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/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/interfaces/ISwitchboard.sol b/contracts/interfaces/ISwitchboard.sol index ac822b4f..394d4044 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 proof_) external; } diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 926c6507..1e6f510b 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 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 @@ -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 @@ -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 digest hash + function getDigest(PayloadDigestParams memory params_) external pure returns (bytes32 digest); function setMaxTimeoutDelayInSeconds(uint256 maxTimeoutDelayInSeconds_) external; @@ -98,9 +98,9 @@ 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 checkAndUpdateLimit( + function checkAndConsumeLimit( address appGateway_, bytes32 limitType_, uint256 consumeLimit_ 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..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 {PayloadRootParams, 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"; @@ -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,14 +120,14 @@ 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 root The merkle root of the payload parameters + /// @return digest The 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, @@ -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 @@ -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/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 5be797e7..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 AppGatewayContractAlreadySetByDifferentSender(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 AppGatewayContractAlreadySetByDifferentSender(contractAddress_); + revert InvalidAppGateway(contractAddress_); } contractsToGateways[contractAddress_] = msg.sender; } diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 17c555db..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 vmChainSlug; + 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 vmChainSlug_ 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 vmChainSlug_, + uint32 evmxSlug_, uint256 auctionEndDelaySeconds_, address addressResolver_, address owner_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - vmChainSlug = vmChainSlug_; + 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), vmChainSlug, asyncId_, fee, extraData)), + keccak256(abi.encode(address(this), evmxSlug, asyncId_, fee, extraData)), transmitterSignature ); diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 8476847c..db2cf1e4 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 ); @@ -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 @@ -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; @@ -203,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/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..8c6873de 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -122,24 +122,27 @@ 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( 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, @@ -149,12 +152,12 @@ 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 function blockFees( - address appGateway_, + address originAppGateway_, Fees memory feesGivenByApp_, Bid memory winningBid_, bytes32 asyncId_ @@ -162,7 +165,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 +206,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 +228,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 ]; @@ -250,7 +253,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 +276,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( @@ -297,19 +300,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/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..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_.root, - 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 74e8451e..874e7d19 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 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. + * @param digest_ Digest of the packet + * @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 root_, bytes calldata signature_) external { - address watcher = _recoverSigner(keccak256(abi.encode(address(this), root_)), signature_); + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata proof_) external { + address watcher = _recoverSigner(keccak256(abi.encode(address(this), digest_)), proof_); - 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/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index 6172427b..a0dcd789 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -59,9 +59,11 @@ 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/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 72058e7c..64c03016 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; } @@ -50,7 +50,7 @@ struct Bid { bytes extraData; } -struct CallFromInboxParams { +struct CallFromChainParams { bytes32 callId; bytes32 params; address plug; @@ -79,13 +79,13 @@ struct DeployParams { struct AttestAndExecutePayloadParams { bytes32 payloadId; - bytes32 root; + bytes32 digest; address switchboard; address appGateway; address target; uint256 executionGasLimit; uint256 deadline; - bytes watcherSignature; + bytes proof; bytes transmitterSignature; bytes payload; } @@ -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 7d18ca94..576d3c31 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, CallFromChainParams} from "../utils/common/Structs.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; /// @title WatcherPrecompile @@ -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 evmxSlug; /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct @@ -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 @@ -107,7 +107,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { address addressResolver_, uint256 defaultLimit_, uint256 expiryTime_, - uint32 vmChainSlug_ + 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); - vmChainSlug = vmChainSlug_; + 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(vmChainSlug, address(this)); + bytes32 timeoutId = _encodeId(evmxSlug, address(this)); timeoutRequests[timeoutId] = TimeoutRequest( timeoutId, msg.sender, @@ -176,21 +176,21 @@ 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 root The merkle root of the payload parameters + /// @return digest The 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 { @@ -204,7 +204,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 @@ -223,8 +223,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, @@ -235,8 +235,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.payload ); - // Calculate merkle root from payload parameters - root = getRoot(rootParams_); + // Calculate digest from payload parameters + digest = getDigest(digestParams_); // Create and store the async request with all necessary details AsyncRequest memory asyncRequest = AsyncRequest( @@ -248,7 +248,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.executionGasLimit, block.timestamp + expiryTime, params_.asyncId, - root, + digest, params_.payloadDetails.payload, params_.payloadDetails.next ); @@ -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(evmxSlug, address(this)); // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries @@ -294,18 +294,15 @@ 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 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, root)) - function finalized( - bytes32 payloadId_, - bytes calldata signature_ - ) external onlyRole(WATCHER_ROLE) { - watcherSignatures[payloadId_] = signature_; - emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); + /// @dev keccak256(abi.encode(switchboard, digest)) + 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 @@ -362,11 +359,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 digest + function getDigest(PayloadDigestParams memory params_) public pure returns (bytes32 digest) { + digest = keccak256( abi.encode( params_.payloadId, params_.appGateway, @@ -387,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, 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/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 284d012c..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_ @@ -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); } /** 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/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 4702a879..04a0fc3e 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, + evmxSlug, auctionEndDelaySeconds, address(addressResolver), owner, @@ -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( @@ -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), evmxSlug, asyncId, bidAmount, "")), transmitterPrivateKey ); @@ -485,7 +485,7 @@ contract DeliveryHelperTest is SetupTest { // ); if (auctionEndDelaySeconds == 0) return; - bytes32 timeoutId = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + bytes32 timeoutId = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); hoax(watcherEOA); watcherPrecompile.resolveTimeout(timeoutId); @@ -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 = watcherPrecompile.getDigest(digestParams_); - bytes32 digest = keccak256(abi.encode(address(socketConfig.switchboard), root)); - bytes memory watcherSig = _createSignature(digest, watcherPrivateKey); - return (watcherSig, root); + bytes32 sigDigest = keccak256(abi.encode(address(socketConfig.switchboard), digest)); + bytes memory proof = _createSignature(sigDigest, watcherPrivateKey); + return (proof, 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 ); @@ -646,7 +646,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/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), 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 216ca823..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 vmChainSlug = 1; + uint32 evmxSlug = 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 + evmxSlug ); vm.expectEmit(true, true, true, false); emit Initialized(version); @@ -173,9 +173,9 @@ contract SetupTest is Test { function relayTx( uint32 chainSlug_, bytes32 payloadId, - bytes32 root, + 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)); @@ -186,8 +186,8 @@ contract SetupTest is Test { vm.startPrank(transmitterEOA); AttestAndExecutePayloadParams memory params = AttestAndExecutePayloadParams({ switchboard: address(socketConfig.switchboard), - root: root, - watcherSignature: watcherSignature, + digest: digest, + proof: watcherProof, payloadId: payloadId, appGateway: payloadDetails.appGateway, executionGasLimit: payloadDetails.executionGasLimit, diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index e0ed658b..ab4d149c 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -140,11 +140,11 @@ 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(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); - payloadIds[1] = _encodeId(vmChainSlug, 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/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..82990d8b 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -116,11 +116,11 @@ 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, evmxSlug); address forwarder = addressResolver.getOrDeployForwarderContract( appDeployer, chainContractAddress, - vmChainSlug + evmxSlug ); assertEq(forwarder, predicted); @@ -277,7 +277,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( @@ -285,7 +285,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address(getSocketConfig(srcChainSlug).switchboard), payloadIdCounter++ ); - payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( dstChainSlug, address(getSocketConfig(dstChainSlug).switchboard), @@ -346,7 +346,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(); @@ -540,7 +540,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // address(getSocketConfig(srcChainSlug).contractFactoryPlug), // payloadIdCounter++ // ); - // payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + // payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); // payloadIds[2] = getWritePayloadId( // dstChainSlug, // address(getSocketConfig(dstChainSlug).contractFactoryPlug), @@ -558,7 +558,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // srcChainSlug, // dstChainSlug // ); - // bytes32 bridgeAsyncId = getCurrentAsyncId(); + // bytes32 bridgeAsyncId = getNextAsyncId(); // asyncCounterTest++; // bytes memory encodedOrder = abi.encode(userOrder); @@ -643,7 +643,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // srcChainSlug // ); - // bytes32 cancelAsyncId = getCurrentAsyncId(); + // bytes32 cancelAsyncId = getNextAsyncId(); // asyncCounterTest++; // bidAndValidate( 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