@@ -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} ) ;
0 commit comments