@@ -543,6 +543,78 @@ func TestUpdateBidirectionalLanesChangesetWithV2FeeQuoter(t *testing.T) {
543543 }
544544}
545545
546+ func TestFilterOutExistingDestChainConfigs (t * testing.T ) {
547+ t .Parallel ()
548+
549+ deployedEnvironment , _ := testhelpers .NewMemoryEnvironment (t , func (testCfg * testhelpers.TestConfigs ) {
550+ testCfg .Chains = 2
551+ })
552+ e := deployedEnvironment .Env
553+
554+ state , err := stateview .LoadOnchainState (e )
555+ require .NoError (t , err , "must load onchain state" )
556+
557+ selectors := e .BlockChains .ListChainSelectors (cldf_chain .WithFamily (chain_selectors .FamilyEVM ))
558+ require .Len (t , selectors , 2 , "must have 2 chains" )
559+
560+ chainSel := selectors [0 ]
561+ otherChainSel := selectors [1 ]
562+ evmChain := e .BlockChains .EVMChains ()[chainSel ]
563+
564+ parsedABI , err := abi .JSON (strings .NewReader (fqv2ops .FeeQuoterABI ))
565+ require .NoError (t , err , "must parse v2 FeeQuoter ABI" )
566+
567+ // Deploy a v2 FeeQuoter with one destination already configured (otherChainSel)
568+ preConfiguredDest := fqv2ops.DestChainConfigArgs {
569+ DestChainSelector : otherChainSel ,
570+ DestChainConfig : fqv2ops.DestChainConfig {
571+ IsEnabled : true ,
572+ MaxDataBytes : 30_000 ,
573+ },
574+ }
575+ fqV2Addr , tx , _ , err := bind .DeployContract (
576+ evmChain .DeployerKey ,
577+ parsedABI ,
578+ common .FromHex (fqv2ops .FeeQuoterBin ),
579+ evmChain .Client ,
580+ fqv2ops.StaticConfig {
581+ MaxFeeJuelsPerMsg : big .NewInt (1e18 ),
582+ LinkToken : state .Chains [chainSel ].LinkToken .Address (),
583+ },
584+ []common.Address {evmChain .DeployerKey .From },
585+ []fqv2ops.TokenTransferFeeConfigArgs {},
586+ []fqv2ops.DestChainConfigArgs {preConfiguredDest },
587+ )
588+ require .NoError (t , err , "must deploy v2 FeeQuoter" )
589+
590+ _ , err = evmChain .Confirm (tx )
591+ require .NoError (t , err , "must confirm v2 FeeQuoter deployment" )
592+
593+ unconfiguredChainSel := uint64 (999 )
594+
595+ // Call FilterOutExistingDestChainConfigs with both destinations
596+ input := []fqv2ops.DestChainConfigArgs {
597+ {
598+ DestChainSelector : otherChainSel ,
599+ DestChainConfig : fqv2ops.DestChainConfig {IsEnabled : true , MaxDataBytes : 50_000 },
600+ },
601+ {
602+ DestChainSelector : unconfiguredChainSel ,
603+ DestChainConfig : fqv2ops.DestChainConfig {IsEnabled : true , MaxDataBytes : 60_000 },
604+ },
605+ }
606+
607+ filtered , err := v1_6 .FilterOutExistingDestChainConfigs (e , fqV2Addr , chainSel , input )
608+ require .NoError (t , err , "FilterOutExistingDestChainConfigs must not error" )
609+
610+ // Only the unconfigured chain should remain
611+ require .Len (t , filtered , 1 , "must filter out the already-enabled destination" )
612+ assert .Equal (t , unconfiguredChainSel , filtered [0 ].DestChainSelector ,
613+ "remaining entry must be the unconfigured chain" )
614+ assert .Equal (t , uint32 (60_000 ), filtered [0 ].DestChainConfig .MaxDataBytes ,
615+ "remaining entry must preserve original config" )
616+ }
617+
546618func TestUpdateBidirectionalLanesChangesetWithV2FeeQuoterWithMCMS (t * testing.T ) {
547619 t .Parallel ()
548620
0 commit comments