1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-12 20:57:12 +01:00
metamask-extension/test/unit/app/controllers/transactions/tx-state-manager.test.js

934 lines
27 KiB
JavaScript
Raw Normal View History

import { strict as assert } from 'assert';
import sinon from 'sinon';
import TxStateManager from '../../../../../app/scripts/controllers/transactions/tx-state-manager';
import { snapshotFromTxMeta } from '../../../../../app/scripts/controllers/transactions/lib/tx-state-history-helpers';
import { TRANSACTION_STATUSES } from '../../../../../shared/constants/transaction';
import {
KOVAN_CHAIN_ID,
KOVAN_NETWORK_ID,
} from '../../../../../shared/constants/network';
const noop = () => true;
2017-08-11 23:19:35 +02:00
2018-03-07 19:24:36 +01:00
describe('TransactionStateManager', function () {
let txStateManager;
const currentNetworkId = KOVAN_NETWORK_ID;
const currentChainId = KOVAN_CHAIN_ID;
const otherNetworkId = '2';
2017-08-11 23:19:35 +02:00
beforeEach(function () {
txStateManager = new TxStateManager({
initState: {
transactions: [],
},
txHistoryLimit: 10,
2018-07-03 00:49:33 +02:00
getNetwork: () => currentNetworkId,
getCurrentChainId: () => currentChainId,
});
});
2017-08-11 23:19:35 +02:00
describe('#setTxStatusSigned', function () {
it('sets the tx status to signed', function () {
2020-11-03 00:41:28 +01:00
const tx = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
txStateManager.addTx(tx, noop);
txStateManager.setTxStatusSigned(1);
const result = txStateManager.getTxList();
assert.ok(Array.isArray(result));
assert.equal(result.length, 1);
assert.equal(result[0].status, TRANSACTION_STATUSES.SIGNED);
});
2017-08-11 23:19:35 +02:00
it('should emit a signed event to signal the execution of callback', function () {
2020-11-03 00:41:28 +01:00
const tx = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
const clock = sinon.useFakeTimers();
const onSigned = sinon.spy();
txStateManager.addTx(tx);
txStateManager.on('1:signed', onSigned);
txStateManager.setTxStatusSigned(1);
clock.runAll();
clock.restore();
2017-08-11 23:19:35 +02:00
assert.ok(onSigned.calledOnce);
});
});
2017-08-11 23:19:35 +02:00
describe('#setTxStatusRejected', function () {
it('sets the tx status to rejected and removes it from history', function () {
2020-11-03 00:41:28 +01:00
const tx = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
txStateManager.addTx(tx);
txStateManager.setTxStatusRejected(1);
const result = txStateManager.getTxList();
assert.ok(Array.isArray(result));
assert.equal(result.length, 0);
});
it('should emit a rejected event to signal the execution of callback', function () {
2020-11-03 00:41:28 +01:00
const tx = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
const clock = sinon.useFakeTimers();
const onSigned = sinon.spy();
txStateManager.addTx(tx);
txStateManager.on('1:rejected', onSigned);
txStateManager.setTxStatusRejected(1);
clock.runAll();
clock.restore();
assert.ok(onSigned.calledOnce);
});
});
2017-08-11 23:19:35 +02:00
describe('#getFullTxList', function () {
it('when new should return empty array', function () {
const result = txStateManager.getTxList();
assert.ok(Array.isArray(result));
assert.equal(result.length, 0);
});
});
2017-08-11 23:19:35 +02:00
describe('#getTxList', function () {
it('when new should return empty array', function () {
const result = txStateManager.getTxList();
assert.ok(Array.isArray(result));
assert.equal(result.length, 0);
});
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
it('should return a full list of transactions', function () {
const submittedTx = {
id: 0,
metamaskNetworkId: currentNetworkId,
time: 0,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x0',
},
status: TRANSACTION_STATUSES.SUBMITTED,
};
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const confirmedTx = {
id: 3,
metamaskNetworkId: currentNetworkId,
time: 3,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x3',
},
status: TRANSACTION_STATUSES.CONFIRMED,
};
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const txm = new TxStateManager({
initState: {
2020-11-03 00:41:28 +01:00
transactions: [submittedTx, confirmedTx],
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
},
getNetwork: () => currentNetworkId,
getCurrentChainId: () => currentChainId,
});
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
assert.deepEqual(txm.getTxList(), [submittedTx, confirmedTx]);
});
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
it('should return a list of transactions, limited by N unique nonces when there are NO duplicates', function () {
const submittedTx0 = {
id: 0,
metamaskNetworkId: currentNetworkId,
time: 0,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x0',
},
status: TRANSACTION_STATUSES.SUBMITTED,
};
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const unapprovedTx1 = {
id: 1,
metamaskNetworkId: currentNetworkId,
time: 1,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x1',
},
status: TRANSACTION_STATUSES.UNAPPROVED,
};
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const approvedTx2 = {
id: 2,
metamaskNetworkId: currentNetworkId,
time: 2,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x2',
},
status: TRANSACTION_STATUSES.APPROVED,
};
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const confirmedTx3 = {
id: 3,
metamaskNetworkId: currentNetworkId,
time: 3,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x3',
},
status: TRANSACTION_STATUSES.CONFIRMED,
};
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const txm = new TxStateManager({
initState: {
transactions: [
submittedTx0,
unapprovedTx1,
approvedTx2,
confirmedTx3,
],
},
getNetwork: () => currentNetworkId,
getCurrentChainId: () => currentChainId,
});
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
assert.deepEqual(txm.getTxList(2), [approvedTx2, confirmedTx3]);
});
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
it('should return a list of transactions, limited by N unique nonces when there ARE duplicates', function () {
const submittedTx0s = [
{
id: 0,
metamaskNetworkId: currentNetworkId,
time: 0,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x0',
},
status: TRANSACTION_STATUSES.SUBMITTED,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
},
{
id: 0,
metamaskNetworkId: currentNetworkId,
time: 0,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x0',
},
status: TRANSACTION_STATUSES.SUBMITTED,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
},
];
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const unapprovedTx1 = {
id: 1,
metamaskNetworkId: currentNetworkId,
chainId: currentChainId,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
time: 1,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x1',
},
status: TRANSACTION_STATUSES.UNAPPROVED,
};
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const approvedTx2s = [
{
id: 2,
metamaskNetworkId: currentNetworkId,
time: 2,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x2',
},
status: TRANSACTION_STATUSES.APPROVED,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
},
{
id: 2,
metamaskNetworkId: currentNetworkId,
chainId: currentChainId,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
time: 2,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x2',
},
status: TRANSACTION_STATUSES.APPROVED,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
},
];
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const failedTx3s = [
{
id: 3,
metamaskNetworkId: currentNetworkId,
time: 3,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x3',
},
status: TRANSACTION_STATUSES.FAILED,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
},
{
id: 3,
metamaskNetworkId: currentNetworkId,
chainId: currentChainId,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
time: 3,
txParams: {
from: '0xAddress',
to: '0xRecipient',
nonce: '0x3',
},
status: TRANSACTION_STATUSES.FAILED,
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
},
];
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
const txm = new TxStateManager({
initState: {
transactions: [
...submittedTx0s,
unapprovedTx1,
...approvedTx2s,
...failedTx3s,
],
},
getNetwork: () => currentNetworkId,
getCurrentChainId: () => currentChainId,
});
Limit number of transactions passed outside of TransactionController (#9010) Refs #8572 Refs #8991 This change limits the number of transactions (`txMeta`s) that are passed outside of the `TransactionController`, resulting in shorter serialization and deserialization times when state is moved between the background and UI contexts. `TransactionController#_updateMemstore` --------------------------------------- The `currentNetworkTxList` state of the `TransactionController` is used externally (i.e. outside of the controller) as the canonical source for the full transaction history. Prior to this change, the method would iterate the full transaction history and possibly return all of it. This change limits it to `MAX_MEMSTORE_TX_LIST_SIZE` to make sure that: 1. Calls to `_updateMemstore` are fast(er) 2. Passing `currentNetworkTxList` around is fast(er) (Shown in #8377, `_updateMemstore`, is called _frequently_ when a transaction is pending.) The list is iterated backwards because it is possible that new transactions are at the end of the list. [1] Results ------- In profiles before this change, with ~3k transactions locally, `PortDuplexStream._onMessage` took up to ~4.5s to complete when the set of transactions is included. [2] In profiles after this change, `PortDuplexStream._onMessage` took ~90ms to complete. [3] Before vs. after profile screenshots: ![Profile 1][2] ![Profile 2][3] [1]:https://github.com/MetaMask/metamask-extension/blob/5a3ae85b728096cb45c8cc6822249eed5555ee25/app/scripts/controllers/transactions/tx-state-manager.js#L172-L174 [2]:https://user-images.githubusercontent.com/1623628/87613203-36f51d80-c6e7-11ea-89bc-11a1cc2f3b1e.png [3]:https://user-images.githubusercontent.com/1623628/87613215-3bb9d180-c6e7-11ea-8d85-aff3acbd0374.png [8337]:https://github.com/MetaMask/metamask-extension/issues/8377 [8572]:https://github.com/MetaMask/metamask-extension/issues/8572 [8991]:https://github.com/MetaMask/metamask-extension/issues/8991
2020-07-16 22:22:41 +02:00
assert.deepEqual(txm.getTxList(2), [...approvedTx2s, ...failedTx3s]);
});
});
2017-08-11 23:19:35 +02:00
describe('#addTx', function () {
it('adds a tx returned in getTxList', function () {
2020-11-03 00:41:28 +01:00
const tx = {
id: 1,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
txStateManager.addTx(tx, noop);
const result = txStateManager.getTxList();
assert.ok(Array.isArray(result));
assert.equal(result.length, 1);
assert.equal(result[0].id, 1);
});
2017-08-11 23:19:35 +02:00
it('throws error and does not add tx if txParams are invalid', function () {
const validTxParams = {
from: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
to: '0x0039f22efb07a647557c7c5d17854cfd6d489ef3',
nonce: '0x3',
gas: '0x77359400',
gasPrice: '0x77359400',
value: '0x0',
data: '0x0',
};
const invalidValues = [1, true, {}, Symbol('1')];
2020-07-21 23:10:45 +02:00
Object.keys(validTxParams).forEach((key) => {
for (const value of invalidValues) {
const tx = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
...validTxParams,
[key]: value,
},
};
2020-11-03 00:41:28 +01:00
assert.throws(
txStateManager.addTx.bind(txStateManager, tx),
'addTx should throw error',
);
const result = txStateManager.getTxList();
assert.ok(Array.isArray(result), 'txList should be an array');
assert.equal(result.length, 0, 'txList should be empty');
}
});
});
2017-08-11 23:19:35 +02:00
it('does not override txs from other networks', function () {
2020-11-03 00:41:28 +01:00
const tx = {
id: 1,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
2020-11-03 00:41:28 +01:00
const tx2 = {
id: 2,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: otherNetworkId,
txParams: {},
};
txStateManager.addTx(tx, noop);
txStateManager.addTx(tx2, noop);
const result = txStateManager.getFullTxList();
const result2 = txStateManager.getTxList();
assert.equal(result.length, 2, 'txs were deleted');
assert.equal(result2.length, 1, 'incorrect number of txs on network.');
});
2017-08-11 23:19:35 +02:00
it('cuts off early txs beyond a limit', function () {
const limit = txStateManager.txHistoryLimit;
2017-08-11 23:19:35 +02:00
for (let i = 0; i < limit + 1; i++) {
2020-11-03 00:41:28 +01:00
const tx = {
id: i,
time: new Date(),
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
txStateManager.addTx(tx, noop);
2017-08-11 23:19:35 +02:00
}
const result = txStateManager.getTxList();
assert.equal(result.length, limit, `limit of ${limit} txs enforced`);
assert.equal(result[0].id, 1, 'early txs truncated');
});
2017-08-11 23:19:35 +02:00
it('cuts off early txs beyond a limit whether or not it is confirmed or rejected', function () {
const limit = txStateManager.txHistoryLimit;
2017-08-11 23:19:35 +02:00
for (let i = 0; i < limit + 1; i++) {
2020-11-03 00:41:28 +01:00
const tx = {
id: i,
time: new Date(),
status: TRANSACTION_STATUSES.REJECTED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
txStateManager.addTx(tx, noop);
2017-08-11 23:19:35 +02:00
}
const result = txStateManager.getTxList();
assert.equal(result.length, limit, `limit of ${limit} txs enforced`);
assert.equal(result[0].id, 1, 'early txs truncated');
});
2017-08-11 23:19:35 +02:00
it('cuts off early txs beyond a limit but does not cut unapproved txs', function () {
2020-11-03 00:41:28 +01:00
const unconfirmedTx = {
id: 0,
time: new Date(),
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
txStateManager.addTx(unconfirmedTx, noop);
const limit = txStateManager.txHistoryLimit;
2017-08-11 23:19:35 +02:00
for (let i = 1; i < limit + 1; i++) {
2020-11-03 00:41:28 +01:00
const tx = {
id: i,
time: new Date(),
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
};
txStateManager.addTx(tx, noop);
2017-08-11 23:19:35 +02:00
}
const result = txStateManager.getTxList();
assert.equal(result.length, limit, `limit of ${limit} txs enforced`);
assert.equal(result[0].id, 0, 'first tx should still be there');
2020-11-03 00:41:28 +01:00
assert.equal(
result[0].status,
TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
'first tx should be unapproved',
);
assert.equal(result[1].id, 2, 'early txs truncated');
});
});
2017-08-11 23:19:35 +02:00
describe('#updateTx', function () {
it('replaces the tx with the same id', function () {
2020-11-03 00:41:28 +01:00
txStateManager.addTx(
{
id: '1',
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
},
noop,
);
2020-11-03 00:41:28 +01:00
txStateManager.addTx(
{
id: '2',
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
},
noop,
);
const txMeta = txStateManager.getTx('1');
txMeta.hash = 'foo';
txStateManager.updateTx(txMeta);
const result = txStateManager.getTx('1');
assert.equal(result.hash, 'foo');
});
2017-08-11 23:19:35 +02:00
it('throws error and does not update tx if txParams are invalid', function () {
const validTxParams = {
from: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
to: '0x0039f22efb07a647557c7c5d17854cfd6d489ef3',
nonce: '0x3',
gas: '0x77359400',
gasPrice: '0x77359400',
value: '0x0',
data: '0x0',
};
const invalidValues = [1, true, {}, Symbol('1')];
2020-11-03 00:41:28 +01:00
txStateManager.addTx({
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: validTxParams,
});
2020-07-21 23:10:45 +02:00
Object.keys(validTxParams).forEach((key) => {
for (const value of invalidValues) {
const originalTx = txStateManager.getTx(1);
const newTx = {
...originalTx,
txParams: {
...originalTx.txParams,
[key]: value,
},
};
2020-11-03 00:41:28 +01:00
assert.throws(
txStateManager.updateTx.bind(txStateManager, newTx),
'updateTx should throw an error',
);
const result = txStateManager.getTx(1);
assert.deepEqual(result, originalTx, 'tx should not be updated');
}
});
});
it('updates gas price and adds history items', function () {
const originalGasPrice = '0x01';
const desiredGasPrice = '0x02';
2017-08-11 23:19:35 +02:00
const txMeta = {
id: '1',
status: TRANSACTION_STATUSES.UNAPPROVED,
2017-08-11 23:19:35 +02:00
metamaskNetworkId: currentNetworkId,
txParams: {
gasPrice: originalGasPrice,
},
};
2017-08-11 23:19:35 +02:00
txStateManager.addTx(txMeta);
const updatedTx = txStateManager.getTx('1');
// verify tx was initialized correctly
assert.equal(updatedTx.history.length, 1, 'one history item (initial)');
2020-11-03 00:41:28 +01:00
assert.equal(
Array.isArray(updatedTx.history[0]),
false,
'first history item is initial state',
);
2020-11-03 00:41:28 +01:00
assert.deepEqual(
updatedTx.history[0],
snapshotFromTxMeta(updatedTx),
'first history item is initial state',
);
// modify value and updateTx
updatedTx.txParams.gasPrice = desiredGasPrice;
const before = new Date().getTime();
txStateManager.updateTx(updatedTx);
const after = new Date().getTime();
// check updated value
const result = txStateManager.getTx('1');
2020-11-03 00:41:28 +01:00
assert.equal(
result.txParams.gasPrice,
desiredGasPrice,
'gas price updated',
);
// validate history was updated
2020-11-03 00:41:28 +01:00
assert.equal(
result.history.length,
2,
'two history items (initial + diff)',
);
2020-11-03 00:41:28 +01:00
assert.equal(
result.history[1].length,
1,
'two history state items (initial + diff)',
);
2020-11-03 00:41:28 +01:00
const expectedEntry = {
op: 'replace',
path: '/txParams/gasPrice',
value: desiredGasPrice,
};
2020-11-03 00:41:28 +01:00
assert.deepEqual(
result.history[1][0].op,
expectedEntry.op,
'two history items (initial + diff) operation',
);
2020-11-03 00:41:28 +01:00
assert.deepEqual(
result.history[1][0].path,
expectedEntry.path,
'two history items (initial + diff) path',
);
2020-11-03 00:41:28 +01:00
assert.deepEqual(
result.history[1][0].value,
expectedEntry.value,
'two history items (initial + diff) value',
);
2020-11-03 00:41:28 +01:00
assert.ok(
result.history[1][0].timestamp >= before &&
result.history[1][0].timestamp <= after,
);
});
it('does NOT add empty history items', function () {
const txMeta = {
id: '1',
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
gasPrice: '0x01',
},
};
txStateManager.addTx(txMeta);
txStateManager.updateTx(txMeta);
const { history } = txStateManager.getTx('1');
assert.equal(history.length, 1, 'two history items (initial + diff)');
});
});
2017-08-11 23:19:35 +02:00
describe('#getUnapprovedTxList', function () {
it('returns unapproved txs in a hash', function () {
2020-11-03 00:41:28 +01:00
txStateManager.addTx(
{
id: '1',
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
},
noop,
);
2020-11-03 00:41:28 +01:00
txStateManager.addTx(
{
id: '2',
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
},
noop,
);
const result = txStateManager.getUnapprovedTxList();
assert.equal(typeof result, 'object');
assert.equal(result['1'].status, TRANSACTION_STATUSES.UNAPPROVED);
assert.equal(result['2'], undefined);
});
});
2017-08-11 23:19:35 +02:00
describe('#getTx', function () {
it('returns a tx with the requested id', function () {
2020-11-03 00:41:28 +01:00
txStateManager.addTx(
{
id: '1',
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
},
noop,
);
2020-11-03 00:41:28 +01:00
txStateManager.addTx(
{
id: '2',
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
metamaskNetworkId: currentNetworkId,
txParams: {},
},
noop,
);
assert.equal(
txStateManager.getTx('1').status,
TRANSACTION_STATUSES.UNAPPROVED,
);
assert.equal(
txStateManager.getTx('2').status,
TRANSACTION_STATUSES.CONFIRMED,
);
});
});
2017-08-11 23:19:35 +02:00
describe('#getFilteredTxList', function () {
it('returns a tx with the requested data', function () {
const txMetas = [
2020-11-03 00:41:28 +01:00
{
id: 0,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: currentNetworkId,
},
{
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: currentNetworkId,
},
{
id: 2,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: currentNetworkId,
},
{
id: 3,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xbb', to: '0xaa' },
metamaskNetworkId: currentNetworkId,
},
{
id: 4,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xbb', to: '0xaa' },
metamaskNetworkId: currentNetworkId,
},
{
id: 5,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: currentNetworkId,
},
{
id: 6,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: currentNetworkId,
},
{
id: 7,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xbb', to: '0xaa' },
metamaskNetworkId: currentNetworkId,
},
{
id: 8,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xbb', to: '0xaa' },
metamaskNetworkId: currentNetworkId,
},
{
id: 9,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xbb', to: '0xaa' },
metamaskNetworkId: currentNetworkId,
},
];
txMetas.forEach((txMeta) => txStateManager.addTx(txMeta, noop));
let filterParams;
2017-08-11 23:19:35 +02:00
filterParams = { status: TRANSACTION_STATUSES.UNAPPROVED, from: '0xaa' };
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFilteredTxList(filterParams).length,
3,
`getFilteredTxList - ${JSON.stringify(filterParams)}`,
);
filterParams = { status: TRANSACTION_STATUSES.UNAPPROVED, to: '0xaa' };
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFilteredTxList(filterParams).length,
2,
`getFilteredTxList - ${JSON.stringify(filterParams)}`,
);
filterParams = { status: TRANSACTION_STATUSES.CONFIRMED, from: '0xbb' };
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFilteredTxList(filterParams).length,
3,
`getFilteredTxList - ${JSON.stringify(filterParams)}`,
);
filterParams = { status: TRANSACTION_STATUSES.CONFIRMED };
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFilteredTxList(filterParams).length,
5,
`getFilteredTxList - ${JSON.stringify(filterParams)}`,
);
filterParams = { from: '0xaa' };
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFilteredTxList(filterParams).length,
5,
`getFilteredTxList - ${JSON.stringify(filterParams)}`,
);
filterParams = { to: '0xaa' };
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFilteredTxList(filterParams).length,
5,
`getFilteredTxList - ${JSON.stringify(filterParams)}`,
);
filterParams = {
status: (status) => status !== TRANSACTION_STATUSES.CONFIRMED,
};
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFilteredTxList(filterParams).length,
5,
`getFilteredTxList - ${JSON.stringify(filterParams)}`,
);
});
});
2018-01-31 19:29:30 +01:00
describe('#wipeTransactions', function () {
const specificAddress = '0xaa';
const otherAddress = '0xbb';
2018-01-31 19:29:30 +01:00
it('should remove only the transactions from a specific address', function () {
const txMetas = [
2020-11-03 00:41:28 +01:00
{
id: 0,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: specificAddress, to: otherAddress },
metamaskNetworkId: currentNetworkId,
},
{
id: 1,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: otherAddress, to: specificAddress },
metamaskNetworkId: currentNetworkId,
},
{
id: 2,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: otherAddress, to: specificAddress },
metamaskNetworkId: currentNetworkId,
},
];
txMetas.forEach((txMeta) => txStateManager.addTx(txMeta, noop));
2018-01-31 19:29:30 +01:00
txStateManager.wipeTransactions(specificAddress);
2018-01-31 19:29:30 +01:00
2020-11-03 00:41:28 +01:00
const transactionsFromCurrentAddress = txStateManager
.getTxList()
.filter((txMeta) => txMeta.txParams.from === specificAddress);
2020-11-03 00:41:28 +01:00
const transactionsFromOtherAddresses = txStateManager
.getTxList()
.filter((txMeta) => txMeta.txParams.from !== specificAddress);
2018-01-31 19:29:30 +01:00
assert.equal(transactionsFromCurrentAddress.length, 0);
assert.equal(transactionsFromOtherAddresses.length, 2);
});
2018-01-31 19:29:30 +01:00
it('should not remove the transactions from other networks', function () {
const txMetas = [
2020-11-03 00:41:28 +01:00
{
id: 0,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: specificAddress, to: otherAddress },
metamaskNetworkId: currentNetworkId,
},
{
id: 1,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: specificAddress, to: otherAddress },
metamaskNetworkId: otherNetworkId,
},
{
id: 2,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: specificAddress, to: otherAddress },
metamaskNetworkId: otherNetworkId,
},
];
txMetas.forEach((txMeta) => txStateManager.addTx(txMeta, noop));
2018-01-31 19:29:30 +01:00
txStateManager.wipeTransactions(specificAddress);
2018-01-31 19:29:30 +01:00
2020-11-03 00:41:28 +01:00
const txsFromCurrentNetworkAndAddress = txStateManager
.getTxList()
.filter((txMeta) => txMeta.txParams.from === specificAddress);
2020-11-03 00:41:28 +01:00
const txFromOtherNetworks = txStateManager
.getFullTxList()
.filter((txMeta) => txMeta.metamaskNetworkId === otherNetworkId);
2018-01-31 19:29:30 +01:00
assert.equal(txsFromCurrentNetworkAndAddress.length, 0);
assert.equal(txFromOtherNetworks.length, 2);
});
});
describe('#_removeTx', function () {
it('should remove the transaction from the storage', function () {
txStateManager._saveTxList([{ id: 1 }]);
txStateManager._removeTx(1);
2020-11-03 00:41:28 +01:00
assert.ok(
!txStateManager.getFullTxList().length,
'txList should be empty',
);
});
it('should only remove the transaction with ID 1 from the storage', function () {
txStateManager._saveTxList([{ id: 1 }, { id: 2 }]);
txStateManager._removeTx(1);
2020-11-03 00:41:28 +01:00
assert.equal(
txStateManager.getFullTxList()[0].id,
2,
'txList should have a id of 2',
);
});
});
describe('#clearUnapprovedTxs', function () {
it('removes unapproved transactions', function () {
const txMetas = [
2020-11-03 00:41:28 +01:00
{
id: 0,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: currentNetworkId,
},
{
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: currentNetworkId,
},
{
id: 2,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: otherNetworkId,
},
{
id: 3,
status: TRANSACTION_STATUSES.CONFIRMED,
2020-11-03 00:41:28 +01:00
txParams: { from: '0xaa', to: '0xbb' },
metamaskNetworkId: otherNetworkId,
},
];
txMetas.forEach((txMeta) => txStateManager.addTx(txMeta, noop));
txStateManager.clearUnapprovedTxs();
2020-11-03 00:41:28 +01:00
const unapprovedTxList = txStateManager
.getFullTxList()
.filter((tx) => tx.status === TRANSACTION_STATUSES.UNAPPROVED);
assert.equal(unapprovedTxList.length, 0);
});
});
});