Skip to content

Commit a40bd4c

Browse files
committed
Add Relay strategy
1 parent cc4c03a commit a40bd4c

24 files changed

+675
-53
lines changed

packages/transaction-controller/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
"@metamask/gas-fee-controller": "^24.1.0",
8080
"@metamask/network-controller": "^24.2.1",
8181
"@metamask/remote-feature-flag-controller": "^1.8.0",
82+
"@ts-bridge/cli": "^0.6.1",
8283
"@types/bn.js": "^5.1.5",
8384
"@types/jest": "^27.4.1",
8485
"@types/node": "^16.18.54",

packages/transaction-controller/src/helpers/PendingTransactionTracker.ts

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,12 @@ export class PendingTransactionTracker {
382382
}
383383

384384
async #checkTransaction(txMeta: TransactionMeta) {
385-
const { hash, id } = txMeta;
385+
const { hash, id, isIntentComplete } = txMeta;
386+
387+
if (isIntentComplete) {
388+
await this.#onTransactionConfirmed(txMeta);
389+
return;
390+
}
386391

387392
if (!hash && (await this.#beforeCheckPendingTransaction(txMeta))) {
388393
const error = new Error(
@@ -450,10 +455,10 @@ export class PendingTransactionTracker {
450455

451456
async #onTransactionConfirmed(
452457
txMeta: TransactionMeta,
453-
receipt: SuccessfulTransactionReceipt,
458+
receipt?: SuccessfulTransactionReceipt,
454459
) {
455460
const { id } = txMeta;
456-
const { blockHash } = receipt;
461+
const { blockHash } = receipt ?? {};
457462

458463
this.#log('Transaction confirmed', id);
459464

@@ -463,19 +468,23 @@ export class PendingTransactionTracker {
463468
return;
464469
}
465470

466-
const { baseFeePerGas, timestamp: blockTimestamp } =
467-
await this.#getBlockByHash(blockHash, false);
468-
469471
const updatedTxMeta = cloneDeep(txMeta);
470-
updatedTxMeta.baseFeePerGas = baseFeePerGas;
471-
updatedTxMeta.blockTimestamp = blockTimestamp;
472+
473+
if (receipt && blockHash) {
474+
const { baseFeePerGas, timestamp: blockTimestamp } =
475+
await this.#getBlockByHash(blockHash, false);
476+
477+
updatedTxMeta.baseFeePerGas = baseFeePerGas;
478+
updatedTxMeta.blockTimestamp = blockTimestamp;
479+
updatedTxMeta.txParams = {
480+
...updatedTxMeta.txParams,
481+
gasUsed: receipt.gasUsed,
482+
};
483+
updatedTxMeta.txReceipt = receipt;
484+
updatedTxMeta.verifiedOnBlockchain = true;
485+
}
486+
472487
updatedTxMeta.status = TransactionStatus.confirmed;
473-
updatedTxMeta.txParams = {
474-
...updatedTxMeta.txParams,
475-
gasUsed: receipt.gasUsed,
476-
};
477-
updatedTxMeta.txReceipt = receipt;
478-
updatedTxMeta.verifiedOnBlockchain = true;
479488

480489
this.#updateTransaction(
481490
updatedTxMeta,

packages/transaction-controller/src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@ export type TransactionMeta = {
268268
/** Whether MetaMask will be compensated for the gas fee by the transaction. */
269269
isGasFeeIncluded?: boolean;
270270

271+
/** Whether the intent of the transaction was achieved via an alternate route or chain. */
272+
isIntentComplete?: boolean;
273+
271274
/**
272275
* Whether the transaction is an incoming token transfer.
273276
*/

packages/transaction-pay-controller/src/TransactionPayController.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,15 @@ describe('TransactionPayController', () => {
6767
});
6868

6969
describe('getStrategy Action', () => {
70-
it('returns bridge if no callback', async () => {
70+
it('returns relay if no callback', async () => {
7171
createController();
7272

7373
expect(
7474
await messenger.call(
7575
'TransactionPayController:getStrategy',
7676
TRANSACTION_META_MOCK,
7777
),
78-
).toBe(TransactionPayStrategy.Bridge);
78+
).toBe(TransactionPayStrategy.Relay);
7979
});
8080

8181
it('returns callback value if provided', async () => {

packages/transaction-pay-controller/src/TransactionPayController.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export class TransactionPayController extends BaseController<
123123
#registerActionHandlers() {
124124
this.messagingSystem.registerActionHandler(
125125
'TransactionPayController:getStrategy',
126-
this.#getStrategy ?? (async () => TransactionPayStrategy.Bridge),
126+
this.#getStrategy ?? (async () => TransactionPayStrategy.Relay),
127127
);
128128
}
129129
}

packages/transaction-pay-controller/src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ export const CONTROLLER_NAME = 'TransactionPayController';
22

33
export enum TransactionPayStrategy {
44
Bridge = 'bridge',
5+
Relay = 'relay',
56
Test = 'test',
67
}

packages/transaction-pay-controller/src/helpers/TransactionPayPublishHook.test.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import type { TransactionMeta } from '@metamask/transaction-controller';
55
import type { TransactionControllerUnapprovedTransactionAddedEvent } from '@metamask/transaction-controller';
66

77
import { TransactionPayPublishHook } from './TransactionPayPublishHook';
8-
import type { TransactionPayPublishHookMessenger } from './TransactionPayPublishHook';
98
import { TransactionPayStrategy } from '../constants';
109
import { TestStrategy } from '../strategy/test/TestStrategy';
1110
import type {
1211
TransactionPayControllerGetStateAction,
12+
TransactionPayPublishHookMessenger,
1313
TransactionPayQuote,
1414
} from '../types';
1515

@@ -100,12 +100,6 @@ describe('TransactionPayPublishHook', () => {
100100
expect(executeMock).not.toHaveBeenCalled();
101101
});
102102

103-
it('returns empty result', async () => {
104-
const result = await runHook();
105-
106-
expect(result).toStrictEqual({ transactionHash: undefined });
107-
});
108-
109103
it('throws errors from submit', async () => {
110104
executeMock.mockRejectedValue(new Error('Test error'));
111105

packages/transaction-pay-controller/src/helpers/TransactionPayPublishHook.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
import type { Messenger } from '@metamask/base-controller';
2-
import type { BridgeStatusControllerStateChangeEvent } from '@metamask/bridge-status-controller';
3-
import type { BridgeStatusControllerActions } from '@metamask/bridge-status-controller';
4-
import type { TransactionControllerUnapprovedTransactionAddedEvent } from '@metamask/transaction-controller';
51
import type { PublishHook } from '@metamask/transaction-controller';
62
import type { TransactionMeta } from '@metamask/transaction-controller';
73
import type { PublishHookResult } from '@metamask/transaction-controller';
@@ -10,8 +6,7 @@ import { createModuleLogger } from '@metamask/utils';
106

117
import { projectLogger } from '../logger';
128
import type {
13-
TransactionPayControllerGetStateAction,
14-
TransactionPayControllerGetStrategyAction,
9+
TransactionPayPublishHookMessenger,
1510
TransactionPayQuote,
1611
} from '../types';
1712
import { getStrategy } from '../utils/strategy';
@@ -22,14 +17,6 @@ const EMPTY_RESULT = {
2217
transactionHash: undefined,
2318
};
2419

25-
export type TransactionPayPublishHookMessenger = Messenger<
26-
| BridgeStatusControllerActions
27-
| TransactionPayControllerGetStateAction
28-
| TransactionPayControllerGetStrategyAction,
29-
| BridgeStatusControllerStateChangeEvent
30-
| TransactionControllerUnapprovedTransactionAddedEvent
31-
>;
32-
3320
export class TransactionPayPublishHook {
3421
readonly #isSmartTransaction: (chainId: Hex) => boolean;
3522

@@ -83,13 +70,11 @@ export class TransactionPayPublishHook {
8370

8471
const strategy = await getStrategy(this.#messenger, transactionMeta);
8572

86-
await strategy.execute({
73+
return await strategy.execute({
8774
isSmartTransaction: this.#isSmartTransaction,
8875
quotes,
8976
messenger: this.#messenger,
9077
transaction: transactionMeta,
9178
});
92-
93-
return EMPTY_RESULT;
9479
}
9580
}

packages/transaction-pay-controller/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ export type {
44
TransactionPayControllerState,
55
TransactionPayControllerStateChangeEvent,
66
TransactionPaymentToken,
7+
TransactionPayPublishHookMessenger,
78
TransactionPayQuote,
89
TransactionPayTotals,
910
TransactionToken,
1011
} from './types';
1112
export { TransactionPayController } from './TransactionPayController';
12-
export type { TransactionPayPublishHookMessenger } from './helpers/TransactionPayPublishHook';
1313
export { TransactionPayPublishHook } from './helpers/TransactionPayPublishHook';

packages/transaction-pay-controller/src/strategy/bridge/BridgeStrategy.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,7 @@ export class BridgeStrategy implements PayStrategy<QuoteResponse> {
2828
quotes,
2929
updateTransaction: noop,
3030
});
31+
32+
return { transactionHash: undefined };
3133
}
3234
}

0 commit comments

Comments
 (0)