diff --git a/evm/README.md b/evm/README.md index c172d3f..0b5b7d0 100644 --- a/evm/README.md +++ b/evm/README.md @@ -94,6 +94,28 @@ executor.requestExecution{value: executorArgs.value}( +#### Example v2 CCTP Request + + + +```solidity +import "example-messaging-executor/evm/src/interfaces/IExecutor.sol"; +import "example-messaging-executor/evm/src/libraries/ExecutorMessages.sol"; +... +uint64 nonce = circleTokenMessenger.depositForBurn(amount, destinationDomain, mintRecipient, burnToken, destinationCaller, maxFee, minFinalityThreshold); + +executor.requestExecution{value: executorArgs.value}( + 0, + bytes32(0), + executorArgs.refundAddress, + executorArgs.signedQuote, + ExecutorMessages.makeCCTPv2Request(sourceDomain, nonce), + executorArgs.instructions +); +``` + + + ### Execution Support #### v1 VAA Execution @@ -120,6 +142,14 @@ The Circle Message Transmitter contract implements the following function. function receiveMessage(bytes calldata message,bytes calldata attestation) external override whenNotPaused returns (bool success) ``` +#### v2 CCTP Execution + +The Circle Message Transmitter contract implements the following function. + +```solidity +function receiveMessage(bytes calldata message,bytes calldata attestation) external override whenNotPaused returns (bool success) +``` + ## Executor Development ### Testing diff --git a/evm/src/libraries/ExecutorMessages.sol b/evm/src/libraries/ExecutorMessages.sol index 9784d2d..c6a22f0 100644 --- a/evm/src/libraries/ExecutorMessages.sol +++ b/evm/src/libraries/ExecutorMessages.sol @@ -6,6 +6,7 @@ library ExecutorMessages { bytes4 private constant REQ_VAA_V1 = "ERV1"; bytes4 private constant REQ_NTT_V1 = "ERN1"; bytes4 private constant REQ_CCTP_V1 = "ERC1"; + bytes4 private constant REQ_CCTP_V2 = "ERC2"; /// @notice Payload length will not fit in a uint32. /// @dev Selector: 492f620d. @@ -63,4 +64,12 @@ library ExecutorMessages { function makeCCTPv1Request(uint32 sourceDomain, uint64 nonce) internal pure returns (bytes memory) { return abi.encodePacked(REQ_CCTP_V1, sourceDomain, nonce); } + + /// @notice Encodes a version 2 CCTP request payload. + /// @param sourceDomain The source chain for the CCTP transfer. + /// @param nonce The nonce of the CCTP transfer. + /// @return bytes The encoded request. + function makeCCTPv2Request(uint32 sourceDomain, uint64 nonce) internal pure returns (bytes memory) { + return abi.encodePacked(REQ_CCTP_V2, sourceDomain, nonce); + } } diff --git a/evm/test/ExecutorMessages.t.sol b/evm/test/ExecutorMessages.t.sol index b0d59df..2d1d60a 100644 --- a/evm/test/ExecutorMessages.t.sol +++ b/evm/test/ExecutorMessages.t.sol @@ -46,4 +46,12 @@ contract ExecutorMessagesTest is Test { bytes memory buf = ExecutorMessages.makeCCTPv1Request(srcDomain, nonce); assertEq(keccak256(expected), keccak256(buf)); } + + function test_makeCCTPv2Request() public pure { + uint32 srcDomain = 7; + uint64 nonce = 42; + bytes memory expected = abi.encodePacked("ERC2", srcDomain, nonce); + bytes memory buf = ExecutorMessages.makeCCTPv2Request(srcDomain, nonce); + assertEq(keccak256(expected), keccak256(buf)); + } }