1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-22 01:47:00 +01:00

[MMI] Applied code fencing in transactions and pending tx tracker controllers (#17909)

* Applied code fencing in trabsactions and pending tx tracker controllers

* remove unneeded URL from the comment

* Added test

* Added useful comment

* Fixing code fences

---------

Co-authored-by: António Regadas <apregadas@gmail.com>
This commit is contained in:
Albert Olivé 2023-05-05 15:58:40 +02:00 committed by GitHub
parent 395ac34bed
commit 33f9d6f480
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 101 additions and 5 deletions

View File

@ -225,6 +225,10 @@ export default class TransactionController extends EventEmitter {
// request state update to finalize initialization
this._updatePendingTxsAfterFirstBlock();
this._onBootCleanUp();
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
this.transactionUpdateController = opts.transactionUpdateController;
///: END:ONLY_INCLUDE_IN
}
/**
@ -1359,6 +1363,16 @@ export default class TransactionController extends EventEmitter {
// So that we do not increment nonce + resubmit something
// that is already being incremented & signed.
const txMeta = this.txStateManager.getTransaction(txId);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
// MMI does not broadcast transactions, as that is the responsibility of the custodian
if (txMeta.custodyStatus) {
this.inProcessOfSigning.delete(txId);
await this.signTransaction(txId);
return;
}
///: END:ONLY_INCLUDE_IN
if (this.inProcessOfSigning.has(txId)) {
return;
}
@ -1512,7 +1526,25 @@ export default class TransactionController extends EventEmitter {
const fromAddress = txParams.from;
const common = await this.getCommonConfiguration(txParams.from);
const unsignedEthTx = TransactionFactory.fromTxData(txParams, { common });
const signedEthTx = await this.signEthTx(unsignedEthTx, fromAddress);
const signedEthTx = await this.signEthTx(
unsignedEthTx,
fromAddress,
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
txMeta.custodyStatus ? txMeta : undefined,
///: END:ONLY_INCLUDE_IN
);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
if (txMeta.custodyStatus) {
txMeta.custodyId = signedEthTx.custodian_transactionId;
txMeta.custodyStatus = signedEthTx.transactionStatus;
this.transactionUpdateController.addTransactionToWatchList(
txMeta.custodyId,
fromAddress,
);
}
///: END:ONLY_INCLUDE_IN
// add r,s,v values for provider request purposes see createMetamaskMiddleware
// and JSON rpc standard for further explanation
@ -1876,9 +1908,18 @@ export default class TransactionController extends EventEmitter {
},
})
.forEach((txMeta) => {
// Line below will try to publish transaction which is in
// APPROVED state at the time of controller bootup
this.approveTransaction(txMeta.id);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
// If you create a Tx and its still inside the custodian waiting to be approved we don't want to approve it right away
if (!txMeta.custodyStatus) {
///: END:ONLY_INCLUDE_IN
// Line below will try to publish transaction which is in
// APPROVED state at the time of controller bootup
this.approveTransaction(txMeta.id);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
}
///: END:ONLY_INCLUDE_IN
});
}

View File

@ -144,6 +144,13 @@ export default class PendingTransactionTracker extends EventEmitter {
return undefined;
}
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
// Don't ever resubmit custodian transactions
if (txMeta.custodyId) {
return undefined;
}
///: END:ONLY_INCLUDE_IN
// Only auto-submit already-signed txs:
if (!('rawTx' in txMeta)) {
return this.approveTransaction(txMeta.id);
@ -180,7 +187,15 @@ export default class PendingTransactionTracker extends EventEmitter {
// extra check in case there was an uncaught error during the
// signature and submission process
if (!txHash) {
let hasNoHash = !txHash;
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
// Don't emit noTxHashErr for custodian transactions
hasNoHash ||= !txMeta.custodyId;
///: END:ONLY_INCLUDE_IN
if (hasNoHash) {
const noTxHashErr = new Error(
'We had an error while submitting this transaction, please try again.',
);

View File

@ -374,6 +374,43 @@ describe('PendingTransactionTracker', function () {
'should NOT try to publish transaction',
);
});
it('should return undefined if txMeta has custodyId property', async function () {
const txMeta = {
custodyId: 1,
id: 1,
hash: '0x0593ee121b92e10d63150ad08b4b8f9c7857d1bd160195ee648fb9a0f8d00eeb',
status: TransactionStatus.signed,
txParams: {
from: '0x1678a085c290ebd122dc42cba69373b5953b831d',
nonce: '0x1',
value: '0xfffff',
},
history: [{}],
rawTx:
'0xf86c808504a817c80086a02ec9d3d1d6e176d4d2593dd760e74ccac753e6a0ea0d00cc9789d0d7ff1f471d',
};
const approveTransaction = sinon.spy();
const publishTransaction = sinon.spy();
const pendingTxTracker = new PendingTransactionTracker({
query: {
getTransactionReceipt: sinon.stub(),
},
nonceTracker: {
getGlobalLock: sinon.stub().resolves({
releaseLock: sinon.spy(),
}),
},
getPendingTransactions: sinon.stub().returns([]),
getCompletedTransactions: sinon.stub().returns([]),
approveTransaction,
publishTransaction,
confirmTransaction: sinon.spy(),
});
const result = await pendingTxTracker._resubmitTx(txMeta);
assert.equal(result, undefined);
});
});
describe('#_checkIfTxWasDropped', function () {
@ -576,6 +613,7 @@ describe('PendingTransactionTracker', function () {
},
history: [{}],
rawTx: '0xf86c808504a817c80082471d',
custodyId: 'testid',
};
const nonceBN = new BN(2);
const pendingTxTracker = new PendingTransactionTracker({
@ -720,6 +758,7 @@ describe('PendingTransactionTracker', function () {
id: '123',
value: '0x02',
hash: '0x2a919d2512ec963f524bfd9730fb66b6d5a2e399d1dd957abb5e2b544a12644b',
custodyId: 'testid',
},
];
const pendingTxTracker = new PendingTransactionTracker({
@ -771,6 +810,7 @@ describe('PendingTransactionTracker', function () {
},
history: [{}],
rawTx: '0xf86c808504a817c80082471d',
custodyId: 'testid',
};
const pendingTxTracker = new PendingTransactionTracker({
query: {