Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support transactions from account snaps that should not be published #5045

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
8 changes: 1 addition & 7 deletions eslint-warning-thresholds.json
Original file line number Diff line number Diff line change
Expand Up @@ -570,16 +570,10 @@
"packages/transaction-controller/src/TransactionController.test.ts": {
"@typescript-eslint/no-unused-vars": 1,
"import-x/namespace": 1,
"import-x/order": 4,
"jsdoc/tag-lines": 1,
"promise/always-return": 2
},
"packages/transaction-controller/src/TransactionController.ts": {
"@typescript-eslint/prefer-readonly": 11,
"jsdoc/check-tag-names": 35,
"jsdoc/require-returns": 5,
"jsdoc/tag-lines": 1,
"prettier/prettier": 1,
"no-unused-private-class-members": 1
},
"packages/transaction-controller/src/TransactionControllerIntegration.test.ts": {
Expand Down Expand Up @@ -663,7 +657,7 @@
"jsdoc/tag-lines": 3
},
"packages/transaction-controller/src/helpers/PendingTransactionTracker.ts": {
"@typescript-eslint/prefer-readonly": 12
"@typescript-eslint/prefer-readonly": 11
},
"packages/transaction-controller/src/helpers/TransactionPoller.test.ts": {
"import-x/order": 1,
Expand Down
152 changes: 112 additions & 40 deletions packages/transaction-controller/src/TransactionController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,6 @@ import { createDeferredPromise } from '@metamask/utils';
import assert from 'assert';
import * as uuidModule from 'uuid';

import { FakeBlockTracker } from '../../../tests/fake-block-tracker';
import { FakeProvider } from '../../../tests/fake-provider';
import { flushPromises } from '../../../tests/helpers';
import {
buildCustomNetworkClientConfiguration,
buildMockGetNetworkClientById,
} from '../../network-controller/tests/helpers';
import { getAccountAddressRelationship } from './api/accounts-api';
import { CHAIN_IDS } from './constants';
import { DefaultGasFeeFlow } from './gas-flows/DefaultGasFeeFlow';
Expand Down Expand Up @@ -92,6 +85,13 @@ import {
updatePostTransactionBalance,
updateSwapsTransaction,
} from './utils/swaps';
import { FakeBlockTracker } from '../../../tests/fake-block-tracker';
import { FakeProvider } from '../../../tests/fake-provider';
import { flushPromises } from '../../../tests/helpers';
import {
buildCustomNetworkClientConfiguration,
buildMockGetNetworkClientById,
} from '../../network-controller/tests/helpers';

type UnrestrictedMessenger = Messenger<
TransactionControllerActions | AllowedActions,
Expand Down Expand Up @@ -273,6 +273,7 @@ function buildMockBlockTracker(

/**
* Builds a mock gas fee flow.
*
* @returns The mocked gas fee flow.
*/
function buildMockGasFeeFlow(): jest.Mocked<GasFeeFlow> {
Expand Down Expand Up @@ -1369,7 +1370,7 @@ describe('TransactionController', () => {
const mockOrigin = 'origin';
const mockSecurityAlertResponse = {
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention

result_type: 'Malicious',
reason: 'blur_farming',
description:
Expand Down Expand Up @@ -4164,7 +4165,7 @@ describe('TransactionController', () => {
const value = 123;

// TODO: Replace `any` with type
// eslint-disable-next-line @typescript-eslint/no-explicit-any

incomingTransactionHelperClassMock.mock.calls[0][0].updateCache(
(cache) => {
cache[key] = value;
Expand Down Expand Up @@ -4465,23 +4466,23 @@ describe('TransactionController', () => {
};

// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention

const duplicate_1 = {
...confirmed,
id: 'testId2',
status: TransactionStatus.submitted,
};

// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention

const duplicate_2 = {
...duplicate_1,
id: 'testId3',
status: TransactionStatus.approved,
};

// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention

const duplicate_3 = {
...duplicate_1,
id: 'testId4',
Expand Down Expand Up @@ -4884,7 +4885,7 @@ describe('TransactionController', () => {
options: {
hooks: {
afterSign: () => false,
beforePublish: () => false,
beforePublish: () => Promise.resolve(false),
getAdditionalSignArguments: () => [metadataMock],
},
},
Expand Down Expand Up @@ -4926,7 +4927,7 @@ describe('TransactionController', () => {
options: {
hooks: {
afterSign: () => false,
beforePublish: () => false,
beforePublish: () => Promise.resolve(false),
getAdditionalSignArguments: () => [metadataMock],
},
// @ts-expect-error sign intentionally returns undefined
Expand Down Expand Up @@ -5104,7 +5105,7 @@ describe('TransactionController', () => {
controller.updateSecurityAlertResponse(transactionMeta.id, {
reason: 'NA',
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention

result_type: 'Benign',
});

Expand All @@ -5127,7 +5128,7 @@ describe('TransactionController', () => {
controller.updateSecurityAlertResponse(undefined, {
reason: 'NA',
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention

result_type: 'Benign',
}),
).toThrow(
Expand Down Expand Up @@ -5195,7 +5196,7 @@ describe('TransactionController', () => {
controller.updateSecurityAlertResponse('456', {
reason: 'NA',
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention

result_type: 'Benign',
}),
).toThrow(
Expand Down Expand Up @@ -5226,7 +5227,6 @@ describe('TransactionController', () => {
};
transactionMeta = {
...baseTransaction,
custodyId: '123',
history: [{ ...baseTransaction }],
};
});
Expand Down Expand Up @@ -5309,7 +5309,7 @@ describe('TransactionController', () => {
);

it('updates transaction hash', async () => {
const newHash = '1234';
const newHash = '0x1234';
const { controller } = setupController({
options: {
state: {
Expand All @@ -5328,40 +5328,112 @@ describe('TransactionController', () => {
expect(updatedTransaction.hash).toStrictEqual(newHash);
});

it('throws if custodial transaction does not exists', async () => {
const nonExistentId = 'nonExistentId';
const newStatus = TransactionStatus.approved as const;
const { controller } = setupController();
it('updates gasLimit', async () => {
const newGasLimit = '0x1234';
const { controller } = setupController({
options: {
state: { transactions: [transactionMeta] },
},
updateToInitialState: true,
});

expect(() =>
controller.updateCustodialTransaction(nonExistentId, {
status: newStatus,
}),
).toThrow(
'Cannot update custodial transaction as no transaction metadata found',
controller.updateCustodialTransaction(transactionId, {
gasLimit: newGasLimit,
});

const updatedTransaction = controller.state.transactions[0];

expect(updatedTransaction.txParams.gasLimit).toStrictEqual(newGasLimit);
});

it('updates gasPrice', async () => {
const newGasPrice = '0x1234';
const { controller } = setupController({
options: {
state: { transactions: [transactionMeta] },
},
updateToInitialState: true,
});

controller.updateCustodialTransaction(transactionId, {
gasPrice: newGasPrice,
});

const updatedTransaction = controller.state.transactions[0];

expect(updatedTransaction.txParams.gasPrice).toStrictEqual(newGasPrice);
});

it('updates maxFeePerGas', async () => {
const newMaxFeePerGas = '0x1234';
const { controller } = setupController({
options: {
state: { transactions: [transactionMeta] },
},
updateToInitialState: true,
});

controller.updateCustodialTransaction(transactionId, {
maxFeePerGas: newMaxFeePerGas,
});

const updatedTransaction = controller.state.transactions[0];

expect(updatedTransaction.txParams.maxFeePerGas).toStrictEqual(
newMaxFeePerGas,
);
});

it('throws if transaction is not a custodial transaction', async () => {
const nonCustodialTransaction: TransactionMeta = {
...baseTransaction,
history: [{ ...baseTransaction }],
};
const newStatus = TransactionStatus.approved as const;
it('updates maxPriorityFeePerGas', async () => {
const newMaxPriorityFeePerGas = '0x1234';
const { controller } = setupController({
options: {
state: {
transactions: [nonCustodialTransaction],
},
state: { transactions: [transactionMeta] },
},
updateToInitialState: true,
});

controller.updateCustodialTransaction(transactionId, {
maxPriorityFeePerGas: newMaxPriorityFeePerGas,
});

const updatedTransaction = controller.state.transactions[0];

expect(updatedTransaction.txParams.maxPriorityFeePerGas).toStrictEqual(
newMaxPriorityFeePerGas,
);
});

it('updates nonce', async () => {
const newNonce = '0x1234';
const { controller } = setupController({
options: {
state: { transactions: [transactionMeta] },
},
updateToInitialState: true,
});

controller.updateCustodialTransaction(transactionId, {
nonce: newNonce,
});

const updatedTransaction = controller.state.transactions[0];

expect(updatedTransaction.txParams.nonce).toStrictEqual(newNonce);
});

it('throws if custodial transaction does not exists', async () => {
const nonExistentId = 'nonExistentId';
const newStatus = TransactionStatus.approved as const;
const { controller } = setupController();

expect(() =>
controller.updateCustodialTransaction(nonCustodialTransaction.id, {
controller.updateCustodialTransaction(nonExistentId, {
status: newStatus,
}),
).toThrow('Transaction must be a custodian transaction');
).toThrow(
'Cannot update custodial transaction as no transaction metadata found',
);
});

it('throws if status is invalid', async () => {
Expand Down
Loading
Loading