@@ -52,6 +52,7 @@ const TRANSACTION_HASH_2_MOCK = '0x456';
5252const TRANSACTION_SIGNATURE_MOCK = '0xabc' ;
5353const TRANSACTION_SIGNATURE_2_MOCK = '0xdef' ;
5454const ERROR_MESSAGE_MOCK = 'Test error' ;
55+ const SECURITY_ALERT_ID_MOCK = '123-456' ;
5556
5657const TRANSACTION_META_MOCK = {
5758 id : BATCH_ID_CUSTOM_MOCK ,
@@ -61,7 +62,7 @@ const TRANSACTION_META_MOCK = {
6162 data : DATA_MOCK ,
6263 value : VALUE_MOCK ,
6364 } ,
64- } as TransactionMeta ;
65+ } as unknown as TransactionMeta ;
6566
6667describe ( 'Batch Utils' , ( ) => {
6768 const doesChainSupportEIP7702Mock = jest . mocked ( doesChainSupportEIP7702 ) ;
@@ -100,11 +101,13 @@ describe('Batch Utils', () => {
100101 jest . resetAllMocks ( ) ;
101102 addTransactionMock = jest . fn ( ) ;
102103 getChainIdMock = jest . fn ( ) ;
104+ updateTransactionMock = jest . fn ( ) ;
103105
104106 determineTransactionTypeMock . mockResolvedValue ( {
105107 type : TransactionType . simpleSend ,
106108 } ) ;
107- updateTransactionMock = jest . fn ( ) ;
109+
110+ getChainIdMock . mockReturnValue ( CHAIN_ID_MOCK ) ;
108111
109112 request = {
110113 addTransaction : addTransactionMock ,
@@ -408,6 +411,138 @@ describe('Batch Utils', () => {
408411 ) ;
409412 } ) ;
410413
414+ it ( 'adds security alert ID to transaction' , async ( ) => {
415+ doesChainSupportEIP7702Mock . mockReturnValueOnce ( true ) ;
416+
417+ isAccountUpgradedToEIP7702Mock . mockResolvedValueOnce ( {
418+ delegationAddress : undefined ,
419+ isSupported : true ,
420+ } ) ;
421+
422+ addTransactionMock . mockResolvedValueOnce ( {
423+ transactionMeta : TRANSACTION_META_MOCK ,
424+ result : Promise . resolve ( '' ) ,
425+ } ) ;
426+
427+ generateEIP7702BatchTransactionMock . mockReturnValueOnce ( {
428+ to : TO_MOCK ,
429+ data : DATA_MOCK ,
430+ value : VALUE_MOCK ,
431+ } ) ;
432+
433+ request . request . securityAlertId = SECURITY_ALERT_ID_MOCK ;
434+
435+ await addTransactionBatch ( request ) ;
436+
437+ expect ( addTransactionMock ) . toHaveBeenCalledTimes ( 1 ) ;
438+ expect ( addTransactionMock ) . toHaveBeenCalledWith (
439+ expect . any ( Object ) ,
440+ expect . objectContaining ( {
441+ securityAlertResponse : {
442+ securityAlertId : SECURITY_ALERT_ID_MOCK ,
443+ } ,
444+ } ) ,
445+ ) ;
446+ } ) ;
447+
448+ describe ( 'validates security' , ( ) => {
449+ it ( 'using transaction params' , async ( ) => {
450+ doesChainSupportEIP7702Mock . mockReturnValueOnce ( true ) ;
451+
452+ isAccountUpgradedToEIP7702Mock . mockResolvedValueOnce ( {
453+ delegationAddress : undefined ,
454+ isSupported : true ,
455+ } ) ;
456+
457+ addTransactionMock . mockResolvedValueOnce ( {
458+ transactionMeta : TRANSACTION_META_MOCK ,
459+ result : Promise . resolve ( '' ) ,
460+ } ) ;
461+
462+ generateEIP7702BatchTransactionMock . mockReturnValueOnce ( {
463+ to : TO_MOCK ,
464+ data : DATA_MOCK ,
465+ value : VALUE_MOCK ,
466+ } ) ;
467+
468+ const validateSecurityMock = jest . fn ( ) ;
469+ validateSecurityMock . mockResolvedValueOnce ( { } ) ;
470+
471+ request . request . validateSecurity = validateSecurityMock ;
472+
473+ await addTransactionBatch ( request ) ;
474+
475+ expect ( validateSecurityMock ) . toHaveBeenCalledTimes ( 1 ) ;
476+ expect ( validateSecurityMock ) . toHaveBeenCalledWith (
477+ {
478+ delegationMock : undefined ,
479+ method : 'eth_sendTransaction' ,
480+ params : [
481+ {
482+ authorizationList : undefined ,
483+ data : DATA_MOCK ,
484+ from : FROM_MOCK ,
485+ to : TO_MOCK ,
486+ type : TransactionEnvelopeType . feeMarket ,
487+ value : VALUE_MOCK ,
488+ } ,
489+ ] ,
490+ } ,
491+ CHAIN_ID_MOCK ,
492+ ) ;
493+ } ) ;
494+
495+ it ( 'using delegation mock if not upgraded' , async ( ) => {
496+ doesChainSupportEIP7702Mock . mockReturnValueOnce ( true ) ;
497+
498+ isAccountUpgradedToEIP7702Mock . mockResolvedValueOnce ( {
499+ delegationAddress : undefined ,
500+ isSupported : false ,
501+ } ) ;
502+
503+ addTransactionMock . mockResolvedValueOnce ( {
504+ transactionMeta : TRANSACTION_META_MOCK ,
505+ result : Promise . resolve ( '' ) ,
506+ } ) ;
507+
508+ generateEIP7702BatchTransactionMock . mockReturnValueOnce ( {
509+ to : TO_MOCK ,
510+ data : DATA_MOCK ,
511+ value : VALUE_MOCK ,
512+ } ) ;
513+
514+ getEIP7702UpgradeContractAddressMock . mockReturnValue (
515+ CONTRACT_ADDRESS_MOCK ,
516+ ) ;
517+
518+ const validateSecurityMock = jest . fn ( ) ;
519+ validateSecurityMock . mockResolvedValueOnce ( { } ) ;
520+
521+ request . request . validateSecurity = validateSecurityMock ;
522+
523+ await addTransactionBatch ( request ) ;
524+
525+ expect ( validateSecurityMock ) . toHaveBeenCalledTimes ( 1 ) ;
526+ expect ( validateSecurityMock ) . toHaveBeenCalledWith (
527+ {
528+ delegationMock : CONTRACT_ADDRESS_MOCK ,
529+ method : 'eth_sendTransaction' ,
530+ params : [
531+ {
532+ authorizationList : undefined ,
533+ data : DATA_MOCK ,
534+ from : FROM_MOCK ,
535+ to : TO_MOCK ,
536+ type : TransactionEnvelopeType . feeMarket ,
537+ value : VALUE_MOCK ,
538+ } ,
539+ ] ,
540+ } ,
541+ CHAIN_ID_MOCK ,
542+ ) ;
543+ } ) ;
544+ } ) ;
545+
411546 describe ( 'with publish batch hook' , ( ) => {
412547 it ( 'adds each nested transaction' , async ( ) => {
413548 const publishBatchHook = jest . fn ( ) ;
0 commit comments