Skip to content

Commit 454987d

Browse files
committed
feat(STX-433): add try catch block to make sure result is returned
1 parent 183dade commit 454987d

3 files changed

Lines changed: 181 additions & 22 deletions

File tree

app/scripts/messenger-client-init/confirmations/transaction-controller-init.test.ts

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,98 @@ describe('Transaction Controller Init', () => {
582582
properties: { transaction_submission_method: 'sentinel_stx' },
583583
});
584584
});
585+
586+
it('returns transaction hash even if upsertTransactionUIMetricsFragment throws on sentinel_relay path', async () => {
587+
const delegation7702HookFn: jest.MockedFn<PublishHook> = jest.fn();
588+
delegation7702HookFn.mockResolvedValue({ transactionHash: '0xdelHash' });
589+
jest.mocked(Delegation7702PublishHook).mockImplementation(
590+
() =>
591+
({
592+
getHook: () => delegation7702HookFn,
593+
}) as unknown as Delegation7702PublishHook,
594+
);
595+
596+
type PHArgs = Parameters<typeof publishHook>[0];
597+
const result = await publishHook({
598+
flatState: {} as PHArgs['flatState'],
599+
getTransactionMetricsRequest: () =>
600+
({
601+
upsertTransactionUIMetricsFragment: jest
602+
.fn()
603+
.mockImplementation(() => {
604+
throw new Error('metrics error');
605+
}),
606+
}) as unknown as ReturnType<PHArgs['getTransactionMetricsRequest']>,
607+
initMessenger: {
608+
call: jest.fn(),
609+
} as unknown as TransactionControllerInitMessenger,
610+
keyringController: {
611+
getKeyringForAccount: jest
612+
.fn()
613+
.mockResolvedValue({ type: 'HD Key Tree' }),
614+
},
615+
signedTx: '0xsigned',
616+
smartTransactionsController:
617+
{} as PHArgs['smartTransactionsController'],
618+
transactionController: {
619+
isAtomicBatchSupported: jest.fn(),
620+
} as unknown as PHArgs['transactionController'],
621+
transactionMeta: {
622+
...mockTransactionMeta,
623+
isExternalSign: true,
624+
} as TransactionMeta,
625+
});
626+
627+
expect(result).toStrictEqual({ transactionHash: '0xdelHash' });
628+
});
629+
630+
it('returns transaction hash even if upsertTransactionUIMetricsFragment throws on sentinel_stx path', async () => {
631+
jest
632+
.mocked(smartTransactionsModule.getSmartTransactionCommonParams)
633+
.mockReturnValue({
634+
isSmartTransaction: true,
635+
featureFlags: {
636+
extensionReturnTxHashAsap: false,
637+
extensionReturnTxHashAsapBatch: false,
638+
extensionSkipSmartTransactionStatusPage: false,
639+
mobileActive: false,
640+
extensionActive: false,
641+
},
642+
isHardwareWalletAccount: false,
643+
});
644+
645+
jest
646+
.mocked(smartTransactionsModule.submitSmartTransactionHook)
647+
.mockResolvedValue({ transactionHash: '0xstxHash' });
648+
649+
type PHArgs = Parameters<typeof publishHook>[0];
650+
const result = await publishHook({
651+
flatState: {} as PHArgs['flatState'],
652+
getTransactionMetricsRequest: () =>
653+
({
654+
upsertTransactionUIMetricsFragment: jest
655+
.fn()
656+
.mockImplementation(() => {
657+
throw new Error('metrics error');
658+
}),
659+
}) as unknown as ReturnType<PHArgs['getTransactionMetricsRequest']>,
660+
initMessenger: {
661+
call: jest.fn(),
662+
} as unknown as TransactionControllerInitMessenger,
663+
keyringController: {
664+
getKeyringForAccount: jest
665+
.fn()
666+
.mockResolvedValue({ type: 'Ledger Hardware' }),
667+
},
668+
signedTx: '0xsigned',
669+
smartTransactionsController:
670+
{} as PHArgs['smartTransactionsController'],
671+
transactionController: {} as PHArgs['transactionController'],
672+
transactionMeta: mockTransactionMeta,
673+
});
674+
675+
expect(result).toStrictEqual({ transactionHash: '0xstxHash' });
676+
});
585677
});
586678

587679
describe('publishBatch hook', () => {
@@ -743,5 +835,53 @@ describe('Transaction Controller Init', () => {
743835

744836
expect(upsertFragmentMock).not.toHaveBeenCalled();
745837
});
838+
839+
it('returns the result even if upsertTransactionUIMetricsFragment throws', async () => {
840+
jest
841+
.mocked(smartTransactionsModule.getSmartTransactionCommonParams)
842+
.mockReturnValue({
843+
isSmartTransaction: true,
844+
featureFlags: {
845+
extensionReturnTxHashAsap: false,
846+
extensionReturnTxHashAsapBatch: false,
847+
extensionSkipSmartTransactionStatusPage: false,
848+
mobileActive: false,
849+
extensionActive: false,
850+
},
851+
isHardwareWalletAccount: false,
852+
});
853+
854+
const expectedResult = { results: [] };
855+
jest
856+
.mocked(smartTransactionsModule.submitBatchSmartTransactionHook)
857+
.mockResolvedValue(expectedResult);
858+
859+
const requestMock = buildInitRequestMock();
860+
requestMock.getTransactionMetricsRequest.mockReturnValue({
861+
upsertTransactionUIMetricsFragment: jest.fn().mockImplementation(() => {
862+
throw new Error('metrics error');
863+
}),
864+
} as unknown as ReturnType<
865+
typeof requestMock.getTransactionMetricsRequest
866+
>);
867+
868+
TransactionControllerInit(requestMock);
869+
870+
const { hooks } = transactionControllerClassMock.mock.calls[0][0];
871+
const controllerInstance =
872+
transactionControllerClassMock.mock.instances[0];
873+
// @ts-expect-error Partial mock state
874+
controllerInstance.state = {
875+
transactions: [mockTransactionMeta],
876+
};
877+
878+
const result = await hooks?.publishBatch?.({
879+
transactions: [
880+
{ id: 'batch-tx-last' } as unknown as PublishBatchHookTransaction,
881+
],
882+
} as unknown as PublishBatchHookRequest);
883+
884+
expect(result).toStrictEqual(expectedResult);
885+
});
746886
});
747887
});

app/scripts/messenger-client-init/confirmations/transaction-controller-init.ts

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,19 @@ export const TransactionControllerInit: ControllerInitFunction<
235235
getTransactionMetricsRequest();
236236
for (const batchTx of _request.transactions) {
237237
if (batchTx.id) {
238-
upsertTransactionUIMetricsFragment(batchTx.id, {
239-
properties: {
240-
[TRANSACTION_SUBMISSION_METHOD_METRIC_NAME]:
241-
TRANSACTION_SUBMISSION_METHOD.SENTINEL_STX,
242-
},
243-
});
238+
try {
239+
upsertTransactionUIMetricsFragment(batchTx.id, {
240+
properties: {
241+
[TRANSACTION_SUBMISSION_METHOD_METRIC_NAME]:
242+
TRANSACTION_SUBMISSION_METHOD.SENTINEL_STX,
243+
},
244+
});
245+
} catch (e) {
246+
console.error(
247+
'Failed to record sentinel_stx metrics fragment for batch tx',
248+
e,
249+
);
250+
}
244251
}
245252
}
246253
}
@@ -442,15 +449,19 @@ export async function publishHook({
442449

443450
const result = await hook(transactionMeta, signedTx);
444451
if (result?.transactionHash) {
445-
getTransactionMetricsRequest().upsertTransactionUIMetricsFragment(
446-
transactionMeta.id,
447-
{
448-
properties: {
449-
[TRANSACTION_SUBMISSION_METHOD_METRIC_NAME]:
450-
TRANSACTION_SUBMISSION_METHOD.SENTINEL_RELAY,
452+
try {
453+
getTransactionMetricsRequest().upsertTransactionUIMetricsFragment(
454+
transactionMeta.id,
455+
{
456+
properties: {
457+
[TRANSACTION_SUBMISSION_METHOD_METRIC_NAME]:
458+
TRANSACTION_SUBMISSION_METHOD.SENTINEL_RELAY,
459+
},
451460
},
452-
},
453-
);
461+
);
462+
} catch (e) {
463+
console.error('Failed to record sentinel_relay metrics fragment', e);
464+
}
454465
return result;
455466
}
456467
// else, fall back to regular regular transaction submission
@@ -471,15 +482,19 @@ export async function publishHook({
471482
});
472483

473484
if (result?.transactionHash) {
474-
getTransactionMetricsRequest().upsertTransactionUIMetricsFragment(
475-
transactionMeta.id,
476-
{
477-
properties: {
478-
[TRANSACTION_SUBMISSION_METHOD_METRIC_NAME]:
479-
TRANSACTION_SUBMISSION_METHOD.SENTINEL_STX,
485+
try {
486+
getTransactionMetricsRequest().upsertTransactionUIMetricsFragment(
487+
transactionMeta.id,
488+
{
489+
properties: {
490+
[TRANSACTION_SUBMISSION_METHOD_METRIC_NAME]:
491+
TRANSACTION_SUBMISSION_METHOD.SENTINEL_STX,
492+
},
480493
},
481-
},
482-
);
494+
);
495+
} catch (e) {
496+
console.error('Failed to record sentinel_stx metrics fragment', e);
497+
}
483498
return result;
484499
}
485500
// else, fall back to regular regular transaction submission

test/jest/console-baseline-unit.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
"error: StorageService: Failed to remove item:": 1,
5252
"error: StorageService: Failed to set item:": 1
5353
},
54+
"app/scripts/messenger-client-init/confirmations/transaction-controller-init.test.ts": {
55+
"error: Failed to record sentinel_relay metrics": 1,
56+
"error: Failed to record sentinel_stx metrics": 2
57+
},
5458
"app/scripts/messenger-client-init/core-backend/backend-websocket-service-init.test.ts": {
5559
"MetaMask: Backend WebSocket warnings": 1
5660
},

0 commit comments

Comments
 (0)