2021-02-04 19:15:23 +01:00
import { strict as assert } from 'assert' ;
import EventEmitter from 'events' ;
2021-04-16 17:05:13 +02:00
import { toBuffer } from 'ethereumjs-util' ;
2021-06-16 22:40:17 +02:00
import { TransactionFactory } from '@ethereumjs/tx' ;
2021-02-04 19:15:23 +01:00
import { ObservableStore } from '@metamask/obs-store' ;
import sinon from 'sinon' ;
2020-01-09 04:34:58 +01:00
2020-11-03 00:41:28 +01:00
import {
createTestProviderTools ,
getTestAccounts ,
2021-03-16 22:00:08 +01:00
} from '../../../../test/stub/provider' ;
2020-11-03 23:57:51 +01:00
import {
2020-11-07 08:38:12 +01:00
TRANSACTION _STATUSES ,
2020-11-03 23:57:51 +01:00
TRANSACTION _TYPES ,
2021-03-16 22:00:08 +01:00
} from '../../../../shared/constants/transaction' ;
2021-06-10 21:27:03 +02:00
import { SECOND } from '../../../../shared/constants/time' ;
2021-07-31 02:45:18 +02:00
import { GAS _ESTIMATE _TYPES } from '../../../../shared/constants/gas' ;
2021-03-16 22:00:08 +01:00
import { METAMASK _CONTROLLER _EVENTS } from '../../metamask-controller' ;
2021-06-24 21:00:54 +02:00
import TransactionController , { TRANSACTION _EVENTS } from '.' ;
2017-08-15 04:15:09 +02:00
2021-02-04 19:15:23 +01:00
const noop = ( ) => true ;
const currentNetworkId = '42' ;
const currentChainId = '0x2a' ;
2021-06-16 22:40:17 +02:00
const providerConfig = {
type : 'kovan' ,
} ;
2017-08-15 04:15:09 +02:00
2021-03-30 16:54:05 +02:00
const VALID _ADDRESS = '0x0000000000000000000000000000000000000000' ;
const VALID _ADDRESS _TWO = '0x0000000000000000000000000000000000000001' ;
2017-08-02 17:34:45 +02:00
describe ( 'Transaction Controller' , function ( ) {
2021-02-04 19:15:23 +01:00
let txController , provider , providerResultStub , fromAccount ;
2016-12-14 21:56:53 +01:00
2017-05-04 23:35:10 +02:00
beforeEach ( function ( ) {
2018-01-18 06:43:34 +01:00
providerResultStub = {
// 1 gwei
eth _gasPrice : '0x0de0b6b3a7640000' ,
// by default, all accounts are external accounts (not contracts)
eth _getCode : '0x' ,
2021-02-04 19:15:23 +01:00
} ;
2020-11-03 00:41:28 +01:00
provider = createTestProviderTools ( { scaffold : providerResultStub } )
2021-02-04 19:15:23 +01:00
. provider ;
2021-06-16 22:40:17 +02:00
2021-02-04 19:15:23 +01:00
fromAccount = getTestAccounts ( ) [ 0 ] ;
const blockTrackerStub = new EventEmitter ( ) ;
blockTrackerStub . getCurrentBlock = noop ;
blockTrackerStub . getLatestBlock = noop ;
2017-05-16 19:27:41 +02:00
txController = new TransactionController ( {
2017-08-09 00:30:22 +02:00
provider ,
2020-11-03 00:41:28 +01:00
getGasPrice ( ) {
2021-02-04 19:15:23 +01:00
return '0xee6b2800' ;
2019-11-20 01:03:20 +01:00
} ,
2020-01-17 22:58:27 +01:00
networkStore : new ObservableStore ( currentNetworkId ) ,
2021-07-31 02:45:18 +02:00
getCurrentNetworkEIP1559Compatibility : ( ) => Promise . resolve ( false ) ,
getCurrentAccountEIP1559Compatibility : ( ) => false ,
2016-12-16 19:33:36 +01:00
txHistoryLimit : 10 ,
2018-05-28 23:29:31 +02:00
blockTracker : blockTrackerStub ,
2020-11-03 00:41:28 +01:00
signTransaction : ( ethTx ) =>
new Promise ( ( resolve ) => {
2021-06-16 22:40:17 +02:00
resolve ( ethTx . sign ( fromAccount . key ) ) ;
2020-11-03 00:41:28 +01:00
} ) ,
2021-06-16 22:40:17 +02:00
getProviderConfig : ( ) => providerConfig ,
2020-08-14 13:47:02 +02:00
getPermittedAccounts : ( ) => undefined ,
2020-10-06 22:18:24 +02:00
getCurrentChainId : ( ) => currentChainId ,
2020-10-08 18:41:23 +02:00
getParticipateInMetrics : ( ) => false ,
2021-06-21 21:02:43 +02:00
trackMetaMetricsEvent : ( ) => undefined ,
2021-07-31 02:45:18 +02:00
getEIP1559GasFeeEstimates : ( ) => undefined ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
txController . nonceTracker . getNonceLock = ( ) =>
2021-02-04 19:15:23 +01:00
Promise . resolve ( { nextNonce : 0 , releaseLock : noop } ) ;
} ) ;
2017-07-26 20:56:52 +02:00
2017-09-08 23:24:40 +02:00
describe ( '#getState' , function ( ) {
2020-04-20 17:01:00 +02:00
it ( 'should return a state object with the right keys and data types' , function ( ) {
2021-02-04 19:15:23 +01:00
const exposedState = txController . getState ( ) ;
2020-11-03 00:41:28 +01:00
assert . ok (
'unapprovedTxs' in exposedState ,
'state should have the key unapprovedTxs' ,
2021-02-04 19:15:23 +01:00
) ;
2020-11-03 00:41:28 +01:00
assert . ok (
'currentNetworkTxList' in exposedState ,
'state should have the key currentNetworkTxList' ,
2021-02-04 19:15:23 +01:00
) ;
2020-11-03 00:41:28 +01:00
assert . ok (
typeof exposedState ? . unapprovedTxs === 'object' ,
'should be an object' ,
2021-02-04 19:15:23 +01:00
) ;
2020-11-03 00:41:28 +01:00
assert . ok (
Array . isArray ( exposedState . currentNetworkTxList ) ,
'should be an array' ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
} ) ;
2017-09-08 23:24:40 +02:00
describe ( '#getUnapprovedTxCount' , function ( ) {
it ( 'should return the number of unapproved txs' , function ( ) {
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 2 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 3 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
2021-02-04 19:15:23 +01:00
] ) ;
const unapprovedTxCount = txController . getUnapprovedTxCount ( ) ;
assert . equal ( unapprovedTxCount , 3 , 'should be 3' ) ;
} ) ;
} ) ;
2017-09-08 23:24:40 +02:00
2017-09-13 23:07:22 +02:00
describe ( '#getPendingTxCount' , function ( ) {
it ( 'should return the number of pending txs' , function ( ) {
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 2 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 3 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
2021-02-04 19:15:23 +01:00
] ) ;
const pendingTxCount = txController . getPendingTxCount ( ) ;
assert . equal ( pendingTxCount , 3 , 'should be 3' ) ;
} ) ;
} ) ;
2017-09-13 23:07:22 +02:00
2017-09-23 01:15:18 +02:00
describe ( '#getConfirmedTransactions' , function ( ) {
2020-02-11 17:51:13 +01:00
it ( 'should return the number of confirmed txs' , function ( ) {
2021-02-04 19:15:23 +01:00
const address = '0xc684832530fcbddae4b4230a47e991ddcec2831d' ;
2017-09-23 01:15:18 +02:00
const txParams = {
2020-11-03 00:41:28 +01:00
from : address ,
to : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
2021-02-04 19:15:23 +01:00
} ;
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 0 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . CONFIRMED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . CONFIRMED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 2 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . CONFIRMED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 3 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 4 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . REJECTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 5 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . APPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 6 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SIGNED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 7 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
{
id : 8 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . FAILED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
2021-02-04 19:15:23 +01:00
] ) ;
2020-11-03 00:41:28 +01:00
assert . equal (
txController . nonceTracker . getConfirmedTransactions ( address ) . length ,
3 ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
} ) ;
2017-09-23 01:15:18 +02:00
2017-08-03 00:58:05 +02:00
describe ( '#newUnapprovedTransaction' , function ( ) {
2021-02-04 19:15:23 +01:00
let stub , txMeta , txParams ;
2017-08-03 00:58:05 +02:00
beforeEach ( function ( ) {
txParams = {
2020-11-03 00:41:28 +01:00
from : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
to : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
2021-02-04 19:15:23 +01:00
} ;
2017-08-03 00:58:05 +02:00
txMeta = {
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2017-08-03 00:58:05 +02:00
id : 1 ,
metamaskNetworkId : currentNetworkId ,
txParams ,
2018-11-16 19:34:08 +01:00
history : [ { } ] ,
2021-02-04 19:15:23 +01:00
} ;
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [ txMeta ] ) ;
2020-11-03 00:41:28 +01:00
stub = sinon
. stub ( txController , 'addUnapprovedTransaction' )
. callsFake ( ( ) => {
2021-02-04 19:15:23 +01:00
txController . emit ( 'newUnapprovedTx' , txMeta ) ;
2021-03-30 16:54:05 +02:00
return Promise . resolve (
txController . txStateManager . addTransaction ( txMeta ) ,
) ;
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2017-08-03 00:58:05 +02:00
2020-02-11 17:51:13 +01:00
afterEach ( function ( ) {
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [ ] ) ;
2021-02-04 19:15:23 +01:00
stub . restore ( ) ;
} ) ;
2017-08-03 00:58:05 +02:00
2020-04-20 17:01:00 +02:00
it ( 'should resolve when finished and status is submitted and resolve with the hash' , async function ( ) {
2017-11-06 13:35:51 +01:00
txController . once ( 'newUnapprovedTx' , ( txMetaFromEmit ) => {
2017-08-03 00:58:05 +02:00
setTimeout ( ( ) => {
2021-02-04 19:15:23 +01:00
txController . setTxHash ( txMetaFromEmit . id , '0x0' ) ;
txController . txStateManager . setTxStatusSubmitted ( txMetaFromEmit . id ) ;
} ) ;
} ) ;
2017-08-03 00:58:05 +02:00
2021-02-04 19:15:23 +01:00
const hash = await txController . newUnapprovedTransaction ( txParams ) ;
assert . ok ( hash , 'newUnapprovedTransaction needs to return the hash' ) ;
} ) ;
2017-08-03 00:58:05 +02:00
2020-04-20 17:01:00 +02:00
it ( 'should reject when finished and status is rejected' , async function ( ) {
2017-11-06 13:35:51 +01:00
txController . once ( 'newUnapprovedTx' , ( txMetaFromEmit ) => {
2017-08-03 00:58:05 +02:00
setTimeout ( ( ) => {
2021-02-04 19:15:23 +01:00
txController . txStateManager . setTxStatusRejected ( txMetaFromEmit . id ) ;
} ) ;
} ) ;
2017-08-03 00:58:05 +02:00
2020-04-20 17:01:00 +02:00
await assert . rejects (
( ) => txController . newUnapprovedTransaction ( txParams ) ,
2020-11-03 00:41:28 +01:00
{
message : 'MetaMask Tx Signature: User denied transaction signature.' ,
} ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
} ) ;
2017-08-03 00:58:05 +02:00
2017-07-26 20:56:52 +02:00
describe ( '#addUnapprovedTransaction' , function ( ) {
2021-02-04 19:15:23 +01:00
const selectedAddress = '0x1678a085c290ebd122dc42cba69373b5953b831d' ;
const recipientAddress = '0xc42edfcc21ed14dda456aa0756c153f7985d8813' ;
2018-10-10 20:41:17 +02:00
2021-02-04 19:15:23 +01:00
let getSelectedAddress , getPermittedAccounts ;
2018-10-10 20:41:17 +02:00
beforeEach ( function ( ) {
2020-11-03 00:41:28 +01:00
getSelectedAddress = sinon
. stub ( txController , 'getSelectedAddress' )
2021-02-04 19:15:23 +01:00
. returns ( selectedAddress ) ;
2020-11-03 00:41:28 +01:00
getPermittedAccounts = sinon
. stub ( txController , 'getPermittedAccounts' )
2021-02-04 19:15:23 +01:00
. returns ( [ selectedAddress ] ) ;
} ) ;
2018-10-10 20:41:17 +02:00
afterEach ( function ( ) {
2021-02-04 19:15:23 +01:00
getSelectedAddress . restore ( ) ;
getPermittedAccounts . restore ( ) ;
} ) ;
2018-01-14 23:01:37 +01:00
2020-04-20 17:01:00 +02:00
it ( 'should add an unapproved transaction and return a valid txMeta' , async function ( ) {
2020-11-03 00:41:28 +01:00
const txMeta = await txController . addUnapprovedTransaction ( {
from : selectedAddress ,
2020-12-04 03:15:59 +01:00
to : recipientAddress ,
2021-02-04 19:15:23 +01:00
} ) ;
assert . ok ( 'id' in txMeta , 'should have a id' ) ;
assert . ok ( 'time' in txMeta , 'should have a time stamp' ) ;
2020-11-03 00:41:28 +01:00
assert . ok (
'metamaskNetworkId' in txMeta ,
'should have a metamaskNetworkId' ,
2021-02-04 19:15:23 +01:00
) ;
assert . ok ( 'txParams' in txMeta , 'should have a txParams' ) ;
assert . ok ( 'history' in txMeta , 'should have a history' ) ;
2020-11-03 00:41:28 +01:00
assert . equal (
txMeta . txParams . value ,
'0x0' ,
'should have added 0x0 as the value' ,
2021-02-04 19:15:23 +01:00
) ;
2020-04-20 17:01:00 +02:00
2021-03-30 16:54:05 +02:00
const memTxMeta = txController . txStateManager . getTransaction ( txMeta . id ) ;
2021-02-04 19:15:23 +01:00
assert . deepEqual ( txMeta , memTxMeta ) ;
} ) ;
2018-01-14 23:01:37 +01:00
it ( 'should emit newUnapprovedTx event and pass txMeta as the first argument' , function ( done ) {
2021-02-04 19:15:23 +01:00
providerResultStub . eth _gasPrice = '4a817c800' ;
2018-01-14 23:01:37 +01:00
txController . once ( 'newUnapprovedTx' , ( txMetaFromEmit ) => {
2021-02-04 19:15:23 +01:00
assert . ok ( txMetaFromEmit , 'txMeta is falsy' ) ;
done ( ) ;
} ) ;
2020-11-03 00:41:28 +01:00
txController
2020-12-04 03:15:59 +01:00
. addUnapprovedTransaction ( {
from : selectedAddress ,
to : recipientAddress ,
} )
2021-02-04 19:15:23 +01:00
. catch ( done ) ;
} ) ;
2018-01-14 23:01:37 +01:00
2020-04-20 17:01:00 +02:00
it ( "should fail if the from address isn't the selected address" , async function ( ) {
2020-11-03 00:41:28 +01:00
await assert . rejects ( ( ) =>
txController . addUnapprovedTransaction ( {
from : '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' ,
} ) ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
2018-10-10 20:41:17 +02:00
2020-04-20 17:01:00 +02:00
it ( 'should fail if netId is loading' , async function ( ) {
2021-02-04 19:15:23 +01:00
txController . networkStore = new ObservableStore ( 'loading' ) ;
2020-04-20 17:01:00 +02:00
await assert . rejects (
2020-11-03 00:41:28 +01:00
( ) =>
txController . addUnapprovedTransaction ( {
from : selectedAddress ,
to : '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' ,
} ) ,
2020-04-20 17:01:00 +02:00
{ message : 'MetaMask is having trouble connecting to the network' } ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
} ) ;
2016-12-14 21:56:53 +01:00
2018-04-13 21:38:07 +02:00
describe ( '#addTxGasDefaults' , function ( ) {
2020-02-11 17:51:13 +01:00
it ( 'should add the tx defaults if their are none' , async function ( ) {
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
2021-02-04 19:15:23 +01:00
] ) ;
2017-09-23 01:15:18 +02:00
const txMeta = {
2020-05-01 17:25:45 +02:00
id : 1 ,
2018-05-25 07:41:09 +02:00
txParams : {
from : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
to : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
2017-08-02 17:34:45 +02:00
} ,
2018-11-16 19:34:08 +01:00
history : [ { } ] ,
2021-02-04 19:15:23 +01:00
} ;
providerResultStub . eth _gasPrice = '4a817c800' ;
providerResultStub . eth _getBlockByNumber = { gasLimit : '47b784' } ;
providerResultStub . eth _estimateGas = '5209' ;
2018-05-25 07:41:09 +02:00
2021-02-04 19:15:23 +01:00
const txMetaWithDefaults = await txController . addTxGasDefaults ( txMeta ) ;
2020-11-03 00:41:28 +01:00
assert . ok (
txMetaWithDefaults . txParams . gasPrice ,
'should have added the gas price' ,
2021-02-04 19:15:23 +01:00
) ;
2020-11-03 00:41:28 +01:00
assert . ok (
txMetaWithDefaults . txParams . gas ,
'should have added the gas field' ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
2021-07-31 02:45:18 +02:00
it ( 'should add EIP1559 tx defaults' , async function ( ) {
const TEST _MAX _FEE _PER _GAS = '0x12a05f200' ;
const TEST _MAX _PRIORITY _FEE _PER _GAS = '0x77359400' ;
const stub1 = sinon
. stub ( txController , 'getEIP1559Compatibility' )
. returns ( true ) ;
const stub2 = sinon
. stub ( txController , '_getDefaultGasFees' )
. callsFake ( ( ) => ( {
maxFeePerGas : TEST _MAX _FEE _PER _GAS ,
maxPriorityFeePerGas : TEST _MAX _PRIORITY _FEE _PER _GAS ,
} ) ) ;
txController . txStateManager . _addTransactionsToState ( [
{
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
metamaskNetworkId : currentNetworkId ,
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
history : [ { } ] ,
} ,
] ) ;
const txMeta = {
id : 1 ,
txParams : {
from : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
to : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
} ,
history : [ { } ] ,
} ;
providerResultStub . eth _getBlockByNumber = { gasLimit : '47b784' } ;
providerResultStub . eth _estimateGas = '5209' ;
const txMetaWithDefaults = await txController . addTxGasDefaults ( txMeta ) ;
assert . equal (
txMetaWithDefaults . txParams . maxFeePerGas ,
TEST _MAX _FEE _PER _GAS ,
'should have added the correct max fee per gas' ,
) ;
assert . equal (
txMetaWithDefaults . txParams . maxPriorityFeePerGas ,
TEST _MAX _PRIORITY _FEE _PER _GAS ,
'should have added the correct max priority fee per gas' ,
) ;
stub1 . restore ( ) ;
stub2 . restore ( ) ;
} ) ;
it ( 'should add gasPrice as maxFeePerGas and maxPriorityFeePerGas if there are no sources of other fee data available' , async function ( ) {
const TEST _GASPRICE = '0x12a05f200' ;
const stub1 = sinon
. stub ( txController , 'getEIP1559Compatibility' )
. returns ( true ) ;
const stub2 = sinon
. stub ( txController , '_getDefaultGasFees' )
. callsFake ( ( ) => ( { gasPrice : TEST _GASPRICE } ) ) ;
txController . txStateManager . _addTransactionsToState ( [
{
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
metamaskNetworkId : currentNetworkId ,
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
history : [ { } ] ,
} ,
] ) ;
const txMeta = {
id : 1 ,
txParams : {
from : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
to : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
} ,
history : [ { } ] ,
} ;
providerResultStub . eth _getBlockByNumber = { gasLimit : '47b784' } ;
providerResultStub . eth _estimateGas = '5209' ;
const txMetaWithDefaults = await txController . addTxGasDefaults ( txMeta ) ;
assert . equal (
txMetaWithDefaults . txParams . maxFeePerGas ,
TEST _GASPRICE ,
'should have added the correct max fee per gas' ,
) ;
assert . equal (
txMetaWithDefaults . txParams . maxPriorityFeePerGas ,
TEST _GASPRICE ,
'should have added the correct max priority fee per gas' ,
) ;
stub1 . restore ( ) ;
stub2 . restore ( ) ;
} ) ;
it ( 'should not add gasPrice if the fee data is available from the dapp' , async function ( ) {
const TEST _GASPRICE = '0x12a05f200' ;
const TEST _MAX _FEE _PER _GAS = '0x12a05f200' ;
const TEST _MAX _PRIORITY _FEE _PER _GAS = '0x77359400' ;
const stub1 = sinon
. stub ( txController , 'getEIP1559Compatibility' )
. returns ( true ) ;
const stub2 = sinon
. stub ( txController , '_getDefaultGasFees' )
. callsFake ( ( ) => ( { gasPrice : TEST _GASPRICE } ) ) ;
txController . txStateManager . _addTransactionsToState ( [
{
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
metamaskNetworkId : currentNetworkId ,
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
maxFeePerGas : TEST _MAX _FEE _PER _GAS ,
maxPriorityFeePerGas : TEST _MAX _PRIORITY _FEE _PER _GAS ,
} ,
history : [ { } ] ,
} ,
] ) ;
const txMeta = {
id : 1 ,
txParams : {
from : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
to : '0xc684832530fcbddae4b4230a47e991ddcec2831d' ,
} ,
history : [ { } ] ,
} ;
providerResultStub . eth _getBlockByNumber = { gasLimit : '47b784' } ;
providerResultStub . eth _estimateGas = '5209' ;
const txMetaWithDefaults = await txController . addTxGasDefaults ( txMeta ) ;
assert . equal (
txMetaWithDefaults . txParams . maxFeePerGas ,
TEST _MAX _FEE _PER _GAS ,
'should have added the correct max fee per gas' ,
) ;
assert . equal (
txMetaWithDefaults . txParams . maxPriorityFeePerGas ,
TEST _MAX _PRIORITY _FEE _PER _GAS ,
'should have added the correct max priority fee per gas' ,
) ;
stub1 . restore ( ) ;
stub2 . restore ( ) ;
} ) ;
} ) ;
describe ( '_getDefaultGasFees' , function ( ) {
let getGasFeeStub ;
beforeEach ( function ( ) {
getGasFeeStub = sinon . stub ( txController , '_getEIP1559GasFeeEstimates' ) ;
} ) ;
afterEach ( function ( ) {
getGasFeeStub . restore ( ) ;
} ) ;
it ( 'should return the correct fee data when the gas estimate type is FEE_MARKET' , async function ( ) {
const EXPECTED _MAX _FEE _PER _GAS = '12a05f200' ;
const EXPECTED _MAX _PRIORITY _FEE _PER _GAS = '77359400' ;
getGasFeeStub . callsFake ( ( ) => ( {
gasFeeEstimates : {
medium : {
suggestedMaxPriorityFeePerGas : '2' ,
suggestedMaxFeePerGas : '5' ,
} ,
} ,
gasEstimateType : GAS _ESTIMATE _TYPES . FEE _MARKET ,
} ) ) ;
const defaultGasFees = await txController . _getDefaultGasFees (
{ txParams : { } } ,
true ,
) ;
assert . deepEqual ( defaultGasFees , {
maxPriorityFeePerGas : EXPECTED _MAX _PRIORITY _FEE _PER _GAS ,
maxFeePerGas : EXPECTED _MAX _FEE _PER _GAS ,
} ) ;
} ) ;
it ( 'should return the correct fee data when the gas estimate type is LEGACY' , async function ( ) {
const EXPECTED _GAS _PRICE = '77359400' ;
getGasFeeStub . callsFake ( ( ) => ( {
gasFeeEstimates : { medium : '2' } ,
gasEstimateType : GAS _ESTIMATE _TYPES . LEGACY ,
} ) ) ;
const defaultGasFees = await txController . _getDefaultGasFees (
{ txParams : { } } ,
false ,
) ;
assert . deepEqual ( defaultGasFees , {
gasPrice : EXPECTED _GAS _PRICE ,
} ) ;
} ) ;
it ( 'should return the correct fee data when the gas estimate type is ETH_GASPRICE' , async function ( ) {
const EXPECTED _GAS _PRICE = '77359400' ;
getGasFeeStub . callsFake ( ( ) => ( {
gasFeeEstimates : { gasPrice : '2' } ,
gasEstimateType : GAS _ESTIMATE _TYPES . ETH _GASPRICE ,
} ) ) ;
const defaultGasFees = await txController . _getDefaultGasFees (
{ txParams : { } } ,
false ,
) ;
assert . deepEqual ( defaultGasFees , {
gasPrice : EXPECTED _GAS _PRICE ,
} ) ;
} ) ;
2021-02-04 19:15:23 +01:00
} ) ;
2017-08-02 17:34:45 +02:00
2021-03-30 16:54:05 +02:00
describe ( '#addTransaction' , function ( ) {
2021-06-24 21:00:54 +02:00
let trackTransactionMetricsEventSpy ;
2021-06-21 21:02:43 +02:00
beforeEach ( function ( ) {
2021-06-24 21:00:54 +02:00
trackTransactionMetricsEventSpy = sinon . spy (
2021-06-21 21:02:43 +02:00
txController ,
2021-06-24 21:00:54 +02:00
'_trackTransactionMetricsEvent' ,
2021-06-21 21:02:43 +02:00
) ;
} ) ;
afterEach ( function ( ) {
2021-06-24 21:00:54 +02:00
trackTransactionMetricsEventSpy . restore ( ) ;
2021-06-21 21:02:43 +02:00
} ) ;
2017-08-11 23:19:35 +02:00
it ( 'should emit updates' , function ( done ) {
2017-05-16 22:22:03 +02:00
const txMeta = {
id : '1' ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2017-05-16 22:22:03 +02:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2021-02-04 19:15:23 +01:00
} ;
2017-05-16 22:22:03 +02:00
2021-02-09 00:22:30 +01:00
const eventNames = [
METAMASK _CONTROLLER _EVENTS . UPDATE _BADGE ,
'1:unapproved' ,
] ;
2021-02-04 19:15:23 +01:00
const listeners = [ ] ;
2017-08-11 23:19:35 +02:00
eventNames . forEach ( ( eventName ) => {
2020-11-03 00:41:28 +01:00
listeners . push (
new Promise ( ( resolve ) => {
txController . once ( eventName , ( arg ) => {
2021-02-04 19:15:23 +01:00
resolve ( arg ) ;
} ) ;
2020-11-03 00:41:28 +01:00
} ) ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
2017-08-11 23:19:35 +02:00
Promise . all ( listeners )
2019-07-31 22:17:11 +02:00
. then ( ( returnValues ) => {
2020-11-03 00:41:28 +01:00
assert . deepEqual (
returnValues . pop ( ) ,
txMeta ,
'last event 1:unapproved should return txMeta' ,
2021-02-04 19:15:23 +01:00
) ;
done ( ) ;
2019-07-31 22:17:11 +02:00
} )
2021-02-04 19:15:23 +01:00
. catch ( done ) ;
2021-03-30 16:54:05 +02:00
txController . addTransaction ( txMeta ) ;
2021-02-04 19:15:23 +01:00
} ) ;
2021-06-21 21:02:43 +02:00
2021-06-24 21:00:54 +02:00
it ( 'should call _trackTransactionMetricsEvent with the correct params' , function ( ) {
2021-06-21 21:02:43 +02:00
const txMeta = {
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
txParams : {
from : fromAccount . address ,
to : '0x1678a085c290ebd122dc42cba69373b5953b831d' ,
gasPrice : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
type : 'sentEther' ,
2021-06-29 23:54:42 +02:00
transaction _envelope _type : 'legacy' ,
2021-06-21 21:02:43 +02:00
origin : 'metamask' ,
chainId : currentChainId ,
2021-06-24 21:00:54 +02:00
time : 1624408066355 ,
2021-06-21 21:02:43 +02:00
metamaskNetworkId : currentNetworkId ,
} ;
txController . addTransaction ( txMeta ) ;
2021-06-24 21:00:54 +02:00
assert . equal ( trackTransactionMetricsEventSpy . callCount , 1 ) ;
2021-06-21 21:02:43 +02:00
assert . deepEqual (
2021-06-24 21:00:54 +02:00
trackTransactionMetricsEventSpy . getCall ( 0 ) . args [ 0 ] ,
txMeta ,
) ;
assert . equal (
trackTransactionMetricsEventSpy . getCall ( 0 ) . args [ 1 ] ,
TRANSACTION _EVENTS . ADDED ,
2021-06-21 21:02:43 +02:00
) ;
} ) ;
2021-02-04 19:15:23 +01:00
} ) ;
2016-12-14 21:56:53 +01:00
2017-05-17 03:16:18 +02:00
describe ( '#approveTransaction' , function ( ) {
2020-04-20 17:01:00 +02:00
it ( 'does not overwrite set values' , async function ( ) {
2021-02-04 19:15:23 +01:00
const originalValue = '0x01' ;
2020-02-11 17:51:13 +01:00
const txMeta = {
2017-05-17 03:16:18 +02:00
id : '1' ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2017-05-17 03:16:18 +02:00
metamaskNetworkId : currentNetworkId ,
txParams : {
2021-03-30 16:54:05 +02:00
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
2017-05-17 03:16:18 +02:00
nonce : originalValue ,
gas : originalValue ,
gasPrice : originalValue ,
} ,
2021-02-04 19:15:23 +01:00
} ;
2021-03-09 20:08:06 +01:00
// eslint-disable-next-line @babel/no-invalid-this
2021-06-10 21:27:03 +02:00
this . timeout ( SECOND * 15 ) ;
2021-02-04 19:15:23 +01:00
const wrongValue = '0x05' ;
2017-05-17 03:16:18 +02:00
2021-03-30 16:54:05 +02:00
txController . addTransaction ( txMeta ) ;
2021-02-04 19:15:23 +01:00
providerResultStub . eth _gasPrice = wrongValue ;
providerResultStub . eth _estimateGas = '0x5209' ;
2017-05-17 03:16:18 +02:00
2020-11-03 00:41:28 +01:00
const signStub = sinon
. stub ( txController , 'signTransaction' )
2021-02-04 19:15:23 +01:00
. callsFake ( ( ) => Promise . resolve ( ) ) ;
2017-05-17 03:16:18 +02:00
2020-11-03 00:41:28 +01:00
const pubStub = sinon
. stub ( txController , 'publishTransaction' )
. callsFake ( ( ) => {
2021-02-04 19:15:23 +01:00
txController . setTxHash ( '1' , originalValue ) ;
txController . txStateManager . setTxStatusSubmitted ( '1' ) ;
} ) ;
2017-05-17 03:16:18 +02:00
2021-02-04 19:15:23 +01:00
await txController . approveTransaction ( txMeta . id ) ;
2021-03-30 16:54:05 +02:00
const result = txController . txStateManager . getTransaction ( txMeta . id ) ;
2021-02-04 19:15:23 +01:00
const params = result . txParams ;
2017-05-17 03:16:18 +02:00
2021-02-04 19:15:23 +01:00
assert . equal ( params . gas , originalValue , 'gas unmodified' ) ;
assert . equal ( params . gasPrice , originalValue , 'gas price unmodified' ) ;
assert . equal ( result . hash , originalValue ) ;
2020-11-03 00:41:28 +01:00
assert . equal (
result . status ,
2020-11-07 08:38:12 +01:00
TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
'should have reached the submitted status.' ,
2021-02-04 19:15:23 +01:00
) ;
signStub . restore ( ) ;
pubStub . restore ( ) ;
} ) ;
} ) ;
2017-05-17 03:16:18 +02:00
2017-05-04 23:35:10 +02:00
describe ( '#sign replay-protected tx' , function ( ) {
2020-04-20 17:01:00 +02:00
it ( 'prepares a tx with the chainId set' , async function ( ) {
2021-03-30 16:54:05 +02:00
txController . addTransaction (
2020-11-03 00:41:28 +01:00
{
id : '1' ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
} ,
noop ,
2021-02-04 19:15:23 +01:00
) ;
const rawTx = await txController . signTransaction ( '1' ) ;
2021-06-16 22:40:17 +02:00
const ethTx = TransactionFactory . fromSerializedData ( toBuffer ( rawTx ) ) ;
assert . equal ( ethTx . common . chainIdBN ( ) . toNumber ( ) , 42 ) ;
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2017-09-23 01:15:18 +02:00
2017-09-26 04:47:03 +02:00
describe ( '#updateAndApproveTransaction' , function ( ) {
2020-02-11 17:51:13 +01:00
it ( 'should update and approve transactions' , async function ( ) {
const txMeta = {
2017-09-26 04:47:03 +02:00
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2017-09-26 04:47:03 +02:00
txParams : {
2018-04-28 02:12:52 +02:00
from : fromAccount . address ,
2017-09-26 04:47:03 +02:00
to : '0x1678a085c290ebd122dc42cba69373b5953b831d' ,
gasPrice : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
metamaskNetworkId : currentNetworkId ,
2021-02-04 19:15:23 +01:00
} ;
2021-03-30 16:54:05 +02:00
txController . txStateManager . addTransaction ( txMeta ) ;
2021-02-04 19:15:23 +01:00
const approvalPromise = txController . updateAndApproveTransaction ( txMeta ) ;
2021-03-30 16:54:05 +02:00
const tx = txController . txStateManager . getTransaction ( 1 ) ;
2021-02-04 19:15:23 +01:00
assert . equal ( tx . status , TRANSACTION _STATUSES . APPROVED ) ;
await approvalPromise ;
} ) ;
} ) ;
2017-09-23 01:15:18 +02:00
2017-09-26 04:47:03 +02:00
describe ( '#getChainId' , function ( ) {
it ( 'returns 0 when the chainId is NaN' , function ( ) {
2021-02-04 19:15:23 +01:00
txController . networkStore = new ObservableStore ( 'loading' ) ;
assert . equal ( txController . getChainId ( ) , 0 ) ;
} ) ;
} ) ;
2017-09-23 01:15:18 +02:00
describe ( '#cancelTransaction' , function ( ) {
2020-02-11 17:51:13 +01:00
it ( 'should emit a status change to rejected' , function ( done ) {
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 0 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
} ,
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . REJECTED ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
} ,
{
id : 2 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . APPROVED ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
} ,
{
id : 3 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SIGNED ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
} ,
{
id : 4 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
} ,
{
id : 5 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . CONFIRMED ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
} ,
{
id : 6 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . FAILED ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
} ,
2021-02-04 19:15:23 +01:00
] ) ;
2017-09-23 01:15:18 +02:00
2018-06-26 01:16:51 +02:00
txController . once ( 'tx:status-update' , ( txId , status ) => {
try {
2020-11-07 08:38:12 +01:00
assert . equal (
status ,
TRANSACTION _STATUSES . REJECTED ,
'status should be rejected' ,
2021-02-04 19:15:23 +01:00
) ;
assert . equal ( txId , 0 , 'id should e 0' ) ;
done ( ) ;
2019-11-20 01:03:20 +01:00
} catch ( e ) {
2021-02-04 19:15:23 +01:00
done ( e ) ;
2019-11-20 01:03:20 +01:00
}
2021-02-04 19:15:23 +01:00
} ) ;
2018-06-26 01:16:51 +02:00
2021-02-04 19:15:23 +01:00
txController . cancelTransaction ( 0 ) ;
} ) ;
} ) ;
2017-09-23 01:15:18 +02:00
2020-02-11 17:51:13 +01:00
describe ( '#createSpeedUpTransaction' , function ( ) {
2021-03-30 16:54:05 +02:00
let addTransactionSpy ;
2021-02-04 19:15:23 +01:00
let approveTransactionSpy ;
let txParams ;
let expectedTxParams ;
2018-10-26 06:42:59 +02:00
2020-02-11 17:51:13 +01:00
beforeEach ( function ( ) {
2021-03-30 16:54:05 +02:00
addTransactionSpy = sinon . spy ( txController , 'addTransaction' ) ;
2021-02-04 19:15:23 +01:00
approveTransactionSpy = sinon . spy ( txController , 'approveTransaction' ) ;
2018-10-26 06:42:59 +02:00
txParams = {
nonce : '0x00' ,
from : '0xB09d8505E1F4EF1CeA089D47094f5DD3464083d4' ,
to : '0xB09d8505E1F4EF1CeA089D47094f5DD3464083d4' ,
gas : '0x5209' ,
gasPrice : '0xa' ,
2021-02-04 19:15:23 +01:00
} ;
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
txParams ,
history : [ { } ] ,
} ,
2021-02-04 19:15:23 +01:00
] ) ;
2018-10-26 06:42:59 +02:00
2021-02-04 19:15:23 +01:00
expectedTxParams = { ... txParams , gasPrice : '0xb' } ;
} ) ;
2018-10-26 06:42:59 +02:00
2020-02-11 17:51:13 +01:00
afterEach ( function ( ) {
2021-03-30 16:54:05 +02:00
addTransactionSpy . restore ( ) ;
2021-02-04 19:15:23 +01:00
approveTransactionSpy . restore ( ) ;
} ) ;
2018-10-26 06:42:59 +02:00
2021-03-30 16:54:05 +02:00
it ( 'should call this.addTransaction and this.approveTransaction with the expected args' , async function ( ) {
2021-02-04 19:15:23 +01:00
await txController . createSpeedUpTransaction ( 1 ) ;
2021-03-30 16:54:05 +02:00
assert . equal ( addTransactionSpy . callCount , 1 ) ;
2018-10-26 06:42:59 +02:00
2021-03-30 16:54:05 +02:00
const addTransactionArgs = addTransactionSpy . getCall ( 0 ) . args [ 0 ] ;
assert . deepEqual ( addTransactionArgs . txParams , expectedTxParams ) ;
2018-10-26 06:42:59 +02:00
2021-07-08 20:48:23 +02:00
const { previousGasParams , type } = addTransactionArgs ;
2020-11-03 00:41:28 +01:00
assert . deepEqual (
2021-07-08 20:48:23 +02:00
{ gasPrice : previousGasParams . gasPrice , type } ,
2020-11-03 00:41:28 +01:00
{
2021-07-08 20:48:23 +02:00
gasPrice : '0xa' ,
2020-11-03 23:57:51 +01:00
type : TRANSACTION _TYPES . RETRY ,
2020-11-03 00:41:28 +01:00
} ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
2018-10-26 06:42:59 +02:00
2020-02-11 17:51:13 +01:00
it ( 'should call this.approveTransaction with the id of the returned tx' , async function ( ) {
2021-02-04 19:15:23 +01:00
const result = await txController . createSpeedUpTransaction ( 1 ) ;
assert . equal ( approveTransactionSpy . callCount , 1 ) ;
2018-10-26 06:42:59 +02:00
2021-02-04 19:15:23 +01:00
const approveTransactionArg = approveTransactionSpy . getCall ( 0 ) . args [ 0 ] ;
assert . equal ( result . id , approveTransactionArg ) ;
} ) ;
2018-10-26 06:42:59 +02:00
2020-02-11 17:51:13 +01:00
it ( 'should return the expected txMeta' , async function ( ) {
2021-02-04 19:15:23 +01:00
const result = await txController . createSpeedUpTransaction ( 1 ) ;
2018-10-26 06:42:59 +02:00
2021-02-04 19:15:23 +01:00
assert . deepEqual ( result . txParams , expectedTxParams ) ;
2018-10-26 06:42:59 +02:00
2021-07-08 20:48:23 +02:00
const { previousGasParams , type } = result ;
2020-11-03 00:41:28 +01:00
assert . deepEqual (
2021-07-08 20:48:23 +02:00
{ gasPrice : previousGasParams . gasPrice , type } ,
2020-11-03 00:41:28 +01:00
{
2021-07-08 20:48:23 +02:00
gasPrice : '0xa' ,
2020-11-03 23:57:51 +01:00
type : TRANSACTION _TYPES . RETRY ,
2020-11-03 00:41:28 +01:00
} ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
} ) ;
2018-10-26 06:42:59 +02:00
2021-07-12 22:26:53 +02:00
describe ( '#signTransaction' , function ( ) {
let fromTxDataSpy ;
beforeEach ( function ( ) {
fromTxDataSpy = sinon . spy ( TransactionFactory , 'fromTxData' ) ;
} ) ;
afterEach ( function ( ) {
fromTxDataSpy . restore ( ) ;
} ) ;
it ( 'sets txParams.type to 0x0 (non-EIP-1559)' , async function ( ) {
txController . txStateManager . _addTransactionsToState ( [
{
status : TRANSACTION _STATUSES . UNAPPROVED ,
id : 1 ,
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
txParams : {
from : VALID _ADDRESS _TWO ,
to : VALID _ADDRESS ,
gasPrice : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
} ,
] ) ;
await txController . signTransaction ( '1' ) ;
assert . equal ( fromTxDataSpy . getCall ( 0 ) . args [ 0 ] . type , '0x0' ) ;
} ) ;
it ( 'sets txParams.type to 0x2 (EIP-1559)' , async function ( ) {
2021-07-31 02:45:18 +02:00
const eip1559CompatibilityStub = sinon
. stub ( txController , 'getEIP1559Compatibility' )
. returns ( true ) ;
2021-07-12 22:26:53 +02:00
txController . txStateManager . _addTransactionsToState ( [
{
status : TRANSACTION _STATUSES . UNAPPROVED ,
id : 2 ,
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
txParams : {
from : VALID _ADDRESS _TWO ,
to : VALID _ADDRESS ,
maxFeePerGas : '0x77359400' ,
maxPriorityFeePerGas : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
} ,
] ) ;
await txController . signTransaction ( '2' ) ;
assert . equal ( fromTxDataSpy . getCall ( 0 ) . args [ 0 ] . type , '0x2' ) ;
2021-07-31 02:45:18 +02:00
eip1559CompatibilityStub . restore ( ) ;
2021-07-12 22:26:53 +02:00
} ) ;
} ) ;
2017-09-23 01:15:18 +02:00
describe ( '#publishTransaction' , function ( ) {
2021-06-24 21:00:54 +02:00
let hash , txMeta , trackTransactionMetricsEventSpy ;
2017-09-23 01:15:18 +02:00
beforeEach ( function ( ) {
2020-11-03 00:41:28 +01:00
hash =
2021-02-04 19:15:23 +01:00
'0x2a5523c6fa98b47b7d9b6c8320179785150b42a16bcff36b398c5062b65657e8' ;
2017-09-23 01:15:18 +02:00
txMeta = {
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2021-03-30 16:54:05 +02:00
txParams : {
2021-06-24 21:00:54 +02:00
gas : '0x7b0d' ,
2021-03-30 16:54:05 +02:00
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2017-09-23 01:15:18 +02:00
metamaskNetworkId : currentNetworkId ,
2021-02-04 19:15:23 +01:00
} ;
providerResultStub . eth _sendRawTransaction = hash ;
2021-06-24 21:00:54 +02:00
trackTransactionMetricsEventSpy = sinon . spy (
txController ,
'_trackTransactionMetricsEvent' ,
) ;
} ) ;
afterEach ( function ( ) {
trackTransactionMetricsEventSpy . restore ( ) ;
2021-02-04 19:15:23 +01:00
} ) ;
2017-09-26 04:47:03 +02:00
2017-09-23 01:15:18 +02:00
it ( 'should publish a tx, updates the rawTx when provided a one' , async function ( ) {
2020-11-03 00:41:28 +01:00
const rawTx =
2021-02-04 19:15:23 +01:00
'0x477b2e6553c917af0db0388ae3da62965ff1a184558f61b749d1266b2e6d024c' ;
2021-03-30 16:54:05 +02:00
txController . txStateManager . addTransaction ( txMeta ) ;
2021-02-04 19:15:23 +01:00
await txController . publishTransaction ( txMeta . id , rawTx ) ;
2021-03-30 16:54:05 +02:00
const publishedTx = txController . txStateManager . getTransaction ( 1 ) ;
2021-02-04 19:15:23 +01:00
assert . equal ( publishedTx . hash , hash ) ;
assert . equal ( publishedTx . status , TRANSACTION _STATUSES . SUBMITTED ) ;
} ) ;
2019-10-30 22:40:33 +01:00
it ( 'should ignore the error "Transaction Failed: known transaction" and be as usual' , async function ( ) {
2020-08-19 18:27:05 +02:00
providerResultStub . eth _sendRawTransaction = async ( _ , _ _ , _ _ _ , end ) => {
2021-02-04 19:15:23 +01:00
end ( 'Transaction Failed: known transaction' ) ;
} ;
2020-11-03 00:41:28 +01:00
const rawTx =
2021-02-04 19:15:23 +01:00
'0xf86204831e848082520894f231d46dd78806e1dd93442cf33c7671f853874880802ca05f973e540f2d3c2f06d3725a626b75247593cb36477187ae07ecfe0a4db3cf57a00259b52ee8c58baaa385fb05c3f96116e58de89bcc165cb3bfdfc708672fed8a' ;
2021-03-30 16:54:05 +02:00
txController . txStateManager . addTransaction ( txMeta ) ;
2021-02-04 19:15:23 +01:00
await txController . publishTransaction ( txMeta . id , rawTx ) ;
2021-03-30 16:54:05 +02:00
const publishedTx = txController . txStateManager . getTransaction ( 1 ) ;
2020-11-03 00:41:28 +01:00
assert . equal (
publishedTx . hash ,
'0x2cc5a25744486f7383edebbf32003e5a66e18135799593d6b5cdd2bb43674f09' ,
2021-02-04 19:15:23 +01:00
) ;
assert . equal ( publishedTx . status , TRANSACTION _STATUSES . SUBMITTED ) ;
} ) ;
2021-06-24 21:00:54 +02:00
it ( 'should call _trackTransactionMetricsEvent with the correct params' , async function ( ) {
const rawTx =
'0x477b2e6553c917af0db0388ae3da62965ff1a184558f61b749d1266b2e6d024c' ;
txController . txStateManager . addTransaction ( txMeta ) ;
await txController . publishTransaction ( txMeta . id , rawTx ) ;
assert . equal ( trackTransactionMetricsEventSpy . callCount , 1 ) ;
assert . deepEqual (
trackTransactionMetricsEventSpy . getCall ( 0 ) . args [ 0 ] ,
txMeta ,
) ;
assert . equal (
trackTransactionMetricsEventSpy . getCall ( 0 ) . args [ 1 ] ,
TRANSACTION _EVENTS . SUBMITTED ,
) ;
} ) ;
2021-02-04 19:15:23 +01:00
} ) ;
2017-09-23 01:15:18 +02:00
2018-03-13 22:30:59 +01:00
describe ( '#_markNonceDuplicatesDropped' , function ( ) {
it ( 'should mark all nonce duplicates as dropped without marking the confirmed transaction as dropped' , function ( ) {
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . CONFIRMED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
nonce : '0x01' ,
} ,
2020-11-03 00:41:28 +01:00
} ,
{
id : 2 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
nonce : '0x01' ,
} ,
2020-11-03 00:41:28 +01:00
} ,
{
id : 3 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
nonce : '0x01' ,
} ,
2020-11-03 00:41:28 +01:00
} ,
{
id : 4 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
nonce : '0x01' ,
} ,
2020-11-03 00:41:28 +01:00
} ,
{
id : 5 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
nonce : '0x01' ,
} ,
2020-11-03 00:41:28 +01:00
} ,
{
id : 6 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
nonce : '0x01' ,
} ,
2020-11-03 00:41:28 +01:00
} ,
{
id : 7 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
history : [ { } ] ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS _TWO ,
from : VALID _ADDRESS ,
nonce : '0x01' ,
} ,
2020-11-03 00:41:28 +01:00
} ,
2021-02-04 19:15:23 +01:00
] ) ;
txController . _markNonceDuplicatesDropped ( 1 ) ;
2021-03-30 16:54:05 +02:00
const confirmedTx = txController . txStateManager . getTransaction ( 1 ) ;
const droppedTxs = txController . txStateManager . getTransactions ( {
searchCriteria : {
nonce : '0x01' ,
status : TRANSACTION _STATUSES . DROPPED ,
} ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . equal (
confirmedTx . status ,
2020-11-07 08:38:12 +01:00
TRANSACTION _STATUSES . CONFIRMED ,
2020-11-03 00:41:28 +01:00
'the confirmedTx should remain confirmed' ,
2021-02-04 19:15:23 +01:00
) ;
assert . equal ( droppedTxs . length , 6 , 'their should be 6 dropped txs' ) ;
} ) ;
} ) ;
2017-09-23 01:15:18 +02:00
2021-03-10 21:16:44 +01:00
describe ( '#_determineTransactionType' , function ( ) {
it ( 'should return a simple send type when to is truthy but data is falsy' , async function ( ) {
const result = await txController . _determineTransactionType ( {
2019-05-14 20:14:07 +02:00
to : '0xabc' ,
data : '' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . SENT _ETHER ,
2020-11-03 00:41:28 +01:00
getCodeResponse : null ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2019-05-14 20:14:07 +02:00
2021-03-10 21:16:44 +01:00
it ( 'should return a token transfer type when data is for the respective method call' , async function ( ) {
const result = await txController . _determineTransactionType ( {
2019-05-14 20:14:07 +02:00
to : '0xabc' ,
2020-11-03 00:41:28 +01:00
data :
'0xa9059cbb0000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C970000000000000000000000000000000000000000000000000000000000000000a' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . TOKEN _METHOD _TRANSFER ,
2020-11-03 00:41:28 +01:00
getCodeResponse : undefined ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2019-05-14 20:14:07 +02:00
2021-03-10 21:16:44 +01:00
it ( 'should return a token approve type when data is for the respective method call' , async function ( ) {
const result = await txController . _determineTransactionType ( {
2019-05-14 20:14:07 +02:00
to : '0xabc' ,
2020-11-03 00:41:28 +01:00
data :
'0x095ea7b30000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C9700000000000000000000000000000000000000000000000000000000000000005' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . TOKEN _METHOD _APPROVE ,
2020-11-03 00:41:28 +01:00
getCodeResponse : undefined ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2019-05-14 20:14:07 +02:00
2021-03-10 21:16:44 +01:00
it ( 'should return a contract deployment type when to is falsy and there is data' , async function ( ) {
const result = await txController . _determineTransactionType ( {
2019-05-14 20:14:07 +02:00
to : '' ,
data : '0xabd' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . DEPLOY _CONTRACT ,
2020-11-03 00:41:28 +01:00
getCodeResponse : undefined ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2019-05-14 20:14:07 +02:00
2021-03-10 21:16:44 +01:00
it ( 'should return a simple send type with a 0x getCodeResponse when there is data and but the to address is not a contract address' , async function ( ) {
const result = await txController . _determineTransactionType ( {
2019-05-14 20:14:07 +02:00
to : '0x9e673399f795D01116e9A8B2dD2F156705131ee9' ,
data : '0xabd' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . SENT _ETHER ,
2020-11-03 00:41:28 +01:00
getCodeResponse : '0x' ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2019-05-14 20:14:07 +02:00
2021-03-10 21:16:44 +01:00
it ( 'should return a simple send type with a null getCodeResponse when to is truthy and there is data and but getCode returns an error' , async function ( ) {
const result = await txController . _determineTransactionType ( {
2019-05-14 20:14:07 +02:00
to : '0xabc' ,
data : '0xabd' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . SENT _ETHER ,
2020-11-03 00:41:28 +01:00
getCodeResponse : null ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2019-05-14 20:14:07 +02:00
2021-03-10 21:16:44 +01:00
it ( 'should return a contract interaction type with the correct getCodeResponse when to is truthy and there is data and it is not a token transaction' , async function ( ) {
2019-05-14 20:14:07 +02:00
const _providerResultStub = {
// 1 gwei
eth _gasPrice : '0x0de0b6b3a7640000' ,
// by default, all accounts are external accounts (not contracts)
eth _getCode : '0xa' ,
2021-02-04 19:15:23 +01:00
} ;
2020-11-03 00:41:28 +01:00
const _provider = createTestProviderTools ( {
scaffold : _providerResultStub ,
2021-02-04 19:15:23 +01:00
} ) . provider ;
const _fromAccount = getTestAccounts ( ) [ 0 ] ;
const _blockTrackerStub = new EventEmitter ( ) ;
_blockTrackerStub . getCurrentBlock = noop ;
_blockTrackerStub . getLatestBlock = noop ;
2019-05-14 20:14:07 +02:00
const _txController = new TransactionController ( {
provider : _provider ,
2020-11-03 00:41:28 +01:00
getGasPrice ( ) {
2021-02-04 19:15:23 +01:00
return '0xee6b2800' ;
2019-11-20 01:03:20 +01:00
} ,
2019-05-14 20:14:07 +02:00
networkStore : new ObservableStore ( currentNetworkId ) ,
2021-03-01 16:15:42 +01:00
getCurrentChainId : ( ) => currentChainId ,
2019-05-14 20:14:07 +02:00
txHistoryLimit : 10 ,
blockTracker : _blockTrackerStub ,
2020-11-03 00:41:28 +01:00
signTransaction : ( ethTx ) =>
new Promise ( ( resolve ) => {
2021-02-04 19:15:23 +01:00
ethTx . sign ( _fromAccount . key ) ;
resolve ( ) ;
2020-11-03 00:41:28 +01:00
} ) ,
2020-10-08 18:41:23 +02:00
getParticipateInMetrics : ( ) => false ,
2021-02-04 19:15:23 +01:00
} ) ;
2021-03-10 21:16:44 +01:00
const result = await _txController . _determineTransactionType ( {
2019-05-14 20:14:07 +02:00
to : '0x9e673399f795D01116e9A8B2dD2F156705131ee9' ,
data : 'abd' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . CONTRACT _INTERACTION ,
2020-11-03 00:41:28 +01:00
getCodeResponse : '0x0a' ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
2019-10-07 21:29:37 +02:00
2021-03-10 21:16:44 +01:00
it ( 'should return a contract interaction type with the correct getCodeResponse when to is a contract address and data is falsy' , async function ( ) {
2019-10-07 21:29:37 +02:00
const _providerResultStub = {
// 1 gwei
eth _gasPrice : '0x0de0b6b3a7640000' ,
// by default, all accounts are external accounts (not contracts)
eth _getCode : '0xa' ,
2021-02-04 19:15:23 +01:00
} ;
2020-11-03 00:41:28 +01:00
const _provider = createTestProviderTools ( {
scaffold : _providerResultStub ,
2021-02-04 19:15:23 +01:00
} ) . provider ;
const _fromAccount = getTestAccounts ( ) [ 0 ] ;
const _blockTrackerStub = new EventEmitter ( ) ;
_blockTrackerStub . getCurrentBlock = noop ;
_blockTrackerStub . getLatestBlock = noop ;
2019-10-07 21:29:37 +02:00
const _txController = new TransactionController ( {
provider : _provider ,
2020-11-03 00:41:28 +01:00
getGasPrice ( ) {
2021-02-04 19:15:23 +01:00
return '0xee6b2800' ;
2019-11-20 01:03:20 +01:00
} ,
2019-10-07 21:29:37 +02:00
networkStore : new ObservableStore ( currentNetworkId ) ,
2021-03-01 16:15:42 +01:00
getCurrentChainId : ( ) => currentChainId ,
2019-10-07 21:29:37 +02:00
txHistoryLimit : 10 ,
blockTracker : _blockTrackerStub ,
2020-11-03 00:41:28 +01:00
signTransaction : ( ethTx ) =>
new Promise ( ( resolve ) => {
2021-02-04 19:15:23 +01:00
ethTx . sign ( _fromAccount . key ) ;
resolve ( ) ;
2020-11-03 00:41:28 +01:00
} ) ,
2020-10-08 18:41:23 +02:00
getParticipateInMetrics : ( ) => false ,
2021-02-04 19:15:23 +01:00
} ) ;
2021-03-10 21:16:44 +01:00
const result = await _txController . _determineTransactionType ( {
2019-10-07 21:29:37 +02:00
to : '0x9e673399f795D01116e9A8B2dD2F156705131ee9' ,
data : '' ,
2021-02-04 19:15:23 +01:00
} ) ;
2020-11-03 00:41:28 +01:00
assert . deepEqual ( result , {
2021-03-10 21:16:44 +01:00
type : TRANSACTION _TYPES . CONTRACT _INTERACTION ,
2020-11-03 00:41:28 +01:00
getCodeResponse : '0x0a' ,
2021-02-04 19:15:23 +01:00
} ) ;
} ) ;
} ) ;
2019-05-14 20:14:07 +02:00
2017-09-23 01:15:18 +02:00
describe ( '#getPendingTransactions' , function ( ) {
2020-04-20 17:01:00 +02:00
it ( 'should show only submitted and approved transactions as pending transaction' , function ( ) {
2021-03-30 16:54:05 +02:00
txController . txStateManager . _addTransactionsToState ( [
2020-11-03 00:41:28 +01:00
{
id : 1 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . UNAPPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
} ,
{
id : 2 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . REJECTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 3 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . APPROVED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 4 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SIGNED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 5 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . SUBMITTED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 6 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . CONFIRMED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
{
id : 7 ,
2020-11-07 08:38:12 +01:00
status : TRANSACTION _STATUSES . FAILED ,
2020-11-03 00:41:28 +01:00
metamaskNetworkId : currentNetworkId ,
2021-03-30 16:54:05 +02:00
txParams : {
to : VALID _ADDRESS ,
from : VALID _ADDRESS _TWO ,
} ,
2020-11-03 00:41:28 +01:00
history : [ { } ] ,
} ,
2021-02-04 19:15:23 +01:00
] ) ;
2020-02-11 17:51:13 +01:00
2020-11-03 00:41:28 +01:00
assert . equal (
txController . pendingTxTracker . getPendingTransactions ( ) . length ,
2 ,
2021-02-04 19:15:23 +01:00
) ;
2020-11-03 00:41:28 +01:00
const states = txController . pendingTxTracker
. getPendingTransactions ( )
2021-02-04 19:15:23 +01:00
. map ( ( tx ) => tx . status ) ;
2020-11-07 08:38:12 +01:00
assert . ok (
states . includes ( TRANSACTION _STATUSES . APPROVED ) ,
'includes approved' ,
2021-02-04 19:15:23 +01:00
) ;
2020-11-07 08:38:12 +01:00
assert . ok (
states . includes ( TRANSACTION _STATUSES . SUBMITTED ) ,
'includes submitted' ,
2021-02-04 19:15:23 +01:00
) ;
} ) ;
} ) ;
2021-06-24 21:00:54 +02:00
describe ( '#_trackTransactionMetricsEvent' , function ( ) {
let trackMetaMetricsEventSpy ;
beforeEach ( function ( ) {
trackMetaMetricsEventSpy = sinon . spy (
txController ,
'_trackMetaMetricsEvent' ,
) ;
} ) ;
afterEach ( function ( ) {
trackMetaMetricsEventSpy . restore ( ) ;
} ) ;
it ( 'should call _trackMetaMetricsEvent with the correct payload (user source)' , function ( ) {
const txMeta = {
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
txParams : {
from : fromAccount . address ,
to : '0x1678a085c290ebd122dc42cba69373b5953b831d' ,
gasPrice : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
type : 'sentEther' ,
origin : 'metamask' ,
chainId : currentChainId ,
time : 1624408066355 ,
metamaskNetworkId : currentNetworkId ,
} ;
const expectedPayload = {
event : 'Transaction Added' ,
category : 'Transactions' ,
2021-07-13 00:30:35 +02:00
properties : {
2021-06-24 21:00:54 +02:00
chain _id : '0x2a' ,
2021-07-13 00:30:35 +02:00
network : '42' ,
referrer : 'metamask' ,
source : 'user' ,
type : 'sentEther' ,
} ,
sensitiveProperties : {
2021-07-12 19:54:39 +02:00
gas _price : '2' ,
2021-06-29 23:54:42 +02:00
gas _limit : '0x7b0d' ,
2021-06-24 21:00:54 +02:00
first _seen : 1624408066355 ,
2021-06-29 23:54:42 +02:00
transaction _envelope _type : 'legacy' ,
2021-06-24 21:00:54 +02:00
status : 'unapproved' ,
} ,
} ;
txController . _trackTransactionMetricsEvent (
txMeta ,
TRANSACTION _EVENTS . ADDED ,
) ;
assert . equal ( trackMetaMetricsEventSpy . callCount , 1 ) ;
assert . deepEqual (
trackMetaMetricsEventSpy . getCall ( 0 ) . args [ 0 ] ,
expectedPayload ,
) ;
} ) ;
it ( 'should call _trackMetaMetricsEvent with the correct payload (dapp source)' , function ( ) {
const txMeta = {
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
txParams : {
from : fromAccount . address ,
to : '0x1678a085c290ebd122dc42cba69373b5953b831d' ,
gasPrice : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
type : 'sentEther' ,
origin : 'other' ,
chainId : currentChainId ,
time : 1624408066355 ,
metamaskNetworkId : currentNetworkId ,
} ;
const expectedPayload = {
event : 'Transaction Added' ,
category : 'Transactions' ,
2021-07-13 00:30:35 +02:00
properties : {
2021-06-24 21:00:54 +02:00
chain _id : '0x2a' ,
2021-07-13 00:30:35 +02:00
network : '42' ,
referrer : 'other' ,
source : 'dapp' ,
type : 'sentEther' ,
} ,
sensitiveProperties : {
2021-07-12 19:54:39 +02:00
gas _price : '2' ,
2021-06-29 23:54:42 +02:00
gas _limit : '0x7b0d' ,
2021-06-24 21:00:54 +02:00
first _seen : 1624408066355 ,
2021-06-29 23:54:42 +02:00
transaction _envelope _type : 'legacy' ,
2021-06-24 21:00:54 +02:00
status : 'unapproved' ,
} ,
} ;
txController . _trackTransactionMetricsEvent (
txMeta ,
TRANSACTION _EVENTS . ADDED ,
) ;
assert . equal ( trackMetaMetricsEventSpy . callCount , 1 ) ;
assert . deepEqual (
trackMetaMetricsEventSpy . getCall ( 0 ) . args [ 0 ] ,
expectedPayload ,
) ;
} ) ;
it ( 'should call _trackMetaMetricsEvent with the correct payload (extra params)' , function ( ) {
const txMeta = {
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
txParams : {
from : fromAccount . address ,
to : '0x1678a085c290ebd122dc42cba69373b5953b831d' ,
gasPrice : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
type : 'sentEther' ,
origin : 'other' ,
chainId : currentChainId ,
time : 1624408066355 ,
metamaskNetworkId : currentNetworkId ,
} ;
const expectedPayload = {
event : 'Transaction Added' ,
category : 'Transactions' ,
2021-07-13 00:30:35 +02:00
properties : {
network : '42' ,
referrer : 'other' ,
source : 'dapp' ,
type : 'sentEther' ,
chain _id : '0x2a' ,
} ,
2021-06-24 21:00:54 +02:00
sensitiveProperties : {
baz : 3.0 ,
foo : 'bar' ,
2021-07-12 19:54:39 +02:00
gas _price : '2' ,
2021-06-29 23:54:42 +02:00
gas _limit : '0x7b0d' ,
first _seen : 1624408066355 ,
transaction _envelope _type : 'legacy' ,
status : 'unapproved' ,
} ,
} ;
txController . _trackTransactionMetricsEvent (
txMeta ,
TRANSACTION _EVENTS . ADDED ,
{
baz : 3.0 ,
foo : 'bar' ,
} ,
) ;
assert . equal ( trackMetaMetricsEventSpy . callCount , 1 ) ;
assert . deepEqual (
trackMetaMetricsEventSpy . getCall ( 0 ) . args [ 0 ] ,
expectedPayload ,
) ;
} ) ;
it ( 'should call _trackMetaMetricsEvent with the correct payload (EIP-1559)' , function ( ) {
const txMeta = {
id : 1 ,
status : TRANSACTION _STATUSES . UNAPPROVED ,
txParams : {
from : fromAccount . address ,
to : '0x1678a085c290ebd122dc42cba69373b5953b831d' ,
maxFeePerGas : '0x77359400' ,
maxPriorityFeePerGas : '0x77359400' ,
gas : '0x7b0d' ,
nonce : '0x4b' ,
} ,
type : 'sentEther' ,
origin : 'other' ,
chainId : currentChainId ,
time : 1624408066355 ,
metamaskNetworkId : currentNetworkId ,
} ;
const expectedPayload = {
event : 'Transaction Added' ,
category : 'Transactions' ,
2021-07-13 00:30:35 +02:00
properties : {
chain _id : '0x2a' ,
network : '42' ,
referrer : 'other' ,
source : 'dapp' ,
type : 'sentEther' ,
} ,
2021-06-29 23:54:42 +02:00
sensitiveProperties : {
baz : 3.0 ,
foo : 'bar' ,
2021-07-12 19:54:39 +02:00
max _fee _per _gas : '2' ,
max _priority _fee _per _gas : '2' ,
2021-06-29 23:54:42 +02:00
gas _limit : '0x7b0d' ,
2021-06-24 21:00:54 +02:00
first _seen : 1624408066355 ,
2021-06-29 23:54:42 +02:00
transaction _envelope _type : 'fee-market' ,
2021-06-24 21:00:54 +02:00
status : 'unapproved' ,
} ,
} ;
txController . _trackTransactionMetricsEvent (
txMeta ,
TRANSACTION _EVENTS . ADDED ,
{
baz : 3.0 ,
foo : 'bar' ,
} ,
) ;
assert . equal ( trackMetaMetricsEventSpy . callCount , 1 ) ;
assert . deepEqual (
trackMetaMetricsEventSpy . getCall ( 0 ) . args [ 0 ] ,
expectedPayload ,
) ;
} ) ;
} ) ;
2021-07-12 19:14:54 +02:00
describe ( '#_getTransactionCompletionTime' , function ( ) {
let nowStub ;
beforeEach ( function ( ) {
nowStub = sinon . stub ( Date , 'now' ) . returns ( 1625782016341 ) ;
} ) ;
afterEach ( function ( ) {
nowStub . restore ( ) ;
} ) ;
it ( 'calculates completion time (one)' , function ( ) {
const submittedTime = 1625781997397 ;
const result = txController . _getTransactionCompletionTime ( submittedTime ) ;
assert . equal ( result , '19' ) ;
} ) ;
it ( 'calculates completion time (two)' , function ( ) {
const submittedTime = 1625781995397 ;
const result = txController . _getTransactionCompletionTime ( submittedTime ) ;
assert . equal ( result , '21' ) ;
} ) ;
} ) ;
2021-07-12 19:54:39 +02:00
describe ( '#_getGasValuesInGWEI' , function ( ) {
it ( 'converts gas values in hex GWEi to dec GWEI (EIP-1559)' , function ( ) {
const params = {
max _fee _per _gas : '0x77359400' ,
max _priority _fee _per _gas : '0x77359400' ,
} ;
const expectedParams = {
max _fee _per _gas : '2' ,
max _priority _fee _per _gas : '2' ,
} ;
const result = txController . _getGasValuesInGWEI ( params ) ;
assert . deepEqual ( result , expectedParams ) ;
} ) ;
it ( 'converts gas values in hex GWEi to dec GWEI (non EIP-1559)' , function ( ) {
const params = {
gas _price : '0x37e11d600' ,
} ;
const expectedParams = {
gas _price : '15' ,
} ;
const result = txController . _getGasValuesInGWEI ( params ) ;
assert . deepEqual ( result , expectedParams ) ;
} ) ;
} ) ;
2021-02-04 19:15:23 +01:00
} ) ;