Skip to content

Commit ed1dd54

Browse files
authored
feat: add support for signed transactions with metadata in SmartTransactionsController (#557)
- Introduced new types: SentinelMeta and SignedTransactionWithMetadata. - Updated SmartTransactionsController to handle signed transactions with metadata. - Enhanced tests to verify inclusion and omission of rawTxsWithMetadata in request body based on provided data.
1 parent dcc0c1d commit ed1dd54

4 files changed

Lines changed: 86 additions & 0 deletions

File tree

src/SmartTransactionsController.test.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type {
2424
import {
2525
type TransactionParams,
2626
TransactionStatus,
27+
TransactionType,
2728
} from '@metamask/transaction-controller';
2829
import type { Hex } from '@metamask/utils';
2930
import nock from 'nock';
@@ -1493,6 +1494,75 @@ describe('SmartTransactionsController', () => {
14931494
});
14941495
});
14951496

1497+
it('includes signedTransactionsWithMetadata in request body as rawTxsWithMetadata', async () => {
1498+
await withController(async ({ controller }) => {
1499+
const signedTransaction = createSignedTransaction();
1500+
const submitTransactionsApiResponse =
1501+
createSubmitTransactionsApiResponse();
1502+
1503+
const signedTransactionsWithMetadata = [
1504+
{
1505+
tx: signedTransaction,
1506+
metadata: {
1507+
txType: TransactionType.swap,
1508+
},
1509+
},
1510+
];
1511+
1512+
let requestBody: any;
1513+
nock(API_BASE_URL)
1514+
.post(
1515+
`/networks/${ethereumChainIdDec}/submitTransactions?stxControllerVersion=${packageJson.version}`,
1516+
(body) => {
1517+
requestBody = body;
1518+
return true;
1519+
},
1520+
)
1521+
.reply(200, submitTransactionsApiResponse);
1522+
1523+
await controller.submitSignedTransactions({
1524+
signedTransactions: [signedTransaction],
1525+
signedTransactionsWithMetadata,
1526+
txParams: createTxParams(),
1527+
});
1528+
1529+
// Verify the request includes rawTxsWithMetadata
1530+
expect(requestBody).toBeDefined();
1531+
expect(requestBody.rawTxsWithMetadata).toStrictEqual(
1532+
signedTransactionsWithMetadata,
1533+
);
1534+
});
1535+
});
1536+
1537+
it('omits rawTxsWithMetadata from request body when signedTransactionsWithMetadata is not provided', async () => {
1538+
await withController(async ({ controller }) => {
1539+
const signedTransaction = createSignedTransaction();
1540+
const submitTransactionsApiResponse =
1541+
createSubmitTransactionsApiResponse();
1542+
1543+
let requestBody: any;
1544+
nock(API_BASE_URL)
1545+
.post(
1546+
`/networks/${ethereumChainIdDec}/submitTransactions?stxControllerVersion=${packageJson.version}`,
1547+
(body) => {
1548+
requestBody = body;
1549+
return true;
1550+
},
1551+
)
1552+
.reply(200, submitTransactionsApiResponse);
1553+
1554+
await controller.submitSignedTransactions({
1555+
signedTransactions: [signedTransaction],
1556+
txParams: createTxParams(),
1557+
// signedTransactionsWithMetadata not provided
1558+
});
1559+
1560+
// Verify the request does not include rawTxsWithMetadata
1561+
expect(requestBody).toBeDefined();
1562+
expect(requestBody.rawTxsWithMetadata).toBeUndefined();
1563+
});
1564+
});
1565+
14961566
it('works without txParams', async () => {
14971567
await withController(async ({ controller }) => {
14981568
const signedTransaction = createSignedTransaction();

src/SmartTransactionsController.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import type {
5252
IndividualTxFees,
5353
SignedCanceledTransaction,
5454
SignedTransaction,
55+
SignedTransactionWithMetadata,
5556
SmartTransaction,
5657
SmartTransactionsStatus,
5758
UnsignedTransaction,
@@ -903,10 +904,12 @@ export class SmartTransactionsController extends StaticIntervalPollingController
903904
txParams,
904905
signedTransactions,
905906
signedCanceledTransactions = [],
907+
signedTransactionsWithMetadata,
906908
networkClientId,
907909
}: {
908910
signedTransactions: SignedTransaction[];
909911
signedCanceledTransactions?: SignedCanceledTransaction[];
912+
signedTransactionsWithMetadata?: SignedTransactionWithMetadata[];
910913
transactionMeta?: TransactionMeta;
911914
txParams?: TransactionParams;
912915
networkClientId?: NetworkClientId;
@@ -930,6 +933,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
930933
body: JSON.stringify({
931934
rawTxs: signedTransactions,
932935
rawCancelTxs: signedCanceledTransactions,
936+
rawTxsWithMetadata: signedTransactionsWithMetadata,
933937
}),
934938
},
935939
),

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export {
1515
type IndividualTxFees,
1616
type FeatureFlags,
1717
type SmartTransaction,
18+
type SentinelMeta,
19+
type SignedTransactionWithMetadata,
1820
type SmartTransactionsNetworkConfig,
1921
type SmartTransactionsFeatureFlagsConfig,
2022
SmartTransactionMinedTx,

src/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import type { NetworkClientId } from '@metamask/network-controller';
2+
import type { TransactionType } from '@metamask/transaction-controller';
23
import type { CaipChainId, Hex } from '@metamask/utils';
34

45
import type { SmartTransactionsNetworkConfig } from './featureFlags';
56

7+
export type SentinelMeta = {
8+
txType?: TransactionType;
9+
};
10+
611
/** API */
712
export enum APIType {
813
'GET_FEES',
@@ -126,6 +131,11 @@ export type UnsignedTransaction = any;
126131
// TODO
127132
export type SignedTransaction = any;
128133

134+
export type SignedTransactionWithMetadata = {
135+
tx: string;
136+
metadata?: SentinelMeta;
137+
};
138+
129139
// TODO
130140
export type SignedCanceledTransaction = any;
131141

0 commit comments

Comments
 (0)