From 7a93b3660e0b3ee2a1cd8d5e9e1a568195b7c0f1 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Mar 2025 19:34:30 +0400 Subject: [PATCH 1/2] rm: extra contracts and functions --- contracts/interfaces/IWatcherPrecompile.sol | 21 ------- contracts/protocol/socket/SocketUtils.sol | 1 - .../watcherPrecompile/RequestHandler.sol | 1 - .../watcherPrecompile/WatcherPrecompile.sol | 23 ++++++- .../WatcherPrecompileCore.sol | 63 +------------------ deployments/stage_addresses.json | 8 --- test/SetupTest.t.sol | 45 +++++++++++-- 7 files changed, 63 insertions(+), 99 deletions(-) diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 58921740..39d67e20 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -75,31 +75,10 @@ interface IWatcherPrecompile { error InvalidSwitchboard(); /// @notice Error thrown when a request is already cancelled error RequestAlreadyCancelled(); - error RequestCancelled(); error AlreadyStarted(); error InvalidLevelNumber(); - /// @notice Calculates the digest hash of payload parameters - /// @param params_ The payload parameters - /// @return digest The calculated digest - function getDigest(DigestParams memory params_) external pure returns (bytes32 digest); - - /// @notice Gets the batch IDs for a request - /// @param requestCount_ The request count - /// @return Array of batch IDs - function getBatches(uint40 requestCount_) external view returns (uint40[] memory); - - /// @notice Gets the payload IDs for a batch - /// @param batchCount_ The batch count - /// @return Array of payload IDs - function getBatchPayloadIds(uint40 batchCount_) external view returns (bytes32[] memory); - - /// @notice Gets the payload parameters for a payload ID - /// @param payloadId_ The payload ID - /// @return The payload parameters - function getPayloadParams(bytes32 payloadId_) external view returns (PayloadParams memory); - function setTimeout( uint256 delayInSeconds_, bytes calldata payload_ diff --git a/contracts/protocol/socket/SocketUtils.sol b/contracts/protocol/socket/SocketUtils.sol index 97aa46ba..5dff55f7 100644 --- a/contracts/protocol/socket/SocketUtils.sol +++ b/contracts/protocol/socket/SocketUtils.sol @@ -90,7 +90,6 @@ abstract contract SocketUtils is SocketConfig { address switchboard_, ExecuteParams memory executeParams_ ) internal view returns (bytes32) { - // todo: match with watcher return keccak256( abi.encode( diff --git a/contracts/protocol/watcherPrecompile/RequestHandler.sol b/contracts/protocol/watcherPrecompile/RequestHandler.sol index 5eb037d0..f8040f4c 100644 --- a/contracts/protocol/watcherPrecompile/RequestHandler.sol +++ b/contracts/protocol/watcherPrecompile/RequestHandler.sol @@ -110,7 +110,6 @@ abstract contract RequestHandler is WatcherPrecompileCore { uint40 batchCount = r.payloadParamsArray[0].dump.getBatchCount(); uint256 totalPayloadsLeft = _processBatch(requestCount, batchCount); - // todo: for retry cases r.currentBatchPayloadsLeft = totalPayloadsLeft; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 9eddf9b0..a0821762 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -40,8 +40,23 @@ contract WatcherPrecompile is RequestHandler { function setTimeout( uint256 delayInSeconds_, bytes calldata payload_ - ) external returns (bytes32) { - return _setTimeout(payload_, delayInSeconds_); + ) external returns (bytes32 timeoutId) { + if (delayInSeconds_ > maxTimeoutDelayInSeconds) revert TimeoutDelayTooLarge(); + + // from auction manager + watcherPrecompileLimits__.consumeLimit(_getCoreAppGateway(msg.sender), SCHEDULE, 1); + uint256 executeAt = block.timestamp + delayInSeconds_; + timeoutId = _encodeId(evmxSlug, address(this)); + timeoutRequests[timeoutId] = TimeoutRequest( + timeoutId, + msg.sender, + delayInSeconds_, + executeAt, + 0, + false, + payload_ + ); + emit TimeoutRequested(timeoutId, msg.sender, payload_, executeAt); } /// @notice Ends the timeouts and calls the target address with the callback payload @@ -272,4 +287,8 @@ contract WatcherPrecompile is RequestHandler { function getRequestParams(uint40 requestCount) external view returns (RequestParams memory) { return requestParams[requestCount]; } + + function getBatches(uint40 requestCount) external view returns (uint40[] memory) { + return requestBatchIds[requestCount]; + } } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileCore.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileCore.sol index ae78821f..50dd76e9 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileCore.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileCore.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.21; import "./WatcherPrecompileStorage.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; -import {AccessControl} from "../utils/AccessControl.sol"; +import "solady/auth/Ownable.sol"; import "solady/utils/Initializable.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; @@ -13,38 +13,11 @@ abstract contract WatcherPrecompileCore is IWatcherPrecompile, WatcherPrecompileStorage, Initializable, - AccessControl, + Ownable, AddressResolverUtil { using DumpDecoder for bytes32; - // ================== Timeout functions ================== - - /// @notice Sets a timeout for a payload execution on app gateway - /// @param payload_ The payload data - /// @param delayInSeconds_ The delay in seconds - function _setTimeout( - bytes calldata payload_, - uint256 delayInSeconds_ - ) internal returns (bytes32 timeoutId) { - if (delayInSeconds_ > maxTimeoutDelayInSeconds) revert TimeoutDelayTooLarge(); - - // from auction manager - watcherPrecompileLimits__.consumeLimit(_getCoreAppGateway(msg.sender), SCHEDULE, 1); - uint256 executeAt = block.timestamp + delayInSeconds_; - timeoutId = _encodeId(evmxSlug, address(this)); - timeoutRequests[timeoutId] = TimeoutRequest( - timeoutId, - msg.sender, - delayInSeconds_, - executeAt, - 0, - false, - payload_ - ); - emit TimeoutRequested(timeoutId, msg.sender, payload_, executeAt); - } - function _finalize( PayloadParams memory params_, address transmitter_ @@ -174,30 +147,6 @@ abstract contract WatcherPrecompileCore is return prevDigestsHash; } - // ================== Helper functions ================== - - /// @notice Verifies the connection between chain slug, target, and app gateway - /// @param chainSlug_ The identifier of the chain - /// @param target_ The target address - /// @param appGateway_ The app gateway address to verify - /// @dev Internal function to validate connections - function _verifyConnections( - uint32 chainSlug_, - address target_, - address appGateway_, - address switchboard_ - ) internal view { - // todo: revisit this - // if target is contractFactoryPlug, return - if (target_ == watcherPrecompileConfig__.contractFactoryPlug(chainSlug_)) return; - - (address appGateway, address switchboard) = watcherPrecompileConfig__.getPlugConfigs( - chainSlug_, - target_ - ); - if (appGateway != appGateway_) revert InvalidGateway(); - if (switchboard != switchboard_) revert InvalidSwitchboard(); - } // todo: revisit when we do timeout precompile function _encodeId( @@ -242,15 +191,7 @@ abstract contract WatcherPrecompileCore is if (signer != owner()) revert InvalidWatcherSignature(); } - function getBatches(uint40 requestCount_) external view returns (uint40[] memory) { - return requestBatchIds[requestCount_]; - } - function getBatchPayloadIds(uint40 batchCount_) external view returns (bytes32[] memory) { return batchPayloadIds[batchCount_]; } - - function getPayloadParams(bytes32 payloadId_) external view returns (PayloadParams memory) { - return payloads[payloadId_]; - } } diff --git a/deployments/stage_addresses.json b/deployments/stage_addresses.json index 09b48a65..6aaf502f 100644 --- a/deployments/stage_addresses.json +++ b/deployments/stage_addresses.json @@ -13,14 +13,6 @@ "WatcherPrecompile": "0x4b5BcB38014cBdf852Ae6429871E0b1Ac0a05Df8", "WatcherPrecompileImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916" }, - "84532": { - "ContractFactoryPlug": "0x693bcDb114a57302Cd687b8Af1bD7583ee56748C", - "FastSwitchboard": "0xf0f51Ba62284A98AbB5D447487d5E6B536DB9B72", - "FeesPlug": "0xe3332D21b49d9347913cca2316FcC1b34fa16914", - "Socket": "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", - "SocketBatcher": "0xC559BABEbcD92278E91a545308190E4761efc347", - "startBlock": 22449147 - }, "421614": { "ContractFactoryPlug": "0x78E3A5d21d0dB60bf0A585Cc2105043F919A404b", "FastSwitchboard": "0x1448E643AbA68a0F1E4C5a3996bA2a355ce3EA8B", diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index b44c8e75..db04e0a2 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -199,8 +199,8 @@ contract SetupTest is Test { bytes32[] memory payloadIds = watcherPrecompile.getBatchPayloadIds(batchCount_); for (uint i = 0; i < payloadIds.length; i++) { - PayloadParams memory payloadParams = watcherPrecompile.getPayloadParams(payloadIds[i]); - if (payloadParams.dump.getCallType() != CallType.READ) { + (bytes32 dump, , , , , , , , , , , , ) = watcherPrecompile.payloads(payloadIds[i]); + if (dump.getCallType() != CallType.READ) { return false; } } @@ -208,6 +208,41 @@ contract SetupTest is Test { return true; } + function getPayloadParams(bytes32 payloadId_) internal view returns (PayloadParams memory) { + ( + bytes32 dump, + address asyncPromise, + address switchboard, + address target, + address appGateway, + bytes32 payloadId, + bytes32 prevDigestsHash, + uint256 gasLimit, + , + uint256 readAt, + uint256 deadline, + bytes memory payload, + address finalizedTransmitter + ) = watcherPrecompile.payloads(payloadId_); + + return + PayloadParams({ + dump: dump, + asyncPromise: asyncPromise, + switchboard: switchboard, + target: target, + appGateway: appGateway, + payloadId: payloadId, + prevDigestsHash: prevDigestsHash, + gasLimit: gasLimit, + value: 0, + readAt: readAt, + deadline: deadline, + payload: payload, + finalizedTransmitter: finalizedTransmitter + }); + } + function _finalizeBatch( uint40 batchCount_, bytes[] memory readReturnData_, @@ -216,12 +251,12 @@ contract SetupTest is Test { bytes32[] memory payloadIds = watcherPrecompile.getBatchPayloadIds(batchCount_); for (uint i = 0; i < payloadIds.length; i++) { - PayloadParams memory payloadParams = watcherPrecompile.getPayloadParams(payloadIds[i]); + PayloadParams memory payloadParams = getPayloadParams(payloadIds[i]); if (payloadParams.dump.getCallType() == CallType.READ) { - _resolvePromise(payloadParams.payloadId, readReturnData_[readCount_++]); + _resolvePromise(payloadIds[i], payloadParams.payload); } else { bytes memory returnData = _uploadProofAndExecute(payloadParams); - _resolvePromise(payloadParams.payloadId, returnData); + _resolvePromise(payloadIds[i], returnData); } } return readCount_; From 4c2d8c2d7556da3d74bd86cf975a7ca17ad1a5a9 Mon Sep 17 00:00:00 2001 From: arthcp Date: Fri, 21 Mar 2025 13:28:58 +0400 Subject: [PATCH 2/2] feat: calldata to memory for contract size --- .../watcherPrecompile/RequestHandler.sol | 4 ++-- .../watcherPrecompile/WatcherPrecompile.sol | 18 +++++++++--------- .../WatcherPrecompileConfig.sol | 4 ++-- .../WatcherPrecompileLimits.sol | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/RequestHandler.sol b/contracts/protocol/watcherPrecompile/RequestHandler.sol index f8040f4c..81326bcb 100644 --- a/contracts/protocol/watcherPrecompile/RequestHandler.sol +++ b/contracts/protocol/watcherPrecompile/RequestHandler.sol @@ -7,7 +7,7 @@ abstract contract RequestHandler is WatcherPrecompileCore { using DumpDecoder for bytes32; function submitRequest( - PayloadSubmitParams[] calldata payloadSubmitParams + PayloadSubmitParams[] memory payloadSubmitParams ) public returns (uint40 requestCount) { requestCount = nextRequestCount++; uint40 batchCount = nextBatchCount; @@ -86,7 +86,7 @@ abstract contract RequestHandler is WatcherPrecompileCore { } function _checkAppGateways( - PayloadSubmitParams[] calldata payloadSubmitParams + PayloadSubmitParams[] memory payloadSubmitParams ) internal view returns (address appGateway) { bool isDeliveryHelper = msg.sender == addressResolver__.deliveryHelper(); address coreAppGateway = isDeliveryHelper diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index a0821762..6e65290f 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -39,7 +39,7 @@ contract WatcherPrecompile is RequestHandler { /// @param delayInSeconds_ The delay in seconds function setTimeout( uint256 delayInSeconds_, - bytes calldata payload_ + bytes memory payload_ ) external returns (bytes32 timeoutId) { if (delayInSeconds_ > maxTimeoutDelayInSeconds) revert TimeoutDelayTooLarge(); @@ -65,7 +65,7 @@ contract WatcherPrecompile is RequestHandler { function resolveTimeout( bytes32 timeoutId_, uint256 signatureNonce_, - bytes calldata signature_ + bytes memory signature_ ) external { _isWatcherSignatureValid( abi.encode(this.resolveTimeout.selector, timeoutId_), @@ -121,9 +121,9 @@ contract WatcherPrecompile is RequestHandler { /// @dev keccak256(abi.encode(switchboard, digest)) function finalized( bytes32 payloadId_, - bytes calldata proof_, + bytes memory proof_, uint256 signatureNonce_, - bytes calldata signature_ + bytes memory signature_ ) external { _isWatcherSignatureValid( abi.encode(this.finalized.selector, payloadId_, proof_), @@ -158,9 +158,9 @@ contract WatcherPrecompile is RequestHandler { /// @param resolvedPromises_ Array of resolved promises and their return data /// @dev Only callable by the contract owner function resolvePromises( - ResolvedPromises[] calldata resolvedPromises_, + ResolvedPromises[] memory resolvedPromises_, uint256 signatureNonce_, - bytes calldata signature_ + bytes memory signature_ ) external { _isWatcherSignatureValid( abi.encode(this.resolvePromises.selector, resolvedPromises_), @@ -207,7 +207,7 @@ contract WatcherPrecompile is RequestHandler { bool isRevertingOnchain_, bytes32 payloadId_, uint256 signatureNonce_, - bytes calldata signature_ + bytes memory signature_ ) external { _isWatcherSignatureValid( abi.encode(this.markRevert.selector, isRevertingOnchain_, payloadId_), @@ -239,9 +239,9 @@ contract WatcherPrecompile is RequestHandler { // ================== On-Chain Inbox ================== function callAppGateways( - CallFromChainParams[] calldata params_, + CallFromChainParams[] memory params_, uint256 signatureNonce_, - bytes calldata signature_ + bytes memory signature_ ) external { _isWatcherSignatureValid( abi.encode(this.callAppGateways.selector, params_), diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index 197fb016..e6883b91 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -99,9 +99,9 @@ contract WatcherPrecompileConfig is /// @dev Only callable by the contract owner /// @dev This helps in verifying that plugs are called by respective app gateways function setAppGateways( - AppGatewayConfig[] calldata configs_, + AppGatewayConfig[] memory configs_, uint256 signatureNonce_, - bytes calldata signature_ + bytes memory signature_ ) external { _isWatcherSignatureValid( abi.encode(this.setAppGateways.selector, configs_), diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index b2690a6b..53f5e86c 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -87,7 +87,7 @@ contract WatcherPrecompileLimits is * @notice Update limit parameters for multiple app gateways * @param updates_ Array of limit parameter updates */ - function updateLimitParams(UpdateLimitParams[] calldata updates_) external onlyOwner { + function updateLimitParams(UpdateLimitParams[] memory updates_) external onlyOwner { _updateLimitParams(updates_); } @@ -95,7 +95,7 @@ contract WatcherPrecompileLimits is * @notice Internal function to update limit parameters * @param updates_ Array of limit parameter updates */ - function _updateLimitParams(UpdateLimitParams[] calldata updates_) internal { + function _updateLimitParams(UpdateLimitParams[] memory updates_) internal { for (uint256 i = 0; i < updates_.length; i++) { _consumePartLimit(0, _limitParams[updates_[i].appGateway][updates_[i].limitType]); _limitParams[updates_[i].appGateway][updates_[i].limitType].maxLimit = updates_[i]