From 68195ffd77bf20401e07ba4dad8ef7c4a934c093 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:26:42 +0400 Subject: [PATCH 01/12] gea: rename root to digest --- contracts/interfaces/ISwitchboard.sol | 6 +-- contracts/interfaces/IWatcherPrecompile.sol | 14 +++--- contracts/mock/MockSocket.sol | 8 ++- contracts/mock/MockWatcherPrecompile.sol | 8 +-- .../app-gateway/BatchAsync.sol | 2 +- .../app-gateway/DeliveryHelper.sol | 8 +-- .../app-gateway/FeesManager.sol | 4 +- contracts/protocol/socket/Socket.sol | 12 +++-- contracts/protocol/socket/SocketBatcher.sol | 2 +- .../socket/switchboard/FastSwitchboard.sol | 34 ++++++------- contracts/protocol/utils/common/Structs.sol | 6 +-- .../watcherPrecompile/WatcherPrecompile.sol | 50 +++++++++++-------- test/DeliveryHelper.t.sol | 16 +++--- test/SetupTest.t.sol | 4 +- 14 files changed, 96 insertions(+), 78 deletions(-) diff --git a/contracts/interfaces/ISwitchboard.sol b/contracts/interfaces/ISwitchboard.sol index ac822b4f..f2a82559 100644 --- a/contracts/interfaces/ISwitchboard.sol +++ b/contracts/interfaces/ISwitchboard.sol @@ -9,11 +9,11 @@ pragma solidity ^0.8.21; interface ISwitchboard { /** * @notice Checks if a packet can be allowed to go through the switchboard. - * @param root_ the packet root. + * @param digest_ the packet digest. * @param packetId_ The unique identifier for the packet. * @return A boolean indicating whether the packet is allowed to go through the switchboard or not. */ - function allowPacket(bytes32 root_, bytes32 packetId_) external view returns (bool); + function allowPacket(bytes32 digest_, bytes32 packetId_) external view returns (bool); - function attest(bytes32 payloadId_, bytes32 root_, bytes calldata signature_) external; + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external; } diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 926c6507..e9671c4f 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {PayloadDetails, AsyncRequest, FinalizeParams, PayloadRootParams, AppGatewayConfig, PlugConfig, ResolvedPromises} from "../protocol/utils/common/Structs.sol"; +import {PayloadDetails, AsyncRequest, FinalizeParams, PayloadDigestParams, AppGatewayConfig, PlugConfig, ResolvedPromises} from "../protocol/utils/common/Structs.sol"; /// @title IWatcherPrecompile /// @notice Interface for the Watcher Precompile system that handles payload verification and execution @@ -36,11 +36,11 @@ interface IWatcherPrecompile { /// @notice Finalizes a payload execution request /// @param params_ Parameters needed for finalization /// @return payloadId The unique identifier for the request - /// @return root The merkle root of the payload parameters + /// @return digest The merkle digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ - ) external returns (bytes32 payloadId, bytes32 root); + ) external returns (bytes32 payloadId, bytes32 digest); /// @notice Creates a new query request /// @param chainSlug_ The identifier of the destination network @@ -83,10 +83,10 @@ interface IWatcherPrecompile { /// @param timeoutId_ The unique identifier for the timeout function resolveTimeout(bytes32 timeoutId_) external; - /// @notice Calculates the root hash for payload parameters - /// @param params_ The payload parameters used to calculate the root - /// @return root The calculated merkle root hash - function getRoot(PayloadRootParams memory params_) external pure returns (bytes32 root); + /// @notice Calculates the Digest hash for payload parameters + /// @param params_ The payload parameters used to calculate the digest + /// @return digest The calculated merkle digest hash + function getDigest(PayloadDigestParams memory params_) external pure returns (bytes32 digest); function setMaxTimeoutDelayInSeconds(uint256 maxTimeoutDelayInSeconds_) external; diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol index 1ffdbd03..d6a4c96e 100644 --- a/contracts/mock/MockSocket.sol +++ b/contracts/mock/MockSocket.sol @@ -126,9 +126,13 @@ contract MockSocket is ISocket { ////////////////// INTERNAL FUNCS ////////////////////// //////////////////////////////////////////////////////// - function _verify(bytes32 root_, bytes32 payloadId_, ISwitchboard switchboard__) internal view { + function _verify( + bytes32 digest_, + bytes32 payloadId_, + ISwitchboard switchboard__ + ) internal view { // NOTE: is the the first un-trusted call in the system, another one is Plug.call - if (!switchboard__.allowPacket(root_, payloadId_)) revert VerificationFailed(); + if (!switchboard__.allowPacket(digest_, payloadId_)) revert VerificationFailed(); } /** diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index aa1ad265..655fe32e 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -5,7 +5,7 @@ import "../interfaces/IAppGateway.sol"; import "../interfaces/IWatcherPrecompile.sol"; import "../interfaces/IPromise.sol"; -import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; import "solady/utils/ERC1967Factory.sol"; @@ -123,11 +123,11 @@ contract MockWatcherPrecompile { /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return root The merkle root of the payload parameters + /// @return digest The merkle digest of the payload parameters function finalize( FinalizeParams memory params_ - ) external returns (bytes32 payloadId, bytes32 root) { - root = keccak256(abi.encode(block.timestamp)); + ) external returns (bytes32 payloadId, bytes32 digest) { + digest = keccak256(abi.encode(block.timestamp)); // Generate a unique payload ID by combining chain, target, and counter payloadId = encodePayloadId( params_.payloadDetails.chainSlug, diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 43a34ddd..8a5a6903 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -45,7 +45,7 @@ abstract contract BatchAsync is QueueAsync { event PayloadAsyncRequested( bytes32 indexed asyncId, bytes32 indexed payloadId, - bytes32 indexed root, + bytes32 indexed digest, PayloadDetails payloadDetails ); diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 650d622f..e0a85af0 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -143,7 +143,7 @@ contract DeliveryHelper is BatchAsync, Initializable { PayloadBatch storage payloadBatch_, address batchPromise_, bool isRead_ - ) internal returns (bytes32 payloadId, bytes32 root) { + ) internal returns (bytes32 payloadId, bytes32 digest) { payloadDetails_.next[1] = batchPromise_; if (isRead_) { payloadId = watcherPrecompile__().query( @@ -153,14 +153,14 @@ contract DeliveryHelper is BatchAsync, Initializable { payloadDetails_.next, payloadDetails_.payload ); - root = bytes32(0); + digest = bytes32(0); } else { FinalizeParams memory finalizeParams = FinalizeParams({ payloadDetails: payloadDetails_, asyncId: asyncId_, transmitter: payloadBatch_.winningBid.transmitter }); - (payloadId, root) = watcherPrecompile__().finalize( + (payloadId, digest) = watcherPrecompile__().finalize( payloadBatch_.appGateway, finalizeParams ); @@ -170,7 +170,7 @@ contract DeliveryHelper is BatchAsync, Initializable { payloadIdToBatchHash[payloadId] = asyncId_; payloadIdToPayloadDetails[payloadId] = payloadDetails_; - emit PayloadAsyncRequested(asyncId_, payloadId, root, payloadDetails_); + emit PayloadAsyncRequested(asyncId_, payloadId, digest, payloadDetails_); } function _processParallelCalls( diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 50fbea34..8acf5997 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -250,7 +250,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl uint32 chainSlug_, address token_, address receiver_ - ) external returns (bytes32 payloadId, bytes32 root, PayloadDetails memory payloadDetails) { + ) external returns (bytes32 payloadId, bytes32 digest, PayloadDetails memory payloadDetails) { address transmitter = msg.sender; // Get all asyncIds for the transmitter uint256 totalFees = transmitterFees[transmitter][chainSlug_][token_]; @@ -273,7 +273,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl transmitter: transmitter }); - (payloadId, root) = watcherPrecompile__().finalize(address(this), finalizeParams); + (payloadId, digest) = watcherPrecompile__().finalize(address(this), finalizeParams); } function _createPayloadDetails( diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index 67720475..bd70a175 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -123,7 +123,7 @@ contract Socket is SocketUtils { ); // create packed payload - bytes32 root = _packPayload( + bytes32 digest = _packPayload( params_.payloadId, appGateway_, transmitter, @@ -136,7 +136,7 @@ contract Socket is SocketUtils { // verify payload was part of the packet and // authenticated by respective switchboard - _verify(root, params_.payloadId, ISwitchboard(switchboard)); + _verify(digest, params_.payloadId, ISwitchboard(switchboard)); // execute payload return @@ -147,9 +147,13 @@ contract Socket is SocketUtils { ////////////////// INTERNAL FUNCS ////////////////////// //////////////////////////////////////////////////////// - function _verify(bytes32 root_, bytes32 payloadId_, ISwitchboard switchboard__) internal view { + function _verify( + bytes32 digest_, + bytes32 payloadId_, + ISwitchboard switchboard__ + ) internal view { // NOTE: is the the first un-trusted call in the system, another one is Plug.call - if (!switchboard__.allowPacket(root_, payloadId_)) revert VerificationFailed(); + if (!switchboard__.allowPacket(digest_, payloadId_)) revert VerificationFailed(); } /** diff --git a/contracts/protocol/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol index 96371877..3b6d2869 100644 --- a/contracts/protocol/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -30,7 +30,7 @@ contract SocketBatcher is Ownable { ) external payable returns (bytes memory) { ISwitchboard(params_.switchboard).attest( params_.payloadId, - params_.root, + params_.digest, params_.watcherSignature ); diff --git a/contracts/protocol/socket/switchboard/FastSwitchboard.sol b/contracts/protocol/socket/switchboard/FastSwitchboard.sol index 74e8451e..8d1cc668 100644 --- a/contracts/protocol/socket/switchboard/FastSwitchboard.sol +++ b/contracts/protocol/socket/switchboard/FastSwitchboard.sol @@ -9,15 +9,15 @@ import "./SwitchboardBase.sol"; * that enables packet attestations and watchers registration. */ contract FastSwitchboard is SwitchboardBase { - // used to track which watcher have attested a root - // watcher => root => isAttested + // used to track which watcher have attested a digest + // watcher => digest => isAttested mapping(bytes32 => bool) public isAttested; - // Error emitted when a root is already attested by a specific watcher. - // This is hit even if they are attesting a new proposalCount with same root. + // Error emitted when a digest is already attested by a specific watcher. + // This is hit even if they are attesting a new proposalCount with same digest. error AlreadyAttested(); error WatcherNotFound(); - event Attested(bytes32 payloadId, bytes32 root_, address watcher); + event Attested(bytes32 payloadId, bytes32 digest_, address watcher); /** * @dev Constructor function for the FastSwitchboard contract @@ -32,28 +32,28 @@ contract FastSwitchboard is SwitchboardBase { /** * @dev Function to attest a packet * @param payloadId_ Packet ID - * @param root_ Root of the packet + * @param digest_ Digest of the packet * @param signature_ Signature of the watcher - * @notice we are attesting a root uniquely identified with packetId and proposalCount. However, - * there can be multiple proposals for same root. To avoid need to re-attest for different proposals - * with same root, we are storing attestations against root instead of packetId and proposalCount. + * @notice we are attesting a digest uniquely identified with packetId and proposalCount. However, + * there can be multiple proposals for same digest. To avoid need to re-attest for different proposals + * with same digest, we are storing attestations against digest instead of packetId and proposalCount. */ - function attest(bytes32 payloadId_, bytes32 root_, bytes calldata signature_) external { - address watcher = _recoverSigner(keccak256(abi.encode(address(this), root_)), signature_); + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external { + address watcher = _recoverSigner(keccak256(abi.encode(address(this), digest_)), signature_); - if (isAttested[root_]) revert AlreadyAttested(); + if (isAttested[digest_]) revert AlreadyAttested(); if (!_hasRole(WATCHER_ROLE, watcher)) revert WatcherNotFound(); - isAttested[root_] = true; - emit Attested(payloadId_, root_, watcher); + isAttested[digest_] = true; + emit Attested(payloadId_, digest_, watcher); } /** * @inheritdoc ISwitchboard */ - function allowPacket(bytes32 root_, bytes32) external view returns (bool) { - // root has enough attestations - if (isAttested[root_]) return true; + function allowPacket(bytes32 digest_, bytes32) external view returns (bool) { + // digest has enough attestations + if (isAttested[digest_]) return true; // not enough attestations and timeout not hit return false; diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 72058e7c..20bcf5de 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -39,7 +39,7 @@ struct AsyncRequest { uint256 executionGasLimit; uint256 deadline; bytes32 asyncId; - bytes32 root; + bytes32 digest; bytes payload; address[] next; } @@ -79,7 +79,7 @@ struct DeployParams { struct AttestAndExecutePayloadParams { bytes32 payloadId; - bytes32 root; + bytes32 digest; address switchboard; address appGateway; address target; @@ -134,7 +134,7 @@ struct PayloadDetails { address[] next; } -struct PayloadRootParams { +struct PayloadDigestParams { address appGateway; address transmitter; address target; diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 9f12c7d9..fc1000f0 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -6,7 +6,7 @@ import "../../interfaces/IAppGateway.sol"; import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; -import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; /// @title WatcherPrecompile @@ -175,18 +175,18 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return root The merkle root of the payload parameters + /// @return digest The merkle digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ - ) external returns (bytes32 payloadId, bytes32 root) { + ) external returns (bytes32 payloadId, bytes32 digest) { // Generate a unique payload ID by combining chain, target, and counter payloadId = _encodeWritePayloadId( params_.payloadDetails.chainSlug, params_.payloadDetails.target ); - root = _finalize(payloadId, originAppGateway_, params_); + digest = _finalize(payloadId, originAppGateway_, params_); } function refinalize(bytes32 payloadId_, FinalizeParams memory params_) external { @@ -200,7 +200,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { bytes32 payloadId_, address originAppGateway_, FinalizeParams memory params_ - ) internal returns (bytes32 root) { + ) internal returns (bytes32 digest) { if (params_.transmitter == address(0)) revert InvalidTransmitter(); // The app gateway is the caller of this function @@ -219,8 +219,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.target ); - // Construct parameters for root calculation - PayloadRootParams memory rootParams_ = PayloadRootParams( + // Construct parameters for digest calculation + PayloadDigestParams memory digestParams_ = PayloadDigestParams( params_.payloadDetails.appGateway, params_.transmitter, params_.payloadDetails.target, @@ -231,8 +231,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.payload ); - // Calculate merkle root from payload parameters - root = getRoot(rootParams_); + // Calculate merkle digest from payload parameters + digest = getDigest(digestParams_); // Create and store the async request with all necessary details AsyncRequest memory asyncRequest = AsyncRequest( @@ -244,7 +244,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.executionGasLimit, block.timestamp + expiryTime, params_.asyncId, - root, + digest, params_.payloadDetails.payload, params_.payloadDetails.next ); @@ -290,13 +290,16 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { emit QueryRequested(chainSlug_, targetAddress_, payloadId, payload_); } - /// @notice Marks a request as finalized with a signature on root + /// @notice Marks a request as finalized with a signature on digest /// @param payloadId_ The unique identifier of the request /// @param signature_ The watcher's signature /// @dev Only callable by the contract owner /// @dev Watcher signs on following digest for validation on switchboard: - /// @dev keccak256(abi.encode(switchboard, root)) - function finalized(bytes32 payloadId_, bytes calldata signature_) external onlyRole(WATCHER_ROLE) { + /// @dev keccak256(abi.encode(switchboard, digest)) + function finalized( + bytes32 payloadId_, + bytes calldata signature_ + ) external onlyRole(WATCHER_ROLE) { watcherSignatures[payloadId_] = signature_; emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); } @@ -304,7 +307,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data /// @dev Only callable by the contract owner - function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external onlyRole(WATCHER_ROLE) { + function resolvePromises( + ResolvedPromises[] calldata resolvedPromises_ + ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < resolvedPromises_.length; i++) { // Get the array of promise addresses for this payload AsyncRequest memory asyncRequest_ = asyncRequests[resolvedPromises_[i].payloadId]; @@ -327,7 +332,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { } // wait till expiry time to assign fees - function markRevert(bytes32 payloadId_, bool isRevertingOnchain_) external onlyRole(WATCHER_ROLE) { + function markRevert( + bytes32 payloadId_, + bool isRevertingOnchain_ + ) external onlyRole(WATCHER_ROLE) { AsyncRequest memory asyncRequest_ = asyncRequests[payloadId_]; address[] memory next = asyncRequest_.next; @@ -346,11 +354,11 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { } } - /// @notice Calculates the root hash of payload parameters + /// @notice Calculates the digest hash of payload parameters /// @param params_ The payload parameters - /// @return root The calculated merkle root - function getRoot(PayloadRootParams memory params_) public pure returns (bytes32 root) { - root = keccak256( + /// @return digest The calculated merkle digest + function getDigest(PayloadDigestParams memory params_) public pure returns (bytes32 digest) { + digest = keccak256( abi.encode( params_.payloadId, params_.appGateway, @@ -370,7 +378,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== On-Chain Inbox ================== - function callAppGateways(CallFromInboxParams[] calldata params_) external onlyRole(WATCHER_ROLE) { + function callAppGateways( + CallFromInboxParams[] calldata params_ + ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < params_.length; i++) { if (appGatewayCalled[params_[i].callId]) revert AppGatewayAlreadyCalled(); if (!isValidInboxCaller[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 4702a879..626eb4ae 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -498,7 +498,7 @@ contract DeliveryHelperTest is SetupTest { SocketContracts memory socketConfig = getSocketConfig(payloadDetails.chainSlug); (, , , , , , uint256 deadline, , , ) = watcherPrecompile.asyncRequests(payloadId); - PayloadRootParams memory rootParams_ = PayloadRootParams( + PayloadDigestParams memory digestParams_ = PayloadDigestParams( payloadDetails.appGateway, transmitterEOA, payloadDetails.target, @@ -508,11 +508,11 @@ contract DeliveryHelperTest is SetupTest { deadline, payloadDetails.payload ); - bytes32 root = watcherPrecompile.getRoot(rootParams_); - - bytes32 digest = keccak256(abi.encode(address(socketConfig.switchboard), root)); - bytes memory watcherSig = _createSignature(digest, watcherPrivateKey); - return (watcherSig, root); + bytes32 digest = watcherPrecompile.getDigest(digestParams_); + + bytes32 sigDigest = keccak256(abi.encode(address(socketConfig.switchboard), digest)); + bytes memory watcherSig = _createSignature(sigDigest, watcherPrivateKey); + return (watcherSig, digest); } function createWithdrawPayloadDetail( @@ -614,12 +614,12 @@ contract DeliveryHelperTest is SetupTest { bytes32 payloadId_, PayloadDetails memory payloadDetails ) internal returns (bytes memory returnData) { - (bytes memory watcherSig, bytes32 root) = finalize(payloadId_, payloadDetails); + (bytes memory watcherSig, bytes32 digest) = finalize(payloadId_, payloadDetails); returnData = relayTx( payloadDetails.chainSlug, payloadId_, - root, + digest, payloadDetails, watcherSig ); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 216ca823..4f8da541 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -173,7 +173,7 @@ contract SetupTest is Test { function relayTx( uint32 chainSlug_, bytes32 payloadId, - bytes32 root, + bytes32 digest, PayloadDetails memory payloadDetails, bytes memory watcherSignature ) internal returns (bytes memory) { @@ -186,7 +186,7 @@ contract SetupTest is Test { vm.startPrank(transmitterEOA); AttestAndExecutePayloadParams memory params = AttestAndExecutePayloadParams({ switchboard: address(socketConfig.switchboard), - root: root, + digest: digest, watcherSignature: watcherSignature, payloadId: payloadId, appGateway: payloadDetails.appGateway, From b838b96e27af44f04f24691b622f504804befe05 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:33:58 +0400 Subject: [PATCH 02/12] feat: watcher sign to proof --- contracts/interfaces/ISwitchboard.sol | 2 +- contracts/interfaces/IWatcherPrecompile.sol | 6 +-- contracts/mock/MockWatcherPrecompile.sol | 14 +++---- .../app-gateway/AuctionManager.sol | 2 +- contracts/protocol/socket/SocketBatcher.sol | 6 +-- .../socket/switchboard/FastSwitchboard.sol | 6 +-- contracts/protocol/utils/common/Errors.sol | 2 +- contracts/protocol/utils/common/Structs.sol | 2 +- .../watcherPrecompile/WatcherPrecompile.sol | 25 +++++------ hardhat-scripts/constants/relayers.ts | 42 +++++++++---------- hardhat-scripts/deploy/2.roles.ts | 19 +++++---- test/DeliveryHelper.t.sol | 2 +- test/SetupTest.t.sol | 4 +- 13 files changed, 65 insertions(+), 67 deletions(-) diff --git a/contracts/interfaces/ISwitchboard.sol b/contracts/interfaces/ISwitchboard.sol index f2a82559..394d4044 100644 --- a/contracts/interfaces/ISwitchboard.sol +++ b/contracts/interfaces/ISwitchboard.sol @@ -15,5 +15,5 @@ interface ISwitchboard { */ function allowPacket(bytes32 digest_, bytes32 packetId_) external view returns (bool); - function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external; + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata proof_) external; } diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index e9671c4f..ee1321c4 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -56,10 +56,10 @@ interface IWatcherPrecompile { bytes memory payload_ ) external returns (bytes32 payloadId); - /// @notice Marks a request as finalized with a signature + /// @notice Marks a request as finalized with a proof /// @param payloadId_ The unique identifier of the request - /// @param signature_ The watcher's signature - function finalized(bytes32 payloadId_, bytes calldata signature_) external; + /// @param proof_ The watcher's proof + function finalized(bytes32 payloadId_, bytes calldata proof_) external; /// @notice Finalizes multiple payload execution requests with a new transmitter /// @param payloadId_ The unique identifier of the request diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index 655fe32e..ea96329d 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -57,8 +57,8 @@ contract MockWatcherPrecompile { /// @notice Emitted when a request is finalized /// @param payloadId The unique identifier for the request /// @param asyncRequest The async request details - /// @param watcherSignature The signature from the watcher - event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes watcherSignature); + /// @param proof The proof from the watcher + event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes proof); /// @notice Emitted when a promise is resolved /// @param payloadId The unique identifier for the resolved promise @@ -120,7 +120,7 @@ contract MockWatcherPrecompile { // ================== Finalize functions ================== - /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain + /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request /// @return digest The merkle digest of the payload parameters @@ -169,12 +169,12 @@ contract MockWatcherPrecompile { emit QueryRequested(chainSlug, targetAddress, payloadId, payload); } - /// @notice Marks a request as finalized with a signature + /// @notice Marks a request as finalized with a proof /// @param payloadId_ The unique identifier of the request - /// @param signature_ The watcher's signature + /// @param proof_ The watcher's proof /// @dev Only callable by the contract owner - function finalized(bytes32 payloadId_, bytes calldata signature_) external { - emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); + function finalized(bytes32 payloadId_, bytes calldata proof_) external { + emit Finalized(payloadId_, asyncRequests[payloadId_], proof_); } /// @notice Resolves multiple promises with their return data diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 59bad963..17c555db 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -152,7 +152,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia function expireBid(bytes32 asyncId_) external onlyWatcherPrecompile { PayloadBatch memory batch = IDeliveryHelper(addressResolver__.deliveryHelper()) .payloadBatches(asyncId_); - + // if executed, bid is not expired if (batch.totalPayloadsRemaining == 0 || batch.isBatchCancelled) return; diff --git a/contracts/protocol/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol index 3b6d2869..726101e8 100644 --- a/contracts/protocol/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -28,11 +28,7 @@ contract SocketBatcher is Ownable { function attestAndExecute( AttestAndExecutePayloadParams calldata params_ ) external payable returns (bytes memory) { - ISwitchboard(params_.switchboard).attest( - params_.payloadId, - params_.digest, - params_.watcherSignature - ); + ISwitchboard(params_.switchboard).attest(params_.payloadId, params_.digest, params_.proof); ISocket.ExecuteParams memory executeParams = ISocket.ExecuteParams({ payloadId: params_.payloadId, diff --git a/contracts/protocol/socket/switchboard/FastSwitchboard.sol b/contracts/protocol/socket/switchboard/FastSwitchboard.sol index 8d1cc668..874e7d19 100644 --- a/contracts/protocol/socket/switchboard/FastSwitchboard.sol +++ b/contracts/protocol/socket/switchboard/FastSwitchboard.sol @@ -33,13 +33,13 @@ contract FastSwitchboard is SwitchboardBase { * @dev Function to attest a packet * @param payloadId_ Packet ID * @param digest_ Digest of the packet - * @param signature_ Signature of the watcher + * @param proof_ Proof of the watcher * @notice we are attesting a digest uniquely identified with packetId and proposalCount. However, * there can be multiple proposals for same digest. To avoid need to re-attest for different proposals * with same digest, we are storing attestations against digest instead of packetId and proposalCount. */ - function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external { - address watcher = _recoverSigner(keccak256(abi.encode(address(this), digest_)), signature_); + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata proof_) external { + address watcher = _recoverSigner(keccak256(abi.encode(address(this), digest_)), proof_); if (isAttested[digest_]) revert AlreadyAttested(); if (!_hasRole(WATCHER_ROLE, watcher)) revert WatcherNotFound(); diff --git a/contracts/protocol/utils/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol index 1ab0cde6..11c15386 100644 --- a/contracts/protocol/utils/common/Errors.sol +++ b/contracts/protocol/utils/common/Errors.sol @@ -28,4 +28,4 @@ error InvalidPromise(); error InvalidIndex(); error InvalidTransmitter(); error FeesNotSet(); -error InvalidTokenAddress(); \ No newline at end of file +error InvalidTokenAddress(); diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 20bcf5de..fe629c79 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -85,7 +85,7 @@ struct AttestAndExecutePayloadParams { address target; uint256 executionGasLimit; uint256 deadline; - bytes watcherSignature; + bytes proof; bytes transmitterSignature; bytes payload; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index fc1000f0..0f6ae695 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -27,9 +27,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Mapping to store timeout requests /// @dev timeoutId => TimeoutRequest struct mapping(bytes32 => TimeoutRequest) public timeoutRequests; - /// @notice Mapping to store watcher signatures - /// @dev payloadId => signature bytes - mapping(bytes32 => bytes) public watcherSignatures; + /// @notice Mapping to store watcher proofs + /// @dev payloadId => proof bytes + mapping(bytes32 => bytes) public watcherProofs; /// @notice Mapping to store if appGateway has been called with trigger from on-chain Inbox /// @dev callId => bool @@ -72,8 +72,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Emitted when a request is finalized /// @param payloadId The unique identifier for the request /// @param asyncRequest The async request details - /// @param watcherSignature The signature from the watcher - event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes watcherSignature); + /// @param proof The proof from the watcher + event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes proof); /// @notice Emitted when a promise is resolved /// @param payloadId The unique identifier for the resolved promise @@ -172,7 +172,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== Finalize functions ================== - /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain + /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request /// @return digest The merkle digest of the payload parameters @@ -290,18 +290,15 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { emit QueryRequested(chainSlug_, targetAddress_, payloadId, payload_); } - /// @notice Marks a request as finalized with a signature on digest + /// @notice Marks a request as finalized with a proof on digest /// @param payloadId_ The unique identifier of the request - /// @param signature_ The watcher's signature + /// @param proof_ The watcher's proof /// @dev Only callable by the contract owner /// @dev Watcher signs on following digest for validation on switchboard: /// @dev keccak256(abi.encode(switchboard, digest)) - function finalized( - bytes32 payloadId_, - bytes calldata signature_ - ) external onlyRole(WATCHER_ROLE) { - watcherSignatures[payloadId_] = signature_; - emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); + function finalized(bytes32 payloadId_, bytes calldata proof_) external onlyRole(WATCHER_ROLE) { + watcherProofs[payloadId_] = proof_; + emit Finalized(payloadId_, asyncRequests[payloadId_], proof_); } /// @notice Resolves multiple promises with their return data diff --git a/hardhat-scripts/constants/relayers.ts b/hardhat-scripts/constants/relayers.ts index 1cbee517..589291d9 100644 --- a/hardhat-scripts/constants/relayers.ts +++ b/hardhat-scripts/constants/relayers.ts @@ -1,22 +1,22 @@ export const relayerAddressList = [ - "0x59D24CD3A0b2b646F980A62DCb0aA4115506FFc9", - "0x762783712FD12231601d6d8591F3a5718812D534", - "0x9f5C9941306E7B57583E99033BedB7eA7889EEA4", - "0xd35F262d6f2D3F6D610bAf6635dE57c349ca83A1", - "0xce6b9c352f864515d7E8BBEA67d80d18245937F2", - "0xE651eDb3F16D9e6b1145ae5eee388f0e48D2d44b", - "0xc176E88dE45747743699fAeA58814Ce98a2faC2D", - "0x88220692264EEc280Bd5AaF9278CdE0737Feb2D6", - "0x2d68551354226c7321130f122055F049F8F67791", - "0xA7C89619ceaC009a23c6C3bC5F74d41BBaC68fD1", - "0x7893D79718860DF30e5Fd21AAA6Be05edD22465D", - "0x6386c83e994331c6a41A4420294D130930AEDF9e", - "0xfF33A0afc88CbF48C9DB31Fc2D2EC2F36D598184", - "0xB756B6D986eE448433542A60A1f590EE3B0DFCda", - "0x76943F947D5622624444aeFF135a5121d6732299", - "0x049B750045fdE15F347aF9E86FB80dD879C848ea", - "0x9c653569C32473F40210495128BB5A40ef10c65B", - "0x0291a40beF28E3606b8208a665F900d141E9A8B3", - "0x2e498dFB44CC79D2ef80Afd7C4439BEC8822E216", - "0x049E701A690E885467E54A1B0595f90BDc8324B0" -] \ No newline at end of file + "0x59D24CD3A0b2b646F980A62DCb0aA4115506FFc9", + "0x762783712FD12231601d6d8591F3a5718812D534", + "0x9f5C9941306E7B57583E99033BedB7eA7889EEA4", + "0xd35F262d6f2D3F6D610bAf6635dE57c349ca83A1", + "0xce6b9c352f864515d7E8BBEA67d80d18245937F2", + "0xE651eDb3F16D9e6b1145ae5eee388f0e48D2d44b", + "0xc176E88dE45747743699fAeA58814Ce98a2faC2D", + "0x88220692264EEc280Bd5AaF9278CdE0737Feb2D6", + "0x2d68551354226c7321130f122055F049F8F67791", + "0xA7C89619ceaC009a23c6C3bC5F74d41BBaC68fD1", + "0x7893D79718860DF30e5Fd21AAA6Be05edD22465D", + "0x6386c83e994331c6a41A4420294D130930AEDF9e", + "0xfF33A0afc88CbF48C9DB31Fc2D2EC2F36D598184", + "0xB756B6D986eE448433542A60A1f590EE3B0DFCda", + "0x76943F947D5622624444aeFF135a5121d6732299", + "0x049B750045fdE15F347aF9E86FB80dD879C848ea", + "0x9c653569C32473F40210495128BB5A40ef10c65B", + "0x0291a40beF28E3606b8208a665F900d141E9A8B3", + "0x2e498dFB44CC79D2ef80Afd7C4439BEC8822E216", + "0x049E701A690E885467E54A1B0595f90BDc8324B0", +]; diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index 5e54711b..cfbb1120 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -64,22 +64,26 @@ async function getSigner(chain: number) { return signer; } - -async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[chain] ?? {}) as ChainAddressesObj; +async function setRolesForOnChain( + chain: number, + addresses: DeploymentAddresses +) { + const chainAddresses: ChainAddressesObj = (addresses[chain] ?? + {}) as ChainAddressesObj; const signer = await getSigner(chain); for (const [contractName, roles] of Object.entries(REQUIRED_ROLES)) { - const contractAddress = chainAddresses[contractName as keyof ChainAddressesObj]; + const contractAddress = + chainAddresses[contractName as keyof ChainAddressesObj]; if (!contractAddress) continue; for (const roleName of roles) { const targetAddress = - contractName === CORE_CONTRACTS.FastSwitchboard && roleName === ROLES.WATCHER_ROLE + contractName === CORE_CONTRACTS.FastSwitchboard && + roleName === ROLES.WATCHER_ROLE ? watcher : signer.address; - await setRoleForContract( contractName as CORE_CONTRACTS, contractAddress, @@ -93,7 +97,8 @@ async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) } async function setRolesForEVMx(addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? {}) as ChainAddressesObj; + const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? + {}) as ChainAddressesObj; const signer = await getSigner(EVMX_CHAIN_ID); const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 626eb4ae..b95d7b34 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -509,7 +509,7 @@ contract DeliveryHelperTest is SetupTest { payloadDetails.payload ); bytes32 digest = watcherPrecompile.getDigest(digestParams_); - + bytes32 sigDigest = keccak256(abi.encode(address(socketConfig.switchboard), digest)); bytes memory watcherSig = _createSignature(sigDigest, watcherPrivateKey); return (watcherSig, digest); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 4f8da541..7ffbdc2c 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -175,7 +175,7 @@ contract SetupTest is Test { bytes32 payloadId, bytes32 digest, PayloadDetails memory payloadDetails, - bytes memory watcherSignature + bytes memory watcherProof ) internal returns (bytes memory) { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); bytes32 transmitterDigest = keccak256(abi.encode(address(socketConfig.socket), payloadId)); @@ -187,7 +187,7 @@ contract SetupTest is Test { AttestAndExecutePayloadParams memory params = AttestAndExecutePayloadParams({ switchboard: address(socketConfig.switchboard), digest: digest, - watcherSignature: watcherSignature, + proof: watcherProof, payloadId: payloadId, appGateway: payloadDetails.appGateway, executionGasLimit: payloadDetails.executionGasLimit, From 16c32179ce8b79a088b0671c98e5e4a14b2600e4 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:37:14 +0400 Subject: [PATCH 03/12] fix: emit event for failed promise --- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 0f6ae695..ec51b20d 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -79,6 +79,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @param payloadId The unique identifier for the resolved promise event PromiseResolved(bytes32 indexed payloadId, bool success, address asyncPromise); + /// @notice Emitted when a promise is not resolved + /// @param payloadId The unique identifier for the not resolved promise + event PromiseNotResolved(bytes32 indexed payloadId, bool success, address asyncPromise); + event TimeoutRequested( bytes32 timeoutId, address target, @@ -322,8 +326,12 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { resolvedPromises_[i].returnData[j] ); - if (!success) break; - emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]); + if (!success) { + emit PromiseNotResolved(resolvedPromises_[i].payloadId, success, next[j]); + break; + } else { + emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]); + } } } } From e4b143b1d42112c18411810dc5411842b1b5bde3 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 18:53:30 +0400 Subject: [PATCH 04/12] gix: origin gateway rename --- contracts/protocol/AddressResolver.sol | 4 +-- .../app-gateway/BatchAsync.sol | 1 + .../app-gateway/FeesManager.sol | 26 +++++++++---------- .../protocol/utils/AddressResolverUtil.sol | 6 ++--- .../WatcherPrecompileLimits.sol | 10 +++---- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 5be797e7..28050c26 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -36,7 +36,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { mapping(address => address) public override gatewaysToContracts; /// @notice Error thrown if AppGateway contract was already set by a different address - error AppGatewayContractAlreadySetByDifferentSender(address contractAddress_); + error InvalidCaller(address contractAddress_); event PlugAdded(address appGateway, uint32 chainSlug, address plug); event ForwarderDeployed(address newForwarder, bytes32 salt); @@ -166,7 +166,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { contractsToGateways[contractAddress_] != address(0) && contractsToGateways[contractAddress_] != msg.sender ) { - revert AppGatewayContractAlreadySetByDifferentSender(contractAddress_); + revert InvalidCaller(contractAddress_); } contractsToGateways[contractAddress_] = msg.sender; } diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 39cd5674..03c0a42c 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -182,6 +182,7 @@ abstract contract BatchAsync is QueueAsync { uint256 readEndIndex, bytes32 asyncId ) internal returns (address) { + // later changed to main app gateway if its a write call address appGateway = msg.sender; uint256 writes = 0; diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 8acf5997..3ce49665 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -127,19 +127,19 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @param amount_ The amount deposited function incrementFeesDeposited( uint32 chainSlug_, - address appGateway_, + address originAppGateway_, address token_, uint256 amount_ ) external onlyOwner { - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][chainSlug_][token_]; tokenBalance.deposited += amount_; emit FeesDepositedUpdated(chainSlug_, appGateway, token_, amount_); } - function isFeesEnough(address appGateway_, Fees memory fees_) external view returns (bool) { - address appGateway = _getCoreAppGateway(appGateway_); + function isFeesEnough(address originAppGateway_, Fees memory fees_) external view returns (bool) { + address appGateway = _getCoreAppGateway(originAppGateway_); uint256 availableFees = getAvailableFees( fees_.feePoolChain, appGateway, @@ -154,7 +154,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @param asyncId_ The batch identifier /// @dev Only callable by delivery helper function blockFees( - address appGateway_, + address originAppGateway_, Fees memory feesGivenByApp_, Bid memory winningBid_, bytes32 asyncId_ @@ -162,7 +162,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl if (msg.sender != deliveryHelper().getAsyncBatchDetails(asyncId_).auctionManager) revert NotAuctionManager(); - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); // Block fees uint256 availableFees = getAvailableFees( feesGivenByApp_.feePoolChain, @@ -203,12 +203,12 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl function unblockAndAssignFees( bytes32 asyncId_, address transmitter_, - address appGateway_ + address originAppGateway_ ) external override onlyDeliveryHelper { Fees memory fees = asyncIdBlockedFees[asyncId_]; if (fees.amount == 0) revert NoFeesBlocked(); - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees.feePoolChain][ fees.feePoolToken ]; @@ -225,11 +225,11 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl emit FeesUnblockedAndAssigned(asyncId_, transmitter_, fees.amount); } - function unblockFees(bytes32 asyncId_, address appGateway_) external onlyDeliveryHelper { + function unblockFees(bytes32 asyncId_, address originAppGateway_) external onlyDeliveryHelper { Fees memory fees = asyncIdBlockedFees[asyncId_]; if (fees.amount == 0) revert NoFeesBlocked(); - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees.feePoolChain][ fees.feePoolToken ]; @@ -297,19 +297,19 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Withdraws funds to a specified receiver /// @dev This function is used to withdraw fees from the fees plug - /// @param appGateway_ The address of the app gateway + /// @param originAppGateway_ The address of the app gateway /// @param chainSlug_ The chain identifier /// @param token_ The address of the token /// @param amount_ The amount of tokens to withdraw /// @param receiver_ The address of the receiver function getWithdrawToPayload( - address appGateway_, + address originAppGateway_, uint32 chainSlug_, address token_, uint256 amount_, address receiver_ ) public returns (PayloadDetails memory) { - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); // Check if amount is available in fees plug uint256 availableAmount = getAvailableFees(chainSlug_, appGateway, token_); diff --git a/contracts/protocol/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index 6172427b..de888174 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -59,9 +59,9 @@ abstract contract AddressResolverUtil { addressResolver__ = IAddressResolver(_addressResolver); } - function _getCoreAppGateway(address appGateway_) internal view returns (address appGateway) { - appGateway = addressResolver__.contractsToGateways(appGateway_); - if (appGateway == address(0)) appGateway = appGateway_; + function _getCoreAppGateway(address originAppGateway_) internal view returns (address appGateway) { + appGateway = addressResolver__.contractsToGateways(originAppGateway_); + if (appGateway == address(0)) appGateway = originAppGateway_; } // for proxy contracts diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 284d012c..2753ee41 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -152,15 +152,15 @@ abstract contract WatcherPrecompileLimits is /** * @notice Internal function to get the core app gateway address - * @param appGateway_ The input app gateway address + * @param originAppGateway_ The input app gateway address * @return appGateway The resolved core app gateway address */ - function _getAppGateway(address appGateway_) internal view returns (address appGateway) { - address resolverAddress = msg.sender == addressResolver__.deliveryHelper() - ? appGateway_ + function _getAppGateway(address originAppGateway_) internal view returns (address appGateway) { + address originAppGateway = msg.sender == addressResolver__.deliveryHelper() + ? originAppGateway_ : msg.sender; - appGateway = _getCoreAppGateway(resolverAddress); + appGateway = _getCoreAppGateway(originAppGateway); } /** From 9f70039e023f9e0fc9aab2c74ee9820ba51193cb Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:01:13 +0400 Subject: [PATCH 05/12] rename: watchervm/offchain to EVMx --- contracts/interfaces/ISocket.sol | 4 ++-- .../app-gateway/AuctionManager.sol | 10 +++++----- .../payload-delivery/app-gateway/FeesManager.sol | 9 ++++++--- contracts/protocol/utils/AddressResolverUtil.sol | 4 +++- .../watcherPrecompile/WatcherPrecompile.sol | 10 +++++----- hardhat-scripts/deploy/1.deploy.ts | 16 ++++++++-------- hardhat-scripts/deploy/2.roles.ts | 7 +++++-- hardhat-scripts/deploy/3.upgradeManagers.ts | 4 ++-- hardhat-scripts/deploy/4.connect.ts | 12 ++++++------ script/mock/{DeployVM.s.sol => DeployEVMx.s.sol} | 3 ++- .../{deployOffchain.s.sol => deployOnEVMx.s.sol} | 0 test/DeliveryHelper.t.sol | 12 ++++++++---- test/Migration.t.sol | 2 +- test/SetupTest.t.sol | 6 +++--- test/apps/Counter.t.sol | 4 ++-- test/apps/SuperToken.t.sol | 2 +- test/apps/SuperTokenLockable.t.sol | 11 +++++++---- testScript.sh | 4 ++-- 18 files changed, 68 insertions(+), 52 deletions(-) rename script/mock/{DeployVM.s.sol => DeployEVMx.s.sol} (95%) rename script/parallel-counter/{deployOffchain.s.sol => deployOnEVMx.s.sol} (100%) diff --git a/contracts/interfaces/ISocket.sol b/contracts/interfaces/ISocket.sol index 60729a00..d46f6eca 100644 --- a/contracts/interfaces/ISocket.sol +++ b/contracts/interfaces/ISocket.sol @@ -65,8 +65,8 @@ interface ISocket { } /** - * @notice To call the appGateway on offChainVM. Should only be called by a plug. - * @param payload_ bytes to be delivered to the Plug on offChainVM + * @notice To call the appGateway on EVMx. Should only be called by a plug. + * @param payload_ bytes to be delivered to the Plug on EVMx * @param params_ a 32 bytes param to add details for execution. */ function callAppGateway( diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 17c555db..f5933c02 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -13,7 +13,7 @@ import "solady/utils/Initializable.sol"; /// @title AuctionManager /// @notice Contract for managing auctions and placing bids contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initializable { - uint32 public vmChainSlug; + uint32 public evmxChainSlug; mapping(bytes32 => Bid) public winningBids; // asyncId => auction status mapping(bytes32 => bool) public override auctionClosed; @@ -39,19 +39,19 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia } /// @notice Initializer function to replace constructor - /// @param vmChainSlug_ The chain slug for the VM + /// @param evmxChainSlug_ The chain slug for the VM /// @param auctionEndDelaySeconds_ The delay in seconds before an auction can end /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the contract owner function initialize( - uint32 vmChainSlug_, + uint32 evmxChainSlug_, uint256 auctionEndDelaySeconds_, address addressResolver_, address owner_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - vmChainSlug = vmChainSlug_; + evmxChainSlug = evmxChainSlug_; auctionEndDelaySeconds = auctionEndDelaySeconds_; } @@ -84,7 +84,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia if (auctionClosed[asyncId_]) revert AuctionClosed(); address transmitter = _recoverSigner( - keccak256(abi.encode(address(this), vmChainSlug, asyncId_, fee, extraData)), + keccak256(abi.encode(address(this), evmxChainSlug, asyncId_, fee, extraData)), transmitterSignature ); diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 3ce49665..8c6873de 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -122,7 +122,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Adds the fees deposited for an app gateway on a chain /// @param chainSlug_ The chain identifier - /// @param appGateway_ The app gateway address + /// @param originAppGateway_ The app gateway address /// @param token_ The token address /// @param amount_ The amount deposited function incrementFeesDeposited( @@ -138,7 +138,10 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl emit FeesDepositedUpdated(chainSlug_, appGateway, token_, amount_); } - function isFeesEnough(address originAppGateway_, Fees memory fees_) external view returns (bool) { + function isFeesEnough( + address originAppGateway_, + Fees memory fees_ + ) external view returns (bool) { address appGateway = _getCoreAppGateway(originAppGateway_); uint256 availableFees = getAvailableFees( fees_.feePoolChain, @@ -149,7 +152,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl } /// @notice Blocks fees for transmitter - /// @param appGateway_ The app gateway address + /// @param originAppGateway_ The app gateway address /// @param feesGivenByApp_ The fees data struct given by the app gateway /// @param asyncId_ The batch identifier /// @dev Only callable by delivery helper diff --git a/contracts/protocol/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index de888174..a0dcd789 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -59,7 +59,9 @@ abstract contract AddressResolverUtil { addressResolver__ = IAddressResolver(_addressResolver); } - function _getCoreAppGateway(address originAppGateway_) internal view returns (address appGateway) { + function _getCoreAppGateway( + address originAppGateway_ + ) internal view returns (address appGateway) { appGateway = addressResolver__.contractsToGateways(originAppGateway_); if (appGateway == address(0)) appGateway = originAppGateway_; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index ec51b20d..368d8dfc 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -19,7 +19,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint256 public expiryTime; /// @notice The chain slug of the watcher precompile - uint32 public vmChainSlug; + uint32 public evmxChainSlug; /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct @@ -107,7 +107,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { address addressResolver_, uint256 defaultLimit_, uint256 expiryTime_, - uint32 vmChainSlug_ + uint32 evmxChainSlug_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); @@ -119,7 +119,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // limit per second defaultRatePerSecond = defaultLimit / (24 * 60 * 60); - vmChainSlug = vmChainSlug_; + evmxChainSlug = evmxChainSlug_; } // ================== Timeout functions ================== @@ -137,7 +137,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from auction manager _consumeLimit(appGateway_, SCHEDULE, 1); uint256 executeAt = block.timestamp + delayInSeconds_; - bytes32 timeoutId = _encodeId(vmChainSlug, address(this)); + bytes32 timeoutId = _encodeId(evmxChainSlug, address(this)); timeoutRequests[timeoutId] = TimeoutRequest( timeoutId, msg.sender, @@ -273,7 +273,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from payload delivery _consumeLimit(appGateway_, QUERY, 1); // Generate unique payload ID from query counter - payloadId = _encodeId(vmChainSlug, address(this)); + payloadId = _encodeId(evmxChainSlug, address(this)); // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 92c9c5f0..a860969a 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -25,7 +25,7 @@ import { } from "../utils"; config(); -let offChainVMOwner: string; +let EVMxOwner: string; const main = async () => { logConfig(); @@ -57,7 +57,7 @@ const deployEVMxContracts = async () => { process.env.WATCHER_PRIVATE_KEY as string, providerInstance ); - offChainVMOwner = signer.address; + EVMxOwner = signer.address; deployUtils = { addresses: chainAddresses, @@ -80,7 +80,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.AddressResolver, `contracts/protocol/AddressResolver.sol`, - [offChainVMOwner], + [EVMxOwner], proxyFactory, deployUtils ); @@ -94,7 +94,7 @@ const deployEVMxContracts = async () => { EVMxCoreContracts.WatcherPrecompile, `contracts/protocol/watcherPrecompile/WatcherPrecompile.sol`, [ - offChainVMOwner, + EVMxOwner, addressResolver.address, MAX_LIMIT, EXPIRY_TIME, @@ -107,7 +107,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.FeesManager, `contracts/protocol/payload-delivery/app-gateway/FeesManager.sol`, - [addressResolver.address, offChainVMOwner], + [addressResolver.address, EVMxOwner], proxyFactory, deployUtils ); @@ -119,7 +119,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.DeliveryHelper, `contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol`, - [addressResolver.address, offChainVMOwner, BID_TIMEOUT], + [addressResolver.address, EVMxOwner, BID_TIMEOUT], proxyFactory, deployUtils ); @@ -131,7 +131,7 @@ const deployEVMxContracts = async () => { EVMX_CHAIN_ID, auctionEndDelaySeconds, addressResolver.address, - offChainVMOwner, + EVMxOwner, ], proxyFactory, deployUtils @@ -380,7 +380,7 @@ const deployContractWithProxy = async ( // Deploy transparent proxy const tx = await proxyFactory .connect(deployUtils.signer) - .deployAndCall(implementation.address, offChainVMOwner, initData); + .deployAndCall(implementation.address, EVMxOwner, initData); const receipt = await tx.wait(); const proxyAddress = receipt.events?.find((e) => e.event === "Deployed")?.args ?.proxy; diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index fd9b60bb..fe6ab9f9 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -60,7 +60,9 @@ async function setRoleForContract( async function getSigner(chain: number, isWatcher: boolean = false) { const providerInstance = getProviderFromChainSlug(chain); const signer: Wallet = new ethers.Wallet( - isWatcher ? process.env.WATCHER_PRIVATE_KEY as string : process.env.SOCKET_SIGNER_KEY as string, + isWatcher + ? (process.env.WATCHER_PRIVATE_KEY as string) + : (process.env.SOCKET_SIGNER_KEY as string), providerInstance ); return signer; @@ -99,7 +101,8 @@ async function setRolesForOnChain( } async function setRolesForEVMx(addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? {}) as ChainAddressesObj; + const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? + {}) as ChainAddressesObj; const signer = await getSigner(EVMX_CHAIN_ID, true); const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 6dca3449..92a522d5 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -64,11 +64,11 @@ async function setOnchainContracts(chain, addresses) { process.env.WATCHER_PRIVATE_KEY as string, providerInstance ); - const watcherVMaddr = addresses[EVMX_CHAIN_ID]!; + const EVMxAddresses = addresses[EVMX_CHAIN_ID]!; const watcherPrecompile = ( await getInstance( EVMxCoreContracts.WatcherPrecompile, - watcherVMaddr[EVMxCoreContracts.WatcherPrecompile] + EVMxAddresses[EVMxCoreContracts.WatcherPrecompile] ) ).connect(signer); diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index 203badb3..7baec350 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -122,7 +122,7 @@ export const connectPlugsOnSocket = async () => { ); }; -export const isConfigSetOnWatcherVM = async ( +export const isConfigSetOnEVMx = async ( watcher: Contract, chain: number, plug: string, @@ -137,7 +137,7 @@ export const isConfigSetOnWatcherVM = async ( }; // Configure plugs on the Watcher VM -export const updateConfigWatcherVM = async () => { +export const updateConfigEVMx = async () => { try { console.log("Connecting plugs on EVMx"); const addresses = dev_addresses as unknown as DeploymentAddresses; @@ -151,11 +151,11 @@ export const updateConfigWatcherVM = async () => { process.env.WATCHER_PRIVATE_KEY as string, providerInstance ); - const watcherVMaddr = addresses[EVMX_CHAIN_ID]!; + const EVMxAddresses = addresses[EVMX_CHAIN_ID]!; const watcher = ( await getInstance( EVMxCoreContracts.WatcherPrecompile, - watcherVMaddr[EVMxCoreContracts.WatcherPrecompile] + EVMxAddresses[EVMxCoreContracts.WatcherPrecompile] ) ).connect(signer); @@ -172,7 +172,7 @@ export const updateConfigWatcherVM = async () => { checkIfAddressExists(appGateway, "AppGateway"); if ( - await isConfigSetOnWatcherVM( + await isConfigSetOnEVMx( watcher, chain, addr[plugContract], @@ -209,7 +209,7 @@ export const updateConfigWatcherVM = async () => { export const main = async () => { try { await connectPlugsOnSocket(); - await updateConfigWatcherVM(); + await updateConfigEVMx(); } catch (error) { console.log("Error while sending transaction", error); } diff --git a/script/mock/DeployVM.s.sol b/script/mock/DeployEVMx.s.sol similarity index 95% rename from script/mock/DeployVM.s.sol rename to script/mock/DeployEVMx.s.sol index 31ecee3f..12570d06 100644 --- a/script/mock/DeployVM.s.sol +++ b/script/mock/DeployEVMx.s.sol @@ -5,7 +5,8 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; import {MockSocket} from "../../contracts/mock/MockSocket.sol"; -contract DeployVM is Script { + +contract DeployEVMx is Script { function run() external { string memory rpc = vm.envString("EVMX_RPC"); vm.createSelectFork(rpc); diff --git a/script/parallel-counter/deployOffchain.s.sol b/script/parallel-counter/deployOnEVMx.s.sol similarity index 100% rename from script/parallel-counter/deployOffchain.s.sol rename to script/parallel-counter/deployOnEVMx.s.sol diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index b95d7b34..05c1f417 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -39,7 +39,7 @@ contract DeliveryHelperTest is SetupTest { function setUpDeliveryHelper() internal { // core - deployOffChainVMCore(); + deployEVMxCore(); // Deploy implementations FeesManager feesManagerImpl = new FeesManager(); DeliveryHelper deliveryHelperImpl = new DeliveryHelper(); @@ -78,7 +78,7 @@ contract DeliveryHelperTest is SetupTest { bytes memory auctionManagerData = abi.encodeWithSelector( AuctionManager.initialize.selector, - vmChainSlug, + evmxChainSlug, auctionEndDelaySeconds, address(addressResolver), owner, @@ -469,7 +469,7 @@ contract DeliveryHelperTest is SetupTest { vm.prank(transmitterEOA); bytes memory transmitterSignature = _createSignature( - keccak256(abi.encode(address(auctionManager), vmChainSlug, asyncId, bidAmount, "")), + keccak256(abi.encode(address(auctionManager), evmxChainSlug, asyncId, bidAmount, "")), transmitterPrivateKey ); @@ -485,7 +485,11 @@ contract DeliveryHelperTest is SetupTest { // ); if (auctionEndDelaySeconds == 0) return; - bytes32 timeoutId = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + bytes32 timeoutId = _encodeId( + evmxChainSlug, + address(watcherPrecompile), + payloadIdCounter++ + ); hoax(watcherEOA); watcherPrecompile.resolveTimeout(timeoutId); diff --git a/test/Migration.t.sol b/test/Migration.t.sol index f29eceda..e073092b 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -28,7 +28,7 @@ contract MigrationTest is SetupTest { bytes4 internal constant UNAUTHORIZED_SELECTOR = 0x82b42900; // bytes4(keccak256("Unauthorized()")) function setUp() public { - deployOffChainVMCore(); + deployEVMxCore(); } function getImplementation(address proxy) internal view returns (address) { diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 7ffbdc2c..83b75e5c 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -32,7 +32,7 @@ contract SetupTest is Test { uint32 arbChainSlug = 421614; uint32 optChainSlug = 11155420; - uint32 vmChainSlug = 1; + uint32 evmxChainSlug = 1; uint256 expiryTime = 10000000; uint256 public payloadIdCounter = 0; @@ -100,7 +100,7 @@ contract SetupTest is Test { }); } - function deployOffChainVMCore() internal { + function deployEVMxCore() internal { // Deploy implementations addressResolverImpl = new AddressResolver(); watcherPrecompileImpl = new WatcherPrecompile(); @@ -125,7 +125,7 @@ contract SetupTest is Test { address(addressResolverProxy), defaultLimit, expiryTime, - vmChainSlug + evmxChainSlug ); vm.expectEmit(true, true, true, false); emit Initialized(version); diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index e0ed658b..2ba5884a 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -143,8 +143,8 @@ contract CounterTest is DeliveryHelperTest { bytes32 bridgeAsyncId = getCurrentAsyncId(); bytes32[] memory payloadIds = new bytes32[](3); - payloadIds[0] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); - payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[0] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( arbChainSlug, diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index 56066ed9..d9558a75 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -84,7 +84,7 @@ contract SuperTokenTest is DeliveryHelperTest { createFees(maxFees), address(auctionManager) ); - // Enable app gateways to do all operations in the Watcher: Read, Write and Schedule on VM + // Enable app gateways to do all operations in the Watcher: Read, Write and Schedule on EVMx // Watcher sets the limits for apps in this SOCKET protocol version depositFees(address(superTokenApp), createFees(1 ether)); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 95e6bebe..cb7ee1ee 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -116,11 +116,14 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address appDeployer = address(uint160(c++)); address chainContractAddress = address(uint160(c++)); - address predicted = addressResolver.getForwarderAddress(chainContractAddress, vmChainSlug); + address predicted = addressResolver.getForwarderAddress( + chainContractAddress, + evmxChainSlug + ); address forwarder = addressResolver.getOrDeployForwarderContract( appDeployer, chainContractAddress, - vmChainSlug + evmxChainSlug ); assertEq(forwarder, predicted); @@ -285,7 +288,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address(getSocketConfig(srcChainSlug).switchboard), payloadIdCounter++ ); - payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( dstChainSlug, address(getSocketConfig(dstChainSlug).switchboard), @@ -540,7 +543,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // address(getSocketConfig(srcChainSlug).contractFactoryPlug), // payloadIdCounter++ // ); - // payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + // payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); // payloadIds[2] = getWritePayloadId( // dstChainSlug, // address(getSocketConfig(dstChainSlug).contractFactoryPlug), diff --git a/testScript.sh b/testScript.sh index eeb2c589..818eb715 100644 --- a/testScript.sh +++ b/testScript.sh @@ -1,7 +1,7 @@ ## Parallel Counter -source .env && forge script script/parallel-counter/deployOffchain.s.sol --broadcast --skip-simulation +source .env && forge script script/parallel-counter/deployOnEVMx.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API source .env && cast send $DEPLOYER "deployMultiChainContracts(uint32[])" '[421614, 11155420]' --private-key $PRIVATE_KEY source .env && forge script script/parallel-counter/checkCounters.s.sol --broadcast --skip-simulation @@ -38,7 +38,7 @@ source .env && forge script script/counter-inbox/CheckGatewayCounter.s.sol --bro ## Mock Testing -source .env && forge script script/mock/DeployVM.s.sol --broadcast --skip-simulation +source .env && forge script script/mock/DeployEVMx.s.sol --broadcast --skip-simulation source .env && forge script script/mock/DeploySocket.s.sol --broadcast --skip-simulation source .env && forge script script/mock/Timeout.s.sol --broadcast --skip-simulation source .env && forge script script/mock/Query.s.sol --broadcast --skip-simulation From 6cebaeb3b584f4a97b54dc548532c129a7957a4a Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:02:39 +0400 Subject: [PATCH 06/12] rename: checkAndConsumeLimit --- contracts/interfaces/IWatcherPrecompile.sol | 2 +- .../protocol/payload-delivery/app-gateway/BatchAsync.sol | 6 +++--- .../protocol/watcherPrecompile/WatcherPrecompileLimits.sol | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index ee1321c4..d8657f98 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -100,7 +100,7 @@ interface IWatcherPrecompile { function setIsValidInboxCaller(uint32 chainSlug_, address plug_, bool isValid_) external; - function checkAndUpdateLimit( + function checkAndConsumeLimit( address appGateway_, bytes32 limitType_, uint256 consumeLimit_ diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 03c0a42c..db2cf1e4 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -97,7 +97,7 @@ abstract contract BatchAsync is QueueAsync { // Handle initial read operations first uint256 readEndIndex = _processReadOperations(payloadDetails_, asyncId); - watcherPrecompile__().checkAndUpdateLimit( + watcherPrecompile__().checkAndConsumeLimit( payloadDetails_[0].appGateway, QUERY, readEndIndex @@ -204,13 +204,13 @@ abstract contract BatchAsync is QueueAsync { payloadBatchDetails[asyncId].push(payloadDetails_[i]); } - watcherPrecompile__().checkAndUpdateLimit( + watcherPrecompile__().checkAndConsumeLimit( appGateway, QUERY, // remaining reads payloadDetails_.length - writes - readEndIndex ); - watcherPrecompile__().checkAndUpdateLimit(appGateway, FINALIZE, writes); + watcherPrecompile__().checkAndConsumeLimit(appGateway, FINALIZE, writes); return appGateway; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 2753ee41..d5acb4a2 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -78,7 +78,7 @@ abstract contract WatcherPrecompileLimits is * @param limitType_ The type of limit to check * @param consumeLimit_ The amount of limit to consume */ - function checkAndUpdateLimit( + function checkAndConsumeLimit( address appGateway_, bytes32 limitType_, uint256 consumeLimit_ From bbafd54c06075040ea17e9e150dfa673e740d4df Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:03:37 +0400 Subject: [PATCH 07/12] rename: getNextAsyncId --- test/DeliveryHelper.t.sol | 14 +++++++------- test/FeesTest.t.sol | 2 +- test/apps/Counter.t.sol | 2 +- test/apps/SuperTokenLockable.t.sol | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 05c1f417..a0c9c1c5 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -292,7 +292,7 @@ contract DeliveryHelperTest is SetupTest { ) internal returns (bytes32 asyncId) { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, address(socketConfig.switchboard), @@ -310,7 +310,7 @@ contract DeliveryHelperTest is SetupTest { IMultiChainAppDeployer appDeployer_, address appGateway_ ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](contractIds.length * chainSlugs_.length); for (uint32 i = 0; i < chainSlugs_.length; i++) { for (uint j = 0; j < contractIds.length; j++) { @@ -359,20 +359,20 @@ contract DeliveryHelperTest is SetupTest { uint32 chainSlug_, uint256 totalPayloads ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); } function _executeReadBatchMultiChain( uint32[] memory chainSlugs_ ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); } function _executeWriteBatchSingleChain( uint32 chainSlug_, uint256 totalPayloads ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, @@ -385,7 +385,7 @@ contract DeliveryHelperTest is SetupTest { function _executeWriteBatchMultiChain( uint32[] memory chainSlugs_ ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bidAndEndAuction(asyncId); for (uint i = 0; i < chainSlugs_.length; i++) { bytes32 payloadId = getWritePayloadId( @@ -650,7 +650,7 @@ contract DeliveryHelperTest is SetupTest { return address(uint160(uint256(hash))); } - function getCurrentAsyncId() public returns (bytes32) { + function getNextAsyncId() public returns (bytes32) { payloadIdCounter++; return bytes32((uint256(uint160(address(deliveryHelper))) << 64) | asyncCounterTest++); } diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index 67d053a0..060f4af2 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -95,7 +95,7 @@ contract FeesTest is DeliveryHelperTest { counterGateway.withdrawFeeTokens(feesChainSlug, ETH_ADDRESS, withdrawAmount, receiver); - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = getWritePayloadIds( feesChainSlug, address(getSocketConfig(feesChainSlug).switchboard), diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index 2ba5884a..ca75e6a1 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -140,7 +140,7 @@ contract CounterTest is DeliveryHelperTest { instances[0] = arbCounterForwarder; instances[1] = optCounterForwarder; - bytes32 bridgeAsyncId = getCurrentAsyncId(); + bytes32 bridgeAsyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](3); payloadIds[0] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index cb7ee1ee..5902ae8e 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -280,7 +280,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { }); uint32 srcChainSlug = IForwarder(userOrder.srcToken).getChainSlug(); uint32 dstChainSlug = IForwarder(userOrder.dstToken).getChainSlug(); - bytes32 bridgeAsyncId = getCurrentAsyncId(); + bytes32 bridgeAsyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](4); payloadIds[0] = getWritePayloadId( @@ -349,7 +349,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { vm.expectEmit(true, true, false, true); emit BatchCancelled(bridgeAsyncId); finalizeQuery(payloadIds[1], abi.encode(0.001 ether)); - bytes32 cancelAsyncId = getCurrentAsyncId(); + bytes32 cancelAsyncId = getNextAsyncId(); bytes32[] memory cancelPayloadIds = new bytes32[](1); uint32 srcChainSlug = IForwarder(userOrder.srcToken).getChainSlug(); @@ -561,7 +561,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // srcChainSlug, // dstChainSlug // ); - // bytes32 bridgeAsyncId = getCurrentAsyncId(); + // bytes32 bridgeAsyncId = getNextAsyncId(); // asyncCounterTest++; // bytes memory encodedOrder = abi.encode(userOrder); @@ -646,7 +646,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // srcChainSlug // ); - // bytes32 cancelAsyncId = getCurrentAsyncId(); + // bytes32 cancelAsyncId = getNextAsyncId(); // asyncCounterTest++; // bidAndValidate( From ce7dd858e452e76dd5383e810b3232d9156b0b66 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:04:52 +0400 Subject: [PATCH 08/12] rename: proof --- test/DeliveryHelper.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index a0c9c1c5..f83c355b 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -515,8 +515,8 @@ contract DeliveryHelperTest is SetupTest { bytes32 digest = watcherPrecompile.getDigest(digestParams_); bytes32 sigDigest = keccak256(abi.encode(address(socketConfig.switchboard), digest)); - bytes memory watcherSig = _createSignature(sigDigest, watcherPrivateKey); - return (watcherSig, digest); + bytes memory proof = _createSignature(sigDigest, watcherPrivateKey); + return (proof, digest); } function createWithdrawPayloadDetail( From 9764d89845362cc992959b3664ca21f2c4b4e8c0 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:07:52 +0400 Subject: [PATCH 09/12] feat: inbox renames --- contracts/apps/counter-inbox/CounterInboxAppGateway.sol | 4 ++-- contracts/base/AppGatewayBase.sol | 2 +- contracts/interfaces/IAppGateway.sol | 2 +- contracts/interfaces/IWatcherPrecompile.sol | 6 +++--- contracts/mock/MockWatcherPrecompile.sol | 6 +++--- contracts/protocol/utils/common/Structs.sol | 2 +- .../protocol/watcherPrecompile/WatcherPrecompileConfig.sol | 6 +++--- test/Inbox.t.sol | 6 +++--- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol b/contracts/apps/counter-inbox/CounterInboxAppGateway.sol index d759a543..23c6a03c 100644 --- a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol +++ b/contracts/apps/counter-inbox/CounterInboxAppGateway.sol @@ -13,11 +13,11 @@ contract CounterInboxAppGateway is AppGatewayBase { uint32 chainSlug_, Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { - watcherPrecompile__().setIsValidInboxCaller(chainSlug_, address(counterInbox_), true); + watcherPrecompile__().setIsValidPlug(chainSlug_, address(counterInbox_), true); _setOverrides(fees_); } - function callFromInbox( + function callFromChain( uint32, address, bytes calldata payload_, diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index 0ae8e5e7..dd4ab09b 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -180,7 +180,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin PayloadBatch memory payloadBatch_ ) external virtual onlyDeliveryHelper {} - function callFromInbox( + function callFromChain( uint32 chainSlug_, address plug_, bytes calldata payload_, diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index 64ebfd1a..308452f0 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -12,7 +12,7 @@ interface IAppGateway { function onBatchComplete(bytes32 asyncId_, PayloadBatch memory payloadBatch_) external; - function callFromInbox( + function callFromChain( uint32 chainSlug_, address plug_, bytes calldata payload_, diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index d8657f98..1e6f510b 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -36,7 +36,7 @@ interface IWatcherPrecompile { /// @notice Finalizes a payload execution request /// @param params_ Parameters needed for finalization /// @return payloadId The unique identifier for the request - /// @return digest The merkle digest of the payload parameters + /// @return digest The digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ @@ -85,7 +85,7 @@ interface IWatcherPrecompile { /// @notice Calculates the Digest hash for payload parameters /// @param params_ The payload parameters used to calculate the digest - /// @return digest The calculated merkle digest hash + /// @return digest The calculated digest hash function getDigest(PayloadDigestParams memory params_) external pure returns (bytes32 digest); function setMaxTimeoutDelayInSeconds(uint256 maxTimeoutDelayInSeconds_) external; @@ -98,7 +98,7 @@ interface IWatcherPrecompile { function feesPlug(uint32 chainSlug_) external view returns (address); - function setIsValidInboxCaller(uint32 chainSlug_, address plug_, bool isValid_) external; + function setIsValidPlug(uint32 chainSlug_, address plug_, bool isValid_) external; function checkAndConsumeLimit( address appGateway_, diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index ea96329d..93f9b3c5 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -5,7 +5,7 @@ import "../interfaces/IAppGateway.sol"; import "../interfaces/IWatcherPrecompile.sol"; import "../interfaces/IPromise.sol"; -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; import "solady/utils/ERC1967Factory.sol"; @@ -123,7 +123,7 @@ contract MockWatcherPrecompile { /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return digest The merkle digest of the payload parameters + /// @return digest The digest of the payload parameters function finalize( FinalizeParams memory params_ ) external returns (bytes32 payloadId, bytes32 digest) { @@ -188,7 +188,7 @@ contract MockWatcherPrecompile { // ================== On-Chain Inbox ================== - function callAppGateways(CallFromInboxParams[] calldata params_) external { + function callAppGateways(CallFromChainParams[] calldata params_) external { for (uint256 i = 0; i < params_.length; i++) { emit CalledAppGateway( params_[i].callId, diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index fe629c79..64c03016 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -50,7 +50,7 @@ struct Bid { bytes extraData; } -struct CallFromInboxParams { +struct CallFromChainParams { bytes32 callId; bytes32 params; address plug; diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index a14631dd..89928c7d 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -28,7 +28,7 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { mapping(uint32 => address) public feesPlug; // appGateway => chainSlug => plug => isValid - mapping(address => mapping(uint32 => mapping(address => bool))) public isValidInboxCaller; + mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; /// @notice Emitted when a new plug is configured for an app gateway /// @param appGateway The address of the app gateway @@ -101,8 +101,8 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { } // @dev app gateway can set the valid plugs for each chain slug - function setIsValidInboxCaller(uint32 chainSlug_, address plug_, bool isValid_) external { - isValidInboxCaller[msg.sender][chainSlug_][plug_] = isValid_; + function setIsValidPlug(uint32 chainSlug_, address plug_, bool isValid_) external { + isValidPlug[msg.sender][chainSlug_][plug_] = isValid_; } /// @notice Retrieves the configuration for a specific plug on a network diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index b407e85e..9072689d 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -46,7 +46,7 @@ contract InboxTest is DeliveryHelperTest { watcherPrecompile.setAppGateways(gateways); hoax(watcherEOA); - watcherPrecompile.setIsValidInboxCaller(arbChainSlug, address(inbox), true); + watcherPrecompile.setIsValidPlug(arbChainSlug, address(inbox), true); } function testInboxIncrement() public { @@ -59,8 +59,8 @@ contract InboxTest is DeliveryHelperTest { bytes32 callId = inbox.increaseOnGateway(incrementValue); hoax(watcherEOA); - CallFromInboxParams[] memory params = new CallFromInboxParams[](1); - params[0] = CallFromInboxParams({ + CallFromChainParams[] memory params = new CallFromChainParams[](1); + params[0] = CallFromChainParams({ callId: callId, chainSlug: arbChainSlug, appGateway: address(gateway), From 8ec15cb74404a071c60c7fa0a48e3c3d8afdae75 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:08:02 +0400 Subject: [PATCH 10/12] rename: merkle --- .../watcherPrecompile/WatcherPrecompile.sol | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 368d8dfc..18681eb8 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -6,7 +6,7 @@ import "../../interfaces/IAppGateway.sol"; import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; /// @title WatcherPrecompile @@ -179,7 +179,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return digest The merkle digest of the payload parameters + /// @return digest The digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ @@ -235,7 +235,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.payload ); - // Calculate merkle digest from payload parameters + // Calculate digest from payload parameters digest = getDigest(digestParams_); // Create and store the async request with all necessary details @@ -361,7 +361,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Calculates the digest hash of payload parameters /// @param params_ The payload parameters - /// @return digest The calculated merkle digest + /// @return digest The calculated digest function getDigest(PayloadDigestParams memory params_) public pure returns (bytes32 digest) { digest = keccak256( abi.encode( @@ -384,14 +384,14 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== On-Chain Inbox ================== function callAppGateways( - CallFromInboxParams[] calldata params_ + CallFromChainParams[] calldata params_ ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < params_.length; i++) { if (appGatewayCalled[params_[i].callId]) revert AppGatewayAlreadyCalled(); - if (!isValidInboxCaller[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) + if (!isValidPlug[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) revert InvalidInboxCaller(); appGatewayCalled[params_[i].callId] = true; - IAppGateway(params_[i].appGateway).callFromInbox( + IAppGateway(params_[i].appGateway).callFromChain( params_[i].chainSlug, params_[i].plug, params_[i].payload, From a8b0e861986344dfeeb782c62e298f4c2f6e7cd6 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 20:13:20 +0400 Subject: [PATCH 11/12] rename: evmxChainSlug to evmxSlug --- .../payload-delivery/app-gateway/AuctionManager.sol | 10 +++++----- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 10 +++++----- test/DeliveryHelper.t.sol | 10 +++------- test/SetupTest.t.sol | 4 ++-- test/apps/Counter.t.sol | 4 ++-- test/apps/SuperTokenLockable.t.sol | 11 ++++------- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index f5933c02..863e969a 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -13,7 +13,7 @@ import "solady/utils/Initializable.sol"; /// @title AuctionManager /// @notice Contract for managing auctions and placing bids contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initializable { - uint32 public evmxChainSlug; + uint32 public evmxSlug; mapping(bytes32 => Bid) public winningBids; // asyncId => auction status mapping(bytes32 => bool) public override auctionClosed; @@ -39,19 +39,19 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia } /// @notice Initializer function to replace constructor - /// @param evmxChainSlug_ The chain slug for the VM + /// @param evmxSlug_ The chain slug for the VM /// @param auctionEndDelaySeconds_ The delay in seconds before an auction can end /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the contract owner function initialize( - uint32 evmxChainSlug_, + uint32 evmxSlug_, uint256 auctionEndDelaySeconds_, address addressResolver_, address owner_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - evmxChainSlug = evmxChainSlug_; + evmxSlug = evmxSlug_; auctionEndDelaySeconds = auctionEndDelaySeconds_; } @@ -84,7 +84,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia if (auctionClosed[asyncId_]) revert AuctionClosed(); address transmitter = _recoverSigner( - keccak256(abi.encode(address(this), evmxChainSlug, asyncId_, fee, extraData)), + keccak256(abi.encode(address(this), evmxSlug, asyncId_, fee, extraData)), transmitterSignature ); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 18681eb8..576d3c31 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -19,7 +19,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint256 public expiryTime; /// @notice The chain slug of the watcher precompile - uint32 public evmxChainSlug; + uint32 public evmxSlug; /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct @@ -107,7 +107,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { address addressResolver_, uint256 defaultLimit_, uint256 expiryTime_, - uint32 evmxChainSlug_ + uint32 evmxSlug_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); @@ -119,7 +119,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // limit per second defaultRatePerSecond = defaultLimit / (24 * 60 * 60); - evmxChainSlug = evmxChainSlug_; + evmxSlug = evmxSlug_; } // ================== Timeout functions ================== @@ -137,7 +137,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from auction manager _consumeLimit(appGateway_, SCHEDULE, 1); uint256 executeAt = block.timestamp + delayInSeconds_; - bytes32 timeoutId = _encodeId(evmxChainSlug, address(this)); + bytes32 timeoutId = _encodeId(evmxSlug, address(this)); timeoutRequests[timeoutId] = TimeoutRequest( timeoutId, msg.sender, @@ -273,7 +273,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from payload delivery _consumeLimit(appGateway_, QUERY, 1); // Generate unique payload ID from query counter - payloadId = _encodeId(evmxChainSlug, address(this)); + payloadId = _encodeId(evmxSlug, address(this)); // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index f83c355b..04a0fc3e 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -78,7 +78,7 @@ contract DeliveryHelperTest is SetupTest { bytes memory auctionManagerData = abi.encodeWithSelector( AuctionManager.initialize.selector, - evmxChainSlug, + evmxSlug, auctionEndDelaySeconds, address(addressResolver), owner, @@ -469,7 +469,7 @@ contract DeliveryHelperTest is SetupTest { vm.prank(transmitterEOA); bytes memory transmitterSignature = _createSignature( - keccak256(abi.encode(address(auctionManager), evmxChainSlug, asyncId, bidAmount, "")), + keccak256(abi.encode(address(auctionManager), evmxSlug, asyncId, bidAmount, "")), transmitterPrivateKey ); @@ -485,11 +485,7 @@ contract DeliveryHelperTest is SetupTest { // ); if (auctionEndDelaySeconds == 0) return; - bytes32 timeoutId = _encodeId( - evmxChainSlug, - address(watcherPrecompile), - payloadIdCounter++ - ); + bytes32 timeoutId = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); hoax(watcherEOA); watcherPrecompile.resolveTimeout(timeoutId); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 83b75e5c..65594d3c 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -32,7 +32,7 @@ contract SetupTest is Test { uint32 arbChainSlug = 421614; uint32 optChainSlug = 11155420; - uint32 evmxChainSlug = 1; + uint32 evmxSlug = 1; uint256 expiryTime = 10000000; uint256 public payloadIdCounter = 0; @@ -125,7 +125,7 @@ contract SetupTest is Test { address(addressResolverProxy), defaultLimit, expiryTime, - evmxChainSlug + evmxSlug ); vm.expectEmit(true, true, true, false); emit Initialized(version); diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index ca75e6a1..ab4d149c 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -143,8 +143,8 @@ contract CounterTest is DeliveryHelperTest { bytes32 bridgeAsyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](3); - payloadIds[0] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); - payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[0] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( arbChainSlug, diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 5902ae8e..82990d8b 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -116,14 +116,11 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address appDeployer = address(uint160(c++)); address chainContractAddress = address(uint160(c++)); - address predicted = addressResolver.getForwarderAddress( - chainContractAddress, - evmxChainSlug - ); + address predicted = addressResolver.getForwarderAddress(chainContractAddress, evmxSlug); address forwarder = addressResolver.getOrDeployForwarderContract( appDeployer, chainContractAddress, - evmxChainSlug + evmxSlug ); assertEq(forwarder, predicted); @@ -288,7 +285,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address(getSocketConfig(srcChainSlug).switchboard), payloadIdCounter++ ); - payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( dstChainSlug, address(getSocketConfig(dstChainSlug).switchboard), @@ -543,7 +540,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // address(getSocketConfig(srcChainSlug).contractFactoryPlug), // payloadIdCounter++ // ); - // payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + // payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); // payloadIds[2] = getWritePayloadId( // dstChainSlug, // address(getSocketConfig(dstChainSlug).contractFactoryPlug), From 98a9d5978bee86b2ef1fadd39ac1e762aa4efb96 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 20:14:36 +0400 Subject: [PATCH 12/12] fix: rename error --- contracts/protocol/AddressResolver.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 28050c26..264f6206 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -36,7 +36,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { mapping(address => address) public override gatewaysToContracts; /// @notice Error thrown if AppGateway contract was already set by a different address - error InvalidCaller(address contractAddress_); + error InvalidAppGateway(address contractAddress_); event PlugAdded(address appGateway, uint32 chainSlug, address plug); event ForwarderDeployed(address newForwarder, bytes32 salt); @@ -166,7 +166,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { contractsToGateways[contractAddress_] != address(0) && contractsToGateways[contractAddress_] != msg.sender ) { - revert InvalidCaller(contractAddress_); + revert InvalidAppGateway(contractAddress_); } contractsToGateways[contractAddress_] = msg.sender; }