Skip to content

Commit

Permalink
Merge branch 'ccip-develop' into fix/onramp-allowlist-race-condition
Browse files Browse the repository at this point in the history
# Conflicts:
#	contracts/gas-snapshots/ccip.gas-snapshot
#	core/gethwrappers/ccip/generated/onramp/onramp.go
#	core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
  • Loading branch information
0xsuryansh committed Oct 4, 2024
2 parents 46d641b + 4db2b21 commit d7e8c4b
Show file tree
Hide file tree
Showing 23 changed files with 138 additions and 127 deletions.
18 changes: 9 additions & 9 deletions contracts/gas-snapshots/ccip.gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -574,10 +574,10 @@ NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success(
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249120)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237027)
NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153748)
NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168256)
NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 219631)
NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 169036)
NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 221191)
NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126745)
NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 106975)
NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107755)
NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123102)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 43079)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64408)
Expand Down Expand Up @@ -769,15 +769,15 @@ OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36527)
OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18291)
OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431)
OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640)
OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 183954)
OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210338)
OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146154)
OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160259)
OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613942)
OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186348)
OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212732)
OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146934)
OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161039)
OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615148)
OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010)
OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866)
OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599)
OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 279390)
OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280170)
OnRamp_getFee:test_EmptyMessage_Success() (gas: 98469)
OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64623)
OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86133)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pragma solidity ^0.8.4;
import {Internal} from "../libraries/Internal.sol";

/// @notice This interface contains the only RMN-related functions that might be used on-chain by other CCIP contracts.
interface IRMNV2 {
interface IRMNRemote {
/// @notice signature components from RMN nodes
struct Signature {
bytes32 r;
Expand Down
20 changes: 10 additions & 10 deletions contracts/src/v0.8/ccip/offRamp/OffRamp.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {IFeeQuoter} from "../interfaces/IFeeQuoter.sol";
import {IMessageInterceptor} from "../interfaces/IMessageInterceptor.sol";
import {INonceManager} from "../interfaces/INonceManager.sol";
import {IPoolV1} from "../interfaces/IPool.sol";
import {IRMNV2} from "../interfaces/IRMNV2.sol";
import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
import {IRouter} from "../interfaces/IRouter.sol";
import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol";

Expand Down Expand Up @@ -95,7 +95,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// solhint-disable-next-line gas-struct-packing
struct StaticConfig {
uint64 chainSelector; // ───╮ Destination chainSelector
IRMNV2 rmn; // ─────────────╯ RMN Verification Contract
IRMNRemote rmnRemote; // ───╯ RMN Verification Contract
address tokenAdminRegistry; // Token admin registry address
address nonceManager; // Nonce manager address
}
Expand Down Expand Up @@ -130,7 +130,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
struct CommitReport {
Internal.PriceUpdates priceUpdates; // Collection of gas and price updates to commit
Internal.MerkleRoot[] merkleRoots; // Collection of merkle roots per source chain to commit
IRMNV2.Signature[] rmnSignatures; // RMN signatures on the merkle roots
IRMNRemote.Signature[] rmnSignatures; // RMN signatures on the merkle roots
uint256 rmnRawVs; // Raw v values of the RMN signatures
}

Expand All @@ -147,7 +147,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
/// @dev ChainSelector of this chain
uint64 internal immutable i_chainSelector;
/// @dev The RMN verification contract
IRMNV2 internal immutable i_rmn;
IRMNRemote internal immutable i_rmnRemote;
/// @dev The address of the token admin registry
address internal immutable i_tokenAdminRegistry;
/// @dev The address of the nonce manager
Expand Down Expand Up @@ -178,7 +178,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
SourceChainConfigArgs[] memory sourceChainConfigs
) MultiOCR3Base() {
if (
address(staticConfig.rmn) == address(0) || staticConfig.tokenAdminRegistry == address(0)
address(staticConfig.rmnRemote) == address(0) || staticConfig.tokenAdminRegistry == address(0)
|| staticConfig.nonceManager == address(0)
) {
revert ZeroAddressNotAllowed();
Expand All @@ -189,7 +189,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
}

i_chainSelector = staticConfig.chainSelector;
i_rmn = staticConfig.rmn;
i_rmnRemote = staticConfig.rmnRemote;
i_tokenAdminRegistry = staticConfig.tokenAdminRegistry;
i_nonceManager = staticConfig.nonceManager;
emit StaticConfigSet(staticConfig);
Expand Down Expand Up @@ -357,7 +357,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
) internal {
uint64 sourceChainSelector = report.sourceChainSelector;
bool manualExecution = manualExecGasExecOverrides.length != 0;
if (i_rmn.isCursed(bytes16(uint128(sourceChainSelector)))) {
if (i_rmnRemote.isCursed(bytes16(uint128(sourceChainSelector)))) {
if (manualExecution) {
// For manual execution we don't want to silently fail so we revert
revert CursedByRMN(sourceChainSelector);
Expand Down Expand Up @@ -785,7 +785,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {

// Verify RMN signatures
if (commitReport.merkleRoots.length > 0) {
i_rmn.verify(address(this), commitReport.merkleRoots, commitReport.rmnSignatures, commitReport.rmnRawVs);
i_rmnRemote.verify(address(this), commitReport.merkleRoots, commitReport.rmnSignatures, commitReport.rmnRawVs);
}

// Check if the report contains price updates
Expand All @@ -811,7 +811,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
Internal.MerkleRoot memory root = commitReport.merkleRoots[i];
uint64 sourceChainSelector = root.sourceChainSelector;

if (i_rmn.isCursed(bytes16(uint128(sourceChainSelector)))) {
if (i_rmnRemote.isCursed(bytes16(uint128(sourceChainSelector)))) {
revert CursedByRMN(sourceChainSelector);
}

Expand Down Expand Up @@ -900,7 +900,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
function getStaticConfig() external view returns (StaticConfig memory) {
return StaticConfig({
chainSelector: i_chainSelector,
rmn: i_rmn,
rmnRemote: i_rmnRemote,
tokenAdminRegistry: i_tokenAdminRegistry,
nonceManager: i_nonceManager
});
Expand Down
22 changes: 12 additions & 10 deletions contracts/src/v0.8/ccip/onRamp/OnRamp.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {IFeeQuoter} from "../interfaces/IFeeQuoter.sol";
import {IMessageInterceptor} from "../interfaces/IMessageInterceptor.sol";
import {INonceManager} from "../interfaces/INonceManager.sol";
import {IPoolV1} from "../interfaces/IPool.sol";
import {IRMNV2} from "../interfaces/IRMNV2.sol";
import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
import {IRouter} from "../interfaces/IRouter.sol";
import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol";

Expand Down Expand Up @@ -48,7 +48,9 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
);
event FeeTokenWithdrawn(address indexed feeAggregator, address indexed feeToken, uint256 amount);
/// RMN depends on this event, if changing, please notify the RMN maintainers.
event CCIPMessageSent(uint64 indexed destChainSelector, Internal.EVM2AnyRampMessage message);
event CCIPMessageSent(
uint64 indexed destChainSelector, uint64 indexed sequenceNumber, Internal.EVM2AnyRampMessage message
);
event AllowListAdminSet(address indexed allowListAdmin);
event AllowListSendersAdded(uint64 indexed destChainSelector, address[] senders);
event AllowListSendersRemoved(uint64 indexed destChainSelector, address[] senders);
Expand All @@ -58,7 +60,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
// solhint-disable-next-line gas-struct-packing
struct StaticConfig {
uint64 chainSelector; // ─────╮ Source chain selector
IRMNV2 rmn; // ───────────────╯ RMN remote address
IRMNRemote rmnRemote; // ─────╯ RMN remote address
address nonceManager; // Nonce manager address
address tokenAdminRegistry; // Token admin registry address
}
Expand Down Expand Up @@ -112,7 +114,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
/// @dev The chain ID of the source chain that this contract is deployed to
uint64 private immutable i_chainSelector;
/// @dev The rmn contract
IRMNV2 private immutable i_rmn;
IRMNRemote private immutable i_rmnRemote;
/// @dev The address of the nonce manager
address private immutable i_nonceManager;
/// @dev The address of the token admin registry
Expand All @@ -131,14 +133,14 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
DestChainConfigArgs[] memory destChainConfigArgs
) {
if (
staticConfig.chainSelector == 0 || address(staticConfig.rmn) == address(0)
staticConfig.chainSelector == 0 || address(staticConfig.rmnRemote) == address(0)
|| staticConfig.nonceManager == address(0) || staticConfig.tokenAdminRegistry == address(0)
) {
revert InvalidConfig();
}

i_chainSelector = staticConfig.chainSelector;
i_rmn = staticConfig.rmn;
i_rmnRemote = staticConfig.rmnRemote;
i_nonceManager = staticConfig.nonceManager;
i_tokenAdminRegistry = staticConfig.tokenAdminRegistry;

Expand Down Expand Up @@ -254,7 +256,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
// Emit message request
// This must happen after any pool events as some tokens (e.g. USDC) emit events that we expect to precede this
// event in the offchain code.
emit CCIPMessageSent(destChainSelector, newMessage);
emit CCIPMessageSent(destChainSelector, newMessage.header.sequenceNumber, newMessage);

s_dynamicConfig.reentrancyGuardEntered = false;

Expand Down Expand Up @@ -313,7 +315,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
function getStaticConfig() external view returns (StaticConfig memory) {
return StaticConfig({
chainSelector: i_chainSelector,
rmn: i_rmn,
rmnRemote: i_rmnRemote,
nonceManager: i_nonceManager,
tokenAdminRegistry: i_tokenAdminRegistry
});
Expand Down Expand Up @@ -350,7 +352,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
emit ConfigSet(
StaticConfig({
chainSelector: i_chainSelector,
rmn: i_rmn,
rmnRemote: i_rmnRemote,
nonceManager: i_nonceManager,
tokenAdminRegistry: i_tokenAdminRegistry
}),
Expand Down Expand Up @@ -481,7 +483,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
uint64 destChainSelector,
Client.EVM2AnyMessage calldata message
) external view returns (uint256 feeTokenAmount) {
if (i_rmn.isCursed(bytes16(uint128(destChainSelector)))) revert CursedByRMN(destChainSelector);
if (i_rmnRemote.isCursed(bytes16(uint128(destChainSelector)))) revert CursedByRMN(destChainSelector);

return IFeeQuoter(s_dynamicConfig.feeQuoter).getValidatedFee(destChainSelector, message);
}
Expand Down
12 changes: 6 additions & 6 deletions contracts/src/v0.8/ccip/rmn/RMNRemote.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity 0.8.24;

import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IRMNV2} from "../interfaces/IRMNV2.sol";
import {IRMNRemote} from "../interfaces/IRMNRemote.sol";

import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
import {EnumerableSet} from "../../shared/enumerable/EnumerableSetWithBytes16.sol";
Expand All @@ -19,7 +19,7 @@ bytes16 constant LEGACY_CURSE_SUBJECT = 0x01000000000000000000000000000000;
bytes16 constant GLOBAL_CURSE_SUBJECT = 0x01000000000000000000000000000001;

/// @notice This contract supports verification of RMN reports for any Any2EVM OffRamp.
contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 {
contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNRemote {
using EnumerableSet for EnumerableSet.Bytes16Set;

error AlreadyCursed(bytes16 subject);
Expand Down Expand Up @@ -85,7 +85,7 @@ contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 {
// │ Verification │
// ================================================================

/// @inheritdoc IRMNV2
/// @inheritdoc IRMNRemote
function verify(
address offrampAddress,
Internal.MerkleRoot[] calldata merkleRoots,
Expand Down Expand Up @@ -224,20 +224,20 @@ contract RMNRemote is OwnerIsCreator, ITypeAndVersion, IRMNV2 {
emit Uncursed(subjects);
}

/// @inheritdoc IRMNV2
/// @inheritdoc IRMNRemote
function getCursedSubjects() external view returns (bytes16[] memory subjects) {
return s_cursedSubjects.values();
}

/// @inheritdoc IRMNV2
/// @inheritdoc IRMNRemote
function isCursed() external view returns (bool) {
if (s_cursedSubjects.length() == 0) {
return false;
}
return s_cursedSubjects.contains(LEGACY_CURSE_SUBJECT) || s_cursedSubjects.contains(GLOBAL_CURSE_SUBJECT);
}

/// @inheritdoc IRMNV2
/// @inheritdoc IRMNRemote
function isCursed(bytes16 subject) external view returns (bool) {
if (s_cursedSubjects.length() == 0) {
return false;
Expand Down
8 changes: 4 additions & 4 deletions contracts/src/v0.8/ccip/test/BaseTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pragma solidity 0.8.24;
// Imports to any non-library are not allowed due to the significant cascading
// compile time increase they cause when imported into this base test.

import {IRMNV2} from "../interfaces/IRMNV2.sol";
import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
import {Internal} from "../libraries/Internal.sol";
import {RateLimiter} from "../libraries/RateLimiter.sol";
import {MockRMN} from "./mocks/MockRMN.sol";
Expand Down Expand Up @@ -71,7 +71,7 @@ contract BaseTest is Test {
address internal constant ADMIN = 0x11118e64e1FB0c487f25dD6D3601FF6aF8d32E4e;

MockRMN internal s_mockRMN;
IRMNV2 internal s_mockRMNRemote;
IRMNRemote internal s_mockRMNRemote;

// nonce for pseudo-random number generation, not to be exposed to test suites
uint256 private randNonce;
Expand All @@ -92,9 +92,9 @@ contract BaseTest is Test {

// setup mock RMN & RMNRemote
s_mockRMN = new MockRMN();
s_mockRMNRemote = IRMNV2(makeAddr("MOCK RMN REMOTE"));
s_mockRMNRemote = IRMNRemote(makeAddr("MOCK RMN REMOTE"));
vm.etch(address(s_mockRMNRemote), bytes("fake bytecode"));
vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNV2.verify.selector), bytes(""));
vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
_setMockRMNGlobalCurse(false);
vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(false)); // no curses by defaule
}
Expand Down
8 changes: 4 additions & 4 deletions contracts/src/v0.8/ccip/test/NonceManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ contract NonceManager_OnRampUpgrade is OnRampSetup {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();

vm.expectEmit();
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, FEE_AMOUNT, OWNER));
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, FEE_AMOUNT, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, OWNER);
}

Expand All @@ -292,14 +292,14 @@ contract NonceManager_OnRampUpgrade is OnRampSetup {

// new onramp nonce should start from 2, while sequence number start from 1
vm.expectEmit();
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, startNonce + 2, FEE_AMOUNT, OWNER));
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, startNonce + 2, FEE_AMOUNT, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, OWNER);

assertEq(startNonce + 2, s_outboundNonceManager.getOutboundNonce(DEST_CHAIN_SELECTOR, OWNER));

// after another send, nonce should be 3, and sequence number be 2
vm.expectEmit();
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 2, startNonce + 3, FEE_AMOUNT, OWNER));
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 2, _messageToEvent(message, 2, startNonce + 3, FEE_AMOUNT, OWNER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, OWNER);

assertEq(startNonce + 3, s_outboundNonceManager.getOutboundNonce(DEST_CHAIN_SELECTOR, OWNER));
Expand All @@ -314,7 +314,7 @@ contract NonceManager_OnRampUpgrade is OnRampSetup {
address newSender = address(1234567);
// new onramp nonce should start from 1 for new sender
vm.expectEmit();
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, _messageToEvent(message, 1, 1, FEE_AMOUNT, newSender));
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, FEE_AMOUNT, newSender));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, FEE_AMOUNT, newSender);
}
}
Expand Down
6 changes: 3 additions & 3 deletions contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {IRMN} from "../../interfaces/IRMN.sol";

import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol";
import {NonceManager} from "../../NonceManager.sol";
import {IRMNV2} from "../../interfaces/IRMNV2.sol";
import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {LockReleaseTokenPool} from "../../pools/LockReleaseTokenPool.sol";
import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol";
import "../helpers/MerkleHelper.sol";
Expand Down Expand Up @@ -150,7 +150,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup {
merkleRoots[1] = MerkleHelper.getMerkleRoot(hashedMessages2);

// TODO make these real sigs :)
IRMNV2.Signature[] memory rmnSignatures = new IRMNV2.Signature[](0);
IRMNRemote.Signature[] memory rmnSignatures = new IRMNRemote.Signature[](0);

Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](2);
roots[0] = Internal.MerkleRoot({
Expand Down Expand Up @@ -268,7 +268,7 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup {
);

vm.expectEmit();
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, msgEvent);
emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, expectedSeqNum, msgEvent);

vm.resumeGasMetering();
router.ccipSend(DEST_CHAIN_SELECTOR, message);
Expand Down
Loading

0 comments on commit d7e8c4b

Please sign in to comment.