From 732777234130a7e368e7671329a5cacaf005f4c2 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Wed, 18 Jun 2025 17:06:40 +0200 Subject: [PATCH 01/18] Change address -> bytes32 for target, socket, sb and related which might have 32 bytes address on non-evm chains --- contracts/evmx/base/AppGatewayBase.sol | 10 ++- contracts/evmx/fees/Credit.sol | 19 ++--- contracts/evmx/helpers/AsyncDeployer.sol | 6 +- contracts/evmx/helpers/DeployForwarder.sol | 2 +- contracts/evmx/helpers/Forwarder.sol | 21 +++-- contracts/evmx/interfaces/IAppGateway.sol | 2 +- contracts/evmx/interfaces/IAsyncDeployer.sol | 4 +- contracts/evmx/interfaces/IConfigurations.sol | 20 ++--- contracts/evmx/interfaces/IForwarder.sol | 6 +- contracts/evmx/interfaces/IWatcher.sol | 3 +- contracts/evmx/plugs/FeesPlug.sol | 1 + contracts/evmx/watcher/Configurations.sol | 34 ++++---- contracts/evmx/watcher/RequestHandler.sol | 4 +- contracts/evmx/watcher/Trigger.sol | 5 +- contracts/evmx/watcher/Watcher.sol | 2 +- contracts/evmx/watcher/WatcherStorage.sol | 12 +-- .../watcher/precompiles/ReadPrecompile.sol | 2 +- .../watcher/precompiles/WritePrecompile.sol | 13 +-- contracts/protocol/Socket.sol | 10 +-- contracts/protocol/SocketConfig.sol | 8 +- contracts/protocol/SocketUtils.sol | 7 +- contracts/protocol/interfaces/ISocket.sol | 4 +- .../protocol/switchboard/FastSwitchboard.sol | 3 +- contracts/utils/common/Converters.sol | 15 ++++ contracts/utils/common/IdUtils.sol | 13 ++- contracts/utils/common/Structs.sol | 31 ++++--- script/counter/ReadOnchainCounters.s.sol | 14 ++-- test/FeesTest.t.sol | 20 ++--- test/ProxyMigration.t.sol | 2 +- test/ProxyStorage.t.sol | 10 ++- test/SetupTest.t.sol | 81 ++++++++++--------- test/TriggerTest.t.sol | 13 +-- test/apps/Counter.t.sol | 13 +-- test/apps/ParallelCounter.t.sol | 20 +++-- test/apps/SuperToken.t.sol | 13 +-- test/mock/MockSocket.sol | 13 +-- test/mock/MockWatcherPrecompile.sol | 2 +- 37 files changed, 271 insertions(+), 187 deletions(-) create mode 100644 contracts/utils/common/Converters.sol diff --git a/contracts/evmx/base/AppGatewayBase.sol b/contracts/evmx/base/AppGatewayBase.sol index 5bcdb2db..576b4ebc 100644 --- a/contracts/evmx/base/AppGatewayBase.sol +++ b/contracts/evmx/base/AppGatewayBase.sol @@ -9,6 +9,7 @@ import "../interfaces/IPromise.sol"; import {InvalidPromise, AsyncModifierNotSet} from "../../utils/common/Errors.sol"; import {FAST, READ, WRITE, SCHEDULE} from "../../utils/common/Constants.sol"; import {IsPlug, QueueParams, Read, WriteFinality, Parallel} from "../../utils/common/Structs.sol"; +import {toBytes32Format} from "../../utils/common/Converters.sol"; /// @title AppGatewayBase /// @notice Abstract contract for the app gateway @@ -137,7 +138,8 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway { function setAddress(bytes memory data_, bytes memory returnData_) external onlyPromises { (uint32 chainSlug, bytes32 contractId) = abi.decode(data_, (uint32, bytes32)); forwarderAddresses[contractId][chainSlug] = asyncDeployer__().getOrDeployForwarderContract( - abi.decode(returnData_, (address)), + // TODO:GW: where does returnData_ come from - maybe it is already bytes32 ? - is it EVM specific ? + toBytes32Format(abi.decode(returnData_, (address))), chainSlug ); } @@ -161,9 +163,9 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway { function getOnChainAddress( bytes32 contractId_, uint32 chainSlug_ - ) public view returns (address onChainAddress) { + ) public view returns (bytes32 onChainAddress) { if (forwarderAddresses[contractId_][chainSlug_] == address(0)) { - return address(0); + return bytes32(0); } onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) @@ -216,7 +218,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway { /// @param isValid Boolean flag indicating whether the contract is authorized (true) or not (false) /// @dev This function retrieves the onchain address using the contractId_ and chainSlug, then calls the watcher precompile to update the plug's validity status function _setValidPlug(bool isValid, uint32 chainSlug_, bytes32 contractId_) internal { - address onchainAddress = getOnChainAddress(contractId_, chainSlug_); + bytes32 onchainAddress = getOnChainAddress(contractId_, chainSlug_); watcher__().setIsValidPlug(isValid, chainSlug_, onchainAddress); } diff --git a/contracts/evmx/fees/Credit.sol b/contracts/evmx/fees/Credit.sol index 4468d12f..0e76c46a 100644 --- a/contracts/evmx/fees/Credit.sol +++ b/contracts/evmx/fees/Credit.sol @@ -14,6 +14,7 @@ import {AddressResolverUtil} from "../helpers/AddressResolverUtil.sol"; import {NonceUsed, InvalidAmount, InsufficientCreditsAvailable, InsufficientBalance, InvalidChainSlug, NotRequestHandler} from "../../utils/common/Errors.sol"; import {WRITE} from "../../utils/common/Constants.sol"; import "../../utils/RescueFundsLib.sol"; +import {toBytes32Format} from "../../utils/common/Converters.sol"; abstract contract FeesManagerStorage is IFeesManager { // slots [0-49] reserved for gap @@ -31,7 +32,7 @@ abstract contract FeesManagerStorage is IFeesManager { // slot 52 /// @notice user credits => stores fees for user, app gateway, transmitters and watcher precompile - mapping(address => UserCredits) public userCredits; + mapping(address => UserCredits) public userCredits; // TODO:GW: what is the "userAddress" ? is is just EVMx address ? // slot 53 /// @notice Mapping to track request credits details for each request count @@ -41,23 +42,23 @@ abstract contract FeesManagerStorage is IFeesManager { // slot 54 // user approved app gateways // userAddress => appGateway => isApproved - mapping(address => mapping(address => bool)) public isApproved; + mapping(address => mapping(address => bool)) public isApproved; //TODO:GW: what is the "userAddress" ? is this an on-chain address ? if yes than it needs to be bytes32 // slot 55 // token pool balances // chainSlug => token address => amount - mapping(uint32 => mapping(address => uint256)) public tokenOnChainBalances; + mapping(uint32 => mapping(address => uint256)) public tokenOnChainBalances; // TODO:GW: what is that ? // how does it map to multi-chain with Solana // slot 56 /// @notice Mapping to track nonce to whether it has been used /// @dev address => signatureNonce => isNonceUsed /// @dev used by watchers or other users in signatures - mapping(address => mapping(uint256 => bool)) public isNonceUsed; + mapping(address => mapping(uint256 => bool)) public isNonceUsed; // TODO:GW: earlier it was just "uint256 => bool" now it has "address" why ? if it is a watcher address it is just for evm or should be bytes32 ? // slot 57 /// @notice Mapping to track fees plug for each chain slug /// @dev chainSlug => fees plug address - mapping(uint32 => address) public feesPlugs; + mapping(uint32 => bytes32) public feesPlugs; // slots [58-107] reserved for gap uint256[50] _gap_after; @@ -92,7 +93,7 @@ abstract contract Credit is FeesManagerStorage, Initializable, Ownable, AddressR event CreditsTransferred(address indexed from, address indexed to, uint256 amount); /// @notice Emitted when fees plug is set - event FeesPlugSet(uint32 indexed chainSlug, address indexed feesPlug); + event FeesPlugSet(uint32 indexed chainSlug, bytes32 indexed feesPlug); /// @notice Emitted when fees pool is set event FeesPoolSet(address indexed feesPool); @@ -100,7 +101,7 @@ abstract contract Credit is FeesManagerStorage, Initializable, Ownable, AddressR /// @notice Emitted when withdraw fails event WithdrawFailed(bytes32 indexed payloadId); - function setFeesPlug(uint32 chainSlug_, address feesPlug_) external onlyOwner { + function setFeesPlug(uint32 chainSlug_, bytes32 feesPlug_) external onlyOwner { feesPlugs[chainSlug_] = feesPlug_; emit FeesPlugSet(chainSlug_, feesPlug_); } @@ -295,8 +296,8 @@ abstract contract Credit is FeesManagerStorage, Initializable, Ownable, AddressR watcher__().queueAndSubmit(queueParams, maxFees_, address(0), consumeFrom_, bytes("")); } - function _getFeesPlugAddress(uint32 chainSlug_) internal view returns (address) { - if (feesPlugs[chainSlug_] == address(0)) revert InvalidChainSlug(); + function _getFeesPlugAddress(uint32 chainSlug_) internal view returns (bytes32) { + if (feesPlugs[chainSlug_] == bytes32(0)) revert InvalidChainSlug(); return feesPlugs[chainSlug_]; } diff --git a/contracts/evmx/helpers/AsyncDeployer.sol b/contracts/evmx/helpers/AsyncDeployer.sol index 735d3241..17053f3b 100644 --- a/contracts/evmx/helpers/AsyncDeployer.sol +++ b/contracts/evmx/helpers/AsyncDeployer.sol @@ -66,7 +66,7 @@ contract AsyncDeployer is AsyncDeployerStorage, Initializable, AddressResolverUt /// @param chainSlug_ The chain slug /// @return newForwarder The address of the deployed Forwarder proxy contract function getOrDeployForwarderContract( - address chainContractAddress_, + bytes32 chainContractAddress_, uint32 chainSlug_ ) public override returns (address newForwarder) { // predict address @@ -107,7 +107,7 @@ contract AsyncDeployer is AsyncDeployerStorage, Initializable, AddressResolverUt } function _createForwarderParams( - address chainContractAddress_, + bytes32 chainContractAddress_, uint32 chainSlug_ ) internal view returns (bytes32 salt, bytes memory initData) { bytes memory constructorArgs = abi.encode( @@ -168,7 +168,7 @@ contract AsyncDeployer is AsyncDeployerStorage, Initializable, AddressResolverUt /// @param chainSlug_ The chain slug /// @return The predicted address of the Forwarder proxy contract function getForwarderAddress( - address chainContractAddress_, + bytes32 chainContractAddress_, uint32 chainSlug_ ) public view override returns (address) { (bytes32 salt, ) = _createForwarderParams(chainContractAddress_, chainSlug_); diff --git a/contracts/evmx/helpers/DeployForwarder.sol b/contracts/evmx/helpers/DeployForwarder.sol index 86a46f3e..0b464006 100644 --- a/contracts/evmx/helpers/DeployForwarder.sol +++ b/contracts/evmx/helpers/DeployForwarder.sol @@ -64,7 +64,7 @@ contract DeployForwarder is IDeployForwarder, Initializable, AddressResolverUtil queueParams.switchboardType = deployerSwitchboardType; queueParams.transaction = Transaction({ chainSlug: chainSlug_, - target: address(0), + target: bytes32(0), payload: _createPayload( isPlug_, plugSwitchboardType, diff --git a/contracts/evmx/helpers/Forwarder.sol b/contracts/evmx/helpers/Forwarder.sol index 8b778061..2f86fd39 100644 --- a/contracts/evmx/helpers/Forwarder.sol +++ b/contracts/evmx/helpers/Forwarder.sol @@ -9,6 +9,7 @@ import "../interfaces/IForwarder.sol"; import {QueueParams, OverrideParams, Transaction} from "../../utils/common/Structs.sol"; import {AsyncModifierNotSet, WatcherNotSet, InvalidOnChainAddress} from "../../utils/common/Errors.sol"; import "../../utils/RescueFundsLib.sol"; +import {toBytes32Format} from "../../utils/common/Converters.sol"; /// @title Forwarder Storage /// @notice Storage contract for the Forwarder contract that contains the state variables @@ -19,11 +20,16 @@ abstract contract ForwarderStorage is IForwarder { // slot 50 /// @notice chain slug on which the contract is deployed uint32 public chainSlug; + + /// @notice old on-chain address kep for storage compatibility - can be removed after redeployment + address internal oldOnChainAddress; + + // slot 51 /// @notice on-chain address associated with this forwarder - address public onChainAddress; + bytes32 public onChainAddress; - // slots [51-100] reserved for gap - uint256[50] _gap_after; + // slots [52-100] reserved for gap + uint256[49] _gap_after; // slots [101-150] 50 slots reserved for address resolver util } @@ -41,10 +47,10 @@ contract Forwarder is ForwarderStorage, Initializable, AddressResolverUtil { /// @param addressResolver_ address resolver contract function initialize( uint32 chainSlug_, - address onChainAddress_, + bytes32 onChainAddress_, address addressResolver_ ) public reinitializer(1) { - if (onChainAddress_ == address(0)) revert InvalidOnChainAddress(); + if (onChainAddress_ == bytes32(0)) revert InvalidOnChainAddress(); chainSlug = chainSlug_; onChainAddress = onChainAddress_; _setAddressResolver(addressResolver_); @@ -52,7 +58,10 @@ contract Forwarder is ForwarderStorage, Initializable, AddressResolverUtil { /// @notice Returns the on-chain address associated with this forwarder. /// @return The on-chain address. - function getOnChainAddress() external view override returns (address) { + function getOnChainAddress() external view override returns (bytes32) { + if (oldOnChainAddress != address(0)) { + return toBytes32Format(oldOnChainAddress); + } return onChainAddress; } diff --git a/contracts/evmx/interfaces/IAppGateway.sol b/contracts/evmx/interfaces/IAppGateway.sol index 132e8c96..2321a8bc 100644 --- a/contracts/evmx/interfaces/IAppGateway.sol +++ b/contracts/evmx/interfaces/IAppGateway.sol @@ -35,7 +35,7 @@ interface IAppGateway { function getOnChainAddress( bytes32 contractId_, uint32 chainSlug_ - ) external view returns (address onChainAddress); + ) external view returns (bytes32 onChainAddress); /// @notice get the forwarder address of a contract /// @param contractId_ The contract id diff --git a/contracts/evmx/interfaces/IAsyncDeployer.sol b/contracts/evmx/interfaces/IAsyncDeployer.sol index 9023db36..b0c8d14d 100644 --- a/contracts/evmx/interfaces/IAsyncDeployer.sol +++ b/contracts/evmx/interfaces/IAsyncDeployer.sol @@ -22,12 +22,12 @@ interface IAsyncDeployer { // Forwarder Management function getOrDeployForwarderContract( - address chainContractAddress_, + bytes32 chainContractAddress_, uint32 chainSlug_ ) external returns (address); function getForwarderAddress( - address chainContractAddress_, + bytes32 chainContractAddress_, uint32 chainSlug_ ) external view returns (address); diff --git a/contracts/evmx/interfaces/IConfigurations.sol b/contracts/evmx/interfaces/IConfigurations.sol index eb795a76..9d095679 100644 --- a/contracts/evmx/interfaces/IConfigurations.sol +++ b/contracts/evmx/interfaces/IConfigurations.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import {AppGatewayConfig, PlugConfig} from "../../utils/common/Structs.sol"; +import {AppGatewayConfig} from "../../utils/common/Structs.sol"; /// @title IConfigurations /// @notice Interface for the Watcher Precompile system that handles payload verification and execution @@ -10,7 +10,7 @@ interface IConfigurations { /// @notice Verifies connections between components function verifyConnections( uint32 chainSlug_, - address target_, + bytes32 target_, address appGateway_, bytes32 switchboardType_ ) external view; @@ -19,39 +19,39 @@ interface IConfigurations { function isValidPlug( address appGateway, uint32 chainSlug, - address plug + bytes32 plug ) external view returns (bool); /// @notice Retrieves the configuration for a specific plug on a network function getPlugConfigs( uint32 chainSlug_, - address plug_ - ) external view returns (bytes32, address); + bytes32 plug_ + ) external view returns (bytes32, bytes32); /// @notice Maps chain slug to their associated socket /// @param chainSlug_ The chain slug /// @return The socket - function sockets(uint32 chainSlug_) external view returns (address); + function sockets(uint32 chainSlug_) external view returns (bytes32); /// @notice Returns the socket for a given chain slug /// @param chainSlug_ The chain slug /// @return The socket - function switchboards(uint32 chainSlug_, bytes32 sbType_) external view returns (address); + function switchboards(uint32 chainSlug_, bytes32 sbType_) external view returns (bytes32); /// @notice Sets the switchboard for a network - function setSwitchboard(uint32 chainSlug_, bytes32 sbType_, address switchboard_) external; + function setSwitchboard(uint32 chainSlug_, bytes32 sbType_, bytes32 switchboard_) external; /// @notice Sets valid plugs for each chain slug /// @dev This function is used to verify if a plug deployed on a chain slug is valid connection to the app gateway function setIsValidPlug( bool isValid_, uint32 chainSlug_, - address plug_, + bytes32 plug_, address appGateway_ ) external; function setAppGatewayConfigs(AppGatewayConfig[] calldata configs_) external; /// @notice Sets the socket for a chain slug - function setSocket(uint32 chainSlug_, address socket_) external; + function setSocket(uint32 chainSlug_, bytes32 socket_) external; } diff --git a/contracts/evmx/interfaces/IForwarder.sol b/contracts/evmx/interfaces/IForwarder.sol index b609fc31..cbc2546a 100644 --- a/contracts/evmx/interfaces/IForwarder.sol +++ b/contracts/evmx/interfaces/IForwarder.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.21; /// @title IForwarder /// @notice Interface for the Forwarder contract that allows contracts to call async promises interface IForwarder { - /// @notice Returns the on-chain address of the contract being referenced - /// @return The on-chain address - function getOnChainAddress() external view returns (address); + /// @notice Returns the on-chain address (as bytes32) of the contract being referenced + /// @return The on-chain address in bytes32 format + function getOnChainAddress() external view returns (bytes32); /// @notice Returns the chain slug of the on chain contract /// @return The chain slug diff --git a/contracts/evmx/interfaces/IWatcher.sol b/contracts/evmx/interfaces/IWatcher.sol index d601d8d7..567c37a4 100644 --- a/contracts/evmx/interfaces/IWatcher.sol +++ b/contracts/evmx/interfaces/IWatcher.sol @@ -74,7 +74,8 @@ interface IWatcher { function increaseFees(uint40 requestCount_, uint256 newFees_) external; - function setIsValidPlug(bool isValid_, uint32 chainSlug_, address onchainAddress_) external; + function setIsValidPlug(bool isValid_, uint32 chainSlug_, bytes32 onchainAddress_) external; + // TODO:GW: what calls this ? - can it also be a Solana watcher key ? function isWatcher(address account_) external view returns (bool); } diff --git a/contracts/evmx/plugs/FeesPlug.sol b/contracts/evmx/plugs/FeesPlug.sol index 3e035125..07ac95af 100644 --- a/contracts/evmx/plugs/FeesPlug.sol +++ b/contracts/evmx/plugs/FeesPlug.sol @@ -116,6 +116,7 @@ contract FeesPlug is IFeesPlug, PlugBase, AccessControl { emit TokenRemovedFromWhitelist(token_); } + // TODO:GW: what is calling this function ? - is it only EVM specific ? function connectSocket( bytes32 appGatewayId_, address socket_, diff --git a/contracts/evmx/watcher/Configurations.sol b/contracts/evmx/watcher/Configurations.sol index 2674f7fb..99ee7dfd 100644 --- a/contracts/evmx/watcher/Configurations.sol +++ b/contracts/evmx/watcher/Configurations.sol @@ -8,6 +8,8 @@ import {encodeAppGatewayId} from "../../utils/common/IdUtils.sol"; import {InvalidGateway, InvalidSwitchboard} from "../../utils/common/Errors.sol"; import "solady/auth/Ownable.sol"; import "../../utils/RescueFundsLib.sol"; +import {toBytes32Format} from "../../utils/common/Converters.sol"; +import {PlugConfigGeneric} from "../../utils/common/Structs.sol"; abstract contract ConfigurationsStorage is IConfigurations { // slots [0-49] reserved for gap @@ -16,22 +18,22 @@ abstract contract ConfigurationsStorage is IConfigurations { // slot 50 /// @notice Maps network and plug to their configuration /// @dev chainSlug => plug => PlugConfig - mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; + mapping(uint32 => mapping(bytes32 => PlugConfigGeneric)) internal _plugConfigs; // slot 51 /// @notice Maps chain slug to their associated switchboard /// @dev chainSlug => sb type => switchboard address - mapping(uint32 => mapping(bytes32 => address)) public switchboards; + mapping(uint32 => mapping(bytes32 => bytes32)) public switchboards; // slot 52 /// @notice Maps chain slug to their associated socket /// @dev chainSlug => socket address - mapping(uint32 => address) public sockets; + mapping(uint32 => bytes32) public sockets; // slot 53 /// @notice Maps app gateway, chain slug, and plug to whether it is valid /// @dev appGateway => chainSlug => plug => isValid - mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; + mapping(address => mapping(uint32 => mapping(bytes32 => bool))) public isValidPlug; // slots [54-103] reserved for gap uint256[50] _gap_after; @@ -47,25 +49,25 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche /// @param appGatewayId The id of the app gateway /// @param chainSlug The identifier of the destination network /// @param plug The address of the plug - event PlugAdded(bytes32 appGatewayId, uint32 chainSlug, address plug); + event PlugAdded(bytes32 appGatewayId, uint32 chainSlug, bytes32 plug); /// @notice Emitted when a switchboard is set for a network /// @param chainSlug The identifier of the network /// @param sbType The type of switchboard /// @param switchboard The address of the switchboard - event SwitchboardSet(uint32 chainSlug, bytes32 sbType, address switchboard); + event SwitchboardSet(uint32 chainSlug, bytes32 sbType, bytes32 switchboard); /// @notice Emitted when socket is set for a network /// @param chainSlug The identifier of the network /// @param socket The address of the socket - event SocketSet(uint32 chainSlug, address socket); + event SocketSet(uint32 chainSlug, bytes32 socket); /// @notice Emitted when a valid plug is set for an app gateway /// @param appGateway The address of the app gateway /// @param chainSlug The identifier of the network /// @param plug The address of the plug /// @param isValid Whether the plug is valid - event IsValidPlugSet(address appGateway, uint32 chainSlug, address plug, bool isValid); + event IsValidPlugSet(address appGateway, uint32 chainSlug, bytes32 plug, bool isValid); constructor() { _disableInitializers(); // disable for implementation @@ -96,7 +98,7 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche /// @notice Sets the socket for a network /// @param chainSlug_ The identifier of the network /// @param socket_ The address of the socket - function setSocket(uint32 chainSlug_, address socket_) external onlyOwner { + function setSocket(uint32 chainSlug_, bytes32 socket_) external onlyOwner { sockets[chainSlug_] = socket_; emit SocketSet(chainSlug_, socket_); } @@ -108,7 +110,7 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche function setSwitchboard( uint32 chainSlug_, bytes32 sbType_, - address switchboard_ + bytes32 switchboard_ ) external onlyOwner { switchboards[chainSlug_][sbType_] = switchboard_; emit SwitchboardSet(chainSlug_, sbType_, switchboard_); @@ -123,7 +125,7 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche function setIsValidPlug( bool isValid_, uint32 chainSlug_, - address plug_, + bytes32 plug_, address appGateway_ ) external onlyWatcher { isValidPlug[appGateway_][chainSlug_][plug_] = isValid_; @@ -138,8 +140,8 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche /// @dev Returns zero addresses if configuration doesn't exist function getPlugConfigs( uint32 chainSlug_, - address plug_ - ) public view returns (bytes32, address) { + bytes32 plug_ + ) public view returns (bytes32, bytes32) { return ( _plugConfigs[chainSlug_][plug_].appGatewayId, _plugConfigs[chainSlug_][plug_].switchboard @@ -154,12 +156,12 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche /// @param switchboardType_ The type of switchboard function verifyConnections( uint32 chainSlug_, - address target_, + bytes32 target_, address appGateway_, bytes32 switchboardType_ ) external view { - (bytes32 appGatewayId, address switchboard) = getPlugConfigs(chainSlug_, target_); - if (appGatewayId != encodeAppGatewayId(appGateway_)) revert InvalidGateway(); + (bytes32 appGatewayId, bytes32 switchboard) = getPlugConfigs(chainSlug_, target_); + if (appGatewayId != toBytes32Format(appGateway_)) revert InvalidGateway(); if (switchboard != switchboards[chainSlug_][switchboardType_]) revert InvalidSwitchboard(); } diff --git a/contracts/evmx/watcher/RequestHandler.sol b/contracts/evmx/watcher/RequestHandler.sol index f11ca0bf..ad1a6b71 100644 --- a/contracts/evmx/watcher/RequestHandler.sol +++ b/contracts/evmx/watcher/RequestHandler.sol @@ -228,8 +228,8 @@ contract RequestHandler is RequestHandlerStorage, Initializable, Ownable, Addres } // get the switchboard address from the configurations - // returns address(0) for schedule precompile and reads if sb type not set - address switchboard = watcher__().configurations__().switchboards( + // returns bytes32(0) for schedule precompile and reads if sb type not set + bytes32 switchboard = watcher__().configurations__().switchboards( queuePayloadParam.transaction.chainSlug, queuePayloadParam.switchboardType ); diff --git a/contracts/evmx/watcher/Trigger.sol b/contracts/evmx/watcher/Trigger.sol index c72ff27b..b9065ce7 100644 --- a/contracts/evmx/watcher/Trigger.sol +++ b/contracts/evmx/watcher/Trigger.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.21; import {LibCall} from "solady/utils/LibCall.sol"; import "./WatcherStorage.sol"; import {decodeAppGatewayId} from "../../utils/common/IdUtils.sol"; +import {fromBytes32Format} from "../../utils/common/Converters.sol"; /// @title Trigger /// @notice Contract that handles trigger validation and execution logic @@ -29,7 +30,7 @@ abstract contract Trigger is WatcherStorage, AddressResolverUtil { function _callAppGateways(TriggerParams memory params_) internal { if (isAppGatewayCalled[params_.triggerId]) revert AppGatewayAlreadyCalled(); - address appGateway = decodeAppGatewayId(params_.appGatewayId); + address appGateway = fromBytes32Format(params_.appGatewayId); if (!configurations__.isValidPlug(appGateway, params_.chainSlug, params_.plug)) revert InvalidCallerTriggered(); @@ -52,6 +53,6 @@ abstract contract Trigger is WatcherStorage, AddressResolverUtil { } triggerFromChainSlug = 0; - triggerFromPlug = address(0); + triggerFromPlug = bytes32(0); } } diff --git a/contracts/evmx/watcher/Watcher.sol b/contracts/evmx/watcher/Watcher.sol index 7dbaa28b..b6714b92 100644 --- a/contracts/evmx/watcher/Watcher.sol +++ b/contracts/evmx/watcher/Watcher.sol @@ -153,7 +153,7 @@ contract Watcher is Trigger { return requestHandler__.getPayload(payloadId_); } - function setIsValidPlug(bool isValid_, uint32 chainSlug_, address plug_) external override { + function setIsValidPlug(bool isValid_, uint32 chainSlug_, bytes32 plug_) external override { configurations__.setIsValidPlug(isValid_, chainSlug_, plug_, msg.sender); } diff --git a/contracts/evmx/watcher/WatcherStorage.sol b/contracts/evmx/watcher/WatcherStorage.sol index 9c429a5e..035be37c 100644 --- a/contracts/evmx/watcher/WatcherStorage.sol +++ b/contracts/evmx/watcher/WatcherStorage.sol @@ -16,13 +16,11 @@ abstract contract WatcherStorage is IWatcher, Initializable, Ownable { // slots [0-49]: gap for future storage variables uint256[50] _gap_before; - // slot 50 (32 + 32 + 160) + // slot 50 (32 + 32) /// @notice The chain slug of the watcher precompile uint32 public evmxSlug; /// @notice stores temporary chainSlug of the trigger from a chain uint32 public triggerFromChainSlug; - /// @notice stores temporary plug of the trigger from a chain - address public triggerFromPlug; // slot 51 /// @notice Stores the trigger fees @@ -59,8 +57,12 @@ abstract contract WatcherStorage is IWatcher, Initializable, Ownable { /// @dev signatureNonce => isValid mapping(uint256 => bool) public isNonceUsed; - // slots [60-109]: gap for future storage variables - uint256[50] _gap_after; + // slot 60 + /// @notice stores temporary plug of the trigger from a chain + bytes32 public triggerFromPlug; + + // slots [61-109]: gap for future storage variables + uint256[49] _gap_after; // slots [110-159] 50 slots reserved for address resolver util } diff --git a/contracts/evmx/watcher/precompiles/ReadPrecompile.sol b/contracts/evmx/watcher/precompiles/ReadPrecompile.sol index e8c7f2e8..175fb4d0 100644 --- a/contracts/evmx/watcher/precompiles/ReadPrecompile.sol +++ b/contracts/evmx/watcher/precompiles/ReadPrecompile.sol @@ -37,7 +37,7 @@ contract ReadPrecompile is IPrecompile, WatcherBase { QueueParams calldata queueParams_, address ) external view returns (bytes memory precompileData, uint256 estimatedFees) { - if (queueParams_.transaction.target == address(0)) revert InvalidTarget(); + if (queueParams_.transaction.target == bytes32(0)) revert InvalidTarget(); if (queueParams_.transaction.payload.length == 0) revert InvalidPayloadSize(); // For read precompile, encode the payload parameters diff --git a/contracts/evmx/watcher/precompiles/WritePrecompile.sol b/contracts/evmx/watcher/precompiles/WritePrecompile.sol index a36eaf4e..e2b13188 100644 --- a/contracts/evmx/watcher/precompiles/WritePrecompile.sol +++ b/contracts/evmx/watcher/precompiles/WritePrecompile.sol @@ -10,6 +10,7 @@ import {InvalidIndex, MaxMsgValueLimitExceeded, InvalidPayloadSize} from "../../ import {encodeAppGatewayId} from "../../../utils/common/IdUtils.sol"; import "../../../utils/RescueFundsLib.sol"; import "../WatcherBase.sol"; +import {toBytes32Format} from "../../../utils/common/Converters.sol"; abstract contract WritePrecompileStorage is IPrecompile { // slots [0-49] reserved for gap @@ -37,7 +38,7 @@ abstract contract WritePrecompileStorage is IPrecompile { mapping(bytes32 => bytes32) public digestHashes; // slot 55 - mapping(uint32 => address) public contractFactoryPlugs; + mapping(uint32 => bytes32) public contractFactoryPlugs; // slots [56-105] reserved for gap uint256[50] _gap_after; @@ -51,7 +52,7 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc /// @notice Emitted when fees are set event FeesSet(uint256 writeFees); event ChainMaxMsgValueLimitsUpdated(uint32 chainSlug, uint256 maxMsgValueLimit); - event ContractFactoryPlugSet(uint32 chainSlug, address contractFactoryPlug); + event ContractFactoryPlugSet(uint32 chainSlug, bytes32 contractFactoryPlug); /// @notice Emitted when a proof upload request is made event WriteProofRequested( address transmitter, @@ -107,7 +108,7 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc revert InvalidPayloadSize(); } - if (queueParams_.transaction.target == address(0)) { + if (queueParams_.transaction.target == bytes32(0)) { queueParams_.transaction.target = contractFactoryPlugs[ queueParams_.transaction.chainSlug ]; @@ -186,7 +187,7 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc value, transaction.payload, transaction.target, - encodeAppGatewayId(appGateway), + toBytes32Format(appGateway), prevBatchDigestHash, bytes("") ); @@ -233,7 +234,7 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc /// @dev This function creates a keccak256 hash of the payload parameters function getDigest(DigestParams memory params_) public pure returns (bytes32 digest) { digest = keccak256( - abi.encode( + abi.encodePacked( params_.socket, params_.transmitter, params_.payloadId, @@ -276,7 +277,7 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc function setContractFactoryPlugs( uint32 chainSlug_, - address contractFactoryPlug_ + bytes32 contractFactoryPlug_ ) external onlyOwner { contractFactoryPlugs[chainSlug_] = contractFactoryPlug_; emit ContractFactoryPlugSet(chainSlug_, contractFactoryPlug_); diff --git a/contracts/protocol/Socket.sol b/contracts/protocol/Socket.sol index 09e06157..b5e8bb17 100644 --- a/contracts/protocol/Socket.sol +++ b/contracts/protocol/Socket.sol @@ -67,7 +67,7 @@ contract Socket is SocketUtils { // check if the call type is valid if (executeParams_.callType != WRITE) revert InvalidCallType(); - PlugConfig memory plugConfig = _plugConfigs[executeParams_.target]; + PlugConfigEvm memory plugConfig = _plugConfigs[executeParams_.target]; // check if the plug is disconnected if (plugConfig.appGatewayId == bytes32(0)) revert PlugNotFound(); @@ -78,7 +78,7 @@ contract Socket is SocketUtils { executeParams_.requestCount, executeParams_.batchCount, executeParams_.payloadCount, - plugConfig.switchboard, + toBytes32Format(plugConfig.switchboard), chainSlug ); @@ -180,7 +180,7 @@ contract Socket is SocketUtils { * @notice To trigger to a connected remote chain. Should only be called by a plug. */ function _triggerAppGateway(address plug_) internal returns (bytes32 triggerId) { - PlugConfig memory plugConfig = _plugConfigs[plug_]; + PlugConfigEvm memory plugConfig = _plugConfigs[plug_]; // if no sibling plug is found for the given chain slug, revert // sends the trigger to connected app gateway @@ -191,8 +191,8 @@ contract Socket is SocketUtils { emit AppGatewayCallRequested( triggerId, plugConfig.appGatewayId, - plugConfig.switchboard, - plug_, + toBytes32Format(plugConfig.switchboard), + toBytes32Format(plug_), // gets the overrides from the plug IPlug(plug_).overrides(), msg.data diff --git a/contracts/protocol/SocketConfig.sol b/contracts/protocol/SocketConfig.sol index 22528f5d..b290fb68 100644 --- a/contracts/protocol/SocketConfig.sol +++ b/contracts/protocol/SocketConfig.sol @@ -7,7 +7,7 @@ import {IPlug} from "./interfaces/IPlug.sol"; import "./interfaces/ISocketFeeManager.sol"; import "../utils/AccessControl.sol"; import {GOVERNANCE_ROLE, RESCUE_ROLE, SWITCHBOARD_DISABLER_ROLE} from "../utils/common/AccessRoles.sol"; -import {PlugConfig, SwitchboardStatus, ExecutionStatus} from "../utils/common/Structs.sol"; +import {PlugConfigEvm, SwitchboardStatus, ExecutionStatus} from "../utils/common/Structs.sol"; import "../utils/common/Errors.sol"; import {MAX_COPY_BYTES} from "../utils/common/Constants.sol"; @@ -25,7 +25,7 @@ abstract contract SocketConfig is ISocket, AccessControl { mapping(address => SwitchboardStatus) public isValidSwitchboard; // @notice mapping of plug address to its config - mapping(address => PlugConfig) internal _plugConfigs; + mapping(address => PlugConfigEvm) internal _plugConfigs; // @notice max copy bytes for socket uint16 public maxCopyBytes = 2048; // 2KB @@ -79,7 +79,7 @@ abstract contract SocketConfig is ISocket, AccessControl { if (isValidSwitchboard[switchboard_] != SwitchboardStatus.REGISTERED) revert InvalidSwitchboard(); - PlugConfig storage _plugConfig = _plugConfigs[msg.sender]; + PlugConfigEvm storage _plugConfig = _plugConfigs[msg.sender]; _plugConfig.appGatewayId = appGatewayId_; _plugConfig.switchboard = switchboard_; @@ -103,7 +103,7 @@ abstract contract SocketConfig is ISocket, AccessControl { function getPlugConfig( address plugAddress_ ) external view returns (bytes32 appGatewayId, address switchboard) { - PlugConfig memory _plugConfig = _plugConfigs[plugAddress_]; + PlugConfigEvm memory _plugConfig = _plugConfigs[plugAddress_]; return (_plugConfig.appGatewayId, _plugConfig.switchboard); } } diff --git a/contracts/protocol/SocketUtils.sol b/contracts/protocol/SocketUtils.sol index 4f96ec81..46597144 100644 --- a/contracts/protocol/SocketUtils.sol +++ b/contracts/protocol/SocketUtils.sol @@ -5,6 +5,7 @@ import {ECDSA} from "solady/utils/ECDSA.sol"; import "../utils/RescueFundsLib.sol"; import "./SocketConfig.sol"; import {LibCall} from "solady/utils/LibCall.sol"; +import {toBytes32Format} from "../utils/common/Converters.sol"; /** * @title SocketUtils @@ -73,8 +74,8 @@ abstract contract SocketUtils is SocketConfig { ) internal view returns (bytes32) { return keccak256( - abi.encode( - address(this), + abi.encodePacked( + toBytes32Format(address(this)), transmitter_, payloadId_, executeParams_.deadline, @@ -82,7 +83,7 @@ abstract contract SocketUtils is SocketConfig { executeParams_.gasLimit, executeParams_.value, executeParams_.payload, - executeParams_.target, + toBytes32Format(executeParams_.target), appGatewayId_, executeParams_.prevBatchDigestHash, executeParams_.extraData diff --git a/contracts/protocol/interfaces/ISocket.sol b/contracts/protocol/interfaces/ISocket.sol index 80a8a25a..74dfe535 100644 --- a/contracts/protocol/interfaces/ISocket.sol +++ b/contracts/protocol/interfaces/ISocket.sol @@ -43,8 +43,8 @@ interface ISocket { event AppGatewayCallRequested( bytes32 triggerId, bytes32 appGatewayId, - address switchboard, - address plug, + bytes32 switchboard, + bytes32 plug, bytes overrides, bytes payload ); diff --git a/contracts/protocol/switchboard/FastSwitchboard.sol b/contracts/protocol/switchboard/FastSwitchboard.sol index ee0679a4..27d915fe 100644 --- a/contracts/protocol/switchboard/FastSwitchboard.sol +++ b/contracts/protocol/switchboard/FastSwitchboard.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.21; import "./SwitchboardBase.sol"; import {WATCHER_ROLE} from "../../utils/common/AccessRoles.sol"; +import {toBytes32Format} from "../../utils/common/Converters.sol"; /** * @title FastSwitchboard contract @@ -43,7 +44,7 @@ contract FastSwitchboard is SwitchboardBase { if (isAttested[digest_]) revert AlreadyAttested(); address watcher = _recoverSigner( - keccak256(abi.encode(address(this), chainSlug, digest_)), + keccak256(abi.encodePacked(toBytes32Format(address(this)), chainSlug, digest_)), proof_ ); if (!_hasRole(WATCHER_ROLE, watcher)) revert WatcherNotFound(); diff --git a/contracts/utils/common/Converters.sol b/contracts/utils/common/Converters.sol new file mode 100644 index 00000000..4f290e4b --- /dev/null +++ b/contracts/utils/common/Converters.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.21; + +error NotAnEvmAddress(bytes32 bytes32FormatAddress); + +function toBytes32Format(address addr) pure returns (bytes32) { + return bytes32(uint256(uint160(addr))); +} + +function fromBytes32Format(bytes32 bytes32FormatAddress) pure returns (address) { + if (uint256(bytes32FormatAddress) >> 160 != 0) { + revert NotAnEvmAddress(bytes32FormatAddress); + } + return address(uint160(uint256(bytes32FormatAddress))); +} diff --git a/contracts/utils/common/IdUtils.sol b/contracts/utils/common/IdUtils.sol index 899abc5e..a70cec20 100644 --- a/contracts/utils/common/IdUtils.sol +++ b/contracts/utils/common/IdUtils.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.22; +// TODO:GW:remove this function encodeAppGatewayId(address appGateway_) pure returns (bytes32) { return bytes32(uint256(uint160(appGateway_))); } @@ -20,9 +21,17 @@ function createPayloadId( uint40 requestCount_, uint40 batchCount_, uint40 payloadCount_, - address switchboard_, + bytes32 switchboard_, uint32 chainSlug_ ) pure returns (bytes32) { return - keccak256(abi.encode(requestCount_, batchCount_, payloadCount_, chainSlug_, switchboard_)); + keccak256( + abi.encodePacked( + requestCount_, + batchCount_, + payloadCount_, + chainSlug_, + switchboard_ + ) + ); } diff --git a/contracts/utils/common/Structs.sol b/contracts/utils/common/Structs.sol index 80943216..bfad31c4 100644 --- a/contracts/utils/common/Structs.sol +++ b/contracts/utils/common/Structs.sol @@ -51,19 +51,30 @@ struct AppGatewayApprovals { //// STRUCTS //// struct AppGatewayConfig { - PlugConfig plugConfig; - address plug; + PlugConfigGeneric plugConfig; + bytes32 plug; uint32 chainSlug; } // Plug config: -struct PlugConfig { +// struct PlugConfig { +// bytes32 appGatewayId; +// address switchboard; +// } +struct PlugConfigGeneric { + bytes32 appGatewayId; + bytes32 switchboard; +} + +// Plug config: +struct PlugConfigEvm { bytes32 appGatewayId; address switchboard; } + //trigger: struct TriggerParams { bytes32 triggerId; - address plug; + bytes32 plug; bytes32 appGatewayId; uint32 chainSlug; bytes overrides; @@ -113,7 +124,7 @@ struct CreateRequestResult { struct Bid { uint256 fee; - address transmitter; + address transmitter; // TODO:GW: for later - in Solana it will be bytes32 bytes extraData; } @@ -124,15 +135,15 @@ struct UserCredits { // digest: struct DigestParams { - address socket; - address transmitter; + bytes32 socket; + address transmitter; // TODO:GW: for later - in Solana it will be bytes32 bytes32 payloadId; uint256 deadline; bytes4 callType; uint256 gasLimit; uint256 value; bytes payload; - address target; + bytes32 target; bytes32 appGatewayId; bytes32 prevBatchDigestHash; bytes extraData; @@ -149,10 +160,10 @@ struct OverrideParams { uint256 delayInSeconds; } -// payload +// payload // TODO:GW: change target to bytes32 - no more QueuePayloadParams ? struct Transaction { uint32 chainSlug; - address target; + bytes32 target; bytes payload; } diff --git a/script/counter/ReadOnchainCounters.s.sol b/script/counter/ReadOnchainCounters.s.sol index 011ab4fb..0bc37fa3 100644 --- a/script/counter/ReadOnchainCounters.s.sol +++ b/script/counter/ReadOnchainCounters.s.sol @@ -5,21 +5,25 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {Counter} from "../../test/apps/app-gateways/counter/Counter.sol"; import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; +import {fromBytes32Format} from "../../contracts/utils/common/Converters.sol"; contract CheckCounters is Script { function run() external { CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); vm.createSelectFork(vm.envString("EVMX_RPC")); - address counterInstanceArbitrumSepolia = gateway.getOnChainAddress( + address counterInstanceArbitrumSepolia = fromBytes32Format(gateway.getOnChainAddress( gateway.counter(), 421614 - ); - address counterInstanceOptimismSepolia = gateway.getOnChainAddress( + )); + address counterInstanceOptimismSepolia = fromBytes32Format(gateway.getOnChainAddress( gateway.counter(), 11155420 - ); - address counterInstanceBaseSepolia = gateway.getOnChainAddress(gateway.counter(), 84532); + )); + address counterInstanceBaseSepolia = fromBytes32Format(gateway.getOnChainAddress( + gateway.counter(), + 84532 + )); if (counterInstanceArbitrumSepolia != address(0)) { vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index c60bd554..9cdf4ebc 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -100,15 +100,15 @@ contract FeesTest is AppGatewayBaseSetup { ); hoax(watcherEOA); - feesManager.setFeesPlug(arbChainSlug, address(0)); + feesManager.setFeesPlug(arbChainSlug, bytes32(0)); AppGatewayConfig[] memory configs = new AppGatewayConfig[](1); configs[0] = AppGatewayConfig({ chainSlug: arbChainSlug, - plug: address(arbConfig.feesPlug), - plugConfig: PlugConfig({ - appGatewayId: encodeAppGatewayId(address(0)), - switchboard: address(0) + plug: toBytes32Format(address(arbConfig.feesPlug)), + plugConfig: PlugConfigGeneric({ + appGatewayId: bytes32(0), + switchboard: bytes32(0) }) }); watcherMultiCall( @@ -156,15 +156,15 @@ contract FeesTest is AppGatewayBaseSetup { vm.stopPrank(); hoax(watcherEOA); - feesManager.setFeesPlug(arbChainSlug, address(arbConfig.feesPlug)); + feesManager.setFeesPlug(arbChainSlug, toBytes32Format(address(arbConfig.feesPlug))); AppGatewayConfig[] memory configs = new AppGatewayConfig[](1); configs[0] = AppGatewayConfig({ chainSlug: arbChainSlug, - plug: address(arbConfig.feesPlug), - plugConfig: PlugConfig({ - appGatewayId: encodeAppGatewayId(address(feesManager)), - switchboard: address(arbConfig.switchboard) + plug: toBytes32Format(address(arbConfig.feesPlug)), + plugConfig: PlugConfigGeneric({ + appGatewayId: toBytes32Format(address(feesManager)), + switchboard: toBytes32Format(address(arbConfig.switchboard)) }) }); watcherMultiCall( diff --git a/test/ProxyMigration.t.sol b/test/ProxyMigration.t.sol index ad35df2a..361fcda0 100644 --- a/test/ProxyMigration.t.sol +++ b/test/ProxyMigration.t.sol @@ -169,7 +169,7 @@ contract MigrationTest is ProxyStorageAssertions { assertEq(newImplAddr, address(newImpl), "New implementation not set correctly"); // Deploy a new forwarder and verify it uses the correct beacon - address newForwarder = asyncDeployer.getOrDeployForwarderContract(address(0x123), 1); + address newForwarder = asyncDeployer.getOrDeployForwarderContract(toBytes32Format(address(0x123)), 1); address beacon = getBeacon(newForwarder); assertEq( beacon, diff --git a/test/ProxyStorage.t.sol b/test/ProxyStorage.t.sol index 284b84cc..498ef568 100644 --- a/test/ProxyStorage.t.sol +++ b/test/ProxyStorage.t.sol @@ -41,7 +41,7 @@ contract ProxyStorageAssertions is AppGatewayBaseSetup { // last hoax(watcherEOA); - feesManager.setFeesPlug(evmxSlug, address(addressResolver)); + feesManager.setFeesPlug(evmxSlug, toBytes32Format(address(addressResolver))); bytes32 mappingSlot = keccak256(abi.encode(uint256(evmxSlug), uint256(57))); slotValue = vm.load(address(feesManager), mappingSlot); assertEq( @@ -211,12 +211,18 @@ contract ProxyStorageAssertions is AppGatewayBaseSetup { } function assertForwarderSlot() internal { - address forwarder = asyncDeployer.getOrDeployForwarderContract(address(this), evmxSlug); + bytes32 chainContractAddress = toBytes32Format(address(this)); + address forwarder = asyncDeployer.getOrDeployForwarderContract(chainContractAddress, evmxSlug); + + console.log("forwarder: ", forwarder); // first bytes32 slotValue = vm.load(address(forwarder), bytes32(uint256(FIRST_SLOT))); assertEq(uint32(uint256(slotValue)), evmxSlug); + slotValue = vm.load(address(forwarder), bytes32(uint256(FIRST_SLOT + 1))); + assertEq(slotValue, IForwarder(forwarder).getOnChainAddress()); + assertAddressResolverUtilSlot(101, address(forwarder)); } diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 377e2c4b..b5b259ec 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -169,34 +169,34 @@ contract DeploySetup is SetupStore { AppGatewayConfig[] memory configs = new AppGatewayConfig[](4); configs[0] = AppGatewayConfig({ chainSlug: arbChainSlug, - plug: address(arbConfig.feesPlug), - plugConfig: PlugConfig({ - appGatewayId: encodeAppGatewayId(address(feesManager)), - switchboard: address(arbConfig.switchboard) + plug: toBytes32Format(address(arbConfig.feesPlug)), + plugConfig: PlugConfigGeneric({ + appGatewayId: toBytes32Format(address(feesManager)), + switchboard: toBytes32Format(address(arbConfig.switchboard)) }) }); configs[1] = AppGatewayConfig({ chainSlug: optChainSlug, - plug: address(optConfig.feesPlug), - plugConfig: PlugConfig({ - appGatewayId: encodeAppGatewayId(address(feesManager)), - switchboard: address(optConfig.switchboard) + plug: toBytes32Format(address(optConfig.feesPlug)), + plugConfig: PlugConfigGeneric({ + appGatewayId: toBytes32Format(address(feesManager)), + switchboard: toBytes32Format(address(optConfig.switchboard)) }) }); configs[2] = AppGatewayConfig({ chainSlug: arbChainSlug, - plug: address(arbConfig.contractFactoryPlug), - plugConfig: PlugConfig({ - appGatewayId: encodeAppGatewayId(address(writePrecompile)), - switchboard: address(arbConfig.switchboard) + plug: toBytes32Format(address(arbConfig.contractFactoryPlug)), + plugConfig: PlugConfigGeneric({ + appGatewayId: toBytes32Format(address(writePrecompile)), + switchboard: toBytes32Format(address(arbConfig.switchboard)) }) }); configs[3] = AppGatewayConfig({ chainSlug: optChainSlug, - plug: address(optConfig.contractFactoryPlug), - plugConfig: PlugConfig({ - appGatewayId: encodeAppGatewayId(address(writePrecompile)), - switchboard: address(optConfig.switchboard) + plug: toBytes32Format(address(optConfig.contractFactoryPlug)), + plugConfig: PlugConfigGeneric({ + appGatewayId: toBytes32Format(address(writePrecompile)), + switchboard: toBytes32Format(address(optConfig.switchboard)) }) }); @@ -259,15 +259,15 @@ contract DeploySetup is SetupStore { vm.stopPrank(); vm.startPrank(watcherEOA); - configurations.setSocket(chainSlug_, address(socket)); - configurations.setSwitchboard(chainSlug_, FAST, address(switchboard)); + configurations.setSocket(chainSlug_, toBytes32Format(address(socket))); + configurations.setSwitchboard(chainSlug_, FAST, toBytes32Format(address(switchboard))); // plugs - feesManager.setFeesPlug(chainSlug_, address(feesPlug)); + feesManager.setFeesPlug(chainSlug_, toBytes32Format(address(feesPlug))); // precompiles writePrecompile.updateChainMaxMsgValueLimits(chainSlug_, maxMsgValueLimit); - writePrecompile.setContractFactoryPlugs(chainSlug_, address(contractFactoryPlug)); + writePrecompile.setContractFactoryPlugs(chainSlug_, toBytes32Format(address(contractFactoryPlug))); vm.stopPrank(); } @@ -770,7 +770,8 @@ contract WatcherSetup is AuctionSetup { ); bytes memory returnData; - (success, returnData) = transaction.target.call(transaction.payload); + address target = fromBytes32Format(transaction.target); + (success, returnData) = target.call(transaction.payload); promiseReturnData = PromiseReturnData({ exceededMaxCopy: false, payloadId: payloadParams.payloadId, @@ -785,7 +786,7 @@ contract WatcherSetup is AuctionSetup { ( uint32 chainSlug, - address switchboard, + bytes32 switchboard, bytes32 digest, DigestParams memory digestParams ) = _validateAndGetDigest(payloadParams); @@ -806,11 +807,12 @@ contract WatcherSetup is AuctionSetup { function _uploadProof( bytes32 payloadId, bytes32 digest, - address switchboard, + bytes32 switchboard, uint32 chainSlug ) internal returns (bytes memory proof) { proof = _createSignature( - keccak256(abi.encode(address(switchboard), chainSlug, digest)), + // create sigDigest which get signed by watcher + keccak256(abi.encodePacked(switchboard, chainSlug, digest)), watcherPrivateKey ); @@ -830,7 +832,7 @@ contract WatcherSetup is AuctionSetup { view returns ( uint32 chainSlug, - address switchboard, + bytes32 switchboard, bytes32 digest, DigestParams memory digestParams ) @@ -841,10 +843,10 @@ contract WatcherSetup is AuctionSetup { , uint256 gasLimit, uint256 value, - address switchboard_ + bytes32 switchboard_ ) = abi.decode( payloadParams.precompileData, - (address, Transaction, WriteFinality, uint256, uint256, address) + (address, Transaction, WriteFinality, uint256, uint256, bytes32) ); chainSlug = transaction.chainSlug; @@ -855,7 +857,7 @@ contract WatcherSetup is AuctionSetup { payloadParams.batchCount ); digestParams = DigestParams( - address(getSocketConfig(transaction.chainSlug).socket), + toBytes32Format(address(getSocketConfig(transaction.chainSlug).socket)), transmitterEOA, payloadParams.payloadId, payloadParams.deadline, @@ -864,7 +866,7 @@ contract WatcherSetup is AuctionSetup { value, transaction.payload, transaction.target, - encodeAppGatewayId(appGateway), + toBytes32Format(appGateway), prevBatchDigestHash, bytes("") ); @@ -875,12 +877,13 @@ contract WatcherSetup is AuctionSetup { function _executeWrite( uint32 chainSlug, - address switchboard, + bytes32 switchboard, bytes32 digest, DigestParams memory digestParams, PayloadParams memory payloadParams, bytes memory watcherProof ) internal returns (bool success, PromiseReturnData memory promiseReturnData) { + // this is a signature for the socket batcher (only used for EVM) bytes memory transmitterSig = _createSignature( keccak256( abi.encode(address(getSocketConfig(chainSlug).socket), payloadParams.payloadId) @@ -895,14 +898,14 @@ contract WatcherSetup is AuctionSetup { gasLimit: digestParams.gasLimit, value: digestParams.value, payload: digestParams.payload, - target: digestParams.target, + target: fromBytes32Format(digestParams.target), requestCount: payloadParams.requestCount, batchCount: payloadParams.batchCount, payloadCount: payloadParams.payloadCount, prevBatchDigestHash: digestParams.prevBatchDigestHash, extraData: digestParams.extraData }), - switchboard, + fromBytes32Format(switchboard), digest, watcherProof, transmitterSig, @@ -946,14 +949,14 @@ contract WatcherSetup is AuctionSetup { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); for (uint i = 0; i < contractIds_.length; i++) { - address plug = appGateway_.getOnChainAddress(contractIds_[i], chainSlug_); + bytes32 plug = appGateway_.getOnChainAddress(contractIds_[i], chainSlug_); configs[i] = AppGatewayConfig({ plug: plug, chainSlug: chainSlug_, - plugConfig: PlugConfig({ - appGatewayId: encodeAppGatewayId(address(appGateway_)), - switchboard: address(socketConfig.switchboard) + plugConfig: PlugConfigGeneric({ + appGatewayId: toBytes32Format(address(appGateway_)), + switchboard: toBytes32Format(address(socketConfig.switchboard)) }) }); } @@ -969,10 +972,10 @@ contract AppGatewayBaseSetup is WatcherSetup { uint32 chainSlug_, bytes32 contractId_, IAppGateway appGateway_ - ) internal view returns (address, address) { - address app = appGateway_.getOnChainAddress(contractId_, chainSlug_); + ) internal view returns (bytes32, address) { + bytes32 onChainContract = appGateway_.getOnChainAddress(contractId_, chainSlug_); address forwarder = appGateway_.forwarderAddresses(contractId_, chainSlug_); - return (app, forwarder); + return (onChainContract, forwarder); } // todo: add checks for request params and payload params created to match what is expected diff --git a/test/TriggerTest.t.sol b/test/TriggerTest.t.sol index 0ebed42f..6b68ff4d 100644 --- a/test/TriggerTest.t.sol +++ b/test/TriggerTest.t.sol @@ -13,8 +13,8 @@ contract TriggerTest is AppGatewayBaseSetup { event AppGatewayCallRequested( bytes32 triggerId, bytes32 appGatewayId, - address switchboard, - address plug, + bytes32 switchboard, + bytes32 plug, bytes overrides, bytes payload ); @@ -35,11 +35,12 @@ contract TriggerTest is AppGatewayBaseSetup { gateway.deployContracts(arbChainSlug); executeDeploy(gateway, arbChainSlug, contractIds); - (address counterAddress, ) = getOnChainAndForwarderAddresses( + (bytes32 counterBytes32, ) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, gateway ); + address counterAddress = fromBytes32Format(counterBytes32); counter = Counter(counterAddress); gateway.setIsValidPlug(arbChainSlug, counterId); } @@ -60,8 +61,8 @@ contract TriggerTest is AppGatewayBaseSetup { emit AppGatewayCallRequested( triggerId, encodeAppGatewayId(address(gateway)), - address(arbConfig.switchboard), - address(counter), + toBytes32Format(address(arbConfig.switchboard)), + toBytes32Format(address(counter)), bytes(""), payload ); @@ -72,7 +73,7 @@ contract TriggerTest is AppGatewayBaseSetup { triggerId: triggerId, chainSlug: arbChainSlug, appGatewayId: encodeAppGatewayId(address(gateway)), - plug: address(counter), + plug: toBytes32Format(address(counter)), payload: payload, overrides: bytes("") }); diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index e0949f07..4d0b5010 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -31,7 +31,7 @@ contract CounterTest is AppGatewayBaseSetup { function testCounterDeployment() external { deployCounterApp(arbChainSlug); - (address onChain, address forwarder) = getOnChainAndForwarderAddresses( + (bytes32 onChain, address forwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, counterGateway @@ -57,11 +57,12 @@ contract CounterTest is AppGatewayBaseSetup { function testCounterIncrement() external { deployCounterApp(arbChainSlug); - (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( + (bytes32 arbCounterBytes32, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, counterGateway ); + address arbCounter = fromBytes32Format(arbCounterBytes32); uint256 arbCounterBefore = Counter(arbCounter).counter(); @@ -77,17 +78,19 @@ contract CounterTest is AppGatewayBaseSetup { deployCounterApp(arbChainSlug); deployCounterApp(optChainSlug); - (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( + (bytes32 arbCounterBytes32, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, counterGateway ); - (address optCounter, address optCounterForwarder) = getOnChainAndForwarderAddresses( + address arbCounter = fromBytes32Format(arbCounterBytes32); + (bytes32 optCounterBytes32, address optCounterForwarder) = getOnChainAndForwarderAddresses( optChainSlug, counterId, counterGateway ); - + address optCounter = fromBytes32Format(optCounterBytes32); + uint256 arbCounterBefore = Counter(arbCounter).counter(); uint256 optCounterBefore = Counter(optCounter).counter(); diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index fda14b52..3acd413c 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -37,23 +37,25 @@ contract ParallelCounterTest is AppGatewayBaseSetup { chainSlugs[1] = optChainSlug; deployCounterApp(chainSlugs); - (address onChainArb1, address forwarderArb1) = getOnChainAndForwarderAddresses( + (bytes32 onChainArb1, address forwarderArb1) = getOnChainAndForwarderAddresses( arbChainSlug, counterId1, parallelCounterGateway ); - (address onChainArb2, address forwarderArb2) = getOnChainAndForwarderAddresses( + + (bytes32 onChainArb2, address forwarderArb2) = getOnChainAndForwarderAddresses( arbChainSlug, counterId2, parallelCounterGateway ); - (address onChainOpt1, address forwarderOpt1) = getOnChainAndForwarderAddresses( + (bytes32 onChainOpt1, address forwarderOpt1) = getOnChainAndForwarderAddresses( optChainSlug, counterId1, parallelCounterGateway ); - (address onChainOpt2, address forwarderOpt2) = getOnChainAndForwarderAddresses( + + (bytes32 onChainOpt2, address forwarderOpt2) = getOnChainAndForwarderAddresses( optChainSlug, counterId2, parallelCounterGateway @@ -106,11 +108,12 @@ contract ParallelCounterTest is AppGatewayBaseSetup { chainSlugs[0] = arbChainSlug; deployCounterApp(chainSlugs); - (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( + (bytes32 arbCounterBytes32, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId1, parallelCounterGateway ); + address arbCounter = fromBytes32Format(arbCounterBytes32); uint256 arbCounterBefore = Counter(arbCounter).counter(); @@ -128,16 +131,19 @@ contract ParallelCounterTest is AppGatewayBaseSetup { chainSlugs[1] = optChainSlug; deployCounterApp(chainSlugs); - (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( + (bytes32 arbCounterBytes32, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId1, parallelCounterGateway ); - (address optCounter, address optCounterForwarder) = getOnChainAndForwarderAddresses( + address arbCounter = fromBytes32Format(arbCounterBytes32); + + (bytes32 optCounterBytes32, address optCounterForwarder) = getOnChainAndForwarderAddresses( optChainSlug, counterId1, parallelCounterGateway ); + address optCounter = fromBytes32Format(optCounterBytes32); uint256 arbCounterBefore = Counter(arbCounter).counter(); uint256 optCounterBefore = Counter(optCounter).counter(); diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index 0314b353..3b35db2d 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -99,11 +99,12 @@ contract SuperTokenTest is AppGatewayBaseSetup { function testContractDeployment() public { deploySuperToken(arbChainSlug); - (address onChain, address forwarder) = getOnChainAndForwarderAddresses( + (bytes32 onChainBytes32, address forwarder) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.superToken, IAppGateway(appContracts.superTokenApp) ); + address onChain = fromBytes32Format(onChainBytes32); assertEq( SuperToken(onChain).name(), @@ -119,7 +120,7 @@ contract SuperTokenTest is AppGatewayBaseSetup { assertEq( IForwarder(forwarder).getOnChainAddress(), - onChain, + onChainBytes32, "Forwarder SuperToken onChainAddress should be correct" ); assertEq(SuperToken(onChain).owner(), owner, "SuperToken owner should be correct"); @@ -137,18 +138,20 @@ contract SuperTokenTest is AppGatewayBaseSetup { deploySuperToken(arbChainSlug); deploySuperToken(optChainSlug); - (address onChainArb, address forwarderArb) = getOnChainAndForwarderAddresses( + (bytes32 onChainArbBytes32, address forwarderArb) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.superToken, IAppGateway(appContracts.superTokenApp) ); + address onChainArb = fromBytes32Format(onChainArbBytes32); - (address onChainOpt, address forwarderOpt) = getOnChainAndForwarderAddresses( + (bytes32 onChainOptBytes32, address forwarderOpt) = getOnChainAndForwarderAddresses( optChainSlug, appContracts.superToken, IAppGateway(appContracts.superTokenApp) ); - + address onChainOpt = fromBytes32Format(onChainOptBytes32); + uint256 arbBalanceBefore = SuperToken(onChainArb).balanceOf(owner); uint256 optBalanceBefore = SuperToken(onChainOpt).balanceOf(owner); diff --git a/test/mock/MockSocket.sol b/test/mock/MockSocket.sol index fbe737a8..adfcc841 100644 --- a/test/mock/MockSocket.sol +++ b/test/mock/MockSocket.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.21; import "../../contracts/utils/common/Errors.sol"; import "../../contracts/protocol/interfaces/ISocket.sol"; import "../../contracts/protocol/interfaces/ISwitchboard.sol"; +import {toBytes32Format} from "../../contracts/utils/common/Converters.sol"; /** * @title SocketDst @@ -14,7 +15,7 @@ import "../../contracts/protocol/interfaces/ISwitchboard.sol"; * It also includes functions for payload execution and verification */ contract MockSocket is ISocket { - struct PlugConfig { + struct PlugConfigEvm { // address of the sibling plug on the remote chain bytes32 appGatewayId; // switchboard instance for the plug connection @@ -22,12 +23,12 @@ contract MockSocket is ISocket { } // plug => (appGateway, switchboard__) - mapping(address => PlugConfig) internal _plugConfigs; + mapping(address => PlugConfigEvm) internal _plugConfigs; function getPlugConfig( address plugAddress_ ) external view returns (bytes32 appGatewayId, address switchboard__) { - PlugConfig memory _plugConfig = _plugConfigs[plugAddress_]; + PlugConfigEvm memory _plugConfig = _plugConfigs[plugAddress_]; return (_plugConfig.appGatewayId, address(_plugConfig.switchboard__)); } @@ -91,14 +92,14 @@ contract MockSocket is ISocket { bytes calldata payload, bytes calldata overrides ) external returns (bytes32 triggerId) { - PlugConfig memory plugConfig = _plugConfigs[msg.sender]; + PlugConfigEvm memory plugConfig = _plugConfigs[msg.sender]; // creates a unique ID for the message triggerId = _encodeTriggerId(plugConfig.appGatewayId); emit AppGatewayCallRequested( triggerId, plugConfig.appGatewayId, - address(plugConfig.switchboard__), - msg.sender, + toBytes32Format(address(plugConfig.switchboard__)), + toBytes32Format(msg.sender), overrides, payload ); diff --git a/test/mock/MockWatcherPrecompile.sol b/test/mock/MockWatcherPrecompile.sol index 7ee24975..6d66417c 100644 --- a/test/mock/MockWatcherPrecompile.sol +++ b/test/mock/MockWatcherPrecompile.sol @@ -56,7 +56,7 @@ contract MockWatcherPrecompile is Trigger { function setIsValidPlug( bool isValid_, uint32 chainSlug_, - address onchainAddress_ + bytes32 onchainAddress_ ) external override {} function isWatcher(address account_) external view override returns (bool) {} From ef81dc962ae4c5ba693544298f0b516ca0928e1a Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Thu, 19 Jun 2025 08:48:17 +0200 Subject: [PATCH 02/18] Fix hardhat scripts; fix missing conversions for address <-> bytes32 --- contracts/evmx/helpers/DeployForwarder.sol | 4 +-- contracts/evmx/plugs/FeesPlug.sol | 1 + contracts/evmx/watcher/Configurations.sol | 1 - contracts/evmx/watcher/Trigger.sol | 1 - .../watcher/precompiles/WritePrecompile.sol | 1 - contracts/utils/common/IdUtils.sol | 9 ------- hardhat-scripts/deploy/3.configureChains.ts | 23 ++++++++++------ hardhat-scripts/deploy/6.connect.ts | 14 +++++----- hardhat-scripts/utils/address.ts | 26 +++++++++++++++++++ hardhat-scripts/utils/appConfig.ts | 6 ++++- test/FeesTest.t.sol | 2 +- test/SetupTest.t.sol | 4 +-- test/SocketFeeManager.t.sol | 2 +- test/TriggerTest.t.sol | 4 +-- 14 files changed, 63 insertions(+), 35 deletions(-) diff --git a/contracts/evmx/helpers/DeployForwarder.sol b/contracts/evmx/helpers/DeployForwarder.sol index 0b464006..be2ab041 100644 --- a/contracts/evmx/helpers/DeployForwarder.sol +++ b/contracts/evmx/helpers/DeployForwarder.sol @@ -9,9 +9,9 @@ import {IDeployForwarder} from "../interfaces/IDeployForwarder.sol"; import {AsyncModifierNotSet} from "../../utils/common/Errors.sol"; import {QueueParams, OverrideParams, Transaction} from "../../utils/common/Structs.sol"; import {WRITE} from "../../utils/common/Constants.sol"; -import {encodeAppGatewayId} from "../../utils/common/IdUtils.sol"; import "../../utils/RescueFundsLib.sol"; import "./AddressResolverUtil.sol"; +import {toBytes32Format} from "../../utils/common/Converters.sol"; /// @title DeployForwarder /// @notice contract responsible for handling deployment requests @@ -93,7 +93,7 @@ contract DeployForwarder is IDeployForwarder, Initializable, AddressResolverUtil IContractFactoryPlug.deployContract.selector, isPlug_, salt, - encodeAppGatewayId(appGateway_), + toBytes32Format(appGateway_), watcher__().configurations__().switchboards(chainSlug_, plugSwitchboardType_), payload_, initCallData_ diff --git a/contracts/evmx/plugs/FeesPlug.sol b/contracts/evmx/plugs/FeesPlug.sol index 07ac95af..6927ce92 100644 --- a/contracts/evmx/plugs/FeesPlug.sol +++ b/contracts/evmx/plugs/FeesPlug.sol @@ -103,6 +103,7 @@ contract FeesPlug is IFeesPlug, PlugBase, AccessControl { /// @notice Adds a token to the whitelist /// @param token_ The token address to whitelist + // TODO:GW: what is that toknen used for ? is it EVM specific ? function whitelistToken(address token_) external onlyOwner { if (token_.code.length == 0) revert InvalidTokenAddress(); whitelistedTokens[token_] = true; diff --git a/contracts/evmx/watcher/Configurations.sol b/contracts/evmx/watcher/Configurations.sol index 99ee7dfd..dc0b3694 100644 --- a/contracts/evmx/watcher/Configurations.sol +++ b/contracts/evmx/watcher/Configurations.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.21; import "solady/utils/Initializable.sol"; import "../interfaces/IConfigurations.sol"; import {WatcherBase} from "./WatcherBase.sol"; -import {encodeAppGatewayId} from "../../utils/common/IdUtils.sol"; import {InvalidGateway, InvalidSwitchboard} from "../../utils/common/Errors.sol"; import "solady/auth/Ownable.sol"; import "../../utils/RescueFundsLib.sol"; diff --git a/contracts/evmx/watcher/Trigger.sol b/contracts/evmx/watcher/Trigger.sol index b9065ce7..72e7dfcd 100644 --- a/contracts/evmx/watcher/Trigger.sol +++ b/contracts/evmx/watcher/Trigger.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.21; import {LibCall} from "solady/utils/LibCall.sol"; import "./WatcherStorage.sol"; -import {decodeAppGatewayId} from "../../utils/common/IdUtils.sol"; import {fromBytes32Format} from "../../utils/common/Converters.sol"; /// @title Trigger diff --git a/contracts/evmx/watcher/precompiles/WritePrecompile.sol b/contracts/evmx/watcher/precompiles/WritePrecompile.sol index e2b13188..b9cc48df 100644 --- a/contracts/evmx/watcher/precompiles/WritePrecompile.sol +++ b/contracts/evmx/watcher/precompiles/WritePrecompile.sol @@ -7,7 +7,6 @@ import "solady/auth/Ownable.sol"; import "../../interfaces/IPrecompile.sol"; import {WRITE, PAYLOAD_SIZE_LIMIT} from "../../../utils/common/Constants.sol"; import {InvalidIndex, MaxMsgValueLimitExceeded, InvalidPayloadSize} from "../../../utils/common/Errors.sol"; -import {encodeAppGatewayId} from "../../../utils/common/IdUtils.sol"; import "../../../utils/RescueFundsLib.sol"; import "../WatcherBase.sol"; import {toBytes32Format} from "../../../utils/common/Converters.sol"; diff --git a/contracts/utils/common/IdUtils.sol b/contracts/utils/common/IdUtils.sol index a70cec20..ba9797e0 100644 --- a/contracts/utils/common/IdUtils.sol +++ b/contracts/utils/common/IdUtils.sol @@ -1,15 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.22; -// TODO:GW:remove this -function encodeAppGatewayId(address appGateway_) pure returns (bytes32) { - return bytes32(uint256(uint160(appGateway_))); -} - -function decodeAppGatewayId(bytes32 appGatewayId_) pure returns (address) { - return address(uint160(uint256(appGatewayId_))); -} - /// @notice Creates a payload ID from the given parameters /// @param requestCount_ The request count /// @param batchCount_ The batch count diff --git a/hardhat-scripts/deploy/3.configureChains.ts b/hardhat-scripts/deploy/3.configureChains.ts index 54a3cb11..2b3cb4b0 100644 --- a/hardhat-scripts/deploy/3.configureChains.ts +++ b/hardhat-scripts/deploy/3.configureChains.ts @@ -15,6 +15,8 @@ import { getSocketSigner, getWatcherSigner, overrides, + toBytes32Format, + toBytes32FormatHexString, updateContractSettings, } from "../utils"; @@ -81,14 +83,19 @@ async function setOnchainContracts( const signer: Wallet = getWatcherSigner(); const chainAddresses = addresses[chain] as ChainAddressesObj; + const switchboard = toBytes32FormatHexString(chainAddresses[Contracts.FastSwitchboard]); + const socket = toBytes32FormatHexString(chainAddresses[Contracts.Socket]); + const feesPlug = toBytes32FormatHexString(chainAddresses[Contracts.FeesPlug]!); + const contractFactory = toBytes32FormatHexString(chainAddresses[Contracts.ContractFactoryPlug]); + await updateContractSettings( EVMX_CHAIN_ID, Contracts.Configurations, "switchboards", [chain, FAST_SWITCHBOARD_TYPE], - chainAddresses[Contracts.FastSwitchboard], + switchboard, "setSwitchboard", - [chain, FAST_SWITCHBOARD_TYPE, chainAddresses[Contracts.FastSwitchboard]], + [chain, FAST_SWITCHBOARD_TYPE, toBytes32Format(switchboard)], signer ); await updateContractSettings( @@ -96,9 +103,9 @@ async function setOnchainContracts( Contracts.Configurations, "sockets", [chain], - chainAddresses[Contracts.Socket], + socket, "setSocket", - [chain, chainAddresses[Contracts.Socket]], + [chain, socket], signer ); @@ -108,9 +115,9 @@ async function setOnchainContracts( Contracts.FeesManager, "feesPlugs", [chain], - chainAddresses[Contracts.FeesPlug], + feesPlug, "setFeesPlug", - [chain, chainAddresses[Contracts.FeesPlug]], + [chain, toBytes32Format(feesPlug)], signer ); @@ -119,9 +126,9 @@ async function setOnchainContracts( Contracts.WritePrecompile, "contractFactoryPlugs", [chain], - chainAddresses[Contracts.ContractFactoryPlug], + contractFactory, "setContractFactoryPlugs", - [chain, chainAddresses[Contracts.ContractFactoryPlug]], + [chain, toBytes32Format(contractFactory)], signer ); } diff --git a/hardhat-scripts/deploy/6.connect.ts b/hardhat-scripts/deploy/6.connect.ts index e13d781c..c1224f7b 100644 --- a/hardhat-scripts/deploy/6.connect.ts +++ b/hardhat-scripts/deploy/6.connect.ts @@ -10,6 +10,7 @@ import { getInstance, getSocketSigner, overrides, + toBytes32FormatHexString, } from "../utils"; import { getWatcherSigner, sendWatcherMultiCallWithNonce } from "../utils/sign"; import { isConfigSetOnEVMx, isConfigSetOnSocket } from "../utils"; @@ -113,8 +114,9 @@ export const updateConfigEVMx = async () => { for (const plugContract of plugs) { const appGatewayId = getAppGatewayId(plugContract, addresses); - const switchboard = addr[Contracts.FastSwitchboard]; - checkIfAddressExists(switchboard, "Switchboard"); + const switchboardBytes32Hex = toBytes32FormatHexString(addr[Contracts.FastSwitchboard]); + const plugBytes32Hex = toBytes32FormatHexString(addr[plugContract]); + // checkIfAddressExists(switchboard, "Switchboard"); checkIfAppGatewayIdExists(appGatewayId, "AppGatewayId"); if (!addr[plugContract]) { @@ -126,9 +128,9 @@ export const updateConfigEVMx = async () => { await isConfigSetOnEVMx( configurationsContract, chain, - addr[plugContract], + plugBytes32Hex, appGatewayId, - switchboard + switchboardBytes32Hex ) ) { console.log(`Config already set on ${chain} for ${plugContract}`); @@ -137,9 +139,9 @@ export const updateConfigEVMx = async () => { appConfigs.push({ plugConfig: { appGatewayId: appGatewayId, - switchboard: switchboard, + switchboard: switchboardBytes32Hex, }, - plug: addr[plugContract], + plug: plugBytes32Hex, chainSlug: chain, }); } diff --git a/hardhat-scripts/utils/address.ts b/hardhat-scripts/utils/address.ts index 4ac48774..254facbb 100644 --- a/hardhat-scripts/utils/address.ts +++ b/hardhat-scripts/utils/address.ts @@ -33,3 +33,29 @@ export const checkIfAddressExists = (address: string, name: string) => { } return address; }; + +// TODO: move this to socket-common +export function toBytes32FormatHexString(hexString: string): string { + // this means that the string is already in bytes32 format with or without 0x prefix + if (hexString.length == 64 || hexString.length == 66) { + return hexString; + } + // Remove the '0x' prefix from the input string if it's present + const cleanedHexString = hexString.startsWith("0x") + ? hexString.slice(2) + : hexString; + + const buffer = Buffer.alloc(32); + buffer.write(cleanedHexString, 32 - cleanedHexString.length / 2, "hex"); // each hex char is 2 bytes + + return "0x" + buffer.toString("hex"); +} + +export function toBytes32Format(hexString: string): number[] { + const hex32Format = toBytes32FormatHexString(hexString); + const cleanedHex32String = hex32Format.startsWith("0x") + ? hex32Format.slice(2) + : hex32Format; + + return Array.from(Buffer.from(cleanedHex32String, "hex")); +} diff --git a/hardhat-scripts/utils/appConfig.ts b/hardhat-scripts/utils/appConfig.ts index 40387b76..0172655f 100644 --- a/hardhat-scripts/utils/appConfig.ts +++ b/hardhat-scripts/utils/appConfig.ts @@ -1,4 +1,5 @@ import { Contract } from "ethers"; +import { toBytes32Format } from "./address"; export const isConfigSetOnSocket = async ( plug: Contract, @@ -21,7 +22,10 @@ export const isConfigSetOnEVMx = async ( appGatewayId: string, switchboard: string ) => { - const plugConfigRegistered = await watcher.getPlugConfigs(chain, plug); + const plugConfigRegistered = await watcher.getPlugConfigs( + chain, + toBytes32Format(plug) + ); return ( plugConfigRegistered[0].toLowerCase() === appGatewayId?.toLowerCase() && plugConfigRegistered[1].toLowerCase() === switchboard.toLowerCase() diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index 9cdf4ebc..a9332b62 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -149,7 +149,7 @@ contract FeesTest is AppGatewayBaseSetup { arbConfig.feesPlug.grantRole(RESCUE_ROLE, address(socketOwner)); arbConfig.feesPlug.whitelistToken(address(arbConfig.testUSDC)); arbConfig.feesPlug.connectSocket( - encodeAppGatewayId(address(feesManager)), + toBytes32Format(address(feesManager)), address(arbConfig.socket), address(arbConfig.switchboard) ); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index b5b259ec..70c88943 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -244,14 +244,14 @@ contract DeploySetup is SetupStore { feesPlug.grantRole(RESCUE_ROLE, address(socketOwner)); feesPlug.whitelistToken(address(socketConfig.testUSDC)); feesPlug.connectSocket( - encodeAppGatewayId(address(feesManager)), + toBytes32Format(address(feesManager)), address(socket), address(switchboard) ); contractFactoryPlug.grantRole(RESCUE_ROLE, address(socketOwner)); contractFactoryPlug.connectSocket( - encodeAppGatewayId(address(writePrecompile)), + toBytes32Format(address(writePrecompile)), address(socket), address(switchboard) ); diff --git a/test/SocketFeeManager.t.sol b/test/SocketFeeManager.t.sol index 8809d11e..1fc6ce21 100644 --- a/test/SocketFeeManager.t.sol +++ b/test/SocketFeeManager.t.sol @@ -25,7 +25,7 @@ contract SocketFeeManagerTest is AppGatewayBaseSetup { counter = new Counter(); mockSwitchboard.registerSwitchboard(); - counter.initSocket(encodeAppGatewayId(gateway), address(socket), address(mockSwitchboard)); + counter.initSocket(toBytes32Format(gateway), address(socket), address(mockSwitchboard)); vm.prank(owner); socket.grantRole(GOVERNANCE_ROLE, address(owner)); diff --git a/test/TriggerTest.t.sol b/test/TriggerTest.t.sol index 6b68ff4d..e8b9fd0f 100644 --- a/test/TriggerTest.t.sol +++ b/test/TriggerTest.t.sol @@ -60,7 +60,7 @@ contract TriggerTest is AppGatewayBaseSetup { vm.expectEmit(true, true, true, true); emit AppGatewayCallRequested( triggerId, - encodeAppGatewayId(address(gateway)), + toBytes32Format(address(gateway)), toBytes32Format(address(arbConfig.switchboard)), toBytes32Format(address(counter)), bytes(""), @@ -72,7 +72,7 @@ contract TriggerTest is AppGatewayBaseSetup { params[0] = TriggerParams({ triggerId: triggerId, chainSlug: arbChainSlug, - appGatewayId: encodeAppGatewayId(address(gateway)), + appGatewayId: toBytes32Format(address(gateway)), plug: toBytes32Format(address(counter)), payload: payload, overrides: bytes("") From abeab6a831992e413a707a78952982c4711871a5 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 19 Jun 2025 13:34:07 +0530 Subject: [PATCH 03/18] chore: publish core 1.1.23 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b61572d5..3d91b195 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.1.22", + "version": "1.1.23", "description": "socket protocol", "scripts": { "build": "yarn abi && tsc --project lib.tsconfig.json", @@ -20,7 +20,7 @@ "compile": "forge build", "deploy": "bash setupInfraContracts.sh", "publish-core": "yarn build && yarn publish --patch --no-git-tag-version", - "trace":"bash trace.sh" + "trace": "bash trace.sh" }, "pre-commit": [], "author": "", From 03d7fbad41b3e12733a288e275ab299b54421f65 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Thu, 19 Jun 2025 17:16:00 +0200 Subject: [PATCH 04/18] Linter changes --- Errors.md | 191 ++-- EventTopics.md | 391 ++++---- FunctionSignatures.md | 939 ++++++++++---------- contracts/evmx/fees/Credit.sol | 4 +- contracts/evmx/interfaces/IWatcher.sol | 1 - contracts/utils/common/IdUtils.sol | 8 +- foundry.toml | 46 +- hardhat-scripts/deploy/3.configureChains.ts | 12 +- hardhat-scripts/deploy/6.connect.ts | 4 +- script/counter/ReadOnchainCounters.s.sol | 21 +- test/FeesTest.t.sol | 5 +- test/ProxyMigration.t.sol | 5 +- test/ProxyStorage.t.sol | 5 +- test/SetupTest.t.sol | 5 +- test/TriggerTest.t.sol | 2 +- 15 files changed, 826 insertions(+), 813 deletions(-) diff --git a/Errors.md b/Errors.md index 77179268..dc1933a7 100644 --- a/Errors.md +++ b/Errors.md @@ -1,142 +1,149 @@ # Custom Error Codes + ## evmx/fees/FeesPool.sol -| Error | Signature | -| ------------------ | ------------ | +| Error | Signature | +|-------|-----------| | `TransferFailed()` | `0x90b8ec18` | ## evmx/helpers/AsyncPromise.sol -| Error | Signature | -| -------------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `PromiseAlreadyResolved()` | `0x56b63537` | -| `OnlyInvoker()` | `0x74ed21f5` | -| `PromiseAlreadySetUp()` | `0x927c53d5` | -| `PromiseRevertFailed()` | `0x0175b9de` | -| `NotLatestPromise()` | `0x39ca95d3` | +| `OnlyInvoker()` | `0x74ed21f5` | +| `PromiseAlreadySetUp()` | `0x927c53d5` | +| `PromiseRevertFailed()` | `0x0175b9de` | +| `NotLatestPromise()` | `0x39ca95d3` | ## evmx/plugs/ContractFactoryPlug.sol -| Error | Signature | -| -------------------------------- | ------------ | -| `DeploymentFailed()` | `0x30116425` | +| Error | Signature | +|-------|-----------| +| `DeploymentFailed()` | `0x30116425` | | `ExecutionFailed(bytes32,bytes)` | `0xd255d8a3` | -| `information(bool,,bytes)` | `0x3a82a1f3` | +| `information(bool,,bytes)` | `0x3a82a1f3` | ## evmx/plugs/FeesPlug.sol -| Error | Signature | -| --------------------------------------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InsufficientTokenBalance(address,uint256,uint256)` | `0xebd6ced9` | -| `InvalidDepositAmount()` | `0xfe9ba5cd` | -| `TokenNotWhitelisted(address)` | `0xea3bff2e` | +| `InvalidDepositAmount()` | `0xfe9ba5cd` | +| `TokenNotWhitelisted(address)` | `0xea3bff2e` | ## evmx/watcher/RequestHandler.sol -| Error | Signature | -| ----------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InsufficientMaxFees()` | `0x0e5bc492` | ## protocol/Socket.sol -| Error | Signature | -| ----------------------------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `PayloadAlreadyExecuted(ExecutionStatus)` | `0xf4c54edd` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InsufficientMsgValue()` | `0x78f38f76` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InsufficientMsgValue()` | `0x78f38f76` | ## protocol/SocketConfig.sol -| Error | Signature | -| ------------------------------- | ------------ | -| `SwitchboardExists()` | `0x2dff8555` | +| Error | Signature | +|-------|-----------| +| `SwitchboardExists()` | `0x2dff8555` | | `SwitchboardExistsOrDisabled()` | `0x1c7d2487` | ## protocol/SocketFeeManager.sol -| Error | Signature | -| -------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InsufficientFees()` | `0x8d53e553` | -| `FeeTooLow()` | `0x732f9413` | +| `FeeTooLow()` | `0x732f9413` | ## protocol/SocketUtils.sol -| Error | Signature | -| -------------------- | ------------ | -| `OnlyOffChain()` | `0x9cbfe066` | +| Error | Signature | +|-------|-----------| +| `OnlyOffChain()` | `0x9cbfe066` | | `SimulationFailed()` | `0x2fbab3ac` | ## protocol/switchboard/FastSwitchboard.sol -| Error | Signature | -| ------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `AlreadyAttested()` | `0x35d90805` | | `WatcherNotFound()` | `0xa278e4ad` | ## utils/AccessControl.sol -| Error | Signature | -| ------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `NoPermit(bytes32)` | `0x962f6333` | +## utils/common/Converters.sol + +| Error | Signature | +|-------|-----------| +| `NotAnEvmAddress(bytes32)` | `0x33b960d0` | + ## utils/common/Errors.sol -| Error | Signature | -| --------------------------------------------- | ------------ | -| `ZeroAddress()` | `0xd92e233d` | -| `InvalidTransmitter()` | `0x58a70a0a` | -| `InvalidTokenAddress()` | `0x1eb00b06` | -| `InvalidSwitchboard()` | `0xf63c9e4d` | -| `SocketAlreadyInitialized()` | `0xc9500b00` | -| `NotSocket()` | `0xc59f8f7c` | -| `PlugNotFound()` | `0x5f1ac76a` | -| `ResolvingScheduleTooEarly()` | `0x207e8731` | -| `CallFailed()` | `0x3204506f` | -| `InvalidAppGateway()` | `0x82ded261` | -| `AppGatewayAlreadyCalled()` | `0xb224683f` | -| `InvalidCallerTriggered()` | `0x3292d247` | -| `InvalidPromise()` | `0x45f2d176` | -| `InvalidWatcherSignature()` | `0x5029f14f` | -| `NonceUsed()` | `0x1f6d5aef` | -| `AsyncModifierNotSet()` | `0xcae106f9` | -| `WatcherNotSet()` | `0x42d473a7` | -| `InvalidTarget()` | `0x82d5d76a` | -| `InvalidIndex()` | `0x63df8171` | -| `InvalidChainSlug()` | `0xbff6b106` | -| `InvalidPayloadSize()` | `0xfbdf7954` | -| `InvalidOnChainAddress()` | `0xb758c606` | -| `InvalidScheduleDelay()` | `0x9a993219` | -| `AuctionClosed()` | `0x36b6b46d` | -| `AuctionNotOpen()` | `0xf0460077` | -| `BidExceedsMaxFees()` | `0x4c923f3c` | -| `LowerBidAlreadyExists()` | `0xaaa1f709` | -| `RequestCountMismatch()` | `0x98bbcbff` | -| `InvalidAmount()` | `0x2c5211c6` | -| `InsufficientCreditsAvailable()` | `0xe61dc0aa` | -| `InsufficientBalance()` | `0xf4d678b8` | -| `InvalidCaller()` | `0x48f5c3ed` | -| `InvalidGateway()` | `0xfc9dfe85` | -| `RequestAlreadyCancelled()` | `0xc70f47d8` | -| `DeadlineNotPassedForOnChainRevert()` | `0x7006aa10` | -| `InvalidBid()` | `0xc6388ef7` | -| `MaxReAuctionCountReached()` | `0xf2b4388c` | -| `MaxMsgValueLimitExceeded()` | `0x97b4e8ce` | -| `OnlyWatcherAllowed()` | `0xdf7d227c` | -| `InvalidPrecompileData()` | `0x320062c0` | -| `InvalidCallType()` | `0x39d2eb55` | -| `NotRequestHandler()` | `0x8f8cba5b` | -| `NotInvoker()` | `0x8a6353d1` | -| `NotPromiseResolver()` | `0x86d876b2` | -| `RequestPayloadCountLimitExceeded()` | `0xcbef144b` | -| `InsufficientFees()` | `0x8d53e553` | -| `RequestAlreadySettled()` | `0x66fad465` | -| `NoWriteRequest()` | `0x9dcd3065` | -| `AlreadyAssigned()` | `0x9688dc51` | -| `OnlyAppGateway()` | `0xfec944ea` | +| Error | Signature | +|-------|-----------| +| `ZeroAddress()` | `0xd92e233d` | +| `InvalidTransmitter()` | `0x58a70a0a` | +| `InvalidTokenAddress()` | `0x1eb00b06` | +| `InvalidSwitchboard()` | `0xf63c9e4d` | +| `SocketAlreadyInitialized()` | `0xc9500b00` | +| `NotSocket()` | `0xc59f8f7c` | +| `PlugNotFound()` | `0x5f1ac76a` | +| `ResolvingScheduleTooEarly()` | `0x207e8731` | +| `CallFailed()` | `0x3204506f` | +| `InvalidAppGateway()` | `0x82ded261` | +| `AppGatewayAlreadyCalled()` | `0xb224683f` | +| `InvalidCallerTriggered()` | `0x3292d247` | +| `InvalidPromise()` | `0x45f2d176` | +| `InvalidWatcherSignature()` | `0x5029f14f` | +| `NonceUsed()` | `0x1f6d5aef` | +| `AsyncModifierNotSet()` | `0xcae106f9` | +| `WatcherNotSet()` | `0x42d473a7` | +| `InvalidTarget()` | `0x82d5d76a` | +| `InvalidIndex()` | `0x63df8171` | +| `InvalidChainSlug()` | `0xbff6b106` | +| `InvalidPayloadSize()` | `0xfbdf7954` | +| `InvalidOnChainAddress()` | `0xb758c606` | +| `InvalidScheduleDelay()` | `0x9a993219` | +| `AuctionClosed()` | `0x36b6b46d` | +| `AuctionNotOpen()` | `0xf0460077` | +| `BidExceedsMaxFees()` | `0x4c923f3c` | +| `LowerBidAlreadyExists()` | `0xaaa1f709` | +| `RequestCountMismatch()` | `0x98bbcbff` | +| `InvalidAmount()` | `0x2c5211c6` | +| `InsufficientCreditsAvailable()` | `0xe61dc0aa` | +| `InsufficientBalance()` | `0xf4d678b8` | +| `InvalidCaller()` | `0x48f5c3ed` | +| `InvalidGateway()` | `0xfc9dfe85` | +| `RequestAlreadyCancelled()` | `0xc70f47d8` | +| `DeadlineNotPassedForOnChainRevert()` | `0x7006aa10` | +| `InvalidBid()` | `0xc6388ef7` | +| `MaxReAuctionCountReached()` | `0xf2b4388c` | +| `MaxMsgValueLimitExceeded()` | `0x97b4e8ce` | +| `OnlyWatcherAllowed()` | `0xdf7d227c` | +| `InvalidPrecompileData()` | `0x320062c0` | +| `InvalidCallType()` | `0x39d2eb55` | +| `NotRequestHandler()` | `0x8f8cba5b` | +| `NotInvoker()` | `0x8a6353d1` | +| `NotPromiseResolver()` | `0x86d876b2` | +| `RequestPayloadCountLimitExceeded()` | `0xcbef144b` | +| `InsufficientFees()` | `0x8d53e553` | +| `RequestAlreadySettled()` | `0x66fad465` | +| `NoWriteRequest()` | `0x9dcd3065` | +| `AlreadyAssigned()` | `0x9688dc51` | +| `OnlyAppGateway()` | `0xfec944ea` | | `NewMaxFeesLowerThanCurrent(uint256,uint256)` | `0x1345dda1` | -| `InvalidContract()` | `0x6eefed20` | -| `InvalidData()` | `0x5cb045db` | -| `InvalidSignature()` | `0x8baa579f` | -| `DeadlinePassed()` | `0x70f65caa` | +| `InvalidContract()` | `0x6eefed20` | +| `InvalidData()` | `0x5cb045db` | +| `InvalidSignature()` | `0x8baa579f` | +| `DeadlinePassed()` | `0x70f65caa` | diff --git a/EventTopics.md b/EventTopics.md index c94cd569..2c5b9a2c 100644 --- a/EventTopics.md +++ b/EventTopics.md @@ -2,267 +2,268 @@ ## AuctionManager -| Event | Arguments | Topic | -| ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------- | -| `AuctionEndDelaySecondsSet` | `(auctionEndDelaySeconds: uint256)` | `0xf38f0d9dc8459cf5426728c250d115196a4c065ebc1a6c29da24764a8c0da722` | -| `AuctionEnded` | `(requestCount: uint40, winningBid: tuple)` | `0xede4ec1efc469fac10dcb4930f70be4cd21f3700ed61c91967c19a7cd7c0d86e` | -| `AuctionRestarted` | `(requestCount: uint40)` | `0x071867b21946ec4655665f0d4515d3757a5a52f144c762ecfdfb11e1da542b82` | -| `AuctionStarted` | `(requestCount: uint40)` | `0xcd040613cf8ef0cfcaa3af0d711783e827a275fc647c116b74595bf17cb9364f` | -| `BidPlaced` | `(requestCount: uint40, bid: tuple)` | `0x7f79485e4c9aeea5d4899bc6f7c63b22ac1f4c01d2d28c801e94732fee657b5d` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `MaxReAuctionCountSet` | `(maxReAuctionCount: uint256)` | `0x2f6fadde7ab8ab83d21ab10c3bc09dde179f8696d47c4176581facf0c6f96bbf` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `AuctionEndDelaySecondsSet` | `(auctionEndDelaySeconds: uint256)` | `0xf38f0d9dc8459cf5426728c250d115196a4c065ebc1a6c29da24764a8c0da722` | +| `AuctionEnded` | `(requestCount: uint40, winningBid: tuple)` | `0xede4ec1efc469fac10dcb4930f70be4cd21f3700ed61c91967c19a7cd7c0d86e` | +| `AuctionRestarted` | `(requestCount: uint40)` | `0x071867b21946ec4655665f0d4515d3757a5a52f144c762ecfdfb11e1da542b82` | +| `AuctionStarted` | `(requestCount: uint40)` | `0xcd040613cf8ef0cfcaa3af0d711783e827a275fc647c116b74595bf17cb9364f` | +| `BidPlaced` | `(requestCount: uint40, bid: tuple)` | `0x7f79485e4c9aeea5d4899bc6f7c63b22ac1f4c01d2d28c801e94732fee657b5d` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `MaxReAuctionCountSet` | `(maxReAuctionCount: uint256)` | `0x2f6fadde7ab8ab83d21ab10c3bc09dde179f8696d47c4176581facf0c6f96bbf` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## Socket -| Event | Arguments | Topic | -| ---------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `AppGatewayCallRequested` | `(triggerId: bytes32, appGatewayId: bytes32, switchboard: address, plug: address, overrides: bytes, payload: bytes)` | `0x5c88d65ab8ba22a57e582bd8ddfa9801cc0ca6be6cb3182baaedc705a612419e` | -| `ExecutionFailed` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x385334bc68a32c4d164625189adc7633e6074eb1b837fb4d11d768245151e4ce` | -| `ExecutionSuccess` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x324d63a433b21a12b90e79cd2ba736b2a5238be6165e03b750fa4a7d5193d5d9` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `PlugConnected` | `(plug: address, appGatewayId: bytes32, switchboard: address)` | `0x90c5924e27cfb6e3a688e729083681f30494ae2615ae14aac3bc807a0c436a88` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | -| `SocketFeeManagerUpdated` | `(oldSocketFeeManager: address, newSocketFeeManager: address)` | `0xdcb02e10d5220346a4638aa2826eaab1897306623bc40a427049e4ebd12255b4` | -| `SwitchboardAdded` | `(switchboard: address)` | `0x1595852923edfbbf906f09fc8523e4cfb022a194773c4d1509446b614146ee88` | -| `SwitchboardDisabled` | `(switchboard: address)` | `0x1b4ee41596b4e754e5665f01ed6122b356f7b36ea0a02030804fac7fa0fdddfc` | -| `SwitchboardEnabled` | `(switchboard: address)` | `0x6909a9974e3eec619bc479ba882d30a5ef1219b72ab1ce6a354516e91be317b8` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `AppGatewayCallRequested` | `(triggerId: bytes32, appGatewayId: bytes32, switchboard: bytes32, plug: bytes32, overrides: bytes, payload: bytes)` | `0xf83cee1d13047d8a1785495ac352da7c9ac5725641f76506899def19750c7696` | +| `ExecutionFailed` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x385334bc68a32c4d164625189adc7633e6074eb1b837fb4d11d768245151e4ce` | +| `ExecutionSuccess` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x324d63a433b21a12b90e79cd2ba736b2a5238be6165e03b750fa4a7d5193d5d9` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `PlugConnected` | `(plug: address, appGatewayId: bytes32, switchboard: address)` | `0x90c5924e27cfb6e3a688e729083681f30494ae2615ae14aac3bc807a0c436a88` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| `SocketFeeManagerUpdated` | `(oldSocketFeeManager: address, newSocketFeeManager: address)` | `0xdcb02e10d5220346a4638aa2826eaab1897306623bc40a427049e4ebd12255b4` | +| `SwitchboardAdded` | `(switchboard: address)` | `0x1595852923edfbbf906f09fc8523e4cfb022a194773c4d1509446b614146ee88` | +| `SwitchboardDisabled` | `(switchboard: address)` | `0x1b4ee41596b4e754e5665f01ed6122b356f7b36ea0a02030804fac7fa0fdddfc` | +| `SwitchboardEnabled` | `(switchboard: address)` | `0x6909a9974e3eec619bc479ba882d30a5ef1219b72ab1ce6a354516e91be317b8` | ## SocketBatcher -| Event | Arguments | Topic | -| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | ## SocketFeeManager -| Event | Arguments | Topic | -| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | -| `SocketFeesUpdated` | `(oldFees: uint256, newFees: uint256)` | `0xcbd4d756fb6198bbcc2e4013cce929f504ad46e9d97c543ef9a8dfea3e407053` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| `SocketFeesUpdated` | `(oldFees: uint256, newFees: uint256)` | `0xcbd4d756fb6198bbcc2e4013cce929f504ad46e9d97c543ef9a8dfea3e407053` | ## FeesManager -| Event | Arguments | Topic | -| ----------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `CreditsBlocked` | `(requestCount: uint40, consumeFrom: address, amount: uint256)` | `0xf037c15aef41440aa823cf1fdeaea332105d8b23d52557f6670189b5d76f1eed` | -| `CreditsTransferred` | `(from: address, to: address, amount: uint256)` | `0xed198cadddd93e734cbf04cb1c3226d9bafaeb504cedbd8ee36b830b0cb9e7a5` | -| `CreditsUnblocked` | `(requestCount: uint40, consumeFrom: address)` | `0x45db29ef2701319155cac058aa2f56ce1f73e0e238161d3db9f8c9a47655210d` | -| `CreditsUnblockedAndAssigned` | `(requestCount: uint40, consumeFrom: address, transmitter: address, amount: uint256)` | `0x38fd327622576a468e1b2818b00f50c8854703633ef8e583e1f31662888ffac2` | -| `CreditsUnwrapped` | `(consumeFrom: address, amount: uint256)` | `0xdcc9473b722b4c953617ab373840b365298a520bc7f20ce94fa7314f4a857774` | -| `CreditsWrapped` | `(consumeFrom: address, amount: uint256)` | `0x40246503613721eb4acf4020c6c56b6a16e5d08713316db0bea5210e8819c592` | -| `Deposited` | `(chainSlug: uint32, token: address, depositTo: address, creditAmount: uint256, nativeAmount: uint256)` | `0x72aedd284699bbd7a987e6942b824cfd6c627e354cb5a0760ac5768acd473f4a` | -| `FeesPlugSet` | `(chainSlug: uint32, feesPlug: address)` | `0xa8c4be32b96cca895f1f0f4684e6b377b2c4513bc35eb57a13afb6b5efb2c0ce` | -| `FeesPoolSet` | `(feesPool: address)` | `0xd07af3fd70b48ab3c077a8d45c3a288498d905d0e3d1e65bc171f6c2e890d8ef` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `WithdrawFailed` | `(payloadId: bytes32)` | `0xea147eb2109f71b4bda9e57528ba08b84821087a31cb43a7851dc6ff743d9be7` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `CreditsBlocked` | `(requestCount: uint40, consumeFrom: address, amount: uint256)` | `0xf037c15aef41440aa823cf1fdeaea332105d8b23d52557f6670189b5d76f1eed` | +| `CreditsTransferred` | `(from: address, to: address, amount: uint256)` | `0xed198cadddd93e734cbf04cb1c3226d9bafaeb504cedbd8ee36b830b0cb9e7a5` | +| `CreditsUnblocked` | `(requestCount: uint40, consumeFrom: address)` | `0x45db29ef2701319155cac058aa2f56ce1f73e0e238161d3db9f8c9a47655210d` | +| `CreditsUnblockedAndAssigned` | `(requestCount: uint40, consumeFrom: address, transmitter: address, amount: uint256)` | `0x38fd327622576a468e1b2818b00f50c8854703633ef8e583e1f31662888ffac2` | +| `CreditsUnwrapped` | `(consumeFrom: address, amount: uint256)` | `0xdcc9473b722b4c953617ab373840b365298a520bc7f20ce94fa7314f4a857774` | +| `CreditsWrapped` | `(consumeFrom: address, amount: uint256)` | `0x40246503613721eb4acf4020c6c56b6a16e5d08713316db0bea5210e8819c592` | +| `Deposited` | `(chainSlug: uint32, token: address, depositTo: address, creditAmount: uint256, nativeAmount: uint256)` | `0x72aedd284699bbd7a987e6942b824cfd6c627e354cb5a0760ac5768acd473f4a` | +| `FeesPlugSet` | `(chainSlug: uint32, feesPlug: bytes32)` | `0x677a00737c8099aa9e6c554104ca7941deb59125335cfb3d0d9f604f178db59c` | +| `FeesPoolSet` | `(feesPool: address)` | `0xd07af3fd70b48ab3c077a8d45c3a288498d905d0e3d1e65bc171f6c2e890d8ef` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `WithdrawFailed` | `(payloadId: bytes32)` | `0xea147eb2109f71b4bda9e57528ba08b84821087a31cb43a7851dc6ff743d9be7` | ## FeesPool -| Event | Arguments | Topic | -| ---------------------------- | ----------------------------------------------- | -------------------------------------------------------------------- | -| `NativeDeposited` | `(from: address, amount: uint256)` | `0xb5d7700fb0cf415158b8db7cc7c39f0eab16a825c92e221404b4c8bb099b4bbb` | -| `NativeWithdrawn` | `(success: bool, to: address, amount: uint256)` | `0xa81f1c8490022ee829d2e1a231053f5dbecad46caee71f6ea38a9db663a3f12b` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `NativeDeposited` | `(from: address, amount: uint256)` | `0xb5d7700fb0cf415158b8db7cc7c39f0eab16a825c92e221404b4c8bb099b4bbb` | +| `NativeWithdrawn` | `(success: bool, to: address, amount: uint256)` | `0xa81f1c8490022ee829d2e1a231053f5dbecad46caee71f6ea38a9db663a3f12b` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## AddressResolver -| Event | Arguments | Topic | -| ------------------------------ | --------------------------------------------------- | -------------------------------------------------------------------- | -| `AsyncDeployerUpdated` | `(asyncDeployer_: address)` | `0x4df9cdd01544e8f6b0326650bc0b55611f47ce5ba2faa522d21fb675e9fc1f73` | -| `ContractAddressUpdated` | `(contractId_: bytes32, contractAddress_: address)` | `0xdf5ec2c15e11ce657bb21bc09c0b5ba95e315b4dba9934c6e311f47559babf28` | -| `DefaultAuctionManagerUpdated` | `(defaultAuctionManager_: address)` | `0x60f296739208a505ead7fb622df0f76b7791b824481b120a2300bdaf85e3e3d6` | -| `DeployForwarderUpdated` | `(deployForwarder_: address)` | `0x237b9bc9fef7508a02ca9ccca81f6965e500064a58024cae1218035da865fd2b` | -| `FeesManagerUpdated` | `(feesManager_: address)` | `0x94e67aa1341a65767dfde81e62fd265bfbade1f5744bfd3cd73f99a6eca0572a` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `WatcherUpdated` | `(watcher_: address)` | `0xc13081d38d92b454cdb6ca20bbc65c12fa43a7a14a1529204ced5b6350052bb0` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `AsyncDeployerUpdated` | `(asyncDeployer_: address)` | `0x4df9cdd01544e8f6b0326650bc0b55611f47ce5ba2faa522d21fb675e9fc1f73` | +| `ContractAddressUpdated` | `(contractId_: bytes32, contractAddress_: address)` | `0xdf5ec2c15e11ce657bb21bc09c0b5ba95e315b4dba9934c6e311f47559babf28` | +| `DefaultAuctionManagerUpdated` | `(defaultAuctionManager_: address)` | `0x60f296739208a505ead7fb622df0f76b7791b824481b120a2300bdaf85e3e3d6` | +| `DeployForwarderUpdated` | `(deployForwarder_: address)` | `0x237b9bc9fef7508a02ca9ccca81f6965e500064a58024cae1218035da865fd2b` | +| `FeesManagerUpdated` | `(feesManager_: address)` | `0x94e67aa1341a65767dfde81e62fd265bfbade1f5744bfd3cd73f99a6eca0572a` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `WatcherUpdated` | `(watcher_: address)` | `0xc13081d38d92b454cdb6ca20bbc65c12fa43a7a14a1529204ced5b6350052bb0` | ## AsyncDeployer -| Event | Arguments | Topic | -| ---------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------- | -| `AsyncPromiseDeployed` | `(newAsyncPromise: address, salt: bytes32)` | `0xb6c5491cf83e09749b1a4dd6a9f07b0e925fcb0a915ac8c2b40e8ab28191c270` | -| `ForwarderDeployed` | `(newForwarder: address, salt: bytes32)` | `0x4dbbecb9cf9c8b93da9743a2b48ea52efe68d69230ab1c1b711891d9d223b29f` | -| `ImplementationUpdated` | `(contractName: string, newImplementation: address)` | `0xa1e41aa2c2f3f20d9b63ac06b634d2788768d6034f3d9192cdf7d07374bb16f4` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `AsyncPromiseDeployed` | `(newAsyncPromise: address, salt: bytes32)` | `0xb6c5491cf83e09749b1a4dd6a9f07b0e925fcb0a915ac8c2b40e8ab28191c270` | +| `ForwarderDeployed` | `(newForwarder: address, salt: bytes32)` | `0x4dbbecb9cf9c8b93da9743a2b48ea52efe68d69230ab1c1b711891d9d223b29f` | +| `ImplementationUpdated` | `(contractName: string, newImplementation: address)` | `0xa1e41aa2c2f3f20d9b63ac06b634d2788768d6034f3d9192cdf7d07374bb16f4` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | ## AsyncPromise -| Event | Arguments | Topic | -| ------------- | ------------------- | -------------------------------------------------------------------- | +| Event | Arguments | Topic | +| ----- | --------- | ----- | | `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | ## DeployForwarder -| Event | Arguments | Topic | -| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | ## Forwarder -| Event | Arguments | Topic | -| ------------- | ------------------- | -------------------------------------------------------------------- | +| Event | Arguments | Topic | +| ----- | --------- | ----- | | `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | ## ProxyFactory -| Event | Arguments | Topic | -| -------------- | ----------------------------------------------------------- | -------------------------------------------------------------------- | -| `AdminChanged` | `(proxy: address, admin: address)` | `0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f` | -| `Deployed` | `(proxy: address, implementation: address, admin: address)` | `0xc95935a66d15e0da5e412aca0ad27ae891d20b2fb91cf3994b6a3bf2b8178082` | -| `Upgraded` | `(proxy: address, implementation: address)` | `0x5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c7` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `AdminChanged` | `(proxy: address, admin: address)` | `0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f` | +| `Deployed` | `(proxy: address, implementation: address, admin: address)` | `0xc95935a66d15e0da5e412aca0ad27ae891d20b2fb91cf3994b6a3bf2b8178082` | +| `Upgraded` | `(proxy: address, implementation: address)` | `0x5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c7` | ## TestUSDC -| Event | Arguments | Topic | -| ---------- | ----------------------------------------------------- | -------------------------------------------------------------------- | +| Event | Arguments | Topic | +| ----- | --------- | ----- | | `Approval` | `(owner: address, spender: address, amount: uint256)` | `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` | -| `Transfer` | `(from: address, to: address, amount: uint256)` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | +| `Transfer` | `(from: address, to: address, amount: uint256)` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | ## ContractFactoryPlug -| Event | Arguments | Topic | -| ---------------------------- | --------------------------------------------------- | -------------------------------------------------------------------- | -| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | -| `Deployed` | `(addr: address, salt: bytes32, returnData: bytes)` | `0x1246c6f8fd9f4abc542c7c8c8f793cfcde6b67aed1976a38aa134fc24af2dfe3` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | +| `Deployed` | `(addr: address, salt: bytes32, returnData: bytes)` | `0x1246c6f8fd9f4abc542c7c8c8f793cfcde6b67aed1976a38aa134fc24af2dfe3` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## FeesPlug -| Event | Arguments | Topic | -| ---------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | -| `FeesDeposited` | `(token: address, receiver: address, creditAmount: uint256, nativeAmount: uint256)` | `0xeb4e1b24b7fe377de69f80f7380bda5ba4b43176c6a4d300a3be9009c49f4228` | -| `FeesWithdrawn` | `(token: address, receiver: address, amount: uint256)` | `0x5e110f8bc8a20b65dcc87f224bdf1cc039346e267118bae2739847f07321ffa8` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | -| `TokenRemovedFromWhitelist` | `(token: address)` | `0xdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d917` | -| `TokenWhitelisted` | `(token: address)` | `0x6a65f90b1a644d2faac467a21e07e50e3f8fa5846e26231d30ae79a417d3d262` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | +| `FeesDeposited` | `(token: address, receiver: address, creditAmount: uint256, nativeAmount: uint256)` | `0xeb4e1b24b7fe377de69f80f7380bda5ba4b43176c6a4d300a3be9009c49f4228` | +| `FeesWithdrawn` | `(token: address, receiver: address, amount: uint256)` | `0x5e110f8bc8a20b65dcc87f224bdf1cc039346e267118bae2739847f07321ffa8` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| `TokenRemovedFromWhitelist` | `(token: address)` | `0xdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d917` | +| `TokenWhitelisted` | `(token: address)` | `0x6a65f90b1a644d2faac467a21e07e50e3f8fa5846e26231d30ae79a417d3d262` | ## Configurations -| Event | Arguments | Topic | -| ---------------------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------- | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `IsValidPlugSet` | `(appGateway: address, chainSlug: uint32, plug: address, isValid: bool)` | `0x61cccc7387868fc741379c7acd9dd346e0ca2e5c067dc5b156fbbc55b1c2fcf5` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `PlugAdded` | `(appGatewayId: bytes32, chainSlug: uint32, plug: address)` | `0x7b3e14230a721c4737d275f9a63b92c44cb657bcfddbe6fe9b4d9cd9bd8d4a95` | -| `SocketSet` | `(chainSlug: uint32, socket: address)` | `0x5b13a5470e66a2ec5e9b32af5f9e23fe304864892918c60fffd22509ca73ac97` | -| `SwitchboardSet` | `(chainSlug: uint32, sbType: bytes32, switchboard: address)` | `0x6273f161f4a795e66ef3585d9b4442ef3796b32337157fdfb420b5281e4cf2e3` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `IsValidPlugSet` | `(appGateway: address, chainSlug: uint32, plug: bytes32, isValid: bool)` | `0xd7a90efd60960a8435ef282822190655f6bd2ffa14bb350dc23d6f6956056d7e` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `PlugAdded` | `(appGatewayId: bytes32, chainSlug: uint32, plug: bytes32)` | `0x3734a2406c5c2f2556c82a0819c51e42a135dd102465cc9856594481ea2f1637` | +| `SocketSet` | `(chainSlug: uint32, socket: bytes32)` | `0x3200bf6ad2ab31b9220ed9d2f83089d7a1332f55aaa3825c57510743a315165b` | +| `SwitchboardSet` | `(chainSlug: uint32, sbType: bytes32, switchboard: bytes32)` | `0xcdfbfa261040f4dffb03c7d9493f74b575f2ae533bb43fd7b5d5b24ac9d804f4` | ## PromiseResolver -| Event | Arguments | Topic | -| -------------------- | ------------------------------------------------ | -------------------------------------------------------------------- | -| `MarkedRevert` | `(payloadId: bytes32, isRevertingOnchain: bool)` | `0xcf1fd844cb4d32cbebb5ca6ce4ac834fe98da3ddac44deb77fffd22ad933824c` | -| `PromiseNotResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0xbcf0d0c678940566e9e64f0c871439395bd5fb5c39bca3547b126fe6ee467937` | -| `PromiseResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0x1b1b5810494fb3e17f7c46547e6e67cd6ad3e6001ea6fb7d12ea0241ba13c4ba` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `MarkedRevert` | `(payloadId: bytes32, isRevertingOnchain: bool)` | `0xcf1fd844cb4d32cbebb5ca6ce4ac834fe98da3ddac44deb77fffd22ad933824c` | +| `PromiseNotResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0xbcf0d0c678940566e9e64f0c871439395bd5fb5c39bca3547b126fe6ee467937` | +| `PromiseResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0x1b1b5810494fb3e17f7c46547e6e67cd6ad3e6001ea6fb7d12ea0241ba13c4ba` | ## RequestHandler -| Event | Arguments | Topic | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `FeesIncreased` | `(requestCount: uint40, newMaxFees: uint256)` | `0xf258fca4e49b803ee2a4c2e33b6fcf18bc3982df21f111c00677025bf1ccbb6a` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RequestCancelled` | `(requestCount: uint40)` | `0xff191657769be72fc08def44c645014c60d18cb24b9ca05c9a33406a28253245` | -| `RequestCompletedWithErrors` | `(requestCount: uint40)` | `0xd8d9915dc14b5a29b66cb263e1ea1e99e60418fc21d97f0fbf09cae1281291e2` | -| `RequestSettled` | `(requestCount: uint40, winner: address)` | `0x1234f98acbe1548b214f4528461a5377f1e2349569c04caa59325e488e7d2aa4` | -| `RequestSubmitted` | `(hasWrite: bool, requestCount: uint40, totalEstimatedWatcherFees: uint256, requestParams: tuple, payloadParamsArray: tuple[])` | `0x762bac43d5d7689b8911c5654a9d5550804373cead33bc98282067e6166e518f` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `FeesIncreased` | `(requestCount: uint40, newMaxFees: uint256)` | `0xf258fca4e49b803ee2a4c2e33b6fcf18bc3982df21f111c00677025bf1ccbb6a` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RequestCancelled` | `(requestCount: uint40)` | `0xff191657769be72fc08def44c645014c60d18cb24b9ca05c9a33406a28253245` | +| `RequestCompletedWithErrors` | `(requestCount: uint40)` | `0xd8d9915dc14b5a29b66cb263e1ea1e99e60418fc21d97f0fbf09cae1281291e2` | +| `RequestSettled` | `(requestCount: uint40, winner: address)` | `0x1234f98acbe1548b214f4528461a5377f1e2349569c04caa59325e488e7d2aa4` | +| `RequestSubmitted` | `(hasWrite: bool, requestCount: uint40, totalEstimatedWatcherFees: uint256, requestParams: tuple, payloadParamsArray: tuple[])` | `0x762bac43d5d7689b8911c5654a9d5550804373cead33bc98282067e6166e518f` | ## Watcher -| Event | Arguments | Topic | -| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `TriggerFailed` | `(triggerId: bytes32)` | `0x4386783bb0f7cad4ba12f033dbec03dc3441e7757a122f3097a7a4d945c98040` | -| `TriggerFeesSet` | `(triggerFees: uint256)` | `0x7df3967b7c8727af5ac0ee9825d88aafeb899d769bc428b91f8967fa0b623084` | -| `TriggerSucceeded` | `(triggerId: bytes32)` | `0x92d20fbcbf31370b8218e10ed00c5aad0e689022da30a08905ba5ced053219eb` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `TriggerFailed` | `(triggerId: bytes32)` | `0x4386783bb0f7cad4ba12f033dbec03dc3441e7757a122f3097a7a4d945c98040` | +| `TriggerFeesSet` | `(triggerFees: uint256)` | `0x7df3967b7c8727af5ac0ee9825d88aafeb899d769bc428b91f8967fa0b623084` | +| `TriggerSucceeded` | `(triggerId: bytes32)` | `0x92d20fbcbf31370b8218e10ed00c5aad0e689022da30a08905ba5ced053219eb` | ## FastSwitchboard -| Event | Arguments | Topic | -| ---------------------------- | ----------------------------------------- | -------------------------------------------------------------------- | -| `Attested` | `(payloadId_: bytes32, watcher: address)` | `0x3d83c7bc55c269e0bc853ddc0d7b9fca30216ecc43779acb4e36b7e0ad1c71e4` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `Attested` | `(payloadId_: bytes32, watcher: address)` | `0x3d83c7bc55c269e0bc853ddc0d7b9fca30216ecc43779acb4e36b7e0ad1c71e4` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## ReadPrecompile -| Event | Arguments | Topic | -| --------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | -| `ReadFeesSet` | `(readFees: uint256)` | `0xc674cb6dde3a59f84dbf226832e606ffc54ac8a169e1568fc834c7813010f926` | -| `ReadRequested` | `(transaction: tuple, readAtBlockNumber: uint256, payloadId: bytes32)` | `0x42d9c65d4f6e45462ae6206adb3e388e046b7daa1dc8699d9380cac72ff5db0b` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | +| `ReadFeesSet` | `(readFees: uint256)` | `0xc674cb6dde3a59f84dbf226832e606ffc54ac8a169e1568fc834c7813010f926` | +| `ReadRequested` | `(transaction: tuple, readAtBlockNumber: uint256, payloadId: bytes32)` | `0xbcad63ac625c0f3cb23b62b126567728fcf5950ca8e559150e764eced73e794a` | ## SchedulePrecompile -| Event | Arguments | Topic | -| ------------------------------ | ---------------------------------------------------------------- | -------------------------------------------------------------------- | -| `ExpiryTimeSet` | `(expiryTime_: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | -| `MaxScheduleDelayInSecondsSet` | `(maxScheduleDelayInSeconds_: uint256)` | `0xfd5e4f0e96753ffb08a583390c2f151c51001d8e560625ab93b7fa7b4dac6d75` | -| `ScheduleCallbackFeesSet` | `(scheduleCallbackFees_: uint256)` | `0x82a2f41efc81ce7bfabc0affda7354dae42a3d09bd74a6196e8904b223138a52` | -| `ScheduleFeesPerSecondSet` | `(scheduleFeesPerSecond_: uint256)` | `0x7901a21229f6d2543d8676f53e21214d15f42513e7d46e0dcb510357222bdc7c` | -| `ScheduleRequested` | `(payloadId: bytes32, executeAfter: uint256, deadline: uint256)` | `0xd099d3e3d0f0e2c9c40e0066affeea125aab71d763b7ab0a279ccec3dff70b64` | -| `ScheduleResolved` | `(payloadId: bytes32)` | `0x925dc6c3ebffa07cac89d6e9675f1a5d04e045f2ed9a4fa442665935cb73e26b` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `ExpiryTimeSet` | `(expiryTime_: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | +| `MaxScheduleDelayInSecondsSet` | `(maxScheduleDelayInSeconds_: uint256)` | `0xfd5e4f0e96753ffb08a583390c2f151c51001d8e560625ab93b7fa7b4dac6d75` | +| `ScheduleCallbackFeesSet` | `(scheduleCallbackFees_: uint256)` | `0x82a2f41efc81ce7bfabc0affda7354dae42a3d09bd74a6196e8904b223138a52` | +| `ScheduleFeesPerSecondSet` | `(scheduleFeesPerSecond_: uint256)` | `0x7901a21229f6d2543d8676f53e21214d15f42513e7d46e0dcb510357222bdc7c` | +| `ScheduleRequested` | `(payloadId: bytes32, executeAfter: uint256, deadline: uint256)` | `0xd099d3e3d0f0e2c9c40e0066affeea125aab71d763b7ab0a279ccec3dff70b64` | +| `ScheduleResolved` | `(payloadId: bytes32)` | `0x925dc6c3ebffa07cac89d6e9675f1a5d04e045f2ed9a4fa442665935cb73e26b` | ## WritePrecompile -| Event | Arguments | Topic | -| ------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `ChainMaxMsgValueLimitsUpdated` | `(chainSlug: uint32, maxMsgValueLimit: uint256)` | `0x439087d094fe7dacbba3f0c67032041952d8bd58a891e15af10ced28fed0eb91` | -| `ContractFactoryPlugSet` | `(chainSlug: uint32, contractFactoryPlug: address)` | `0x85bfa413b9e5e225278f51af2ac872988e0a9374263b118d963c50945ea888bb` | -| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | -| `FeesSet` | `(writeFees: uint256)` | `0x3346af6da1932164d501f2ec28f8c5d686db5828a36b77f2da4332d89184fe7b` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `WriteProofRequested` | `(transmitter: address, digest: bytes32, prevBatchDigestHash: bytes32, deadline: uint256, payloadParams: tuple)` | `0x3247df5b4e8df4ac60c2c1f803b404ee16bc9d84a6b7649865464a8a397b9acb` | -| `WriteProofUploaded` | `(payloadId: bytes32, proof: bytes)` | `0xd8fe3a99a88c9630360418877afdf14e3e79f0f25fee162aeb230633ea740156` | +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `ChainMaxMsgValueLimitsUpdated` | `(chainSlug: uint32, maxMsgValueLimit: uint256)` | `0x439087d094fe7dacbba3f0c67032041952d8bd58a891e15af10ced28fed0eb91` | +| `ContractFactoryPlugSet` | `(chainSlug: uint32, contractFactoryPlug: bytes32)` | `0xfad552a6feb82bef23201b8dce04b2460bff41b00f26fef3d791572cfdab49c2` | +| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | +| `FeesSet` | `(writeFees: uint256)` | `0x3346af6da1932164d501f2ec28f8c5d686db5828a36b77f2da4332d89184fe7b` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `WriteProofRequested` | `(transmitter: address, digest: bytes32, prevBatchDigestHash: bytes32, deadline: uint256, payloadParams: tuple)` | `0x3247df5b4e8df4ac60c2c1f803b404ee16bc9d84a6b7649865464a8a397b9acb` | +| `WriteProofUploaded` | `(payloadId: bytes32, proof: bytes)` | `0xd8fe3a99a88c9630360418877afdf14e3e79f0f25fee162aeb230633ea740156` | + diff --git a/FunctionSignatures.md b/FunctionSignatures.md index c5445dae..e5d5ecd3 100644 --- a/FunctionSignatures.md +++ b/FunctionSignatures.md @@ -2,560 +2,561 @@ ## AuctionManager -| Function | Signature | -| ---------------------------- | ------------ | -| `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `auctionEndDelaySeconds` | `0x9087dfdb` | -| `auctionManager` | `0xb0192f9a` | -| `auctionStatus` | `0xd7d5fbf6` | -| `bid` | `0xfcdf49c2` | -| `bidTimeout` | `0x94090d0b` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `consumeFrom` | `0x40dd78be` | -| `creationCodeWithArgs` | `0xc126dcc4` | -| `deployForwarder__` | `0xd4e3b034` | -| `endAuction` | `0x1212e653` | -| `evmxSlug` | `0x8bae77c2` | -| `expireBid` | `0x1dd5022c` | -| `feesManager__` | `0x70568b58` | -| `forwarderAddresses` | `0x5390fdcb` | -| `getOnChainAddress` | `0xb6abffd7` | -| `getOverrideParams` | `0x54f0a866` | -| `grantRole` | `0x2f2ff15d` | -| `handleRevert` | `0x44792f25` | -| `hasRole` | `0x91d14854` | -| `initialize` | `0x86891c9b` | -| `initializeOnChain` | `0x86f01739` | -| `isAsyncModifierSet` | `0xb69e0c4a` | -| `isValidPromise` | `0xb690b962` | -| `maxFees` | `0xe83e34b1` | -| `maxReAuctionCount` | `0xc367b376` | -| `onCompleteData` | `0xb52fa926` | -| `onRequestComplete` | `0x5ed1f959` | -| `overrideParams` | `0xec5490fe` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `addressResolver__` | `0x6a750469` | +| `asyncDeployer__` | `0x2a39e801` | +| `auctionEndDelaySeconds` | `0x9087dfdb` | +| `auctionManager` | `0xb0192f9a` | +| `auctionStatus` | `0xd7d5fbf6` | +| `bid` | `0xfcdf49c2` | +| `bidTimeout` | `0x94090d0b` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `consumeFrom` | `0x40dd78be` | +| `creationCodeWithArgs` | `0xc126dcc4` | +| `deployForwarder__` | `0xd4e3b034` | +| `endAuction` | `0x1212e653` | +| `evmxSlug` | `0x8bae77c2` | +| `expireBid` | `0x1dd5022c` | +| `feesManager__` | `0x70568b58` | +| `forwarderAddresses` | `0x5390fdcb` | +| `getOnChainAddress` | `0xb6abffd7` | +| `getOverrideParams` | `0x54f0a866` | +| `grantRole` | `0x2f2ff15d` | +| `handleRevert` | `0x44792f25` | +| `hasRole` | `0x91d14854` | +| `initialize` | `0x86891c9b` | +| `initializeOnChain` | `0x86f01739` | +| `isAsyncModifierSet` | `0xb69e0c4a` | +| `isValidPromise` | `0xb690b962` | +| `maxFees` | `0xe83e34b1` | +| `maxReAuctionCount` | `0xc367b376` | +| `onCompleteData` | `0xb52fa926` | +| `onRequestComplete` | `0x5ed1f959` | +| `overrideParams` | `0xec5490fe` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `reAuctionCount` | `0x9b4b22d3` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `sbType` | `0x745de344` | -| `setAddress` | `0x85bf312c` | -| `setAuctionEndDelaySeconds` | `0x88606b1a` | -| `setMaxReAuctionCount` | `0x64c71403` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | -| `winningBids` | `0x9133f232` | +| `reAuctionCount` | `0x9b4b22d3` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `sbType` | `0x745de344` | +| `setAddress` | `0x85bf312c` | +| `setAuctionEndDelaySeconds` | `0x88606b1a` | +| `setMaxReAuctionCount` | `0x64c71403` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | +| `winningBids` | `0x9133f232` | ## Socket -| Function | Signature | -| ---------------------------- | ------------ | -| `OFF_CHAIN_CALLER` | `0xcb2cb4f6` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `chainSlug` | `0xb349ba65` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `connect` | `0xb3bde1aa` | -| `disableSwitchboard` | `0xe545b261` | -| `enableSwitchboard` | `0xf97a498a` | -| `execute` | `0xafa8b480` | -| `getPlugConfig` | `0xf9778ee0` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `isValidSwitchboard` | `0xb2d67675` | -| `maxCopyBytes` | `0x212249d4` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `OFF_CHAIN_CALLER` | `0xcb2cb4f6` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `chainSlug` | `0xb349ba65` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `connect` | `0xb3bde1aa` | +| `disableSwitchboard` | `0xe545b261` | +| `enableSwitchboard` | `0xf97a498a` | +| `execute` | `0xafa8b480` | +| `getPlugConfig` | `0xf9778ee0` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `isValidSwitchboard` | `0xb2d67675` | +| `maxCopyBytes` | `0x212249d4` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payloadExecuted` | `0x3eaeac3d` | -| `payloadIdToDigest` | `0x7c8552b2` | -| `registerSwitchboard` | `0x74f5b1fc` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `setMaxCopyBytes` | `0x4fc7d6e9` | -| `setSocketFeeManager` | `0x25bd97e5` | -| `simulate` | `0x91bf8275` | -| `socketFeeManager` | `0xde5b8838` | -| `transferOwnership` | `0xf2fde38b` | -| `triggerCounter` | `0x8b0021de` | -| `version` | `0x54fd4d50` | +| `payloadExecuted` | `0x3eaeac3d` | +| `payloadIdToDigest` | `0x7c8552b2` | +| `registerSwitchboard` | `0x74f5b1fc` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `setMaxCopyBytes` | `0x4fc7d6e9` | +| `setSocketFeeManager` | `0x25bd97e5` | +| `simulate` | `0x91bf8275` | +| `socketFeeManager` | `0xde5b8838` | +| `transferOwnership` | `0xf2fde38b` | +| `triggerCounter` | `0x8b0021de` | +| `version` | `0x54fd4d50` | ## SocketBatcher -| Function | Signature | -| ---------------------------- | ------------ | -| `attestAndExecute` | `0x66c7748a` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `attestAndExecute` | `0x66c7748a` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `socket__` | `0xc6a261d2` | -| `transferOwnership` | `0xf2fde38b` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `socket__` | `0xc6a261d2` | +| `transferOwnership` | `0xf2fde38b` | ## SocketFeeManager -| Function | Signature | -| ---------------------------- | ------------ | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `getMinSocketFees` | `0xd383b688` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `getMinSocketFees` | `0xd383b688` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payAndCheckFees` | `0xd9d29ae3` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `setSocketFees` | `0x47a406f6` | -| `socketFees` | `0xab1b33a8` | -| `transferOwnership` | `0xf2fde38b` | +| `payAndCheckFees` | `0xd9d29ae3` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `setSocketFees` | `0x47a406f6` | +| `socketFees` | `0xab1b33a8` | +| `transferOwnership` | `0xf2fde38b` | ## FeesManager -| Function | Signature | -| -------------------------------- | ------------ | -| `addressResolver__` | `0x6a750469` | -| `approveAppGateway` | `0xa3b53d8b` | +| Function | Signature | +| -------- | --------- | +| `addressResolver__` | `0x6a750469` | +| `approveAppGateway` | `0xa3b53d8b` | | `approveAppGatewayWithSignature` | `0x94b649ec` | -| `approveAppGateways` | `0x86d23ab2` | -| `asyncDeployer__` | `0x2a39e801` | -| `blockCredits` | `0x9e434307` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deployForwarder__` | `0xd4e3b034` | -| `deposit` | `0x5671d329` | -| `evmxSlug` | `0x8bae77c2` | -| `feesManager__` | `0x70568b58` | -| `feesPlugs` | `0x23f5ee8a` | -| `feesPool` | `0x6b259690` | -| `getAvailableCredits` | `0xb065a8e5` | -| `handleRevert` | `0x44792f25` | -| `initialize` | `0xbf2c8539` | -| `isApproved` | `0xa389783e` | -| `isCreditSpendable` | `0x4f8990fd` | -| `isNonceUsed` | `0xcab7e8eb` | -| `onRequestComplete` | `0x5ed1f959` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestBlockedCredits` | `0xb62d25ac` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `sbType` | `0x745de344` | -| `setFeesPlug` | `0xeab75f36` | -| `setFeesPool` | `0xd6684588` | -| `tokenOnChainBalances` | `0x3b27866d` | -| `transferCredits` | `0xf1686c89` | -| `transferOwnership` | `0xf2fde38b` | -| `unblockAndAssignCredits` | `0x01958181` | -| `unblockCredits` | `0xa0b32314` | -| `unwrap` | `0x7647691d` | -| `userCredits` | `0x20babb92` | -| `watcher__` | `0x300bb063` | -| `withdrawCredits` | `0xcfc6dbd9` | -| `wrap` | `0x023276f0` | +| `approveAppGateways` | `0x86d23ab2` | +| `asyncDeployer__` | `0x2a39e801` | +| `blockCredits` | `0x9e434307` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deployForwarder__` | `0xd4e3b034` | +| `deposit` | `0x5671d329` | +| `evmxSlug` | `0x8bae77c2` | +| `feesManager__` | `0x70568b58` | +| `feesPlugs` | `0x23f5ee8a` | +| `feesPool` | `0x6b259690` | +| `getAvailableCredits` | `0xb065a8e5` | +| `handleRevert` | `0x44792f25` | +| `initialize` | `0xbf2c8539` | +| `isApproved` | `0xa389783e` | +| `isCreditSpendable` | `0x4f8990fd` | +| `isNonceUsed` | `0xcab7e8eb` | +| `onRequestComplete` | `0x5ed1f959` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `renounceOwnership` | `0x715018a6` | +| `requestBlockedCredits` | `0xb62d25ac` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `sbType` | `0x745de344` | +| `setFeesPlug` | `0xd6a9a8b7` | +| `setFeesPool` | `0xd6684588` | +| `tokenOnChainBalances` | `0x3b27866d` | +| `transferCredits` | `0xf1686c89` | +| `transferOwnership` | `0xf2fde38b` | +| `unblockAndAssignCredits` | `0x01958181` | +| `unblockCredits` | `0xa0b32314` | +| `unwrap` | `0x7647691d` | +| `userCredits` | `0x20babb92` | +| `watcher__` | `0x300bb063` | +| `withdrawCredits` | `0xcfc6dbd9` | +| `wrap` | `0x023276f0` | ## FeesPool -| Function | Signature | -| ---------------------------- | ------------ | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `getBalance` | `0x12065fe0` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `getBalance` | `0x12065fe0` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `revokeRole` | `0xd547741f` | -| `transferOwnership` | `0xf2fde38b` | -| `withdraw` | `0xf3fef3a3` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `revokeRole` | `0xd547741f` | +| `transferOwnership` | `0xf2fde38b` | +| `withdraw` | `0xf3fef3a3` | ## AddressResolver -| Function | Signature | -| ---------------------------- | ------------ | -| `asyncDeployer__` | `0x2a39e801` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `contractAddresses` | `0xf689e892` | -| `defaultAuctionManager` | `0x8f27cdc6` | -| `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `initialize` | `0xc4d66de8` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `asyncDeployer__` | `0x2a39e801` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `contractAddresses` | `0xf689e892` | +| `defaultAuctionManager` | `0x8f27cdc6` | +| `deployForwarder__` | `0xd4e3b034` | +| `feesManager__` | `0x70568b58` | +| `initialize` | `0xc4d66de8` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `setAsyncDeployer` | `0xcb0ffff8` | -| `setContractAddress` | `0xe001f841` | -| `setDefaultAuctionManager` | `0xede8b4b5` | -| `setDeployForwarder` | `0xaeaee8a6` | -| `setFeesManager` | `0x1c89382a` | -| `setWatcher` | `0x24f48bc5` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `setAsyncDeployer` | `0xcb0ffff8` | +| `setContractAddress` | `0xe001f841` | +| `setDefaultAuctionManager` | `0xede8b4b5` | +| `setDeployForwarder` | `0xaeaee8a6` | +| `setFeesManager` | `0x1c89382a` | +| `setWatcher` | `0x24f48bc5` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | ## AsyncDeployer -| Function | Signature | -| ------------------------------- | ------------ | -| `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `asyncPromiseBeacon` | `0xc0fbc0ef` | -| `asyncPromiseCounter` | `0x97cdbf4c` | -| `asyncPromiseImplementation` | `0x59531b8d` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deployAsyncPromiseContract` | `0x9851be0b` | -| `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `forwarderBeacon` | `0x945709ae` | -| `forwarderImplementation` | `0xe38d60a1` | -| `getAsyncPromiseAddress` | `0x104f39b4` | -| `getForwarderAddress` | `0x48c0b3e0` | -| `getOrDeployForwarderContract` | `0x0aa178de` | -| `initialize` | `0x485cc955` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | +| Function | Signature | +| -------- | --------- | +| `addressResolver__` | `0x6a750469` | +| `asyncDeployer__` | `0x2a39e801` | +| `asyncPromiseBeacon` | `0xc0fbc0ef` | +| `asyncPromiseCounter` | `0x97cdbf4c` | +| `asyncPromiseImplementation` | `0x59531b8d` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deployAsyncPromiseContract` | `0x9851be0b` | +| `deployForwarder__` | `0xd4e3b034` | +| `feesManager__` | `0x70568b58` | +| `forwarderBeacon` | `0x945709ae` | +| `forwarderImplementation` | `0xe38d60a1` | +| `getAsyncPromiseAddress` | `0x104f39b4` | +| `getForwarderAddress` | `0x9c038b01` | +| `getOrDeployForwarderContract` | `0xe9bf1edf` | +| `initialize` | `0x485cc955` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | | `setAsyncPromiseImplementation` | `0xeb506eab` | -| `setForwarderImplementation` | `0x83b1e974` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | +| `setForwarderImplementation` | `0x83b1e974` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | ## AsyncPromise -| Function | Signature | -| ------------------- | ------------ | +| Function | Signature | +| -------- | --------- | | `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `callbackData` | `0xef44c272` | -| `callbackSelector` | `0x2764f92f` | +| `asyncDeployer__` | `0x2a39e801` | +| `callbackData` | `0xef44c272` | +| `callbackSelector` | `0x2764f92f` | | `deployForwarder__` | `0xd4e3b034` | -| `exceededMaxCopy` | `0xaf598c7c` | -| `feesManager__` | `0x70568b58` | -| `initialize` | `0x0ece6089` | -| `localInvoker` | `0x45eb87f4` | +| `exceededMaxCopy` | `0xaf598c7c` | +| `feesManager__` | `0x70568b58` | +| `initialize` | `0x0ece6089` | +| `localInvoker` | `0x45eb87f4` | | `markOnchainRevert` | `0xd0e7af1b` | -| `markResolved` | `0x822d5d1f` | -| `requestCount` | `0x5badbe4c` | -| `rescueFunds` | `0x6ccae054` | -| `returnData` | `0xebddbaf6` | -| `state` | `0xc19d93fb` | -| `then` | `0x0bf2ba15` | -| `watcher__` | `0x300bb063` | +| `markResolved` | `0x822d5d1f` | +| `requestCount` | `0x5badbe4c` | +| `rescueFunds` | `0x6ccae054` | +| `returnData` | `0xebddbaf6` | +| `state` | `0xc19d93fb` | +| `then` | `0x0bf2ba15` | +| `watcher__` | `0x300bb063` | ## DeployForwarder -| Function | Signature | -| ---------------------------- | ------------ | -| `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deploy` | `0x940f11af` | -| `deployForwarder__` | `0xd4e3b034` | -| `deployerSwitchboardType` | `0xaa381f9a` | -| `feesManager__` | `0x70568b58` | -| `initialize` | `0x6133f985` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `addressResolver__` | `0x6a750469` | +| `asyncDeployer__` | `0x2a39e801` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deploy` | `0x940f11af` | +| `deployForwarder__` | `0xd4e3b034` | +| `deployerSwitchboardType` | `0xaa381f9a` | +| `feesManager__` | `0x70568b58` | +| `initialize` | `0x6133f985` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `saltCounter` | `0xa04c6809` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `saltCounter` | `0xa04c6809` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | ## Forwarder -| Function | Signature | -| ------------------- | ------------ | +| Function | Signature | +| -------- | --------- | | `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `chainSlug` | `0xb349ba65` | +| `asyncDeployer__` | `0x2a39e801` | +| `chainSlug` | `0xb349ba65` | | `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `getChainSlug` | `0x0b8c6568` | +| `feesManager__` | `0x70568b58` | +| `getChainSlug` | `0x0b8c6568` | | `getOnChainAddress` | `0x9da48789` | -| `initialize` | `0x647c576c` | -| `onChainAddress` | `0x8bd0b363` | -| `rescueFunds` | `0x6ccae054` | -| `watcher__` | `0x300bb063` | +| `initialize` | `0x148841cb` | +| `onChainAddress` | `0x8bd0b363` | +| `rescueFunds` | `0x6ccae054` | +| `watcher__` | `0x300bb063` | ## ProxyFactory -| Function | Signature | -| ----------------------------- | ------------ | -| `adminOf` | `0x2abbef15` | -| `changeAdmin` | `0x1acfd02a` | -| `deploy` | `0x545e7c61` | -| `deployAndCall` | `0x4314f120` | -| `deployDeterministic` | `0x3729f922` | -| `deployDeterministicAndCall` | `0xa97b90d5` | -| `initCodeHash` | `0xdb4c545e` | +| Function | Signature | +| -------- | --------- | +| `adminOf` | `0x2abbef15` | +| `changeAdmin` | `0x1acfd02a` | +| `deploy` | `0x545e7c61` | +| `deployAndCall` | `0x4314f120` | +| `deployDeterministic` | `0x3729f922` | +| `deployDeterministicAndCall` | `0xa97b90d5` | +| `initCodeHash` | `0xdb4c545e` | | `predictDeterministicAddress` | `0x5414dff0` | -| `upgrade` | `0x99a88ec4` | -| `upgradeAndCall` | `0x9623609d` | +| `upgrade` | `0x99a88ec4` | +| `upgradeAndCall` | `0x9623609d` | ## TestUSDC -| Function | Signature | -| ------------------ | ------------ | +| Function | Signature | +| -------- | --------- | | `DOMAIN_SEPARATOR` | `0x3644e515` | -| `allowance` | `0xdd62ed3e` | -| `approve` | `0x095ea7b3` | -| `balanceOf` | `0x70a08231` | -| `decimals` | `0x313ce567` | -| `mint` | `0x40c10f19` | -| `name` | `0x06fdde03` | -| `nonces` | `0x7ecebe00` | -| `owner` | `0x8da5cb5b` | -| `permit` | `0xd505accf` | -| `symbol` | `0x95d89b41` | -| `totalSupply` | `0x18160ddd` | -| `transfer` | `0xa9059cbb` | -| `transferFrom` | `0x23b872dd` | +| `allowance` | `0xdd62ed3e` | +| `approve` | `0x095ea7b3` | +| `balanceOf` | `0x70a08231` | +| `decimals` | `0x313ce567` | +| `mint` | `0x40c10f19` | +| `name` | `0x06fdde03` | +| `nonces` | `0x7ecebe00` | +| `owner` | `0x8da5cb5b` | +| `permit` | `0xd505accf` | +| `symbol` | `0x95d89b41` | +| `totalSupply` | `0x18160ddd` | +| `transfer` | `0xa9059cbb` | +| `transferFrom` | `0x23b872dd` | ## ContractFactoryPlug -| Function | Signature | -| ---------------------------- | ------------ | -| `appGatewayId` | `0x1c335f49` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `connectSocket` | `0x258d19c8` | -| `deployContract` | `0xa0695389` | -| `getAddress` | `0x94ca2cb5` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `initSocket` | `0xa07d8545` | -| `isSocketInitialized` | `0x9a7d9a9b` | -| `overrides` | `0x4a85f041` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `appGatewayId` | `0x1c335f49` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `connectSocket` | `0x258d19c8` | +| `deployContract` | `0xa0695389` | +| `getAddress` | `0x94ca2cb5` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `initSocket` | `0xa07d8545` | +| `isSocketInitialized` | `0x9a7d9a9b` | +| `overrides` | `0x4a85f041` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `socket__` | `0xc6a261d2` | -| `transferOwnership` | `0xf2fde38b` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `socket__` | `0xc6a261d2` | +| `transferOwnership` | `0xf2fde38b` | ## Configurations -| Function | Signature | -| ---------------------------- | ------------ | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `getPlugConfigs` | `0x8a028c38` | -| `initialize` | `0x485cc955` | -| `isValidPlug` | `0xec8aef74` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `getPlugConfigs` | `0x25945c1a` | +| `initialize` | `0x485cc955` | +| `isValidPlug` | `0x00f9b9f4` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `setAppGatewayConfigs` | `0xd137fcbb` | -| `setIsValidPlug` | `0xf41332b0` | -| `setSocket` | `0x075c40be` | -| `setSwitchboard` | `0x61706f1e` | -| `sockets` | `0xb44a23ab` | -| `switchboards` | `0xaa539546` | -| `transferOwnership` | `0xf2fde38b` | -| `verifyConnections` | `0xa53b6fad` | -| `watcher__` | `0x300bb063` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `setAppGatewayConfigs` | `0xebfb22cd` | +| `setIsValidPlug` | `0x4842c37a` | +| `setSocket` | `0x38d4de67` | +| `setSwitchboard` | `0x491eac1f` | +| `sockets` | `0xb44a23ab` | +| `switchboards` | `0xaa539546` | +| `transferOwnership` | `0xf2fde38b` | +| `verifyConnections` | `0x36cb19fb` | +| `watcher__` | `0x300bb063` | ## PromiseResolver -| Function | Signature | -| ----------------- | ------------ | -| `markRevert` | `0x56501015` | -| `rescueFunds` | `0x6ccae054` | +| Function | Signature | +| -------- | --------- | +| `markRevert` | `0x56501015` | +| `rescueFunds` | `0x6ccae054` | | `resolvePromises` | `0xbf8484b8` | -| `watcher__` | `0x300bb063` | +| `watcher__` | `0x300bb063` | ## RequestHandler -| Function | Signature | -| ------------------------------ | ------------ | -| `addressResolver__` | `0x6a750469` | -| `assignTransmitter` | `0xae5e9c48` | -| `asyncDeployer__` | `0x2a39e801` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `cancelRequest` | `0x3b5fd6fb` | -| `cancelRequestForReverts` | `0x82970278` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `getBatchPayloadIds` | `0xfd83cd1f` | -| `getPayload` | `0xb48fd0fe` | -| `getPrecompileFees` | `0xabac263c` | -| `getRequest` | `0xcf39abf6` | -| `getRequestBatchIds` | `0xe138fadb` | -| `handleRevert` | `0xcc88d3f9` | -| `increaseFees` | `0x10205541` | -| `initialize` | `0x485cc955` | -| `nextBatchCount` | `0x333a3963` | -| `nextRequestCount` | `0xfef72893` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payloadCounter` | `0x550ce1d5` | -| `precompiles` | `0x9932450b` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `setPrecompile` | `0x122e0042` | -| `setRequestPayloadCountLimit` | `0x8526582b` | -| `submitRequest` | `0xbb299a2c` | -| `transferOwnership` | `0xf2fde38b` | +| Function | Signature | +| -------- | --------- | +| `addressResolver__` | `0x6a750469` | +| `assignTransmitter` | `0xae5e9c48` | +| `asyncDeployer__` | `0x2a39e801` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `cancelRequest` | `0x3b5fd6fb` | +| `cancelRequestForReverts` | `0x82970278` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deployForwarder__` | `0xd4e3b034` | +| `feesManager__` | `0x70568b58` | +| `getBatchPayloadIds` | `0xfd83cd1f` | +| `getPayload` | `0xb48fd0fe` | +| `getPrecompileFees` | `0xabac263c` | +| `getRequest` | `0xcf39abf6` | +| `getRequestBatchIds` | `0xe138fadb` | +| `handleRevert` | `0xcc88d3f9` | +| `increaseFees` | `0x10205541` | +| `initialize` | `0x485cc955` | +| `nextBatchCount` | `0x333a3963` | +| `nextRequestCount` | `0xfef72893` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `payloadCounter` | `0x550ce1d5` | +| `precompiles` | `0x9932450b` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `setPrecompile` | `0x122e0042` | +| `setRequestPayloadCountLimit` | `0x8526582b` | +| `submitRequest` | `0xf91ba7cc` | +| `transferOwnership` | `0xf2fde38b` | | `updateRequestAndProcessBatch` | `0x46464471` | -| `watcher__` | `0x300bb063` | +| `watcher__` | `0x300bb063` | ## Watcher -| Function | Signature | -| ---------------------------- | ------------ | -| `addressResolver__` | `0x6a750469` | -| `appGatewayTemp` | `0x1394c029` | -| `asyncDeployer__` | `0x2a39e801` | -| `callAppGateways` | `0x0050bef1` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `cancelRequest` | `0x50ad0779` | -| `clearQueue` | `0xf22cb874` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `configurations__` | `0x52a3bbeb` | -| `deployForwarder__` | `0xd4e3b034` | -| `evmxSlug` | `0x8bae77c2` | -| `feesManager__` | `0x70568b58` | -| `getCurrentRequestCount` | `0x5715abbb` | -| `getPayloadParams` | `0xae5eeb77` | -| `getPrecompileFees` | `0xabac263c` | -| `getRequestParams` | `0x71263d0d` | -| `increaseFees` | `0xe9b304da` | -| `initialize` | `0xaaf7fc1a` | -| `isAppGatewayCalled` | `0xa79da6c7` | -| `isNonceUsed` | `0x5d00bb12` | -| `isWatcher` | `0x84785ecd` | -| `latestAsyncPromise` | `0xb8a8ba52` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `addressResolver__` | `0x6a750469` | +| `appGatewayTemp` | `0x1394c029` | +| `asyncDeployer__` | `0x2a39e801` | +| `callAppGateways` | `0x0050bef1` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `cancelRequest` | `0x50ad0779` | +| `clearQueue` | `0xf22cb874` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `configurations__` | `0x52a3bbeb` | +| `deployForwarder__` | `0xd4e3b034` | +| `evmxSlug` | `0x8bae77c2` | +| `feesManager__` | `0x70568b58` | +| `getCurrentRequestCount` | `0x5715abbb` | +| `getPayloadParams` | `0xae5eeb77` | +| `getPrecompileFees` | `0xabac263c` | +| `getRequestParams` | `0x71263d0d` | +| `increaseFees` | `0xe9b304da` | +| `initialize` | `0xaaf7fc1a` | +| `isAppGatewayCalled` | `0xa79da6c7` | +| `isNonceUsed` | `0x5d00bb12` | +| `isWatcher` | `0x84785ecd` | +| `latestAsyncPromise` | `0xb8a8ba52` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payloadQueue` | `0x74f00ffb` | -| `promiseResolver__` | `0xdee152be` | -| `queue` | `0xf03ca7f7` | -| `queueAndSubmit` | `0xf0fb9665` | -| `renounceOwnership` | `0x715018a6` | -| `requestHandler__` | `0x55184561` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0xa58c6fc5` | -| `setCoreContracts` | `0xefa891c4` | -| `setIsValidPlug` | `0x7fc82ff6` | -| `setTriggerFees` | `0xaeb30511` | -| `submitRequest` | `0x4890b5ef` | -| `transferOwnership` | `0xf2fde38b` | -| `triggerFees` | `0x73f76aec` | -| `triggerFromChainSlug` | `0xd12b4f12` | -| `triggerFromPlug` | `0x3b847d12` | -| `watcherMultiCall` | `0x8021e82b` | -| `watcher__` | `0x300bb063` | +| `payloadQueue` | `0x74f00ffb` | +| `promiseResolver__` | `0xdee152be` | +| `queue` | `0x65967f1a` | +| `queueAndSubmit` | `0x9d4c9df7` | +| `renounceOwnership` | `0x715018a6` | +| `requestHandler__` | `0x55184561` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0xa58c6fc5` | +| `setCoreContracts` | `0xefa891c4` | +| `setIsValidPlug` | `0x06c0a40a` | +| `setTriggerFees` | `0xaeb30511` | +| `submitRequest` | `0x4890b5ef` | +| `transferOwnership` | `0xf2fde38b` | +| `triggerFees` | `0x73f76aec` | +| `triggerFromChainSlug` | `0xd12b4f12` | +| `triggerFromPlug` | `0x3b847d12` | +| `watcherMultiCall` | `0x8021e82b` | +| `watcher__` | `0x300bb063` | ## FastSwitchboard -| Function | Signature | -| ---------------------------- | ------------ | -| `allowPayload` | `0x31c23f66` | -| `attest` | `0x63671b60` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `chainSlug` | `0xb349ba65` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `isAttested` | `0xc13c2396` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| -------- | --------- | +| `allowPayload` | `0x31c23f66` | +| `attest` | `0x63671b60` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `chainSlug` | `0xb349ba65` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `isAttested` | `0xc13c2396` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `registerSwitchboard` | `0x74f5b1fc` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `socket__` | `0xc6a261d2` | -| `transferOwnership` | `0xf2fde38b` | +| `registerSwitchboard` | `0x74f5b1fc` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `socket__` | `0xc6a261d2` | +| `transferOwnership` | `0xf2fde38b` | ## ReadPrecompile -| Function | Signature | -| ------------------------------ | ------------ | -| `expiryTime` | `0x99bc0aea` | -| `getPrecompileFees` | `0xb7a3d04c` | -| `handlePayload` | `0x1d5e1d98` | -| `readFees` | `0xe06357a2` | -| `rescueFunds` | `0x6ccae054` | -| `resolvePayload` | `0xea92e825` | -| `setExpiryTime` | `0x30fc4cff` | -| `setFees` | `0x3d18678e` | -| `validateAndGetPrecompileData` | `0xab172aab` | -| `watcher__` | `0x300bb063` | +| Function | Signature | +| -------- | --------- | +| `expiryTime` | `0x99bc0aea` | +| `getPrecompileFees` | `0xb7a3d04c` | +| `handlePayload` | `0x1d5e1d98` | +| `readFees` | `0xe06357a2` | +| `rescueFunds` | `0x6ccae054` | +| `resolvePayload` | `0xea92e825` | +| `setExpiryTime` | `0x30fc4cff` | +| `setFees` | `0x3d18678e` | +| `validateAndGetPrecompileData` | `0x997f5bef` | +| `watcher__` | `0x300bb063` | ## SchedulePrecompile -| Function | Signature | -| ------------------------------ | ------------ | -| `expiryTime` | `0x99bc0aea` | -| `getPrecompileFees` | `0xb7a3d04c` | -| `handlePayload` | `0x1d5e1d98` | -| `maxScheduleDelayInSeconds` | `0x3ef01cdb` | -| `rescueFunds` | `0x6ccae054` | -| `resolvePayload` | `0xea92e825` | -| `scheduleCallbackFees` | `0x4c5b6007` | -| `scheduleFeesPerSecond` | `0x852a74c1` | -| `setExpiryTime` | `0x30fc4cff` | +| Function | Signature | +| -------- | --------- | +| `expiryTime` | `0x99bc0aea` | +| `getPrecompileFees` | `0xb7a3d04c` | +| `handlePayload` | `0x1d5e1d98` | +| `maxScheduleDelayInSeconds` | `0x3ef01cdb` | +| `rescueFunds` | `0x6ccae054` | +| `resolvePayload` | `0xea92e825` | +| `scheduleCallbackFees` | `0x4c5b6007` | +| `scheduleFeesPerSecond` | `0x852a74c1` | +| `setExpiryTime` | `0x30fc4cff` | | `setMaxScheduleDelayInSeconds` | `0x12953318` | -| `setScheduleCallbackFees` | `0xec8fd71e` | -| `setScheduleFeesPerSecond` | `0x28e59e57` | -| `validateAndGetPrecompileData` | `0xab172aab` | -| `watcher__` | `0x300bb063` | +| `setScheduleCallbackFees` | `0xec8fd71e` | +| `setScheduleFeesPerSecond` | `0x28e59e57` | +| `validateAndGetPrecompileData` | `0x997f5bef` | +| `watcher__` | `0x300bb063` | ## WritePrecompile -| Function | Signature | -| ------------------------------ | ------------ | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `chainMaxMsgValueLimit` | `0x01d1e126` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `contractFactoryPlugs` | `0x35426631` | -| `digestHashes` | `0xd1a862bf` | -| `expiryTime` | `0x99bc0aea` | -| `getDigest` | `0xdd4bf97b` | -| `getPrecompileFees` | `0xb7a3d04c` | -| `getPrevBatchDigestHash` | `0x372863a1` | -| `handlePayload` | `0x1d5e1d98` | -| `initialize` | `0xeb990c59` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `resolvePayload` | `0xea92e825` | -| `setContractFactoryPlugs` | `0xc067b6dd` | -| `setExpiryTime` | `0x30fc4cff` | -| `setFees` | `0x3d18678e` | -| `transferOwnership` | `0xf2fde38b` | +| Function | Signature | +| -------- | --------- | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `chainMaxMsgValueLimit` | `0x01d1e126` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `contractFactoryPlugs` | `0x35426631` | +| `digestHashes` | `0xd1a862bf` | +| `expiryTime` | `0x99bc0aea` | +| `getDigest` | `0x91b6288b` | +| `getPrecompileFees` | `0xb7a3d04c` | +| `getPrevBatchDigestHash` | `0x372863a1` | +| `handlePayload` | `0x1d5e1d98` | +| `initialize` | `0xeb990c59` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `resolvePayload` | `0xea92e825` | +| `setContractFactoryPlugs` | `0x8b198f5c` | +| `setExpiryTime` | `0x30fc4cff` | +| `setFees` | `0x3d18678e` | +| `transferOwnership` | `0xf2fde38b` | | `updateChainMaxMsgValueLimits` | `0x6a7aa6ac` | -| `uploadProof` | `0x81b48fcf` | -| `validateAndGetPrecompileData` | `0xab172aab` | -| `watcherProofs` | `0x3fa3166b` | -| `watcher__` | `0x300bb063` | -| `writeFees` | `0x5c664aeb` | +| `uploadProof` | `0x81b48fcf` | +| `validateAndGetPrecompileData` | `0x997f5bef` | +| `watcherProofs` | `0x3fa3166b` | +| `watcher__` | `0x300bb063` | +| `writeFees` | `0x5c664aeb` | + diff --git a/contracts/evmx/fees/Credit.sol b/contracts/evmx/fees/Credit.sol index 0e76c46a..463589f2 100644 --- a/contracts/evmx/fees/Credit.sol +++ b/contracts/evmx/fees/Credit.sol @@ -32,7 +32,7 @@ abstract contract FeesManagerStorage is IFeesManager { // slot 52 /// @notice user credits => stores fees for user, app gateway, transmitters and watcher precompile - mapping(address => UserCredits) public userCredits; // TODO:GW: what is the "userAddress" ? is is just EVMx address ? + mapping(address => UserCredits) public userCredits; // TODO:GW: what is the "userAddress" ? is is just EVMx address ? // slot 53 /// @notice Mapping to track request credits details for each request count @@ -53,7 +53,7 @@ abstract contract FeesManagerStorage is IFeesManager { /// @notice Mapping to track nonce to whether it has been used /// @dev address => signatureNonce => isNonceUsed /// @dev used by watchers or other users in signatures - mapping(address => mapping(uint256 => bool)) public isNonceUsed; // TODO:GW: earlier it was just "uint256 => bool" now it has "address" why ? if it is a watcher address it is just for evm or should be bytes32 ? + mapping(address => mapping(uint256 => bool)) public isNonceUsed; // TODO:GW: earlier it was just "uint256 => bool" now it has "address" why ? if it is a watcher address it is just for evm or should be bytes32 ? // slot 57 /// @notice Mapping to track fees plug for each chain slug diff --git a/contracts/evmx/interfaces/IWatcher.sol b/contracts/evmx/interfaces/IWatcher.sol index 567c37a4..856c9386 100644 --- a/contracts/evmx/interfaces/IWatcher.sol +++ b/contracts/evmx/interfaces/IWatcher.sol @@ -11,7 +11,6 @@ import "./IPromiseResolver.sol"; /// @notice Interface for the Watcher Precompile system that handles payload verification and execution /// @dev Defines core functionality for payload processing and promise resolution interface IWatcher { - function requestHandler__() external view returns (IRequestHandler); function configurations__() external view returns (IConfigurations); diff --git a/contracts/utils/common/IdUtils.sol b/contracts/utils/common/IdUtils.sol index ba9797e0..6490ad04 100644 --- a/contracts/utils/common/IdUtils.sol +++ b/contracts/utils/common/IdUtils.sol @@ -17,12 +17,6 @@ function createPayloadId( ) pure returns (bytes32) { return keccak256( - abi.encodePacked( - requestCount_, - batchCount_, - payloadCount_, - chainSlug_, - switchboard_ - ) + abi.encodePacked(requestCount_, batchCount_, payloadCount_, chainSlug_, switchboard_) ); } diff --git a/foundry.toml b/foundry.toml index 6d1a2709..50557a6f 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,27 +10,27 @@ evm_version = 'paris' via_ir = false [labels] -0x67790E222c41b0E787C278e757b7c40f03Fa5709 = "AddressResolver" -0x89C928379fED43B7117b852931e2968ce39C8380 = "AddressResolverImpl" -0x1C70bc3043667e884222B8835E0Ae554eb512810 = "AsyncDeployer" -0x09a762309c63a4e19cd3d822aA340Fe964Ba9C92 = "AsyncDeployerImpl" -0xC12aDF88dfc116CAF88816d150FE498843dABEEe = "AuctionManager" -0x55b76897b3BF6ED04188cbaa7DC21ae14b35D3eE = "AuctionManagerImpl" -0x377431bD1A3321C401542C8B1EC6E0c23E125042 = "Configurations" -0xDe5DedAe6e17f906D1269D5e84BEfB06F3926310 = "ConfigurationsImpl" -0xd48218b2DafF9063177b0c6Bae229ec6C5f086a9 = "DeployForwarder" -0x8e178161BB3B36a28C15DFBe3142afF8757B8993 = "DeployForwarderImpl" -0x870fCA8803bEFd119B1317AFB6794F97af7e515e = "ERC1967Factory" -0x761A9024D267006061ec943d02e3949678906f3E = "FeesManager" -0x29C583B64FD2d7b70f8F6253C2a28D60af364Cb5 = "FeesManagerImpl" +0xc9155aef2042DB8B088bDC19BaEb6986e291e077 = "AddressResolver" +0xd17957AF30c1AE7250A113E17F221C739B5da536 = "AddressResolverImpl" +0x2bcB99C7E3d135447410A6671F2Ba99A5F6DAEe5 = "AsyncDeployer" +0xa567410c4F3eaeE53F37aAD43FeEEb1E2bfE3D51 = "AsyncDeployerImpl" +0x9F8CB0b040F41cb53D3Ee165a589Ba311fE090eE = "AuctionManager" +0x034E00F1094F962f42950dEF0401e06940c5AfcC = "AuctionManagerImpl" +0x7f073B55a3c44B8ee60f1d21783517df8262e24f = "Configurations" +0x3B5e67DfdC6faf4C0E5C84fBe5600e26ce760444 = "ConfigurationsImpl" +0x72A9923E9dBf1f7a52694a7D467876F1495C656B = "DeployForwarder" +0xBe014D345a7D76F2682464ceF06a55BfA1D7A716 = "DeployForwarderImpl" +0xE12aF35E2930CBF7a7eD6F34ee6b7f9774f1E013 = "ERC1967Factory" +0x0Cab384393ab43A1E2da59498376EfF7324c87E7 = "FeesManager" +0xD6D008738Dac7391023F5C6A6d620AE1DdD1cA08 = "FeesManagerImpl" 0x9De353dD1131aB4e502590D3a1832652FA316268 = "FeesPool" -0x73b1B3dF6C71e0aa912f9d6933920D4461ae9718 = "PromiseResolver" -0x58f49313816c1876417EE53De8F5de047359fB2C = "ReadPrecompile" -0x63a6D7096b5a2F5c9Ce7D8632A7A2034A85b7F01 = "RequestHandler" -0x593f4844ceEA828bC6d9D78A0ef7Ce64F42190dC = "RequestHandlerImpl" -0xF77d2059a66026Efac11334D30372429553CAaC3 = "SchedulePrecompile" -0xe4D1B4B8c0eEE90ac1f5314e758446CBa201BBA8 = "Watcher" -0x7726e559A5129A9174f89F7E2029f7212B66dD13 = "WatcherImpl" -0xd8be408E271EEe9d3D0f28305bB9b6003589E1A9 = "WritePrecompile" -0xE24c4b0f67f566Fa558b3FE85f1780CD330f1F4D = "WritePrecompileImpl" -0x4Faa9C39f4E1C5be5f9c2e3F5AC8774da3b7B1C2 = "APP_GATEWAY" +0x1357c7C53c4EC523c2bDde70F2C7c6cC16cfb111 = "PromiseResolver" +0x833CeaE292709aa55C59A9b59f66b5dDB0B50c62 = "ReadPrecompile" +0x8E07c6Ec1EbBDfEEc17103409F583d950B35b2D7 = "RequestHandler" +0x9dC6Cd010CcC342086d3F077a7cB6df0700E7A20 = "RequestHandlerImpl" +0xfE6E9CD8a8902CC90285B1607545A93F3794a391 = "SchedulePrecompile" +0x829a0A0D00c10075Bd17E731C5087Ceb4ebe7EFb = "Watcher" +0x3EC725ccF07d625648DA2eDCE1e05Fd87B9d9de6 = "WatcherImpl" +0xbB8067A271B93d59c22983fad022B5D342D357A5 = "WritePrecompile" +0x4342F1A730bBaFB966795bD57e7561143c902Dcb = "WritePrecompileImpl" +0xf8B4Ff208327Cd03d3Fd56032CCD9578CF49EEdF = "APP_GATEWAY" diff --git a/hardhat-scripts/deploy/3.configureChains.ts b/hardhat-scripts/deploy/3.configureChains.ts index 2b3cb4b0..a19da8bc 100644 --- a/hardhat-scripts/deploy/3.configureChains.ts +++ b/hardhat-scripts/deploy/3.configureChains.ts @@ -83,10 +83,16 @@ async function setOnchainContracts( const signer: Wallet = getWatcherSigner(); const chainAddresses = addresses[chain] as ChainAddressesObj; - const switchboard = toBytes32FormatHexString(chainAddresses[Contracts.FastSwitchboard]); + const switchboard = toBytes32FormatHexString( + chainAddresses[Contracts.FastSwitchboard] + ); const socket = toBytes32FormatHexString(chainAddresses[Contracts.Socket]); - const feesPlug = toBytes32FormatHexString(chainAddresses[Contracts.FeesPlug]!); - const contractFactory = toBytes32FormatHexString(chainAddresses[Contracts.ContractFactoryPlug]); + const feesPlug = toBytes32FormatHexString( + chainAddresses[Contracts.FeesPlug]! + ); + const contractFactory = toBytes32FormatHexString( + chainAddresses[Contracts.ContractFactoryPlug] + ); await updateContractSettings( EVMX_CHAIN_ID, diff --git a/hardhat-scripts/deploy/6.connect.ts b/hardhat-scripts/deploy/6.connect.ts index c1224f7b..f9e9f471 100644 --- a/hardhat-scripts/deploy/6.connect.ts +++ b/hardhat-scripts/deploy/6.connect.ts @@ -114,7 +114,9 @@ export const updateConfigEVMx = async () => { for (const plugContract of plugs) { const appGatewayId = getAppGatewayId(plugContract, addresses); - const switchboardBytes32Hex = toBytes32FormatHexString(addr[Contracts.FastSwitchboard]); + const switchboardBytes32Hex = toBytes32FormatHexString( + addr[Contracts.FastSwitchboard] + ); const plugBytes32Hex = toBytes32FormatHexString(addr[plugContract]); // checkIfAddressExists(switchboard, "Switchboard"); checkIfAppGatewayIdExists(appGatewayId, "AppGatewayId"); diff --git a/script/counter/ReadOnchainCounters.s.sol b/script/counter/ReadOnchainCounters.s.sol index 0bc37fa3..4a041e95 100644 --- a/script/counter/ReadOnchainCounters.s.sol +++ b/script/counter/ReadOnchainCounters.s.sol @@ -12,18 +12,15 @@ contract CheckCounters is Script { CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); vm.createSelectFork(vm.envString("EVMX_RPC")); - address counterInstanceArbitrumSepolia = fromBytes32Format(gateway.getOnChainAddress( - gateway.counter(), - 421614 - )); - address counterInstanceOptimismSepolia = fromBytes32Format(gateway.getOnChainAddress( - gateway.counter(), - 11155420 - )); - address counterInstanceBaseSepolia = fromBytes32Format(gateway.getOnChainAddress( - gateway.counter(), - 84532 - )); + address counterInstanceArbitrumSepolia = fromBytes32Format( + gateway.getOnChainAddress(gateway.counter(), 421614) + ); + address counterInstanceOptimismSepolia = fromBytes32Format( + gateway.getOnChainAddress(gateway.counter(), 11155420) + ); + address counterInstanceBaseSepolia = fromBytes32Format( + gateway.getOnChainAddress(gateway.counter(), 84532) + ); if (counterInstanceArbitrumSepolia != address(0)) { vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index a9332b62..c94d0681 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -106,10 +106,7 @@ contract FeesTest is AppGatewayBaseSetup { configs[0] = AppGatewayConfig({ chainSlug: arbChainSlug, plug: toBytes32Format(address(arbConfig.feesPlug)), - plugConfig: PlugConfigGeneric({ - appGatewayId: bytes32(0), - switchboard: bytes32(0) - }) + plugConfig: PlugConfigGeneric({appGatewayId: bytes32(0), switchboard: bytes32(0)}) }); watcherMultiCall( address(configurations), diff --git a/test/ProxyMigration.t.sol b/test/ProxyMigration.t.sol index 361fcda0..d05b2897 100644 --- a/test/ProxyMigration.t.sol +++ b/test/ProxyMigration.t.sol @@ -169,7 +169,10 @@ contract MigrationTest is ProxyStorageAssertions { assertEq(newImplAddr, address(newImpl), "New implementation not set correctly"); // Deploy a new forwarder and verify it uses the correct beacon - address newForwarder = asyncDeployer.getOrDeployForwarderContract(toBytes32Format(address(0x123)), 1); + address newForwarder = asyncDeployer.getOrDeployForwarderContract( + toBytes32Format(address(0x123)), + 1 + ); address beacon = getBeacon(newForwarder); assertEq( beacon, diff --git a/test/ProxyStorage.t.sol b/test/ProxyStorage.t.sol index 498ef568..69720ca9 100644 --- a/test/ProxyStorage.t.sol +++ b/test/ProxyStorage.t.sol @@ -212,7 +212,10 @@ contract ProxyStorageAssertions is AppGatewayBaseSetup { function assertForwarderSlot() internal { bytes32 chainContractAddress = toBytes32Format(address(this)); - address forwarder = asyncDeployer.getOrDeployForwarderContract(chainContractAddress, evmxSlug); + address forwarder = asyncDeployer.getOrDeployForwarderContract( + chainContractAddress, + evmxSlug + ); console.log("forwarder: ", forwarder); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 70c88943..76a1ca21 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -267,7 +267,10 @@ contract DeploySetup is SetupStore { // precompiles writePrecompile.updateChainMaxMsgValueLimits(chainSlug_, maxMsgValueLimit); - writePrecompile.setContractFactoryPlugs(chainSlug_, toBytes32Format(address(contractFactoryPlug))); + writePrecompile.setContractFactoryPlugs( + chainSlug_, + toBytes32Format(address(contractFactoryPlug)) + ); vm.stopPrank(); } diff --git a/test/TriggerTest.t.sol b/test/TriggerTest.t.sol index e8b9fd0f..304472d9 100644 --- a/test/TriggerTest.t.sol +++ b/test/TriggerTest.t.sol @@ -73,7 +73,7 @@ contract TriggerTest is AppGatewayBaseSetup { triggerId: triggerId, chainSlug: arbChainSlug, appGatewayId: toBytes32Format(address(gateway)), - plug: toBytes32Format(address(counter)), + plug: toBytes32Format(address(counter)), payload: payload, overrides: bytes("") }); From c82bae26c24b7922d02a5689e63777db684393f0 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Fri, 20 Jun 2025 09:25:09 +0200 Subject: [PATCH 05/18] remove resolved comments --- contracts/evmx/base/AppGatewayBase.sol | 1 - contracts/utils/common/Structs.sol | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/contracts/evmx/base/AppGatewayBase.sol b/contracts/evmx/base/AppGatewayBase.sol index 576b4ebc..f7e5f5ca 100644 --- a/contracts/evmx/base/AppGatewayBase.sol +++ b/contracts/evmx/base/AppGatewayBase.sol @@ -138,7 +138,6 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway { function setAddress(bytes memory data_, bytes memory returnData_) external onlyPromises { (uint32 chainSlug, bytes32 contractId) = abi.decode(data_, (uint32, bytes32)); forwarderAddresses[contractId][chainSlug] = asyncDeployer__().getOrDeployForwarderContract( - // TODO:GW: where does returnData_ come from - maybe it is already bytes32 ? - is it EVM specific ? toBytes32Format(abi.decode(returnData_, (address))), chainSlug ); diff --git a/contracts/utils/common/Structs.sol b/contracts/utils/common/Structs.sol index bfad31c4..244221a3 100644 --- a/contracts/utils/common/Structs.sol +++ b/contracts/utils/common/Structs.sol @@ -124,7 +124,7 @@ struct CreateRequestResult { struct Bid { uint256 fee; - address transmitter; // TODO:GW: for later - in Solana it will be bytes32 + address transmitter; bytes extraData; } @@ -136,7 +136,7 @@ struct UserCredits { // digest: struct DigestParams { bytes32 socket; - address transmitter; // TODO:GW: for later - in Solana it will be bytes32 + address transmitter; bytes32 payloadId; uint256 deadline; bytes4 callType; @@ -160,7 +160,6 @@ struct OverrideParams { uint256 delayInSeconds; } -// payload // TODO:GW: change target to bytes32 - no more QueuePayloadParams ? struct Transaction { uint32 chainSlug; bytes32 target; From 0b2551fde94a4e34ab84deafeb82a05fdd8464ce Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Fri, 20 Jun 2025 13:49:37 +0200 Subject: [PATCH 06/18] Add Solana chainSlugs and bump version --- package.json | 2 +- src/chain-enums/chainId.ts | 2 ++ src/chain-enums/chainSlug.ts | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3d91b195..02180c27 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.1.23", + "version": "1.1.26", "description": "socket protocol", "scripts": { "build": "yarn abi && tsc --project lib.tsconfig.json", diff --git a/src/chain-enums/chainId.ts b/src/chain-enums/chainId.ts index 4c7cf31c..69a11947 100644 --- a/src/chain-enums/chainId.ts +++ b/src/chain-enums/chainId.ts @@ -57,4 +57,6 @@ export enum ChainId { ZERO_SEPOLIA = 4457845, INTEROP_ALPHA_0 = 420120000, INTEROP_ALPHA_1 = 420120001, + SOLANA_MAINNET = 10000001, + SOLANA_DEVNET = 10000002, } diff --git a/src/chain-enums/chainSlug.ts b/src/chain-enums/chainSlug.ts index 6dd18494..d62533f8 100644 --- a/src/chain-enums/chainSlug.ts +++ b/src/chain-enums/chainSlug.ts @@ -59,4 +59,6 @@ export enum ChainSlug { ZERO_SEPOLIA = ChainId.ZERO_SEPOLIA, INTEROP_ALPHA_0 = ChainId.INTEROP_ALPHA_0, INTEROP_ALPHA_1 = ChainId.INTEROP_ALPHA_1, + SOLANA_MAINNET = ChainId.SOLANA_MAINNET, + SOLANA_DEVNET = ChainId.SOLANA_DEVNET, } From 7847a7169e4d2b1f53d2a7c3139343a95031dc76 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Wed, 25 Jun 2025 10:28:09 +0200 Subject: [PATCH 07/18] refactor: WritePrecompile -> handlePayload() -> abi.decode for switchboard --- .gitignore | 2 ++ contracts/evmx/watcher/precompiles/WritePrecompile.sol | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 99e108e6..ee1c88c5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ deployments/local_verification.json testScript.sh CLAUDE.md + +.idea/ diff --git a/contracts/evmx/watcher/precompiles/WritePrecompile.sol b/contracts/evmx/watcher/precompiles/WritePrecompile.sol index b9cc48df..d5368408 100644 --- a/contracts/evmx/watcher/precompiles/WritePrecompile.sol +++ b/contracts/evmx/watcher/precompiles/WritePrecompile.sol @@ -157,13 +157,13 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc ( address appGateway, Transaction memory transaction, - , + , // _writeFinality uint256 gasLimit, uint256 value, - + // bytes32 switchboard ) = abi.decode( payloadParams.precompileData, - (address, Transaction, WriteFinality, uint256, uint256, address) + (address, Transaction, WriteFinality, uint256, uint256, bytes32) ); precompileData = payloadParams.precompileData; From bc4bcfa6a1a31e5ebb9a62e3fec4eb12f381d8f4 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Thu, 19 Jun 2025 17:33:39 +0200 Subject: [PATCH 08/18] WIP --- contracts/evmx/helpers/ForwarderSolana.sol | 171 +++++++++++++++ contracts/utils/common/Constants.sol | 3 + contracts/utils/common/Structs.sol | 22 ++ .../DeployEVMSolanaApps.s.sol | 70 ++++++ .../EvmSolanaOnchainCalls.s.sol | 199 ++++++++++++++++++ .../super-token/EvmSolanaAppGateway.sol | 165 +++++++++++++++ 6 files changed, 630 insertions(+) create mode 100644 contracts/evmx/helpers/ForwarderSolana.sol create mode 100644 script/super-token-solana/DeployEVMSolanaApps.s.sol create mode 100644 script/super-token-solana/EvmSolanaOnchainCalls.s.sol create mode 100644 test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol diff --git a/contracts/evmx/helpers/ForwarderSolana.sol b/contracts/evmx/helpers/ForwarderSolana.sol new file mode 100644 index 00000000..cb35813b --- /dev/null +++ b/contracts/evmx/helpers/ForwarderSolana.sol @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity ^0.8.21; + +// import "./interfaces/IAddressResolver.sol"; +// import "./interfaces/IMiddleware.sol"; +// import "./interfaces/IAppGateway.sol"; +// import "./interfaces/IPromise.sol"; +// import "./interfaces/IForwarder.sol"; +// import {AddressResolverUtil} from "./AddressResolverUtil.sol"; +// import {AsyncModifierNotUsed, NoAsyncPromiseFound, PromiseCallerMismatch, RequestCountMismatch, DeliveryHelperNotSet} from "../utils/common/Errors.sol"; +// import "solady/utils/Initializable.sol"; +// import {SolanaInstruction} from "../utils/common/Structs.sol"; +// import {CHAIN_SLUG_SOLANA_MAINNET, CHAIN_SLUG_SOLANA_DEVNET} from "../utils/common/Constants.sol"; + +import "solady/utils/Initializable.sol"; +import "./AddressResolverUtil.sol"; +import "../interfaces/IAddressResolver.sol"; +import "../interfaces/IAppGateway.sol"; +import "../interfaces/IForwarder.sol"; +import {QueueParams, OverrideParams, Transaction} from "../../utils/common/Structs.sol"; +import {AsyncModifierNotSet, WatcherNotSet, InvalidOnChainAddress} from "../../utils/common/Errors.sol"; +import "../../utils/RescueFundsLib.sol"; +import {toBytes32Format} from "../../utils/common/Converters.sol"; +import {SolanaInstruction} from "../../utils/common/Structs.sol"; +import {CHAIN_SLUG_SOLANA_MAINNET, CHAIN_SLUG_SOLANA_DEVNET} from "../../utils/common/Constants.sol"; + + +/// @title Forwarder Storage +/// @notice Storage contract for the Forwarder contract that contains the state variables +abstract contract ForwarderStorage is IForwarder { + // slots [0-49] reserved for gap + uint256[50] _gap_before; + + // slot 50 + /// @notice chain slug on which the contract is deployed + uint32 public chainSlug; + /// @notice Solana on-chain address associated with this forwarder + bytes32 public onChainAddress; + + // slot 51 + /// @notice caches the latest async promise address for the last call + address public latestAsyncPromise; + + // slot 52 + /// @notice the address of the contract that called the latest async promise + address public latestPromiseCaller; + /// @notice the request count of the latest async promise + uint40 public latestRequestCount; + + // slots [53-102] reserved for gap + // TODO:remove-after-review: - 12 for using bytes32 onChainAddress - is there any mainnet deployment which storage could be affected? + uint256[50] _gap_after; + + // slots 103-154 (51) reserved for addr resolver util +} + +/// @title Forwarder Contract +/// @notice This contract acts as a forwarder for async calls to the on-chain contracts. +contract ForwarderSolana is ForwarderStorage, Initializable, AddressResolverUtil { + + error InvalidSolanaChainSlug(); + + constructor() { + _disableInitializers(); // disable for implementation + } + + /// @notice Initializer to replace constructor for upgradeable contracts + /// @param chainSlug_ chain slug on which the contract is deployed + //// @param onChainAddress_ on-chain address associated with this forwarder + /// @param addressResolver_ address resolver contract + function initialize( + uint32 chainSlug_, + bytes32 onChainAddress_, + address addressResolver_ + ) public initializer { + if (chainSlug_ == CHAIN_SLUG_SOLANA_MAINNET || chainSlug_ == CHAIN_SLUG_SOLANA_DEVNET) { + chainSlug = chainSlug_; + } else { + revert InvalidSolanaChainSlug(); + } + onChainAddress = onChainAddress_; + _setAddressResolver(addressResolver_); + } + + /// @notice Stores the callback address and data to be executed once the promise is resolved. + /// @dev This function should not be called before the fallback function. + /// @dev It resets the latest async promise address + /// @param selector_ The function selector for callback + /// @param data_ The data to be passed to callback + /// @return promise_ The address of the new promise + // TODO:GW: uncommenting this is making the deployment fail silently + // function then(bytes4 selector_, bytes memory data_) external returns (address promise_) { + // if (latestAsyncPromise == address(0)) revert NoAsyncPromiseFound(); + // if (latestPromiseCaller != msg.sender) revert PromiseCallerMismatch(); + // if (latestRequestCount != watcherPrecompile__().nextRequestCount()) + // revert RequestCountMismatch(); + + // address latestAsyncPromise_ = latestAsyncPromise; + // latestAsyncPromise = address(0); + + // promise_ = IPromise(latestAsyncPromise_).then(selector_, data_); + // } + + /// @notice Returns the on-chain address associated with this forwarder. + /// @return The on-chain address. + function getOnChainAddress() external view returns (bytes32) { + return onChainAddress; + } + + /// @notice Returns the chain slug on which the contract is deployed. + /// @return chain slug + function getChainSlug() external view returns (uint32) { + return chainSlug; + } + + /// @notice Fallback function to process the contract calls to onChainAddress + /// @dev It queues the calls in the middleware and deploys the promise contract + function callSolana(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external { + if (address(deliveryHelper__()) == address(0)) { + revert DeliveryHelperNotSet(); + } + + // validates if the async modifier is set + bool isAsyncModifierSet = IAppGateway(msg.sender).isAsyncModifierSet(); + if (!isAsyncModifierSet) revert AsyncModifierNotUsed(); + + // Deploy a new async promise contract. + latestAsyncPromise = addressResolver__.deployAsyncPromiseContract(msg.sender); + + // set the latest promise caller and request count for validating if the future .then call is valid + latestPromiseCaller = msg.sender; + latestRequestCount = watcherPrecompile__().nextRequestCount(); + + // fetch the override params from app gateway + ( + Read isReadCall, + Parallel isParallelCall, + WriteFinality writeFinality, + uint256 readAt, + uint256 gasLimit, + uint256 value, + bytes32 sbType + ) = IAppGateway(msg.sender).getOverrideParams(); + + // TODO:GW: after POC make it work like below + // get the switchboard address from the watcher precompile config + // address switchboard = watcherPrecompileConfig().switchboards(chainSlug, sbType); + + bytes memory solanaPayload = abi.encode(solanaInstruction); + + // Queue the call in the middleware. + deliveryHelper__().queue( + QueuePayloadParams({ + chainSlug: chainSlug, + callType: isReadCall == Read.ON ? CallType.READ : CallType.WRITE, + isParallel: isParallelCall, + isPlug: IsPlug.NO, + writeFinality: writeFinality, + asyncPromise: latestAsyncPromise, + switchboard: switchboardSolana, + target: onChainAddress, + appGateway: msg.sender, + gasLimit: gasLimit, + value: value, + readAt: readAt, + payload: solanaPayload, + initCallData: bytes("") + }) + ); + } +} diff --git a/contracts/utils/common/Constants.sol b/contracts/utils/common/Constants.sol index 2afa6479..eecc138a 100644 --- a/contracts/utils/common/Constants.sol +++ b/contracts/utils/common/Constants.sol @@ -16,3 +16,6 @@ bytes32 constant FAST = keccak256("FAST"); uint256 constant PAYLOAD_SIZE_LIMIT = 24_500; uint16 constant MAX_COPY_BYTES = 2048; // 2KB + +uint32 constant CHAIN_SLUG_SOLANA_MAINNET = 10000001; +uint32 constant CHAIN_SLUG_SOLANA_DEVNET = 10000002; diff --git a/contracts/utils/common/Structs.sol b/contracts/utils/common/Structs.sol index 244221a3..bbfb46e7 100644 --- a/contracts/utils/common/Structs.sol +++ b/contracts/utils/common/Structs.sol @@ -209,3 +209,25 @@ struct RequestParams { uint256 writeCount; bytes onCompleteData; } + +struct SolanaInstruction { + SolanaInstructionData data; + SolanaInstructionDataDescription description; +} + +struct SolanaInstructionData { + bytes32 programId; + bytes32[] accounts; + bytes8 instructionDiscriminator; + // TODO:GW: in one of functionArguments is an array it might need a special handling and encoding + // for now we assume the all functionArguments are simple types (uint256, address, bool, etc.) not complex types (struct, array, etc.) + bytes[] functionArguments; +} + +struct SolanaInstructionDataDescription { + // flags for accounts, we only need isWritable for now + // 0 bit - isWritable (0|1) + bytes1[] accountFlags; + // names for function argument types used later in data decoding in watcher and transmitter + string[] functionArgumentTypeNames; +} \ No newline at end of file diff --git a/script/super-token-solana/DeployEVMSolanaApps.s.sol b/script/super-token-solana/DeployEVMSolanaApps.s.sol new file mode 100644 index 00000000..de7fd65f --- /dev/null +++ b/script/super-token-solana/DeployEVMSolanaApps.s.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity ^0.8.21; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {EvmSolanaAppGateway} from "../../test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol"; +import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; +import {ETH_ADDRESS} from "../../contracts/utils/common/Constants.sol"; +import {ForwarderSolana} from "../../contracts/evmx/helpers/ForwarderSolana.sol"; +import {AddressResolver} from "../../contracts/evmx/helpers/AddressResolver.sol"; + + +// source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation --legacy --gas-price 0 +contract DeployEVMSolanaApps is Script { + function run() external { + address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); + // address owner = vm.envAddress("OWNER"); + address owner = vm.envAddress("SENDER_ADDRESS"); // TODO: what address should be used here?– + string memory rpc = vm.envString("EVMX_RPC"); + vm.createSelectFork(rpc); + + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + + // fill with correct values after deployment + bytes32 solanaProgramId = vm.envBytes32("SOLANA_TARGET_PROGRAM"); + address forwarderSolanaAddress = 0xCEC0c6c88217c687FcdE60bccfc7c14c1c0c72eB; + + // Setting fee payment on Arbitrum Sepolia + uint256 fees = 10 ether; + + EvmSolanaAppGateway gateway = new EvmSolanaAppGateway( + addressResolver, + owner, + fees, + EvmSolanaAppGateway.SuperTokenEvmConstructorParams({ + name_: "SuperToken-Evm", + symbol_: "SUPER", + decimals_: 6, + initialSupplyHolder_: owner, + initialSupply_: 100000000000 + }), + solanaProgramId, + forwarderSolanaAddress + ); + + // TODO: deploy super token on evm + // TODO: callSolana() on gateway + + console.log("Contracts deployed:"); + console.log("EvmSolanaAppGateway:", address(gateway)); + console.log("solanaProgramId:"); + console.logBytes32(solanaProgramId); + console.log("forwarderSolanaAddress:"); + console.logAddress(forwarderSolanaAddress); + + console.log("Forwarder Solana address resolver:"); + console.log(address(ForwarderSolana(forwarderSolanaAddress).addressResolver__())); + console.log("ForwarderSolana chain slug:"); + console.log(ForwarderSolana(forwarderSolanaAddress).chainSlug()); + console.log("ForwarderSolana onChainAddress:"); + console.logBytes32(ForwarderSolana(forwarderSolanaAddress).onChainAddress()); + + console.log("Address resolver from vars:"); + console.log(addressResolver); + + // console.log("Address resolver owner:"); + // console.log(AddressResolver(address(ForwarderSolana(forwarderSolanaAddress).addressResolver__())).owner()); + } +} diff --git a/script/super-token-solana/EvmSolanaOnchainCalls.s.sol b/script/super-token-solana/EvmSolanaOnchainCalls.s.sol new file mode 100644 index 00000000..c8a8bcb2 --- /dev/null +++ b/script/super-token-solana/EvmSolanaOnchainCalls.s.sol @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity ^0.8.21; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {ETH_ADDRESS} from "../../contracts/utils/common/Constants.sol"; +import {EvmSolanaAppGateway} from "../../test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol"; +import {SolanaInstruction, SolanaInstructionData, SolanaInstructionDataDescription} from "../../contracts/utils/common/Structs.sol"; + +// source .env && forge script script/counter/EvmSolanaOnchainCalls.s.sol --broadcast --skip-simulation --legacy --gas-price 0 +contract EvmSolanaOnchainCalls is Script { + function run() external { + string memory rpc = vm.envString("EVMX_RPC"); + console.log(rpc); + vm.createSelectFork(rpc); + + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + + EvmSolanaAppGateway appGateway = EvmSolanaAppGateway(vm.envAddress("APP_GATEWAY")); + bytes32 switchboardSolana = vm.envBytes32("SWITCHBOARD_SOLANA"); + address userEvmAddress = vm.envAddress("EVM_TEST_ACCOUNT"); + + console.log("EvmSolanaAppGateway:", address(appGateway)); + console.log("Switchboard solana:"); + console.logBytes32(switchboardSolana); + console.log("User address: ", userEvmAddress); + + // console.log("Deploying SuperToken on Optimism Sepolia..."); + // appGateway.deployEvmContract(11155420); + + // appGateway.transfer( + // abi.encode( + // EvmSolanaAppGateway.TransferOrderEvmToSolana({ + // srcEvmToken: 0x4200000000000000000000000000000000000006, + // dstSolanaToken: 0x66619ffe200970bf084fa4713da27d7dff551179adac93fc552787c7555f3482, + // userEvm: 0x4200000000000000000000000000000000000005, + // destUserTokenAddress: 0x44419ffe200970bf084fa4713da27d7dff551179adac93fc552787c7555f3482, + // srcAmount: 1000000000000000000, + // deadline: 1715702400 + // }) + // ), + // switchboardSolana + // ); + + uint256 srcAmount = 1000000; + //mintOnEvm(srcAmount, userEvmAddress, appGateway); + // mintOnSolana(srcAmount, userEvmAddress, switchboardSolana, appGateway); + transferEvmToSolana(srcAmount, userEvmAddress, switchboardSolana, appGateway); + + // This works: + // appGateway.transferForDebug( + // buildSolanaInstruction( + // EvmSolanaAppGateway.TransferOrderEvmToSolana({ + // srcEvmToken: 0x4200000000000000000000000000000000000006, + // // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q + // dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, + // userEvm: 0x4200000000000000000000000000000000000005, + // // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr + // destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, + // srcAmount: 1000000, + // deadline: 1715702400 + // }) + // ), + // switchboardSolana + // ); + + + } + + function transferEvmToSolana( + uint256 srcAmount, + address userEvmAddress, + bytes32 switchboardSolana, + EvmSolanaAppGateway appGateway + ) public { + console.log("Transfer EVM to Solana"); + + EvmSolanaAppGateway.TransferOrderEvmToSolana memory order = EvmSolanaAppGateway.TransferOrderEvmToSolana({ + srcEvmToken: 0xd912E5870212FC22D56f3C7Cc04aAFfa54eFde31, // Forwarder(!!) for Super-token contract on given chain + // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q + dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, + userEvm: userEvmAddress, + // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr + destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, + srcAmount: srcAmount, + deadline: 1715702400 + }); + + SolanaInstruction memory solanaInstruction = buildSolanaInstruction(order); + + bytes memory orderEncoded = abi.encode(order); + + appGateway.transfer(orderEncoded, solanaInstruction, switchboardSolana); + } + + function mintOnEvm( + uint256 srcAmount, + address userEvmAddress, + EvmSolanaAppGateway appGateway + ) public { + console.log("Mint on EVM"); + + bytes memory order = abi.encode(EvmSolanaAppGateway.TransferOrderEvmToSolana({ + srcEvmToken: 0xd912E5870212FC22D56f3C7Cc04aAFfa54eFde31, // Forwarder(!!) for Super-token contract on given chain + dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, // irrelevant for EVM minting + userEvm: userEvmAddress, + destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, // irrelevant for EVM minting + srcAmount: srcAmount, + deadline: 1715702400 + })); + + EvmSolanaAppGateway.TransferOrderEvmToSolana memory orderObj = abi.decode(order, (EvmSolanaAppGateway.TransferOrderEvmToSolana)); + console.log("Order srcEvmToken:", orderObj.srcEvmToken); + console.log("Order userEvm:", orderObj.userEvm); + console.log("Order srcAmount:", orderObj.srcAmount); + + appGateway.mintSuperTokenEvm(order); + } + + function mintOnSolana( + uint256 srcAmount, + address userEvmAddress, + bytes32 switchboardSolana, + EvmSolanaAppGateway appGateway + ) public { + console.log("Mint on Solana"); + + SolanaInstruction memory solanaInstruction = buildSolanaInstruction( + EvmSolanaAppGateway.TransferOrderEvmToSolana({ + srcEvmToken: 0xD4a20b34D0dE11e3382Aaa7E0839844f154B6191, + // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q + dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, + userEvm: userEvmAddress, + // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr + destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, + srcAmount: srcAmount, + deadline: 1715702400 + }) + ); + + appGateway.mintSuperTokenSolana(solanaInstruction, switchboardSolana); + } + + function buildSolanaInstruction( + EvmSolanaAppGateway.TransferOrderEvmToSolana memory order + ) internal view returns (SolanaInstruction memory) { + bytes32 solanaTargetProgramId = vm.envBytes32("SOLANA_TARGET_PROGRAM"); + + // May be subject to change + bytes32[] memory accounts = new bytes32[](5); + // accounts 0 - superTokenConfigPda : jox6eY2gcjaKneNv96TKpjN7f3Rjcpn9dN9ZLNt3Krs + accounts[0] = 0x0af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d34; + // accounts 1 - mint account + accounts[1] = order.dstSolanaToken; + // accounts 2 - destination user ata + accounts[2] = order.destUserTokenAddress; + // accounts 3 - system programId: 11111111111111111111111111111111 + accounts[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; + // accounts 4 - token programId: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA + accounts[4] = 0x06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9; + + bytes[] memory functionArguments = new bytes[](1); + // TODO:GW: in watcher and transmitter we might need to convert this value if on Solana mint has different decimals, for now we assume that both are the same + functionArguments[0] = abi.encode(order.srcAmount); + + bytes1[] memory accountFlags = new bytes1[](5); + // superTokenConfigPda is not writable + accountFlags[0] = bytes1(0x00); // false + // mint is writable + accountFlags[1] = bytes1(0x01); // true + // destination user ata is writable + accountFlags[2] = bytes1(0x01); // true + // system programId is not writable + accountFlags[3] = bytes1(0x00); // false + // token programId is not writable + accountFlags[4] = bytes1(0x00); // false + + // mint instruction discriminator + bytes8 instructionDiscriminator = 0x3339e12fb69289a6; + + string[] memory functionArgumentTypeNames = new string[](1); + functionArgumentTypeNames[0] = "u64"; + + return + SolanaInstruction({ + data: SolanaInstructionData({ + programId: solanaTargetProgramId, + instructionDiscriminator: instructionDiscriminator, + accounts: accounts, + functionArguments: functionArguments + }), + description: SolanaInstructionDataDescription({ + accountFlags: accountFlags, + functionArgumentTypeNames: functionArgumentTypeNames + }) + }); + } +} diff --git a/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol b/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol new file mode 100644 index 00000000..5c4eefff --- /dev/null +++ b/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity ^0.8.21; + +import "solady/auth/Ownable.sol"; +import "../../../../contracts/evmx/base/AppGatewayBase.sol"; +import "./ISuperToken.sol"; +import "./SuperToken.sol"; +import {SolanaInstruction, SolanaInstructionData, SolanaInstructionDataDescription} from "../../../../contracts/utils/common/Structs.sol"; +import {ForwarderSolana} from "../../../../contracts/evmx/helpers/ForwarderSolana.sol"; + + +contract EvmSolanaAppGateway is AppGatewayBase, Ownable { + bytes32 public superTokenEvm = _createContractId("superTokenEvm"); + // solana program address + bytes32 public solanaProgramId; + ForwarderSolana public forwarderSolana; + + event Transferred(uint40 requestCount); + + struct SuperTokenEvmConstructorParams { + string name_; + string symbol_; + uint8 decimals_; + address initialSupplyHolder_; + uint256 initialSupply_; + } + + struct TransferOrderEvmToSolana { + address srcEvmToken; + bytes32 dstSolanaToken; + address userEvm; + bytes32 destUserTokenAddress; + uint256 srcAmount; + uint256 deadline; + } + + constructor( + address addressResolver_, + address owner_, + uint256 fees_, + SuperTokenEvmConstructorParams memory params_, + bytes32 solanaProgramId_, + address forwarderSolanaAddress_ + ) AppGatewayBase(addressResolver_) { + // for evm we use standard mode with contract deployment using EVMx + creationCodeWithArgs[superTokenEvm] = abi.encodePacked( + type(SuperToken).creationCode, + abi.encode( + params_.name_, + params_.symbol_, + params_.decimals_, + params_.initialSupplyHolder_, + params_.initialSupply_ + ) + ); + // for Solana we just pass the programId(program address) + solanaProgramId = solanaProgramId_; + forwarderSolana = ForwarderSolana(forwarderSolanaAddress_); + + // sets the fees data like max fees, chain and token for all transfers + // they can be updated for each transfer as well + _setMaxFees(fees_); + _initializeOwner(owner_); + } + + function deployEvmContract(uint32 chainSlug_) external async(bytes("")) { + bytes memory initData = abi.encodeWithSelector(SuperToken.setOwner.selector, owner()); + _deploy(superTokenEvm, chainSlug_, IsPlug.YES, initData); + } + + // no need to call this directly, will be called automatically after all contracts are deployed. + // check AppGatewayBase._deploy and AppGatewayBase.onRequestComplete + function initialize(uint32) public pure override { + return; + } + + function getForwarderSolanaAddressResolver() external view returns (address) { + return address(forwarderSolana.addressResolver__()); + } + + function transfer(bytes memory order_, SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external async(bytes("")) { + TransferOrderEvmToSolana memory order = abi.decode(order_, (TransferOrderEvmToSolana)); + ISuperToken(order.srcEvmToken).burn(order.userEvm, order.srcAmount); + + // SolanaInstruction memory solanaInstruction = buildSolanaInstruction(order); + + /// we are directly calling the ForwarderSolana + forwarderSolana.callSolana(solanaInstruction, switchboardSolana); + + emit Transferred(_getCurrentAsyncId()); + } + + function mintSuperTokenEvm(bytes memory order_) external async(bytes("")) { + TransferOrderEvmToSolana memory order = abi.decode(order_, (TransferOrderEvmToSolana)); + ISuperToken(order.srcEvmToken).mint(order.userEvm, order.srcAmount); + + emit Transferred(_getCurrentAsyncId()); + } + + function mintSuperTokenSolana(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external async(bytes("")) { + // we are directly calling the ForwarderSolana + forwarderSolana.callSolana(solanaInstruction, switchboardSolana); + + emit Transferred(_getCurrentAsyncId()); + } + + function transferForDebug(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external async(bytes("")) { + // ISuperToken(order.srcEvmToken).burn(order.userEvm, order.srcAmount); + + // we are directly calling the ForwarderSolana + forwarderSolana.callSolana(solanaInstruction, switchboardSolana); + + emit Transferred(_getCurrentAsyncId()); + } + + /* + function buildSolanaInstruction( + TransferOrderEvmToSolana memory order + ) internal view returns (SolanaInstruction memory) { + // May be subject to change + bytes32[] memory accounts = new bytes32[](5); + // accounts 0 - destination user wallet + accounts[0] = order.destUserTokenAddress; + // accounts 1 - mint account + accounts[1] = order.dstSolanaToken; + // accounts 2 - user ata account for mint // TODO:GW: this is random value + accounts[2] = 0x66619ffe200970bf084fa4713da27d7dff551179adac93fc552787c7555f3482; + // accounts 4 - mint authority account (target program PDA) // TODO:GW: this is random value + accounts[4] = 0xfff2e2d5bdb632266e17b0cdce8b7e3f3a7f1d87c096719f234903b39f84d743; + // accounts 5,6 - system_program, token_program (those are static and will be added by the transmitter while making a call) + + bytes[] memory functionArguments = new bytes[](1); + // TODO:GW: in watcher and transmitter we might need to convert this value if on Solana mint has different decimals, for now we assume that both are the same + functionArguments[0] = abi.encode(order.srcAmount); + + bytes1[] memory accountFlags = new bytes1[](4); + accountFlags[0] = bytes1(0x00); + // mint must be is writable + accountFlags[1] = bytes1(0x01); + // dst token ata must be is writable + accountFlags[2] = bytes1(0x01); + accountFlags[3] = bytes1(0x00); + + // TODO:GW: update when TargetDummy is ready + bytes8 instructionDiscriminator = bytes8(uint64(123)); + + string[] memory functionArgumentTypeNames = new string[](1); + functionArgumentTypeNames[0] = "u64"; + + return + SolanaInstruction({ + data: SolanaInstructionData({ + programId: solanaProgramId, + instructionDiscriminator: instructionDiscriminator, + accounts: accounts, + functionArguments: functionArguments + }), + description: SolanaInstructionDataDescription({ + accountFlags: accountFlags, + functionArgumentTypeNames: functionArgumentTypeNames + }) + }); + } + */ +} From 5522c6d4a0178f2547e1d1211a18f78317ccb332 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Fri, 20 Jun 2025 12:13:35 +0200 Subject: [PATCH 09/18] Add ForwarderSolana and solana gatway and call scripts --- contracts/evmx/helpers/ForwarderSolana.sol | 107 +++++++----------- .../DeployEVMSolanaApps.s.sol | 1 - .../EvmSolanaOnchainCalls.s.sol | 8 +- .../super-token/EvmSolanaAppGateway.sol | 30 ++--- 4 files changed, 57 insertions(+), 89 deletions(-) diff --git a/contracts/evmx/helpers/ForwarderSolana.sol b/contracts/evmx/helpers/ForwarderSolana.sol index cb35813b..37f6f2c2 100644 --- a/contracts/evmx/helpers/ForwarderSolana.sol +++ b/contracts/evmx/helpers/ForwarderSolana.sol @@ -23,37 +23,9 @@ import "../../utils/RescueFundsLib.sol"; import {toBytes32Format} from "../../utils/common/Converters.sol"; import {SolanaInstruction} from "../../utils/common/Structs.sol"; import {CHAIN_SLUG_SOLANA_MAINNET, CHAIN_SLUG_SOLANA_DEVNET} from "../../utils/common/Constants.sol"; +import { ForwarderStorage } from "./Forwarder.sol"; -/// @title Forwarder Storage -/// @notice Storage contract for the Forwarder contract that contains the state variables -abstract contract ForwarderStorage is IForwarder { - // slots [0-49] reserved for gap - uint256[50] _gap_before; - - // slot 50 - /// @notice chain slug on which the contract is deployed - uint32 public chainSlug; - /// @notice Solana on-chain address associated with this forwarder - bytes32 public onChainAddress; - - // slot 51 - /// @notice caches the latest async promise address for the last call - address public latestAsyncPromise; - - // slot 52 - /// @notice the address of the contract that called the latest async promise - address public latestPromiseCaller; - /// @notice the request count of the latest async promise - uint40 public latestRequestCount; - - // slots [53-102] reserved for gap - // TODO:remove-after-review: - 12 for using bytes32 onChainAddress - is there any mainnet deployment which storage could be affected? - uint256[50] _gap_after; - - // slots 103-154 (51) reserved for addr resolver util -} - /// @title Forwarder Contract /// @notice This contract acts as a forwarder for async calls to the on-chain contracts. contract ForwarderSolana is ForwarderStorage, Initializable, AddressResolverUtil { @@ -115,32 +87,20 @@ contract ForwarderSolana is ForwarderStorage, Initializable, AddressResolverUtil /// @notice Fallback function to process the contract calls to onChainAddress /// @dev It queues the calls in the middleware and deploys the promise contract - function callSolana(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external { - if (address(deliveryHelper__()) == address(0)) { - revert DeliveryHelperNotSet(); + // function callSolana(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external { + function callSolana(SolanaInstruction memory solanaInstruction) external { + if (address(watcher__()) == address(0)) { + revert WatcherNotSet(); } // validates if the async modifier is set - bool isAsyncModifierSet = IAppGateway(msg.sender).isAsyncModifierSet(); - if (!isAsyncModifierSet) revert AsyncModifierNotUsed(); - - // Deploy a new async promise contract. - latestAsyncPromise = addressResolver__.deployAsyncPromiseContract(msg.sender); - - // set the latest promise caller and request count for validating if the future .then call is valid - latestPromiseCaller = msg.sender; - latestRequestCount = watcherPrecompile__().nextRequestCount(); + address msgSender = msg.sender; + bool isAsyncModifierSet = IAppGateway(msgSender).isAsyncModifierSet(); + if (!isAsyncModifierSet) revert AsyncModifierNotSet(); // fetch the override params from app gateway - ( - Read isReadCall, - Parallel isParallelCall, - WriteFinality writeFinality, - uint256 readAt, - uint256 gasLimit, - uint256 value, - bytes32 sbType - ) = IAppGateway(msg.sender).getOverrideParams(); + (OverrideParams memory overrideParams, bytes32 sbType) = IAppGateway(msgSender) + .getOverrideParams(); // TODO:GW: after POC make it work like below // get the switchboard address from the watcher precompile config @@ -149,23 +109,34 @@ contract ForwarderSolana is ForwarderStorage, Initializable, AddressResolverUtil bytes memory solanaPayload = abi.encode(solanaInstruction); // Queue the call in the middleware. - deliveryHelper__().queue( - QueuePayloadParams({ - chainSlug: chainSlug, - callType: isReadCall == Read.ON ? CallType.READ : CallType.WRITE, - isParallel: isParallelCall, - isPlug: IsPlug.NO, - writeFinality: writeFinality, - asyncPromise: latestAsyncPromise, - switchboard: switchboardSolana, - target: onChainAddress, - appGateway: msg.sender, - gasLimit: gasLimit, - value: value, - readAt: readAt, - payload: solanaPayload, - initCallData: bytes("") - }) - ); + QueueParams memory queueParams; + queueParams.overrideParams = overrideParams; + queueParams.transaction = Transaction({ + chainSlug: chainSlug, + target: onChainAddress, + payload: solanaPayload + }); + queueParams.switchboardType = sbType; + watcher__().queue(queueParams, msgSender); + + // Queue the call in the middleware. + // deliveryHelper__().queue( + // QueuePayloadParams({ + // chainSlug: chainSlug, + // callType: isReadCall == Read.ON ? CallType.READ : CallType.WRITE, + // isParallel: isParallelCall, + // isPlug: IsPlug.NO, + // writeFinality: writeFinality, + // asyncPromise: latestAsyncPromise, + // switchboard: switchboardSolana, + // target: onChainAddress, + // appGateway: msg.sender, + // gasLimit: gasLimit, + // value: value, + // readAt: readAt, + // payload: solanaPayload, + // initCallData: bytes("") + // }) + // ); } } diff --git a/script/super-token-solana/DeployEVMSolanaApps.s.sol b/script/super-token-solana/DeployEVMSolanaApps.s.sol index de7fd65f..c4882133 100644 --- a/script/super-token-solana/DeployEVMSolanaApps.s.sol +++ b/script/super-token-solana/DeployEVMSolanaApps.s.sol @@ -30,7 +30,6 @@ contract DeployEVMSolanaApps is Script { uint256 fees = 10 ether; EvmSolanaAppGateway gateway = new EvmSolanaAppGateway( - addressResolver, owner, fees, EvmSolanaAppGateway.SuperTokenEvmConstructorParams({ diff --git a/script/super-token-solana/EvmSolanaOnchainCalls.s.sol b/script/super-token-solana/EvmSolanaOnchainCalls.s.sol index c8a8bcb2..bb2c5290 100644 --- a/script/super-token-solana/EvmSolanaOnchainCalls.s.sol +++ b/script/super-token-solana/EvmSolanaOnchainCalls.s.sol @@ -46,7 +46,7 @@ contract EvmSolanaOnchainCalls is Script { uint256 srcAmount = 1000000; //mintOnEvm(srcAmount, userEvmAddress, appGateway); // mintOnSolana(srcAmount, userEvmAddress, switchboardSolana, appGateway); - transferEvmToSolana(srcAmount, userEvmAddress, switchboardSolana, appGateway); + transferEvmToSolana(srcAmount, userEvmAddress, appGateway); // This works: // appGateway.transferForDebug( @@ -71,7 +71,6 @@ contract EvmSolanaOnchainCalls is Script { function transferEvmToSolana( uint256 srcAmount, address userEvmAddress, - bytes32 switchboardSolana, EvmSolanaAppGateway appGateway ) public { console.log("Transfer EVM to Solana"); @@ -91,7 +90,7 @@ contract EvmSolanaOnchainCalls is Script { bytes memory orderEncoded = abi.encode(order); - appGateway.transfer(orderEncoded, solanaInstruction, switchboardSolana); + appGateway.transfer(orderEncoded, solanaInstruction); } function mintOnEvm( @@ -121,7 +120,6 @@ contract EvmSolanaOnchainCalls is Script { function mintOnSolana( uint256 srcAmount, address userEvmAddress, - bytes32 switchboardSolana, EvmSolanaAppGateway appGateway ) public { console.log("Mint on Solana"); @@ -139,7 +137,7 @@ contract EvmSolanaOnchainCalls is Script { }) ); - appGateway.mintSuperTokenSolana(solanaInstruction, switchboardSolana); + appGateway.mintSuperTokenSolana(solanaInstruction); } function buildSolanaInstruction( diff --git a/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol b/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol index 5c4eefff..ce2d4694 100644 --- a/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol +++ b/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol @@ -35,13 +35,12 @@ contract EvmSolanaAppGateway is AppGatewayBase, Ownable { } constructor( - address addressResolver_, address owner_, uint256 fees_, SuperTokenEvmConstructorParams memory params_, bytes32 solanaProgramId_, address forwarderSolanaAddress_ - ) AppGatewayBase(addressResolver_) { + ) { // for evm we use standard mode with contract deployment using EVMx creationCodeWithArgs[superTokenEvm] = abi.encodePacked( type(SuperToken).creationCode, @@ -63,14 +62,14 @@ contract EvmSolanaAppGateway is AppGatewayBase, Ownable { _initializeOwner(owner_); } - function deployEvmContract(uint32 chainSlug_) external async(bytes("")) { + function deployEvmContract(uint32 chainSlug_) external async { bytes memory initData = abi.encodeWithSelector(SuperToken.setOwner.selector, owner()); _deploy(superTokenEvm, chainSlug_, IsPlug.YES, initData); } // no need to call this directly, will be called automatically after all contracts are deployed. // check AppGatewayBase._deploy and AppGatewayBase.onRequestComplete - function initialize(uint32) public pure override { + function initializeOnChain(uint32) public pure override { return; } @@ -78,39 +77,40 @@ contract EvmSolanaAppGateway is AppGatewayBase, Ownable { return address(forwarderSolana.addressResolver__()); } - function transfer(bytes memory order_, SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external async(bytes("")) { + function transfer(bytes memory order_, SolanaInstruction memory solanaInstruction) external async { TransferOrderEvmToSolana memory order = abi.decode(order_, (TransferOrderEvmToSolana)); ISuperToken(order.srcEvmToken).burn(order.userEvm, order.srcAmount); // SolanaInstruction memory solanaInstruction = buildSolanaInstruction(order); /// we are directly calling the ForwarderSolana - forwarderSolana.callSolana(solanaInstruction, switchboardSolana); + forwarderSolana.callSolana(solanaInstruction); - emit Transferred(_getCurrentAsyncId()); + emit Transferred(_getCurrentRequestCount()); } - function mintSuperTokenEvm(bytes memory order_) external async(bytes("")) { + function mintSuperTokenEvm(bytes memory order_) external async { TransferOrderEvmToSolana memory order = abi.decode(order_, (TransferOrderEvmToSolana)); ISuperToken(order.srcEvmToken).mint(order.userEvm, order.srcAmount); - emit Transferred(_getCurrentAsyncId()); + emit Transferred(_getCurrentRequestCount()); } - function mintSuperTokenSolana(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external async(bytes("")) { + function mintSuperTokenSolana(SolanaInstruction memory solanaInstruction) external async { // we are directly calling the ForwarderSolana - forwarderSolana.callSolana(solanaInstruction, switchboardSolana); + forwarderSolana.callSolana(solanaInstruction); - emit Transferred(_getCurrentAsyncId()); + emit Transferred(_getCurrentRequestCount()); } - function transferForDebug(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external async(bytes("")) { + function transferForDebug(SolanaInstruction memory solanaInstruction) external async { // ISuperToken(order.srcEvmToken).burn(order.userEvm, order.srcAmount); // we are directly calling the ForwarderSolana - forwarderSolana.callSolana(solanaInstruction, switchboardSolana); + forwarderSolana.callSolana(solanaInstruction); + + emit Transferred(_getCurrentRequestCount()); - emit Transferred(_getCurrentAsyncId()); } /* From db1038a2d1d792640256bc592a77bcc7d8286c08 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Wed, 25 Jun 2025 10:21:50 +0200 Subject: [PATCH 10/18] refactor: add creating Solana style digest; emit debug events; fix deployDment scripts --- Errors.md | 13 ++ EventTopics.md | 9 + FunctionSignatures.md | 17 ++ contracts/evmx/helpers/ForwarderSolana.sol | 21 +-- contracts/evmx/watcher/Configurations.sol | 10 +- contracts/evmx/watcher/RequestHandler.sol | 28 ++++ .../watcher/precompiles/WritePrecompile.sol | 157 ++++++++++++++++-- contracts/utils/common/Constants.sol | 2 +- contracts/utils/common/Structs.sol | 2 +- foundry.toml | 48 +++--- hardhat-scripts/deploy/1.deploy.ts | 28 +++- hardhat-scripts/deploy/3.configureChains.ts | 16 ++ hardhat-scripts/deploy/6.connect.ts | 35 +++- hardhat.config.ts | 4 +- .../DeployEVMSolanaApps.s.sol | 6 +- .../EvmSolanaOnchainCalls.s.sol | 130 ++++++++++++--- src/enums.ts | 1 + test/DigestTest.t.sol | 88 ++++++++++ .../super-token/EvmSolanaAppGateway.sol | 11 +- 19 files changed, 534 insertions(+), 92 deletions(-) create mode 100644 test/DigestTest.t.sol diff --git a/Errors.md b/Errors.md index dc1933a7..029af1fb 100644 --- a/Errors.md +++ b/Errors.md @@ -17,6 +17,13 @@ | `PromiseRevertFailed()` | `0x0175b9de` | | `NotLatestPromise()` | `0x39ca95d3` | +## evmx/helpers/ForwarderSolana.sol + +| Error | Signature | +|-------|-----------| +| `InvalidSolanaChainSlug()` | `0xe37803ab` | +| `AddressResolverNotSet()` | `0x6d55276d` | + ## evmx/plugs/ContractFactoryPlug.sol | Error | Signature | @@ -33,6 +40,12 @@ | `InvalidDepositAmount()` | `0xfe9ba5cd` | | `TokenNotWhitelisted(address)` | `0xea3bff2e` | +## evmx/watcher/Configurations.sol + +| Error | Signature | +|-------|-----------| +| `InvalidSwitchboardTest(bytes32,bytes32)` | `0x702f36a1` | + ## evmx/watcher/RequestHandler.sol | Error | Signature | diff --git a/EventTopics.md b/EventTopics.md index 2c5b9a2c..589e474b 100644 --- a/EventTopics.md +++ b/EventTopics.md @@ -133,6 +133,12 @@ | ----- | --------- | ----- | | `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +## ForwarderSolana + +| Event | Arguments | Topic | +| ----- | --------- | ----- | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | + ## ProxyFactory | Event | Arguments | Topic | @@ -187,6 +193,7 @@ | `PlugAdded` | `(appGatewayId: bytes32, chainSlug: uint32, plug: bytes32)` | `0x3734a2406c5c2f2556c82a0819c51e42a135dd102465cc9856594481ea2f1637` | | `SocketSet` | `(chainSlug: uint32, socket: bytes32)` | `0x3200bf6ad2ab31b9220ed9d2f83089d7a1332f55aaa3825c57510743a315165b` | | `SwitchboardSet` | `(chainSlug: uint32, sbType: bytes32, switchboard: bytes32)` | `0xcdfbfa261040f4dffb03c7d9493f74b575f2ae533bb43fd7b5d5b24ac9d804f4` | +| `VerifyConnectionsSB` | `(switchboard: bytes32, switchboardExpected: bytes32)` | `0xf55cb41249952cf17b38f1473238606bcd5048a5202d544f5d401c24a1208403` | ## PromiseResolver @@ -205,6 +212,7 @@ | `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | | `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | | `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `PayloadIdData` | `(requestCount: uint40, batchCount: uint40, payloadCount: uint40, chainSlug: uint32, switchboard: bytes32, packed: bytes)` | `0x40cd955f96207785cb90a63920257959a7ca0c5f89377eaefbe53ccaa8e4b380` | | `RequestCancelled` | `(requestCount: uint40)` | `0xff191657769be72fc08def44c645014c60d18cb24b9ca05c9a33406a28253245` | | `RequestCompletedWithErrors` | `(requestCount: uint40)` | `0xd8d9915dc14b5a29b66cb263e1ea1e99e60418fc21d97f0fbf09cae1281291e2` | | `RequestSettled` | `(requestCount: uint40, winner: address)` | `0x1234f98acbe1548b214f4528461a5377f1e2349569c04caa59325e488e7d2aa4` | @@ -258,6 +266,7 @@ | ----- | --------- | ----- | | `ChainMaxMsgValueLimitsUpdated` | `(chainSlug: uint32, maxMsgValueLimit: uint256)` | `0x439087d094fe7dacbba3f0c67032041952d8bd58a891e15af10ced28fed0eb91` | | `ContractFactoryPlugSet` | `(chainSlug: uint32, contractFactoryPlug: bytes32)` | `0xfad552a6feb82bef23201b8dce04b2460bff41b00f26fef3d791572cfdab49c2` | +| `DigestWithSourceParams` | `(digest: bytes32, digestParams: tuple)` | `0x093e9b93d5aafe2a01beeb5ad1e80356601b533260651c08eda18b79912f315b` | | `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | | `FeesSet` | `(writeFees: uint256)` | `0x3346af6da1932164d501f2ec28f8c5d686db5828a36b77f2da4332d89184fe7b` | | `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | diff --git a/FunctionSignatures.md b/FunctionSignatures.md index e5d5ecd3..def1a84b 100644 --- a/FunctionSignatures.md +++ b/FunctionSignatures.md @@ -297,6 +297,22 @@ | `rescueFunds` | `0x6ccae054` | | `watcher__` | `0x300bb063` | +## ForwarderSolana + +| Function | Signature | +| -------- | --------- | +| `addressResolver__` | `0x6a750469` | +| `asyncDeployer__` | `0x2a39e801` | +| `callSolana` | `0x8af147d3` | +| `chainSlug` | `0xb349ba65` | +| `deployForwarder__` | `0xd4e3b034` | +| `feesManager__` | `0x70568b58` | +| `getChainSlug` | `0x0b8c6568` | +| `getOnChainAddress` | `0x9da48789` | +| `initialize` | `0x148841cb` | +| `onChainAddress` | `0x8bd0b363` | +| `watcher__` | `0x300bb063` | + ## ProxyFactory | Function | Signature | @@ -537,6 +553,7 @@ | `completeOwnershipHandover` | `0xf04e283e` | | `contractFactoryPlugs` | `0x35426631` | | `digestHashes` | `0xd1a862bf` | +| `encodeU64Borsh` | `0xacc1b559` | | `expiryTime` | `0x99bc0aea` | | `getDigest` | `0x91b6288b` | | `getPrecompileFees` | `0xb7a3d04c` | diff --git a/contracts/evmx/helpers/ForwarderSolana.sol b/contracts/evmx/helpers/ForwarderSolana.sol index 37f6f2c2..fbdd83c5 100644 --- a/contracts/evmx/helpers/ForwarderSolana.sol +++ b/contracts/evmx/helpers/ForwarderSolana.sol @@ -1,17 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -// import "./interfaces/IAddressResolver.sol"; -// import "./interfaces/IMiddleware.sol"; -// import "./interfaces/IAppGateway.sol"; -// import "./interfaces/IPromise.sol"; -// import "./interfaces/IForwarder.sol"; -// import {AddressResolverUtil} from "./AddressResolverUtil.sol"; -// import {AsyncModifierNotUsed, NoAsyncPromiseFound, PromiseCallerMismatch, RequestCountMismatch, DeliveryHelperNotSet} from "../utils/common/Errors.sol"; -// import "solady/utils/Initializable.sol"; -// import {SolanaInstruction} from "../utils/common/Structs.sol"; -// import {CHAIN_SLUG_SOLANA_MAINNET, CHAIN_SLUG_SOLANA_DEVNET} from "../utils/common/Constants.sol"; - import "solady/utils/Initializable.sol"; import "./AddressResolverUtil.sol"; import "../interfaces/IAddressResolver.sol"; @@ -23,14 +12,13 @@ import "../../utils/RescueFundsLib.sol"; import {toBytes32Format} from "../../utils/common/Converters.sol"; import {SolanaInstruction} from "../../utils/common/Structs.sol"; import {CHAIN_SLUG_SOLANA_MAINNET, CHAIN_SLUG_SOLANA_DEVNET} from "../../utils/common/Constants.sol"; -import { ForwarderStorage } from "./Forwarder.sol"; - +import {ForwarderStorage} from "./Forwarder.sol"; /// @title Forwarder Contract /// @notice This contract acts as a forwarder for async calls to the on-chain contracts. contract ForwarderSolana is ForwarderStorage, Initializable, AddressResolverUtil { - error InvalidSolanaChainSlug(); + error AddressResolverNotSet(); constructor() { _disableInitializers(); // disable for implementation @@ -89,7 +77,10 @@ contract ForwarderSolana is ForwarderStorage, Initializable, AddressResolverUtil /// @dev It queues the calls in the middleware and deploys the promise contract // function callSolana(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external { function callSolana(SolanaInstruction memory solanaInstruction) external { - if (address(watcher__()) == address(0)) { + if (address(addressResolver__) == address(0)) { + revert AddressResolverNotSet(); + } + if (address(watcher__()) == address(0)) { revert WatcherNotSet(); } diff --git a/contracts/evmx/watcher/Configurations.sol b/contracts/evmx/watcher/Configurations.sol index dc0b3694..d5fdf34d 100644 --- a/contracts/evmx/watcher/Configurations.sol +++ b/contracts/evmx/watcher/Configurations.sol @@ -14,6 +14,8 @@ abstract contract ConfigurationsStorage is IConfigurations { // slots [0-49] reserved for gap uint256[50] _gap_before; + error InvalidSwitchboardTest(bytes32 sb, bytes32 sbExpected); + // slot 50 /// @notice Maps network and plug to their configuration /// @dev chainSlug => plug => PlugConfig @@ -44,6 +46,9 @@ abstract contract ConfigurationsStorage is IConfigurations { /// @notice Configuration contract for the Watcher Precompile system /// @dev Handles the mapping between networks, plugs, and app gateways for payload execution contract Configurations is ConfigurationsStorage, Initializable, Ownable, WatcherBase { + // TODO:GW: remove after testing Solana + event VerifyConnectionsSB(bytes32 switchboard, bytes32 switchboardExpected); + /// @notice Emitted when a new plug is configured for an app gateway /// @param appGatewayId The id of the app gateway /// @param chainSlug The identifier of the destination network @@ -158,10 +163,13 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche bytes32 target_, address appGateway_, bytes32 switchboardType_ + // ) external { ) external view { (bytes32 appGatewayId, bytes32 switchboard) = getPlugConfigs(chainSlug_, target_); if (appGatewayId != toBytes32Format(appGateway_)) revert InvalidGateway(); - if (switchboard != switchboards[chainSlug_][switchboardType_]) revert InvalidSwitchboard(); + // emit VerifyConnectionsSB(switchboard, switchboards[chainSlug_][switchboardType_]); + // if (switchboard != switchboards[chainSlug_][switchboardType_]) revert InvalidSwitchboard(); + if (switchboard != switchboards[chainSlug_][switchboardType_]) revert InvalidSwitchboardTest(switchboard, switchboards[chainSlug_][switchboardType_]); } /** diff --git a/contracts/evmx/watcher/RequestHandler.sol b/contracts/evmx/watcher/RequestHandler.sol index ad1a6b71..d9bd933b 100644 --- a/contracts/evmx/watcher/RequestHandler.sol +++ b/contracts/evmx/watcher/RequestHandler.sol @@ -75,6 +75,16 @@ contract RequestHandler is RequestHandlerStorage, Initializable, Ownable, Addres event RequestCompletedWithErrors(uint40 requestCount); event RequestCancelled(uint40 requestCount); + // TODO: remove after testing Solana + event PayloadIdData( + uint40 requestCount, + uint40 batchCount, + uint40 payloadCount, + uint32 chainSlug, + bytes32 switchboard, + bytes packed + ); + modifier isRequestCancelled(uint40 requestCount_) { if (_requests[requestCount_].requestTrackingParams.isRequestCancelled) revert RequestAlreadyCancelled(); @@ -254,6 +264,24 @@ contract RequestHandler is RequestHandlerStorage, Initializable, Ownable, Addres ); _batchPayloadIds[nextBatchCount].push(payloadId); + // TODO: remove after testing Solana + uint32 chainSlugParam = queuePayloadParam.transaction.chainSlug; + bytes memory packed = abi.encodePacked( + requestCount_, + nextBatchCount, + payloadCount, + chainSlugParam, + switchboard + ); + emit PayloadIdData( + requestCount_, + nextBatchCount, + payloadCount, + chainSlugParam, + switchboard, + packed + ); + // create prev digest hash PayloadParams memory p; p.requestCount = requestCount_; diff --git a/contracts/evmx/watcher/precompiles/WritePrecompile.sol b/contracts/evmx/watcher/precompiles/WritePrecompile.sol index d5368408..ef7028a9 100644 --- a/contracts/evmx/watcher/precompiles/WritePrecompile.sol +++ b/contracts/evmx/watcher/precompiles/WritePrecompile.sol @@ -5,7 +5,7 @@ import "solady/utils/Initializable.sol"; import "solady/auth/Ownable.sol"; import "../../interfaces/IPrecompile.sol"; -import {WRITE, PAYLOAD_SIZE_LIMIT} from "../../../utils/common/Constants.sol"; +import {WRITE, PAYLOAD_SIZE_LIMIT, CHAIN_SLUG_SOLANA_MAINNET, CHAIN_SLUG_SOLANA_DEVNET} from "../../../utils/common/Constants.sol"; import {InvalidIndex, MaxMsgValueLimitExceeded, InvalidPayloadSize} from "../../../utils/common/Errors.sol"; import "../../../utils/RescueFundsLib.sol"; import "../WatcherBase.sol"; @@ -61,6 +61,9 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc PayloadParams payloadParams ); + // TODO: remove after testing Solana + event DigestWithSourceParams(bytes32 digest, DigestParams digestParams); + /// @notice Emitted when a proof is uploaded /// @param payloadId The unique identifier for the request /// @param proof The proof from the watcher @@ -175,26 +178,38 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc payloadParams.batchCount ); - // create digest - DigestParams memory digestParams_ = DigestParams( - configurations__().sockets(transaction.chainSlug), - transmitter_, - payloadParams.payloadId, - deadline, - payloadParams.callType, - gasLimit, - value, - transaction.payload, - transaction.target, - toBytes32Format(appGateway), - prevBatchDigestHash, - bytes("") - ); + // Construct parameters for digest calculation + DigestParams memory digestParams_; + if (_isSolanaChainSlug(transaction.chainSlug)) { + digestParams_ = _createSolanaDigestParams( + payloadParams, + transaction, + appGateway, + transmitter_, + prevBatchDigestHash, + deadline, + gasLimit, + value + ); + } else { + digestParams_ = _createEvmDigestParams( + payloadParams, + transaction, + appGateway, + transmitter_, + prevBatchDigestHash, + deadline, + gasLimit, + value + ); + } // Calculate and store digest from payload parameters bytes32 digest = getDigest(digestParams_); digestHashes[payloadParams.payloadId] = digest; + emit DigestWithSourceParams(digest, digestParams_); + emit WriteProofRequested( transmitter_, digest, @@ -250,6 +265,105 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc ); } + function _createEvmDigestParams( + PayloadParams memory payloadParams_, + Transaction memory transaction_, + address appGateway_, + address transmitter_, + bytes32 prevBatchDigestHash_, + uint256 deadline_, + uint256 gasLimit_, + uint256 value_ + ) internal view returns (DigestParams memory) { + // create digest + // DigestParams memory digestParams_ = DigestParams( + // configurations__().sockets(transaction.chainSlug), + // transmitter_, + // payloadParams.payloadId, + // deadline, + // payloadParams.callType, + // gasLimit, + // value, + // transaction.payload, + // transaction.target, + // toBytes32Format(appGateway), + // prevBatchDigestHash, + // bytes("") + // ); + + return + DigestParams( + configurations__().sockets(transaction_.chainSlug), + transmitter_, + payloadParams_.payloadId, + deadline_, + payloadParams_.callType, + gasLimit_, + value_, + transaction_.payload, + transaction_.target, + toBytes32Format(appGateway_), + prevBatchDigestHash_, + bytes("") + ); + } + + function _createSolanaDigestParams( + PayloadParams memory payloadParams_, + Transaction memory transaction_, + address appGateway_, + address transmitter_, + bytes32 prevBatchDigestHash_, + uint256 deadline_, + uint256 gasLimit_, + uint256 value_ + ) internal view returns (DigestParams memory) { + SolanaInstruction memory instruction = abi.decode( + transaction_.payload, + (SolanaInstruction) + ); + // TODO: this is a problem, function arguments must be packed in a way that is not later touched and that can be used on Solana side in raw Instruction call + // like a call data, so it should be Borsh encoded already here + bytes memory functionArgsPacked; + for (uint256 i = 0; i < instruction.data.functionArguments.length; i++) { + uint256 abiDecodedArg = abi.decode(instruction.data.functionArguments[i], (uint256)); + // silent assumption that all arguments are uint64 to simplify the encoding + uint64 arg = uint64(abiDecodedArg); + bytes8 borshEncodedArg = encodeU64Borsh(arg); + functionArgsPacked = abi.encodePacked(functionArgsPacked, borshEncodedArg); + } + + bytes memory payloadPacked = abi.encodePacked( + instruction.data.programId, + instruction.data.accounts, + instruction.data.instructionDiscriminator, + functionArgsPacked + ); + + // bytes32 of Solana Socket address : 9vFEQ5e3xf4eo17WttfqmXmnqN3gUicrhFGppmmNwyqV + bytes32 hardcodedSocket = 0x84815e8ca2f6dad7e12902c39a51bc72e13c48139b4fb10025d94e7abea2969c; + return + DigestParams( + // watcherPrecompileConfig__.sockets(params_.payloadHeader.getChainSlug()), // TODO: this does not work, for some reason it returns 0x000.... address + hardcodedSocket, + transmitter_, + payloadParams_.payloadId, + deadline_, + payloadParams_.callType, + gasLimit_, + value_, + payloadPacked, + transaction_.target, + toBytes32Format(appGateway_), + prevBatchDigestHash_, + bytes("") + ); + } + + function _isSolanaChainSlug(uint32 chainSlug_) internal pure returns (bool) { + return chainSlug_ == CHAIN_SLUG_SOLANA_MAINNET || chainSlug_ == CHAIN_SLUG_SOLANA_DEVNET; + } + /// @notice Marks a write request with a proof on digest /// @param payloadId_ The unique identifier of the request /// @param proof_ The watcher's proof @@ -305,4 +419,15 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyWatcher { RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); } + + // Borsh helper functions + function encodeU64Borsh(uint64 v) public pure returns (bytes8) { + return bytes8(swapBytes8(v)); + } + + function swapBytes8(uint64 v) internal pure returns (uint64) { + v = ((v & 0x00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00) >> 8); + v = ((v & 0x0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000) >> 16); + return (v << 32) | (v >> 32); + } } diff --git a/contracts/utils/common/Constants.sol b/contracts/utils/common/Constants.sol index eecc138a..62b19797 100644 --- a/contracts/utils/common/Constants.sol +++ b/contracts/utils/common/Constants.sol @@ -18,4 +18,4 @@ uint256 constant PAYLOAD_SIZE_LIMIT = 24_500; uint16 constant MAX_COPY_BYTES = 2048; // 2KB uint32 constant CHAIN_SLUG_SOLANA_MAINNET = 10000001; -uint32 constant CHAIN_SLUG_SOLANA_DEVNET = 10000002; +uint32 constant CHAIN_SLUG_SOLANA_DEVNET = 10000002; diff --git a/contracts/utils/common/Structs.sol b/contracts/utils/common/Structs.sol index bbfb46e7..3592a67f 100644 --- a/contracts/utils/common/Structs.sol +++ b/contracts/utils/common/Structs.sol @@ -230,4 +230,4 @@ struct SolanaInstructionDataDescription { bytes1[] accountFlags; // names for function argument types used later in data decoding in watcher and transmitter string[] functionArgumentTypeNames; -} \ No newline at end of file +} diff --git a/foundry.toml b/foundry.toml index 50557a6f..fc7fae52 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,27 +10,29 @@ evm_version = 'paris' via_ir = false [labels] -0xc9155aef2042DB8B088bDC19BaEb6986e291e077 = "AddressResolver" -0xd17957AF30c1AE7250A113E17F221C739B5da536 = "AddressResolverImpl" -0x2bcB99C7E3d135447410A6671F2Ba99A5F6DAEe5 = "AsyncDeployer" -0xa567410c4F3eaeE53F37aAD43FeEEb1E2bfE3D51 = "AsyncDeployerImpl" -0x9F8CB0b040F41cb53D3Ee165a589Ba311fE090eE = "AuctionManager" -0x034E00F1094F962f42950dEF0401e06940c5AfcC = "AuctionManagerImpl" -0x7f073B55a3c44B8ee60f1d21783517df8262e24f = "Configurations" -0x3B5e67DfdC6faf4C0E5C84fBe5600e26ce760444 = "ConfigurationsImpl" -0x72A9923E9dBf1f7a52694a7D467876F1495C656B = "DeployForwarder" -0xBe014D345a7D76F2682464ceF06a55BfA1D7A716 = "DeployForwarderImpl" -0xE12aF35E2930CBF7a7eD6F34ee6b7f9774f1E013 = "ERC1967Factory" -0x0Cab384393ab43A1E2da59498376EfF7324c87E7 = "FeesManager" -0xD6D008738Dac7391023F5C6A6d620AE1DdD1cA08 = "FeesManagerImpl" +0xEBBCa7Aa182fE5Fa6f891a776582Ce945E4ff43a = "AddressResolver" +0xa4FF2b386291A6DbBb6186A1fff37C235E9AF698 = "AddressResolverImpl" +0xD4E83aaDF6893e1a1C41646c068e5795d8708429 = "AsyncDeployer" +0x4b731545444500093957B3521E1A29b1e9BB989d = "AsyncDeployerImpl" +0xf5Ec4693bC9E3df9C248299C1bF5E97cbfaDb413 = "AuctionManager" +0xdDc5460808D19bce6cA05b1DaC425ee80C0A0086 = "AuctionManagerImpl" +0x48b3A2a434b9fE975E4B79a3C28c37Bc06a28f8b = "Configurations" +0x3A0123540353594D8beB826371D18d1F9EA2f01d = "ConfigurationsImpl" +0x7597271576B01bA949b9162870878192811e9268 = "DeployForwarder" +0xE7F208422F817cd703C83A859A2068bf1fF047B3 = "DeployForwarderImpl" +0xE7e73a8ffcF155BCe71BaB0a3b7c8BB68cfb6Bf0 = "ERC1967Factory" +0x357529E7D3F2fC1448560D095337D1bEaaA51Db4 = "FeesManager" +0x6944dC2Ae8ca915c4eE15b8b437E09aD8eBF2ED9 = "FeesManagerImpl" 0x9De353dD1131aB4e502590D3a1832652FA316268 = "FeesPool" -0x1357c7C53c4EC523c2bDde70F2C7c6cC16cfb111 = "PromiseResolver" -0x833CeaE292709aa55C59A9b59f66b5dDB0B50c62 = "ReadPrecompile" -0x8E07c6Ec1EbBDfEEc17103409F583d950B35b2D7 = "RequestHandler" -0x9dC6Cd010CcC342086d3F077a7cB6df0700E7A20 = "RequestHandlerImpl" -0xfE6E9CD8a8902CC90285B1607545A93F3794a391 = "SchedulePrecompile" -0x829a0A0D00c10075Bd17E731C5087Ceb4ebe7EFb = "Watcher" -0x3EC725ccF07d625648DA2eDCE1e05Fd87B9d9de6 = "WatcherImpl" -0xbB8067A271B93d59c22983fad022B5D342D357A5 = "WritePrecompile" -0x4342F1A730bBaFB966795bD57e7561143c902Dcb = "WritePrecompileImpl" -0xf8B4Ff208327Cd03d3Fd56032CCD9578CF49EEdF = "APP_GATEWAY" +0xe116CcF80015162584C77D1e9D1cbE1109443f91 = "ForwarderSolana" +0x0F471B6023CeE741Ec0287EE178b3A5cA90585b2 = "ForwarderSolanaImpl" +0xB1365F70cF2c9d5858F12c8DfB5ECBb66543538C = "PromiseResolver" +0x055C05c3f7cC24f216d42B30c4B94b343eF62f4e = "ReadPrecompile" +0xD243A5761C30Caf3ECC9305F778Ca111698E1182 = "RequestHandler" +0x8A59c8Ec8279366778f7fC4d8f7Ca111D4CfBD3D = "RequestHandlerImpl" +0x36b13Ae0b6d533d8B98EC6d7C7086Eec11361F4A = "SchedulePrecompile" +0xDF6726Cc8867e6AEd6C20f4696a8B98a46036467 = "Watcher" +0x86a2659B57e393aC5Ea4e8bf97e4b1e595a2f9C2 = "WatcherImpl" +0x4276fDBc8383De3CB6F527a40D2e5E4725Ec8BBb = "WritePrecompile" +0xDd13A39F991A7Dd702a0BEBcB31EB2e54d1625E6 = "WritePrecompileImpl" +0x4530a440dcc32206f901325143132da1eDB8d2E9 = "APP_GATEWAY" diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index f5e19534..566bf22e 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -2,7 +2,7 @@ import { config } from "dotenv"; import { Contract, utils, Wallet } from "ethers"; import { formatEther } from "ethers/lib/utils"; import { ethers } from "hardhat"; -import { ChainAddressesObj, ChainSlug, Contracts } from "../../src"; +import { ChainAddressesObj, ChainId, ChainSlug, Contracts } from "../../src"; import { AUCTION_END_DELAY_SECONDS, BID_TIMEOUT, @@ -37,6 +37,12 @@ config(); let EVMxOwner: string; +// cT9tVQf8NAwHk849ctDqeLhbN2B6JJi3LfR6GfuN751 - super-token test program id +export const mockForwarderSolanaOnChainAddress32Bytes = Buffer.from( + "0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c2448", + "hex" +); + const main = async () => { logConfig(); await logBalances(); @@ -249,6 +255,26 @@ const deployEVMxContracts = async () => { deployUtils.addresses[Contracts.SchedulePrecompile] = schedulePrecompile.address; + try { + console.log("AddressResolver address:", addressResolver.address); + + deployUtils = await deployContractWithProxy( + Contracts.ForwarderSolana, + `contracts/evmx/helpers/ForwarderSolana.sol`, + [ + ChainId.SOLANA_DEVNET, + mockForwarderSolanaOnChainAddress32Bytes, + addressResolver.address, + ], + proxyFactory, + deployUtils + ); + const forwarderSolanaAddress = deployUtils.addresses[Contracts.ForwarderSolana]; + console.log("ForwarderSolana Proxy:", forwarderSolanaAddress); + } catch (error) { + console.log("Error deploying ForwarderSolana:", error); + } + deployUtils.addresses.startBlock = (deployUtils.addresses.startBlock ? deployUtils.addresses.startBlock diff --git a/hardhat-scripts/deploy/3.configureChains.ts b/hardhat-scripts/deploy/3.configureChains.ts index a19da8bc..0c6deb80 100644 --- a/hardhat-scripts/deploy/3.configureChains.ts +++ b/hardhat-scripts/deploy/3.configureChains.ts @@ -104,6 +104,22 @@ async function setOnchainContracts( [chain, FAST_SWITCHBOARD_TYPE, toBytes32Format(switchboard)], signer ); + console.log("XXX Setting solana switchboard"); + console.log("FAST_SWITCHBOARD_TYPE: ", FAST_SWITCHBOARD_TYPE); + const solanaSwitchboard = process.env.SWITCHBOARD_SOLANA; + if (!solanaSwitchboard) throw new Error("SWITCHBOARD_SOLANA is not set"); + console.log("solanaSwitchboard as bytes32 reversed: ", Buffer.from(toBytes32Format(solanaSwitchboard)).toString("hex")); + await updateContractSettings( + EVMX_CHAIN_ID, + Contracts.Configurations, + "switchboards", + [ChainSlug.SOLANA_DEVNET, FAST_SWITCHBOARD_TYPE], + solanaSwitchboard, + "setSwitchboard", + [ChainSlug.SOLANA_DEVNET, FAST_SWITCHBOARD_TYPE, toBytes32Format(solanaSwitchboard)], + signer + ); + await updateContractSettings( EVMX_CHAIN_ID, Contracts.Configurations, diff --git a/hardhat-scripts/deploy/6.connect.ts b/hardhat-scripts/deploy/6.connect.ts index f9e9f471..e8b56731 100644 --- a/hardhat-scripts/deploy/6.connect.ts +++ b/hardhat-scripts/deploy/6.connect.ts @@ -1,4 +1,4 @@ -import { Wallet } from "ethers"; +import { ethers, Wallet } from "ethers"; import { ChainAddressesObj, ChainSlug, Contracts } from "../../src"; import { chains, EVMX_CHAIN_ID, mode } from "../config"; import { AppGatewayConfig, DeploymentAddresses } from "../constants"; @@ -14,6 +14,7 @@ import { } from "../utils"; import { getWatcherSigner, sendWatcherMultiCallWithNonce } from "../utils/sign"; import { isConfigSetOnEVMx, isConfigSetOnSocket } from "../utils"; +import { mockForwarderSolanaOnChainAddress32Bytes } from "./1.deploy"; const plugs = [Contracts.ContractFactoryPlug, Contracts.FeesPlug]; @@ -150,6 +151,38 @@ export const updateConfigEVMx = async () => { }) ); + //TODO:GW: This is a temporary workaround for th Solana POC + //--- + const appGatewayAddress = process.env.APP_GATEWAY; + if (!appGatewayAddress) throw new Error("APP_GATEWAY is not set"); + const solanaSwitchboard = process.env.SWITCHBOARD_SOLANA!.slice(2); // remove 0x prefix for Buffer from conversion + if (!solanaSwitchboard) throw new Error("SWITCHBOARD_SOLANA is not set"); + + const solanaSwitchboardBytes32 = Buffer.from(solanaSwitchboard, "hex"); + const solanaAppGatewayId = ethers.utils.hexZeroPad(appGatewayAddress, 32); + + console.log("SolanaAppGatewayId: ", solanaAppGatewayId); + console.log( + "SolanaSwitchboardBytes32: ", + solanaSwitchboardBytes32.toString("hex") + ); + + appConfigs.push({ + plugConfig: { + appGatewayId: solanaAppGatewayId, + switchboard: "0x" + solanaSwitchboardBytes32.toString("hex"), + }, + plug: "0x" + mockForwarderSolanaOnChainAddress32Bytes.toString("hex"), + chainSlug: ChainSlug.SOLANA_DEVNET, + }); + // appConfigs.push({ + // plug: "0x" + mockForwarderSolanaOnChainAddress32Bytes.toString("hex"), + // appGatewayId: solanaAppGatewayId, + // switchboard: "0x" + solanaSwitchboardBytes32.toString("hex"), + // chainSlug: ChainSlug.SOLANA_DEVNET, + // }); + //--- + // Update configs if any changes needed if (appConfigs.length > 0) { console.log({ appConfigs }); diff --git a/hardhat.config.ts b/hardhat.config.ts index f9745fe6..20f97d25 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -166,7 +166,7 @@ const config: HardhatUserConfig = { evmVersion: "paris", optimizer: { enabled: true, - runs: 1, + runs: 200, details: { yul: true, yulDetails: { @@ -174,7 +174,7 @@ const config: HardhatUserConfig = { }, }, }, - viaIR: false, + viaIR: true, }, }, }; diff --git a/script/super-token-solana/DeployEVMSolanaApps.s.sol b/script/super-token-solana/DeployEVMSolanaApps.s.sol index c4882133..7b55ecec 100644 --- a/script/super-token-solana/DeployEVMSolanaApps.s.sol +++ b/script/super-token-solana/DeployEVMSolanaApps.s.sol @@ -9,7 +9,6 @@ import {ETH_ADDRESS} from "../../contracts/utils/common/Constants.sol"; import {ForwarderSolana} from "../../contracts/evmx/helpers/ForwarderSolana.sol"; import {AddressResolver} from "../../contracts/evmx/helpers/AddressResolver.sol"; - // source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation --legacy --gas-price 0 contract DeployEVMSolanaApps is Script { function run() external { @@ -24,7 +23,7 @@ contract DeployEVMSolanaApps is Script { // fill with correct values after deployment bytes32 solanaProgramId = vm.envBytes32("SOLANA_TARGET_PROGRAM"); - address forwarderSolanaAddress = 0xCEC0c6c88217c687FcdE60bccfc7c14c1c0c72eB; + address forwarderSolanaAddress = 0xe116CcF80015162584C77D1e9D1cbE1109443f91; // Setting fee payment on Arbitrum Sepolia uint256 fees = 10 ether; @@ -40,7 +39,8 @@ contract DeployEVMSolanaApps is Script { initialSupply_: 100000000000 }), solanaProgramId, - forwarderSolanaAddress + forwarderSolanaAddress, + addressResolver ); // TODO: deploy super token on evm diff --git a/script/super-token-solana/EvmSolanaOnchainCalls.s.sol b/script/super-token-solana/EvmSolanaOnchainCalls.s.sol index bb2c5290..141d1792 100644 --- a/script/super-token-solana/EvmSolanaOnchainCalls.s.sol +++ b/script/super-token-solana/EvmSolanaOnchainCalls.s.sol @@ -43,9 +43,9 @@ contract EvmSolanaOnchainCalls is Script { // switchboardSolana // ); - uint256 srcAmount = 1000000; - //mintOnEvm(srcAmount, userEvmAddress, appGateway); - // mintOnSolana(srcAmount, userEvmAddress, switchboardSolana, appGateway); + uint256 srcAmount = 1000000; + // mintOnEvm(srcAmount, userEvmAddress, appGateway); + // mintOnSolana(srcAmount, userEvmAddress, appGateway); transferEvmToSolana(srcAmount, userEvmAddress, appGateway); // This works: @@ -64,8 +64,6 @@ contract EvmSolanaOnchainCalls is Script { // ), // switchboardSolana // ); - - } function transferEvmToSolana( @@ -75,16 +73,17 @@ contract EvmSolanaOnchainCalls is Script { ) public { console.log("Transfer EVM to Solana"); - EvmSolanaAppGateway.TransferOrderEvmToSolana memory order = EvmSolanaAppGateway.TransferOrderEvmToSolana({ - srcEvmToken: 0xd912E5870212FC22D56f3C7Cc04aAFfa54eFde31, // Forwarder(!!) for Super-token contract on given chain - // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q - dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, - userEvm: userEvmAddress, - // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr - destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, - srcAmount: srcAmount, - deadline: 1715702400 - }); + EvmSolanaAppGateway.TransferOrderEvmToSolana memory order = EvmSolanaAppGateway + .TransferOrderEvmToSolana({ + srcEvmToken: 0x817fe2ED9c6EE7507C30D1feea417d728546efA1, // Forwarder(!!) for Super-token contract on given chain + // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q + dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, + userEvm: userEvmAddress, + // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr + destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, + srcAmount: srcAmount, + deadline: 1715702400 + }); SolanaInstruction memory solanaInstruction = buildSolanaInstruction(order); @@ -100,16 +99,21 @@ contract EvmSolanaOnchainCalls is Script { ) public { console.log("Mint on EVM"); - bytes memory order = abi.encode(EvmSolanaAppGateway.TransferOrderEvmToSolana({ - srcEvmToken: 0xd912E5870212FC22D56f3C7Cc04aAFfa54eFde31, // Forwarder(!!) for Super-token contract on given chain - dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, // irrelevant for EVM minting - userEvm: userEvmAddress, - destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, // irrelevant for EVM minting - srcAmount: srcAmount, - deadline: 1715702400 - })); + bytes memory order = abi.encode( + EvmSolanaAppGateway.TransferOrderEvmToSolana({ + srcEvmToken: 0x817fe2ED9c6EE7507C30D1feea417d728546efA1, // Forwarder(!!) for Super-token contract on given chain + dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, // irrelevant for EVM minting + userEvm: userEvmAddress, + destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, // irrelevant for EVM minting + srcAmount: srcAmount, + deadline: 1715702400 + }) + ); - EvmSolanaAppGateway.TransferOrderEvmToSolana memory orderObj = abi.decode(order, (EvmSolanaAppGateway.TransferOrderEvmToSolana)); + EvmSolanaAppGateway.TransferOrderEvmToSolana memory orderObj = abi.decode( + order, + (EvmSolanaAppGateway.TransferOrderEvmToSolana) + ); console.log("Order srcEvmToken:", orderObj.srcEvmToken); console.log("Order userEvm:", orderObj.userEvm); console.log("Order srcAmount:", orderObj.srcAmount); @@ -194,4 +198,82 @@ contract EvmSolanaOnchainCalls is Script { }) }); } + + + function buildSolanaInstructionTest( + EvmSolanaAppGateway.TransferOrderEvmToSolana memory order + ) internal view returns (SolanaInstruction memory) { + bytes32 solanaTargetProgramId = vm.envBytes32("SOLANA_TARGET_PROGRAM"); + + // May be subject to change + bytes32[] memory accounts = new bytes32[](5); + // accounts 0 - superTokenConfigPda : jox6eY2gcjaKneNv96TKpjN7f3Rjcpn9dN9ZLNt3Krs + accounts[0] = 0x0af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d34; + // accounts 1 - mint account + accounts[1] = order.dstSolanaToken; + // accounts 2 - destination user ata + accounts[2] = order.destUserTokenAddress; + // accounts 3 - system programId: 11111111111111111111111111111111 + accounts[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; + // accounts 4 - token programId: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA + accounts[4] = 0x06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9; + + bytes[] memory functionArguments = new bytes[](1); + functionArguments[0] = abi.encode(order.srcAmount); + uint256[] memory array = new uint256[](100); + functionArguments[1] = abi.encode(array); + ComplexTestStruct memory complexTestStruct = ComplexTestStruct({ + name: "test", + addr: 0x1234567890123456789012345678901234567890123456789012345678901234, + isActive: true, + value: 100 + }); + functionArguments[2] = abi.encode(complexTestStruct); + + + string[] memory functionArgumentTypeNames = new string[](1); + functionArgumentTypeNames[0] = "u64"; + functionArgumentTypeNames[1] = "[u64;100]"; + functionArgumentTypeNames[2] = "{\"ComplexTestStruct\": {\"name\": \"string\",\"addr\": \"[u8;32]\",\"isActive\": \"boolean\",\"value\": \"u64\"}}"; + + bytes1[] memory accountFlags = new bytes1[](5); + // superTokenConfigPda is not writable + accountFlags[0] = bytes1(0x00); // false + // mint is writable + accountFlags[1] = bytes1(0x01); // true + // destination user ata is writable + accountFlags[2] = bytes1(0x01); // true + // system programId is not writable + accountFlags[3] = bytes1(0x00); // false + // token programId is not writable + accountFlags[4] = bytes1(0x00); // false + + // mint instruction discriminator + bytes8 instructionDiscriminator = 0x3339e12fb69289a6; + + + + return + SolanaInstruction({ + data: SolanaInstructionData({ + programId: solanaTargetProgramId, + instructionDiscriminator: instructionDiscriminator, + accounts: accounts, + functionArguments: functionArguments + }), + description: SolanaInstructionDataDescription({ + accountFlags: accountFlags, + functionArgumentTypeNames: functionArgumentTypeNames + }) + }); + } + + struct ComplexTestStruct { + string name; + bytes32 addr; + bool isActive; + uint256 value; + } } + + diff --git a/src/enums.ts b/src/enums.ts index f54d3ba8..2554dc61 100644 --- a/src/enums.ts +++ b/src/enums.ts @@ -65,6 +65,7 @@ export enum Contracts { FeesPool = "FeesPool", AsyncDeployer = "AsyncDeployer", DeployForwarder = "DeployForwarder", + ForwarderSolana = "ForwarderSolana", } export enum CallTypeNames { diff --git a/test/DigestTest.t.sol b/test/DigestTest.t.sol new file mode 100644 index 00000000..62e85fbc --- /dev/null +++ b/test/DigestTest.t.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity ^0.8.21; + +import "forge-std/Test.sol"; +import {DigestParams} from "../contracts/utils/common/Structs.sol"; +import "../contracts/utils/common/Constants.sol"; +import "forge-std/console.sol"; + +contract DigestTest is Test { + + function testCallType() pure public { + bytes4 READ = bytes4(keccak256("READ")); + bytes4 WRITE = bytes4(keccak256("WRITE")); + bytes4 SCHEDULE = bytes4(keccak256("SCHEDULE")); + + console.log("READ"); + console.logBytes4(READ); + console.log("WRITE"); + console.logBytes4(WRITE); + console.log("SCHEDULE"); + console.logBytes4(SCHEDULE); + } + + /** + emit DigestWithSourceParams(digest: 0xd64549c2e9bc8c443a5e8a5e375c72258a7131088b6fcd0c3297b40a686195b3, digestParams: DigestParams({ socket: 0x84815e8ca2f6dad7e12902c39a51bc72e13c48139b4fb10025d94e7abea2969c, transmitter: 0x138e9840861C983DC0BB9b3e941FB7C0e9Ade320, payloadId: 0x8c60d67962292aec8829ece076feee3bc37b486f9e6939cf56fa4f6bf25553bd, deadline: 1749307926 [1.749e9], callType: 1, gasLimit: 10000000 [1e7], value: 0, payload: 0x0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c24480af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d349ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb000000000000000000000000000000000000000000000000000000000000000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a93339e12fb69289a640420f0000000000, target: 0x55d893e742d43eafc1e6509eefca9ceb635a39bd3394041d334203ed35720922, appGatewayId: 0x000000000000000000000000751085ca028d2bcfc58cee2514def1ed72c843cd, prevDigestsHash: 0x4cfb2ef587acc8ad0cdb441f5b5e0624f7fef9c2fa084f5e93075cdc54d99d8f })) + */ + function testDigest3() public { + bytes32 expectedDigest = 0xd64549c2e9bc8c443a5e8a5e375c72258a7131088b6fcd0c3297b40a686195b3; + + DigestParams memory inputDigestParams = DigestParams({ + socket: 0x84815e8ca2f6dad7e12902c39a51bc72e13c48139b4fb10025d94e7abea2969c, + transmitter: 0x138e9840861C983DC0BB9b3e941FB7C0e9Ade320, + payloadId: 0x965c0b8c6c5c8dc6f433b34b72ecddcec35b2f36f700f50aed20a40366efa88a, + deadline: 1750681840, + callType: WRITE, + gasLimit: 10000000, + value: 0, + payload: hex"0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c24480af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d349ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb000000000000000000000000000000000000000000000000000000000000000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a93339e12fb69289a640420f0000000000", + // TODO: fix with correct super-token program id + target: 0x0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c2448, + appGatewayId: 0x0000000000000000000000004530a440dcc32206f901325143132da1edb8d2e9, + // prevDigestsHash: 0x4cfb2ef587acc8ad0cdb441f5b5e0624f7fef9c2fa084f5e93075cdc54d99d8f + prevDigestsHash: 0x0000000000000000000000000000000000000000000000000000000000000000 + }); + + assertEq(uint256(inputDigestParams.callType), uint256(1)); + + bytes memory packedParams = abi.encodePacked( + inputDigestParams.socket, + inputDigestParams.transmitter, + inputDigestParams.payloadId, + inputDigestParams.deadline, + inputDigestParams.callType, + inputDigestParams.gasLimit, + inputDigestParams.value, + inputDigestParams.payload, + inputDigestParams.target, + inputDigestParams.appGatewayId, + inputDigestParams.prevDigestsHash, + bytes("") + ); + console.log("packedParams"); + console.logBytes(packedParams); + + bytes32 actualDigest = getDigest(inputDigestParams); + assertEq(actualDigest, expectedDigest); + } + + // taken from WatcherPrecompileCore.getDigest() + function getDigest(DigestParams memory params_) public pure returns (bytes32 digest) { + digest = keccak256( + abi.encodePacked( + params_.socket, + params_.transmitter, + params_.payloadId, + params_.deadline, + params_.callType, + params_.gasLimit, + params_.value, + params_.payload, + params_.target, + params_.appGatewayId, + params_.prevDigestsHash, + bytes("") + ) + ); + } +} diff --git a/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol b/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol index ce2d4694..3e679626 100644 --- a/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol +++ b/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol @@ -8,7 +8,6 @@ import "./SuperToken.sol"; import {SolanaInstruction, SolanaInstructionData, SolanaInstructionDataDescription} from "../../../../contracts/utils/common/Structs.sol"; import {ForwarderSolana} from "../../../../contracts/evmx/helpers/ForwarderSolana.sol"; - contract EvmSolanaAppGateway is AppGatewayBase, Ownable { bytes32 public superTokenEvm = _createContractId("superTokenEvm"); // solana program address @@ -39,7 +38,8 @@ contract EvmSolanaAppGateway is AppGatewayBase, Ownable { uint256 fees_, SuperTokenEvmConstructorParams memory params_, bytes32 solanaProgramId_, - address forwarderSolanaAddress_ + address forwarderSolanaAddress_, + address addressResolver_ ) { // for evm we use standard mode with contract deployment using EVMx creationCodeWithArgs[superTokenEvm] = abi.encodePacked( @@ -60,6 +60,7 @@ contract EvmSolanaAppGateway is AppGatewayBase, Ownable { // they can be updated for each transfer as well _setMaxFees(fees_); _initializeOwner(owner_); + _initializeAppGateway(addressResolver_); } function deployEvmContract(uint32 chainSlug_) external async { @@ -77,7 +78,10 @@ contract EvmSolanaAppGateway is AppGatewayBase, Ownable { return address(forwarderSolana.addressResolver__()); } - function transfer(bytes memory order_, SolanaInstruction memory solanaInstruction) external async { + function transfer( + bytes memory order_, + SolanaInstruction memory solanaInstruction + ) external async { TransferOrderEvmToSolana memory order = abi.decode(order_, (TransferOrderEvmToSolana)); ISuperToken(order.srcEvmToken).burn(order.userEvm, order.srcAmount); @@ -110,7 +114,6 @@ contract EvmSolanaAppGateway is AppGatewayBase, Ownable { forwarderSolana.callSolana(solanaInstruction); emit Transferred(_getCurrentRequestCount()); - } /* From c9e61f335a8fbbd8b2eb5b69e5a6967ffb0b7246 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Wed, 2 Jul 2025 17:04:07 +0200 Subject: [PATCH 11/18] fix: after merge fix; remove unused test and fix IWatcher type --- contracts/evmx/interfaces/IWatcher.sol | 2 +- test/DigestTest.t.sol | 88 -------------------------- 2 files changed, 1 insertion(+), 89 deletions(-) delete mode 100644 test/DigestTest.t.sol diff --git a/contracts/evmx/interfaces/IWatcher.sol b/contracts/evmx/interfaces/IWatcher.sol index 795b9310..97fd6725 100644 --- a/contracts/evmx/interfaces/IWatcher.sol +++ b/contracts/evmx/interfaces/IWatcher.sol @@ -45,7 +45,7 @@ interface IWatcher { function triggerFromChainSlug() external view returns (uint32); - function triggerFromPlug() external view returns (address); + function triggerFromPlug() external view returns (bytes32); function isAppGatewayCalled(bytes32 triggerId) external view returns (bool); diff --git a/test/DigestTest.t.sol b/test/DigestTest.t.sol deleted file mode 100644 index 62e85fbc..00000000 --- a/test/DigestTest.t.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import "forge-std/Test.sol"; -import {DigestParams} from "../contracts/utils/common/Structs.sol"; -import "../contracts/utils/common/Constants.sol"; -import "forge-std/console.sol"; - -contract DigestTest is Test { - - function testCallType() pure public { - bytes4 READ = bytes4(keccak256("READ")); - bytes4 WRITE = bytes4(keccak256("WRITE")); - bytes4 SCHEDULE = bytes4(keccak256("SCHEDULE")); - - console.log("READ"); - console.logBytes4(READ); - console.log("WRITE"); - console.logBytes4(WRITE); - console.log("SCHEDULE"); - console.logBytes4(SCHEDULE); - } - - /** - emit DigestWithSourceParams(digest: 0xd64549c2e9bc8c443a5e8a5e375c72258a7131088b6fcd0c3297b40a686195b3, digestParams: DigestParams({ socket: 0x84815e8ca2f6dad7e12902c39a51bc72e13c48139b4fb10025d94e7abea2969c, transmitter: 0x138e9840861C983DC0BB9b3e941FB7C0e9Ade320, payloadId: 0x8c60d67962292aec8829ece076feee3bc37b486f9e6939cf56fa4f6bf25553bd, deadline: 1749307926 [1.749e9], callType: 1, gasLimit: 10000000 [1e7], value: 0, payload: 0x0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c24480af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d349ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb000000000000000000000000000000000000000000000000000000000000000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a93339e12fb69289a640420f0000000000, target: 0x55d893e742d43eafc1e6509eefca9ceb635a39bd3394041d334203ed35720922, appGatewayId: 0x000000000000000000000000751085ca028d2bcfc58cee2514def1ed72c843cd, prevDigestsHash: 0x4cfb2ef587acc8ad0cdb441f5b5e0624f7fef9c2fa084f5e93075cdc54d99d8f })) - */ - function testDigest3() public { - bytes32 expectedDigest = 0xd64549c2e9bc8c443a5e8a5e375c72258a7131088b6fcd0c3297b40a686195b3; - - DigestParams memory inputDigestParams = DigestParams({ - socket: 0x84815e8ca2f6dad7e12902c39a51bc72e13c48139b4fb10025d94e7abea2969c, - transmitter: 0x138e9840861C983DC0BB9b3e941FB7C0e9Ade320, - payloadId: 0x965c0b8c6c5c8dc6f433b34b72ecddcec35b2f36f700f50aed20a40366efa88a, - deadline: 1750681840, - callType: WRITE, - gasLimit: 10000000, - value: 0, - payload: hex"0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c24480af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d349ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb000000000000000000000000000000000000000000000000000000000000000006ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a93339e12fb69289a640420f0000000000", - // TODO: fix with correct super-token program id - target: 0x0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c2448, - appGatewayId: 0x0000000000000000000000004530a440dcc32206f901325143132da1edb8d2e9, - // prevDigestsHash: 0x4cfb2ef587acc8ad0cdb441f5b5e0624f7fef9c2fa084f5e93075cdc54d99d8f - prevDigestsHash: 0x0000000000000000000000000000000000000000000000000000000000000000 - }); - - assertEq(uint256(inputDigestParams.callType), uint256(1)); - - bytes memory packedParams = abi.encodePacked( - inputDigestParams.socket, - inputDigestParams.transmitter, - inputDigestParams.payloadId, - inputDigestParams.deadline, - inputDigestParams.callType, - inputDigestParams.gasLimit, - inputDigestParams.value, - inputDigestParams.payload, - inputDigestParams.target, - inputDigestParams.appGatewayId, - inputDigestParams.prevDigestsHash, - bytes("") - ); - console.log("packedParams"); - console.logBytes(packedParams); - - bytes32 actualDigest = getDigest(inputDigestParams); - assertEq(actualDigest, expectedDigest); - } - - // taken from WatcherPrecompileCore.getDigest() - function getDigest(DigestParams memory params_) public pure returns (bytes32 digest) { - digest = keccak256( - abi.encodePacked( - params_.socket, - params_.transmitter, - params_.payloadId, - params_.deadline, - params_.callType, - params_.gasLimit, - params_.value, - params_.payload, - params_.target, - params_.appGatewayId, - params_.prevDigestsHash, - bytes("") - ) - ); - } -} From 30127c71ccee29ac4b68e21216ca707062660376 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Wed, 2 Jul 2025 17:10:33 +0200 Subject: [PATCH 12/18] refactor: remove Solana related files and deploy script changes --- Errors.md | 7 - EventTopics.md | 6 - FunctionSignatures.md | 16 - contracts/evmx/helpers/ForwarderSolana.sol | 133 --------- foundry.toml | 2 - hardhat-scripts/deploy/1.deploy.ts | 26 -- hardhat-scripts/deploy/6.connect.ts | 33 --- .../DeployEVMSolanaApps.s.sol | 69 ----- .../EvmSolanaOnchainCalls.s.sol | 279 ------------------ src/enums.ts | 1 - .../super-token/EvmSolanaAppGateway.sol | 168 ----------- 11 files changed, 740 deletions(-) delete mode 100644 contracts/evmx/helpers/ForwarderSolana.sol delete mode 100644 script/super-token-solana/DeployEVMSolanaApps.s.sol delete mode 100644 script/super-token-solana/EvmSolanaOnchainCalls.s.sol delete mode 100644 test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol diff --git a/Errors.md b/Errors.md index 029af1fb..d9ec5c3c 100644 --- a/Errors.md +++ b/Errors.md @@ -17,13 +17,6 @@ | `PromiseRevertFailed()` | `0x0175b9de` | | `NotLatestPromise()` | `0x39ca95d3` | -## evmx/helpers/ForwarderSolana.sol - -| Error | Signature | -|-------|-----------| -| `InvalidSolanaChainSlug()` | `0xe37803ab` | -| `AddressResolverNotSet()` | `0x6d55276d` | - ## evmx/plugs/ContractFactoryPlug.sol | Error | Signature | diff --git a/EventTopics.md b/EventTopics.md index 589e474b..4781eea2 100644 --- a/EventTopics.md +++ b/EventTopics.md @@ -133,12 +133,6 @@ | ----- | --------- | ----- | | `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -## ForwarderSolana - -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | - ## ProxyFactory | Event | Arguments | Topic | diff --git a/FunctionSignatures.md b/FunctionSignatures.md index def1a84b..cfd25dce 100644 --- a/FunctionSignatures.md +++ b/FunctionSignatures.md @@ -297,22 +297,6 @@ | `rescueFunds` | `0x6ccae054` | | `watcher__` | `0x300bb063` | -## ForwarderSolana - -| Function | Signature | -| -------- | --------- | -| `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `callSolana` | `0x8af147d3` | -| `chainSlug` | `0xb349ba65` | -| `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `getChainSlug` | `0x0b8c6568` | -| `getOnChainAddress` | `0x9da48789` | -| `initialize` | `0x148841cb` | -| `onChainAddress` | `0x8bd0b363` | -| `watcher__` | `0x300bb063` | - ## ProxyFactory | Function | Signature | diff --git a/contracts/evmx/helpers/ForwarderSolana.sol b/contracts/evmx/helpers/ForwarderSolana.sol deleted file mode 100644 index fbdd83c5..00000000 --- a/contracts/evmx/helpers/ForwarderSolana.sol +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import "solady/utils/Initializable.sol"; -import "./AddressResolverUtil.sol"; -import "../interfaces/IAddressResolver.sol"; -import "../interfaces/IAppGateway.sol"; -import "../interfaces/IForwarder.sol"; -import {QueueParams, OverrideParams, Transaction} from "../../utils/common/Structs.sol"; -import {AsyncModifierNotSet, WatcherNotSet, InvalidOnChainAddress} from "../../utils/common/Errors.sol"; -import "../../utils/RescueFundsLib.sol"; -import {toBytes32Format} from "../../utils/common/Converters.sol"; -import {SolanaInstruction} from "../../utils/common/Structs.sol"; -import {CHAIN_SLUG_SOLANA_MAINNET, CHAIN_SLUG_SOLANA_DEVNET} from "../../utils/common/Constants.sol"; -import {ForwarderStorage} from "./Forwarder.sol"; - -/// @title Forwarder Contract -/// @notice This contract acts as a forwarder for async calls to the on-chain contracts. -contract ForwarderSolana is ForwarderStorage, Initializable, AddressResolverUtil { - error InvalidSolanaChainSlug(); - error AddressResolverNotSet(); - - constructor() { - _disableInitializers(); // disable for implementation - } - - /// @notice Initializer to replace constructor for upgradeable contracts - /// @param chainSlug_ chain slug on which the contract is deployed - //// @param onChainAddress_ on-chain address associated with this forwarder - /// @param addressResolver_ address resolver contract - function initialize( - uint32 chainSlug_, - bytes32 onChainAddress_, - address addressResolver_ - ) public initializer { - if (chainSlug_ == CHAIN_SLUG_SOLANA_MAINNET || chainSlug_ == CHAIN_SLUG_SOLANA_DEVNET) { - chainSlug = chainSlug_; - } else { - revert InvalidSolanaChainSlug(); - } - onChainAddress = onChainAddress_; - _setAddressResolver(addressResolver_); - } - - /// @notice Stores the callback address and data to be executed once the promise is resolved. - /// @dev This function should not be called before the fallback function. - /// @dev It resets the latest async promise address - /// @param selector_ The function selector for callback - /// @param data_ The data to be passed to callback - /// @return promise_ The address of the new promise - // TODO:GW: uncommenting this is making the deployment fail silently - // function then(bytes4 selector_, bytes memory data_) external returns (address promise_) { - // if (latestAsyncPromise == address(0)) revert NoAsyncPromiseFound(); - // if (latestPromiseCaller != msg.sender) revert PromiseCallerMismatch(); - // if (latestRequestCount != watcherPrecompile__().nextRequestCount()) - // revert RequestCountMismatch(); - - // address latestAsyncPromise_ = latestAsyncPromise; - // latestAsyncPromise = address(0); - - // promise_ = IPromise(latestAsyncPromise_).then(selector_, data_); - // } - - /// @notice Returns the on-chain address associated with this forwarder. - /// @return The on-chain address. - function getOnChainAddress() external view returns (bytes32) { - return onChainAddress; - } - - /// @notice Returns the chain slug on which the contract is deployed. - /// @return chain slug - function getChainSlug() external view returns (uint32) { - return chainSlug; - } - - /// @notice Fallback function to process the contract calls to onChainAddress - /// @dev It queues the calls in the middleware and deploys the promise contract - // function callSolana(SolanaInstruction memory solanaInstruction, bytes32 switchboardSolana) external { - function callSolana(SolanaInstruction memory solanaInstruction) external { - if (address(addressResolver__) == address(0)) { - revert AddressResolverNotSet(); - } - if (address(watcher__()) == address(0)) { - revert WatcherNotSet(); - } - - // validates if the async modifier is set - address msgSender = msg.sender; - bool isAsyncModifierSet = IAppGateway(msgSender).isAsyncModifierSet(); - if (!isAsyncModifierSet) revert AsyncModifierNotSet(); - - // fetch the override params from app gateway - (OverrideParams memory overrideParams, bytes32 sbType) = IAppGateway(msgSender) - .getOverrideParams(); - - // TODO:GW: after POC make it work like below - // get the switchboard address from the watcher precompile config - // address switchboard = watcherPrecompileConfig().switchboards(chainSlug, sbType); - - bytes memory solanaPayload = abi.encode(solanaInstruction); - - // Queue the call in the middleware. - QueueParams memory queueParams; - queueParams.overrideParams = overrideParams; - queueParams.transaction = Transaction({ - chainSlug: chainSlug, - target: onChainAddress, - payload: solanaPayload - }); - queueParams.switchboardType = sbType; - watcher__().queue(queueParams, msgSender); - - // Queue the call in the middleware. - // deliveryHelper__().queue( - // QueuePayloadParams({ - // chainSlug: chainSlug, - // callType: isReadCall == Read.ON ? CallType.READ : CallType.WRITE, - // isParallel: isParallelCall, - // isPlug: IsPlug.NO, - // writeFinality: writeFinality, - // asyncPromise: latestAsyncPromise, - // switchboard: switchboardSolana, - // target: onChainAddress, - // appGateway: msg.sender, - // gasLimit: gasLimit, - // value: value, - // readAt: readAt, - // payload: solanaPayload, - // initCallData: bytes("") - // }) - // ); - } -} diff --git a/foundry.toml b/foundry.toml index fc7fae52..a63f4924 100644 --- a/foundry.toml +++ b/foundry.toml @@ -24,8 +24,6 @@ via_ir = false 0x357529E7D3F2fC1448560D095337D1bEaaA51Db4 = "FeesManager" 0x6944dC2Ae8ca915c4eE15b8b437E09aD8eBF2ED9 = "FeesManagerImpl" 0x9De353dD1131aB4e502590D3a1832652FA316268 = "FeesPool" -0xe116CcF80015162584C77D1e9D1cbE1109443f91 = "ForwarderSolana" -0x0F471B6023CeE741Ec0287EE178b3A5cA90585b2 = "ForwarderSolanaImpl" 0xB1365F70cF2c9d5858F12c8DfB5ECBb66543538C = "PromiseResolver" 0x055C05c3f7cC24f216d42B30c4B94b343eF62f4e = "ReadPrecompile" 0xD243A5761C30Caf3ECC9305F778Ca111698E1182 = "RequestHandler" diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 19f8a2bb..af18ecf9 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -37,12 +37,6 @@ config(); let EVMxOwner: string; -// cT9tVQf8NAwHk849ctDqeLhbN2B6JJi3LfR6GfuN751 - super-token test program id -export const mockForwarderSolanaOnChainAddress32Bytes = Buffer.from( - "0914e65e59622aeeefb7f007aef36df62d4c380895553b0643fcc4383c7c2448", - "hex" -); - const main = async () => { logConfig(); await logBalances(); @@ -255,26 +249,6 @@ const deployEVMxContracts = async () => { deployUtils.addresses[Contracts.SchedulePrecompile] = schedulePrecompile.address; - try { - console.log("AddressResolver address:", addressResolver.address); - - deployUtils = await deployContractWithProxy( - Contracts.ForwarderSolana, - `contracts/evmx/helpers/ForwarderSolana.sol`, - [ - ChainId.SOLANA_DEVNET, - mockForwarderSolanaOnChainAddress32Bytes, - addressResolver.address, - ], - proxyFactory, - deployUtils - ); - const forwarderSolanaAddress = deployUtils.addresses[Contracts.ForwarderSolana]; - console.log("ForwarderSolana Proxy:", forwarderSolanaAddress); - } catch (error) { - console.log("Error deploying ForwarderSolana:", error); - } - deployUtils.addresses.startBlock = (deployUtils.addresses.startBlock ? deployUtils.addresses.startBlock diff --git a/hardhat-scripts/deploy/6.connect.ts b/hardhat-scripts/deploy/6.connect.ts index e8b56731..5d427734 100644 --- a/hardhat-scripts/deploy/6.connect.ts +++ b/hardhat-scripts/deploy/6.connect.ts @@ -14,7 +14,6 @@ import { } from "../utils"; import { getWatcherSigner, sendWatcherMultiCallWithNonce } from "../utils/sign"; import { isConfigSetOnEVMx, isConfigSetOnSocket } from "../utils"; -import { mockForwarderSolanaOnChainAddress32Bytes } from "./1.deploy"; const plugs = [Contracts.ContractFactoryPlug, Contracts.FeesPlug]; @@ -151,38 +150,6 @@ export const updateConfigEVMx = async () => { }) ); - //TODO:GW: This is a temporary workaround for th Solana POC - //--- - const appGatewayAddress = process.env.APP_GATEWAY; - if (!appGatewayAddress) throw new Error("APP_GATEWAY is not set"); - const solanaSwitchboard = process.env.SWITCHBOARD_SOLANA!.slice(2); // remove 0x prefix for Buffer from conversion - if (!solanaSwitchboard) throw new Error("SWITCHBOARD_SOLANA is not set"); - - const solanaSwitchboardBytes32 = Buffer.from(solanaSwitchboard, "hex"); - const solanaAppGatewayId = ethers.utils.hexZeroPad(appGatewayAddress, 32); - - console.log("SolanaAppGatewayId: ", solanaAppGatewayId); - console.log( - "SolanaSwitchboardBytes32: ", - solanaSwitchboardBytes32.toString("hex") - ); - - appConfigs.push({ - plugConfig: { - appGatewayId: solanaAppGatewayId, - switchboard: "0x" + solanaSwitchboardBytes32.toString("hex"), - }, - plug: "0x" + mockForwarderSolanaOnChainAddress32Bytes.toString("hex"), - chainSlug: ChainSlug.SOLANA_DEVNET, - }); - // appConfigs.push({ - // plug: "0x" + mockForwarderSolanaOnChainAddress32Bytes.toString("hex"), - // appGatewayId: solanaAppGatewayId, - // switchboard: "0x" + solanaSwitchboardBytes32.toString("hex"), - // chainSlug: ChainSlug.SOLANA_DEVNET, - // }); - //--- - // Update configs if any changes needed if (appConfigs.length > 0) { console.log({ appConfigs }); diff --git a/script/super-token-solana/DeployEVMSolanaApps.s.sol b/script/super-token-solana/DeployEVMSolanaApps.s.sol deleted file mode 100644 index 7b55ecec..00000000 --- a/script/super-token-solana/DeployEVMSolanaApps.s.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {EvmSolanaAppGateway} from "../../test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol"; -import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; -import {ETH_ADDRESS} from "../../contracts/utils/common/Constants.sol"; -import {ForwarderSolana} from "../../contracts/evmx/helpers/ForwarderSolana.sol"; -import {AddressResolver} from "../../contracts/evmx/helpers/AddressResolver.sol"; - -// source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation --legacy --gas-price 0 -contract DeployEVMSolanaApps is Script { - function run() external { - address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); - // address owner = vm.envAddress("OWNER"); - address owner = vm.envAddress("SENDER_ADDRESS"); // TODO: what address should be used here?– - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - // fill with correct values after deployment - bytes32 solanaProgramId = vm.envBytes32("SOLANA_TARGET_PROGRAM"); - address forwarderSolanaAddress = 0xe116CcF80015162584C77D1e9D1cbE1109443f91; - - // Setting fee payment on Arbitrum Sepolia - uint256 fees = 10 ether; - - EvmSolanaAppGateway gateway = new EvmSolanaAppGateway( - owner, - fees, - EvmSolanaAppGateway.SuperTokenEvmConstructorParams({ - name_: "SuperToken-Evm", - symbol_: "SUPER", - decimals_: 6, - initialSupplyHolder_: owner, - initialSupply_: 100000000000 - }), - solanaProgramId, - forwarderSolanaAddress, - addressResolver - ); - - // TODO: deploy super token on evm - // TODO: callSolana() on gateway - - console.log("Contracts deployed:"); - console.log("EvmSolanaAppGateway:", address(gateway)); - console.log("solanaProgramId:"); - console.logBytes32(solanaProgramId); - console.log("forwarderSolanaAddress:"); - console.logAddress(forwarderSolanaAddress); - - console.log("Forwarder Solana address resolver:"); - console.log(address(ForwarderSolana(forwarderSolanaAddress).addressResolver__())); - console.log("ForwarderSolana chain slug:"); - console.log(ForwarderSolana(forwarderSolanaAddress).chainSlug()); - console.log("ForwarderSolana onChainAddress:"); - console.logBytes32(ForwarderSolana(forwarderSolanaAddress).onChainAddress()); - - console.log("Address resolver from vars:"); - console.log(addressResolver); - - // console.log("Address resolver owner:"); - // console.log(AddressResolver(address(ForwarderSolana(forwarderSolanaAddress).addressResolver__())).owner()); - } -} diff --git a/script/super-token-solana/EvmSolanaOnchainCalls.s.sol b/script/super-token-solana/EvmSolanaOnchainCalls.s.sol deleted file mode 100644 index 141d1792..00000000 --- a/script/super-token-solana/EvmSolanaOnchainCalls.s.sol +++ /dev/null @@ -1,279 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {ETH_ADDRESS} from "../../contracts/utils/common/Constants.sol"; -import {EvmSolanaAppGateway} from "../../test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol"; -import {SolanaInstruction, SolanaInstructionData, SolanaInstructionDataDescription} from "../../contracts/utils/common/Structs.sol"; - -// source .env && forge script script/counter/EvmSolanaOnchainCalls.s.sol --broadcast --skip-simulation --legacy --gas-price 0 -contract EvmSolanaOnchainCalls is Script { - function run() external { - string memory rpc = vm.envString("EVMX_RPC"); - console.log(rpc); - vm.createSelectFork(rpc); - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - EvmSolanaAppGateway appGateway = EvmSolanaAppGateway(vm.envAddress("APP_GATEWAY")); - bytes32 switchboardSolana = vm.envBytes32("SWITCHBOARD_SOLANA"); - address userEvmAddress = vm.envAddress("EVM_TEST_ACCOUNT"); - - console.log("EvmSolanaAppGateway:", address(appGateway)); - console.log("Switchboard solana:"); - console.logBytes32(switchboardSolana); - console.log("User address: ", userEvmAddress); - - // console.log("Deploying SuperToken on Optimism Sepolia..."); - // appGateway.deployEvmContract(11155420); - - // appGateway.transfer( - // abi.encode( - // EvmSolanaAppGateway.TransferOrderEvmToSolana({ - // srcEvmToken: 0x4200000000000000000000000000000000000006, - // dstSolanaToken: 0x66619ffe200970bf084fa4713da27d7dff551179adac93fc552787c7555f3482, - // userEvm: 0x4200000000000000000000000000000000000005, - // destUserTokenAddress: 0x44419ffe200970bf084fa4713da27d7dff551179adac93fc552787c7555f3482, - // srcAmount: 1000000000000000000, - // deadline: 1715702400 - // }) - // ), - // switchboardSolana - // ); - - uint256 srcAmount = 1000000; - // mintOnEvm(srcAmount, userEvmAddress, appGateway); - // mintOnSolana(srcAmount, userEvmAddress, appGateway); - transferEvmToSolana(srcAmount, userEvmAddress, appGateway); - - // This works: - // appGateway.transferForDebug( - // buildSolanaInstruction( - // EvmSolanaAppGateway.TransferOrderEvmToSolana({ - // srcEvmToken: 0x4200000000000000000000000000000000000006, - // // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q - // dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, - // userEvm: 0x4200000000000000000000000000000000000005, - // // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr - // destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, - // srcAmount: 1000000, - // deadline: 1715702400 - // }) - // ), - // switchboardSolana - // ); - } - - function transferEvmToSolana( - uint256 srcAmount, - address userEvmAddress, - EvmSolanaAppGateway appGateway - ) public { - console.log("Transfer EVM to Solana"); - - EvmSolanaAppGateway.TransferOrderEvmToSolana memory order = EvmSolanaAppGateway - .TransferOrderEvmToSolana({ - srcEvmToken: 0x817fe2ED9c6EE7507C30D1feea417d728546efA1, // Forwarder(!!) for Super-token contract on given chain - // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q - dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, - userEvm: userEvmAddress, - // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr - destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, - srcAmount: srcAmount, - deadline: 1715702400 - }); - - SolanaInstruction memory solanaInstruction = buildSolanaInstruction(order); - - bytes memory orderEncoded = abi.encode(order); - - appGateway.transfer(orderEncoded, solanaInstruction); - } - - function mintOnEvm( - uint256 srcAmount, - address userEvmAddress, - EvmSolanaAppGateway appGateway - ) public { - console.log("Mint on EVM"); - - bytes memory order = abi.encode( - EvmSolanaAppGateway.TransferOrderEvmToSolana({ - srcEvmToken: 0x817fe2ED9c6EE7507C30D1feea417d728546efA1, // Forwarder(!!) for Super-token contract on given chain - dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, // irrelevant for EVM minting - userEvm: userEvmAddress, - destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, // irrelevant for EVM minting - srcAmount: srcAmount, - deadline: 1715702400 - }) - ); - - EvmSolanaAppGateway.TransferOrderEvmToSolana memory orderObj = abi.decode( - order, - (EvmSolanaAppGateway.TransferOrderEvmToSolana) - ); - console.log("Order srcEvmToken:", orderObj.srcEvmToken); - console.log("Order userEvm:", orderObj.userEvm); - console.log("Order srcAmount:", orderObj.srcAmount); - - appGateway.mintSuperTokenEvm(order); - } - - function mintOnSolana( - uint256 srcAmount, - address userEvmAddress, - EvmSolanaAppGateway appGateway - ) public { - console.log("Mint on Solana"); - - SolanaInstruction memory solanaInstruction = buildSolanaInstruction( - EvmSolanaAppGateway.TransferOrderEvmToSolana({ - srcEvmToken: 0xD4a20b34D0dE11e3382Aaa7E0839844f154B6191, - // mint on local-testnet: BdUzPsaAicEWinR7b14YLtvavwM8zYn8BaHKqGQ8by2q - dstSolanaToken: 0x9ded6d20f1f5b9c56cb90ef89fc52d355aaaa868c42738eff11f50d1f81f522a, - userEvm: userEvmAddress, - // alice super token ata: LVuCmGaoHjAGu54dFppzujS1Ti61CBac57taeQbokUr - destUserTokenAddress: 0x04feb6778939c89983aac734e237dc22f49d7b4418d378a516df15a255d084cb, - srcAmount: srcAmount, - deadline: 1715702400 - }) - ); - - appGateway.mintSuperTokenSolana(solanaInstruction); - } - - function buildSolanaInstruction( - EvmSolanaAppGateway.TransferOrderEvmToSolana memory order - ) internal view returns (SolanaInstruction memory) { - bytes32 solanaTargetProgramId = vm.envBytes32("SOLANA_TARGET_PROGRAM"); - - // May be subject to change - bytes32[] memory accounts = new bytes32[](5); - // accounts 0 - superTokenConfigPda : jox6eY2gcjaKneNv96TKpjN7f3Rjcpn9dN9ZLNt3Krs - accounts[0] = 0x0af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d34; - // accounts 1 - mint account - accounts[1] = order.dstSolanaToken; - // accounts 2 - destination user ata - accounts[2] = order.destUserTokenAddress; - // accounts 3 - system programId: 11111111111111111111111111111111 - accounts[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; - // accounts 4 - token programId: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - accounts[4] = 0x06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9; - - bytes[] memory functionArguments = new bytes[](1); - // TODO:GW: in watcher and transmitter we might need to convert this value if on Solana mint has different decimals, for now we assume that both are the same - functionArguments[0] = abi.encode(order.srcAmount); - - bytes1[] memory accountFlags = new bytes1[](5); - // superTokenConfigPda is not writable - accountFlags[0] = bytes1(0x00); // false - // mint is writable - accountFlags[1] = bytes1(0x01); // true - // destination user ata is writable - accountFlags[2] = bytes1(0x01); // true - // system programId is not writable - accountFlags[3] = bytes1(0x00); // false - // token programId is not writable - accountFlags[4] = bytes1(0x00); // false - - // mint instruction discriminator - bytes8 instructionDiscriminator = 0x3339e12fb69289a6; - - string[] memory functionArgumentTypeNames = new string[](1); - functionArgumentTypeNames[0] = "u64"; - - return - SolanaInstruction({ - data: SolanaInstructionData({ - programId: solanaTargetProgramId, - instructionDiscriminator: instructionDiscriminator, - accounts: accounts, - functionArguments: functionArguments - }), - description: SolanaInstructionDataDescription({ - accountFlags: accountFlags, - functionArgumentTypeNames: functionArgumentTypeNames - }) - }); - } - - - function buildSolanaInstructionTest( - EvmSolanaAppGateway.TransferOrderEvmToSolana memory order - ) internal view returns (SolanaInstruction memory) { - bytes32 solanaTargetProgramId = vm.envBytes32("SOLANA_TARGET_PROGRAM"); - - // May be subject to change - bytes32[] memory accounts = new bytes32[](5); - // accounts 0 - superTokenConfigPda : jox6eY2gcjaKneNv96TKpjN7f3Rjcpn9dN9ZLNt3Krs - accounts[0] = 0x0af77affb0a5db632e9bafb98525232515d440861c9942e447c20eefd8883d34; - // accounts 1 - mint account - accounts[1] = order.dstSolanaToken; - // accounts 2 - destination user ata - accounts[2] = order.destUserTokenAddress; - // accounts 3 - system programId: 11111111111111111111111111111111 - accounts[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; - // accounts 4 - token programId: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - accounts[4] = 0x06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9; - - bytes[] memory functionArguments = new bytes[](1); - functionArguments[0] = abi.encode(order.srcAmount); - uint256[] memory array = new uint256[](100); - functionArguments[1] = abi.encode(array); - ComplexTestStruct memory complexTestStruct = ComplexTestStruct({ - name: "test", - addr: 0x1234567890123456789012345678901234567890123456789012345678901234, - isActive: true, - value: 100 - }); - functionArguments[2] = abi.encode(complexTestStruct); - - - string[] memory functionArgumentTypeNames = new string[](1); - functionArgumentTypeNames[0] = "u64"; - functionArgumentTypeNames[1] = "[u64;100]"; - functionArgumentTypeNames[2] = "{\"ComplexTestStruct\": {\"name\": \"string\",\"addr\": \"[u8;32]\",\"isActive\": \"boolean\",\"value\": \"u64\"}}"; - - bytes1[] memory accountFlags = new bytes1[](5); - // superTokenConfigPda is not writable - accountFlags[0] = bytes1(0x00); // false - // mint is writable - accountFlags[1] = bytes1(0x01); // true - // destination user ata is writable - accountFlags[2] = bytes1(0x01); // true - // system programId is not writable - accountFlags[3] = bytes1(0x00); // false - // token programId is not writable - accountFlags[4] = bytes1(0x00); // false - - // mint instruction discriminator - bytes8 instructionDiscriminator = 0x3339e12fb69289a6; - - - - return - SolanaInstruction({ - data: SolanaInstructionData({ - programId: solanaTargetProgramId, - instructionDiscriminator: instructionDiscriminator, - accounts: accounts, - functionArguments: functionArguments - }), - description: SolanaInstructionDataDescription({ - accountFlags: accountFlags, - functionArgumentTypeNames: functionArgumentTypeNames - }) - }); - } - - struct ComplexTestStruct { - string name; - bytes32 addr; - bool isActive; - uint256 value; - } -} - - diff --git a/src/enums.ts b/src/enums.ts index 2554dc61..f54d3ba8 100644 --- a/src/enums.ts +++ b/src/enums.ts @@ -65,7 +65,6 @@ export enum Contracts { FeesPool = "FeesPool", AsyncDeployer = "AsyncDeployer", DeployForwarder = "DeployForwarder", - ForwarderSolana = "ForwarderSolana", } export enum CallTypeNames { diff --git a/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol b/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol deleted file mode 100644 index 3e679626..00000000 --- a/test/apps/app-gateways/super-token/EvmSolanaAppGateway.sol +++ /dev/null @@ -1,168 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import "solady/auth/Ownable.sol"; -import "../../../../contracts/evmx/base/AppGatewayBase.sol"; -import "./ISuperToken.sol"; -import "./SuperToken.sol"; -import {SolanaInstruction, SolanaInstructionData, SolanaInstructionDataDescription} from "../../../../contracts/utils/common/Structs.sol"; -import {ForwarderSolana} from "../../../../contracts/evmx/helpers/ForwarderSolana.sol"; - -contract EvmSolanaAppGateway is AppGatewayBase, Ownable { - bytes32 public superTokenEvm = _createContractId("superTokenEvm"); - // solana program address - bytes32 public solanaProgramId; - ForwarderSolana public forwarderSolana; - - event Transferred(uint40 requestCount); - - struct SuperTokenEvmConstructorParams { - string name_; - string symbol_; - uint8 decimals_; - address initialSupplyHolder_; - uint256 initialSupply_; - } - - struct TransferOrderEvmToSolana { - address srcEvmToken; - bytes32 dstSolanaToken; - address userEvm; - bytes32 destUserTokenAddress; - uint256 srcAmount; - uint256 deadline; - } - - constructor( - address owner_, - uint256 fees_, - SuperTokenEvmConstructorParams memory params_, - bytes32 solanaProgramId_, - address forwarderSolanaAddress_, - address addressResolver_ - ) { - // for evm we use standard mode with contract deployment using EVMx - creationCodeWithArgs[superTokenEvm] = abi.encodePacked( - type(SuperToken).creationCode, - abi.encode( - params_.name_, - params_.symbol_, - params_.decimals_, - params_.initialSupplyHolder_, - params_.initialSupply_ - ) - ); - // for Solana we just pass the programId(program address) - solanaProgramId = solanaProgramId_; - forwarderSolana = ForwarderSolana(forwarderSolanaAddress_); - - // sets the fees data like max fees, chain and token for all transfers - // they can be updated for each transfer as well - _setMaxFees(fees_); - _initializeOwner(owner_); - _initializeAppGateway(addressResolver_); - } - - function deployEvmContract(uint32 chainSlug_) external async { - bytes memory initData = abi.encodeWithSelector(SuperToken.setOwner.selector, owner()); - _deploy(superTokenEvm, chainSlug_, IsPlug.YES, initData); - } - - // no need to call this directly, will be called automatically after all contracts are deployed. - // check AppGatewayBase._deploy and AppGatewayBase.onRequestComplete - function initializeOnChain(uint32) public pure override { - return; - } - - function getForwarderSolanaAddressResolver() external view returns (address) { - return address(forwarderSolana.addressResolver__()); - } - - function transfer( - bytes memory order_, - SolanaInstruction memory solanaInstruction - ) external async { - TransferOrderEvmToSolana memory order = abi.decode(order_, (TransferOrderEvmToSolana)); - ISuperToken(order.srcEvmToken).burn(order.userEvm, order.srcAmount); - - // SolanaInstruction memory solanaInstruction = buildSolanaInstruction(order); - - /// we are directly calling the ForwarderSolana - forwarderSolana.callSolana(solanaInstruction); - - emit Transferred(_getCurrentRequestCount()); - } - - function mintSuperTokenEvm(bytes memory order_) external async { - TransferOrderEvmToSolana memory order = abi.decode(order_, (TransferOrderEvmToSolana)); - ISuperToken(order.srcEvmToken).mint(order.userEvm, order.srcAmount); - - emit Transferred(_getCurrentRequestCount()); - } - - function mintSuperTokenSolana(SolanaInstruction memory solanaInstruction) external async { - // we are directly calling the ForwarderSolana - forwarderSolana.callSolana(solanaInstruction); - - emit Transferred(_getCurrentRequestCount()); - } - - function transferForDebug(SolanaInstruction memory solanaInstruction) external async { - // ISuperToken(order.srcEvmToken).burn(order.userEvm, order.srcAmount); - - // we are directly calling the ForwarderSolana - forwarderSolana.callSolana(solanaInstruction); - - emit Transferred(_getCurrentRequestCount()); - } - - /* - function buildSolanaInstruction( - TransferOrderEvmToSolana memory order - ) internal view returns (SolanaInstruction memory) { - // May be subject to change - bytes32[] memory accounts = new bytes32[](5); - // accounts 0 - destination user wallet - accounts[0] = order.destUserTokenAddress; - // accounts 1 - mint account - accounts[1] = order.dstSolanaToken; - // accounts 2 - user ata account for mint // TODO:GW: this is random value - accounts[2] = 0x66619ffe200970bf084fa4713da27d7dff551179adac93fc552787c7555f3482; - // accounts 4 - mint authority account (target program PDA) // TODO:GW: this is random value - accounts[4] = 0xfff2e2d5bdb632266e17b0cdce8b7e3f3a7f1d87c096719f234903b39f84d743; - // accounts 5,6 - system_program, token_program (those are static and will be added by the transmitter while making a call) - - bytes[] memory functionArguments = new bytes[](1); - // TODO:GW: in watcher and transmitter we might need to convert this value if on Solana mint has different decimals, for now we assume that both are the same - functionArguments[0] = abi.encode(order.srcAmount); - - bytes1[] memory accountFlags = new bytes1[](4); - accountFlags[0] = bytes1(0x00); - // mint must be is writable - accountFlags[1] = bytes1(0x01); - // dst token ata must be is writable - accountFlags[2] = bytes1(0x01); - accountFlags[3] = bytes1(0x00); - - // TODO:GW: update when TargetDummy is ready - bytes8 instructionDiscriminator = bytes8(uint64(123)); - - string[] memory functionArgumentTypeNames = new string[](1); - functionArgumentTypeNames[0] = "u64"; - - return - SolanaInstruction({ - data: SolanaInstructionData({ - programId: solanaProgramId, - instructionDiscriminator: instructionDiscriminator, - accounts: accounts, - functionArguments: functionArguments - }), - description: SolanaInstructionDataDescription({ - accountFlags: accountFlags, - functionArgumentTypeNames: functionArgumentTypeNames - }) - }); - } - */ -} From b66faa7d322aacffd3439201d763d9f0c1766ab1 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Wed, 2 Jul 2025 18:09:23 +0200 Subject: [PATCH 13/18] Remove calculating solana digest from WritePrecompile --- .../watcher/precompiles/WritePrecompile.sol | 158 ++---------------- package.json | 2 +- 2 files changed, 17 insertions(+), 143 deletions(-) diff --git a/contracts/evmx/watcher/precompiles/WritePrecompile.sol b/contracts/evmx/watcher/precompiles/WritePrecompile.sol index ef7028a9..ab69f652 100644 --- a/contracts/evmx/watcher/precompiles/WritePrecompile.sol +++ b/contracts/evmx/watcher/precompiles/WritePrecompile.sol @@ -44,7 +44,6 @@ abstract contract WritePrecompileStorage is IPrecompile { // 1 slot reserved for watcher base } - /// @title WritePrecompile /// @notice Handles write precompile logic contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, WatcherBase { @@ -61,9 +60,6 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc PayloadParams payloadParams ); - // TODO: remove after testing Solana - event DigestWithSourceParams(bytes32 digest, DigestParams digestParams); - /// @notice Emitted when a proof is uploaded /// @param payloadId The unique identifier for the request /// @param proof The proof from the watcher @@ -178,38 +174,26 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc payloadParams.batchCount ); - // Construct parameters for digest calculation - DigestParams memory digestParams_; - if (_isSolanaChainSlug(transaction.chainSlug)) { - digestParams_ = _createSolanaDigestParams( - payloadParams, - transaction, - appGateway, - transmitter_, - prevBatchDigestHash, - deadline, - gasLimit, - value - ); - } else { - digestParams_ = _createEvmDigestParams( - payloadParams, - transaction, - appGateway, - transmitter_, - prevBatchDigestHash, - deadline, - gasLimit, - value - ); - } + // create digest + DigestParams memory digestParams_ = DigestParams( + configurations__().sockets(transaction.chainSlug), + transmitter_, + payloadParams.payloadId, + deadline, + payloadParams.callType, + gasLimit, + value, + transaction.payload, + transaction.target, + toBytes32Format(appGateway), + prevBatchDigestHash, + bytes("") + ); // Calculate and store digest from payload parameters bytes32 digest = getDigest(digestParams_); digestHashes[payloadParams.payloadId] = digest; - emit DigestWithSourceParams(digest, digestParams_); - emit WriteProofRequested( transmitter_, digest, @@ -265,105 +249,6 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc ); } - function _createEvmDigestParams( - PayloadParams memory payloadParams_, - Transaction memory transaction_, - address appGateway_, - address transmitter_, - bytes32 prevBatchDigestHash_, - uint256 deadline_, - uint256 gasLimit_, - uint256 value_ - ) internal view returns (DigestParams memory) { - // create digest - // DigestParams memory digestParams_ = DigestParams( - // configurations__().sockets(transaction.chainSlug), - // transmitter_, - // payloadParams.payloadId, - // deadline, - // payloadParams.callType, - // gasLimit, - // value, - // transaction.payload, - // transaction.target, - // toBytes32Format(appGateway), - // prevBatchDigestHash, - // bytes("") - // ); - - return - DigestParams( - configurations__().sockets(transaction_.chainSlug), - transmitter_, - payloadParams_.payloadId, - deadline_, - payloadParams_.callType, - gasLimit_, - value_, - transaction_.payload, - transaction_.target, - toBytes32Format(appGateway_), - prevBatchDigestHash_, - bytes("") - ); - } - - function _createSolanaDigestParams( - PayloadParams memory payloadParams_, - Transaction memory transaction_, - address appGateway_, - address transmitter_, - bytes32 prevBatchDigestHash_, - uint256 deadline_, - uint256 gasLimit_, - uint256 value_ - ) internal view returns (DigestParams memory) { - SolanaInstruction memory instruction = abi.decode( - transaction_.payload, - (SolanaInstruction) - ); - // TODO: this is a problem, function arguments must be packed in a way that is not later touched and that can be used on Solana side in raw Instruction call - // like a call data, so it should be Borsh encoded already here - bytes memory functionArgsPacked; - for (uint256 i = 0; i < instruction.data.functionArguments.length; i++) { - uint256 abiDecodedArg = abi.decode(instruction.data.functionArguments[i], (uint256)); - // silent assumption that all arguments are uint64 to simplify the encoding - uint64 arg = uint64(abiDecodedArg); - bytes8 borshEncodedArg = encodeU64Borsh(arg); - functionArgsPacked = abi.encodePacked(functionArgsPacked, borshEncodedArg); - } - - bytes memory payloadPacked = abi.encodePacked( - instruction.data.programId, - instruction.data.accounts, - instruction.data.instructionDiscriminator, - functionArgsPacked - ); - - // bytes32 of Solana Socket address : 9vFEQ5e3xf4eo17WttfqmXmnqN3gUicrhFGppmmNwyqV - bytes32 hardcodedSocket = 0x84815e8ca2f6dad7e12902c39a51bc72e13c48139b4fb10025d94e7abea2969c; - return - DigestParams( - // watcherPrecompileConfig__.sockets(params_.payloadHeader.getChainSlug()), // TODO: this does not work, for some reason it returns 0x000.... address - hardcodedSocket, - transmitter_, - payloadParams_.payloadId, - deadline_, - payloadParams_.callType, - gasLimit_, - value_, - payloadPacked, - transaction_.target, - toBytes32Format(appGateway_), - prevBatchDigestHash_, - bytes("") - ); - } - - function _isSolanaChainSlug(uint32 chainSlug_) internal pure returns (bool) { - return chainSlug_ == CHAIN_SLUG_SOLANA_MAINNET || chainSlug_ == CHAIN_SLUG_SOLANA_DEVNET; - } - /// @notice Marks a write request with a proof on digest /// @param payloadId_ The unique identifier of the request /// @param proof_ The watcher's proof @@ -419,15 +304,4 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyWatcher { RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); } - - // Borsh helper functions - function encodeU64Borsh(uint64 v) public pure returns (bytes8) { - return bytes8(swapBytes8(v)); - } - - function swapBytes8(uint64 v) internal pure returns (uint64) { - v = ((v & 0x00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00) >> 8); - v = ((v & 0x0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000) >> 16); - return (v << 32) | (v >> 32); - } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 02180c27..c99576fa 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.1.26", + "version": "1.1.29", "description": "socket protocol", "scripts": { "build": "yarn abi && tsc --project lib.tsconfig.json", From 3c67df3a0d899085ab266104d4c7cd557da22097 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Thu, 3 Jul 2025 10:02:11 +0200 Subject: [PATCH 14/18] Cr fixes; add missing CCTP enums & constants --- hardhat-scripts/deploy/1.deploy.ts | 2 +- hardhat.config.ts | 4 ++-- package.json | 2 +- src/cctp.ts | 34 ++++++++++++++++++++++++++++++ src/enums.ts | 6 ++++++ src/events.ts | 4 ++++ src/index.ts | 1 + src/types.ts | 1 + 8 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/cctp.ts diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index af18ecf9..ffd4d4cc 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -2,7 +2,7 @@ import { config } from "dotenv"; import { Contract, utils, Wallet } from "ethers"; import { formatEther } from "ethers/lib/utils"; import { ethers } from "hardhat"; -import { ChainAddressesObj, ChainId, ChainSlug, Contracts } from "../../src"; +import { ChainAddressesObj, ChainSlug, Contracts } from "../../src"; import { AUCTION_END_DELAY_SECONDS, BID_TIMEOUT, diff --git a/hardhat.config.ts b/hardhat.config.ts index 20f97d25..f9745fe6 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -166,7 +166,7 @@ const config: HardhatUserConfig = { evmVersion: "paris", optimizer: { enabled: true, - runs: 200, + runs: 1, details: { yul: true, yulDetails: { @@ -174,7 +174,7 @@ const config: HardhatUserConfig = { }, }, }, - viaIR: true, + viaIR: false, }, }, }; diff --git a/package.json b/package.json index c99576fa..0dfa34ef 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.1.29", + "version": "1.1.32", "description": "socket protocol", "scripts": { "build": "yarn abi && tsc --project lib.tsconfig.json", diff --git a/src/cctp.ts b/src/cctp.ts new file mode 100644 index 00000000..7b9dde13 --- /dev/null +++ b/src/cctp.ts @@ -0,0 +1,34 @@ +import { ChainSlug } from "./chain-enums"; + +// CCTP +export const MESSAGE_TRANSMITTER: { + [chainSlug: number]: string; +} = { + [ChainSlug.SEPOLIA]: "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD", + [ChainSlug.OPTIMISM_SEPOLIA]: "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD", + [ChainSlug.ARBITRUM_SEPOLIA]: "0xaCF1ceeF35caAc005e15888dDb8A3515C41B4872", + [ChainSlug.BASE_SEPOLIA]: "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD", + [ChainSlug.POLYGON_AMOY]: "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD", + [ChainSlug.MAINNET]: "0x0a992d191DEeC32aFe36203Ad87D7d289a738F81", + [ChainSlug.AVALANCHE]: "0x8186359aF5F57FbB40c6b14A588d2A59C0C29880", + [ChainSlug.OPTIMISM]: "0x4D41f22c5a0e5c74090899E5a8Fb597a8842b3e8", + [ChainSlug.ARBITRUM]: "0xC30362313FBBA5cf9163F0bb16a0e01f01A896ca", + [ChainSlug.BASE]: "0xAD09780d193884d503182aD4588450C416D6F9D4", + [ChainSlug.POLYGON_MAINNET]: "0xF3be9355363857F3e001be68856A2f96b4C39Ba9", +}; + +export const CCTP_DOMAINS: { + [chainSlug: number]: number; +} = { + [ChainSlug.SEPOLIA]: 0, + [ChainSlug.OPTIMISM_SEPOLIA]: 2, + [ChainSlug.ARBITRUM_SEPOLIA]: 3, + [ChainSlug.BASE_SEPOLIA]: 6, + [ChainSlug.POLYGON_AMOY]: 7, + [ChainSlug.MAINNET]: 0, + [ChainSlug.AVALANCHE]: 1, + [ChainSlug.OPTIMISM]: 2, + [ChainSlug.ARBITRUM]: 3, + [ChainSlug.BASE]: 6, + [ChainSlug.POLYGON_MAINNET]: 7, +}; \ No newline at end of file diff --git a/src/enums.ts b/src/enums.ts index f54d3ba8..a9bcceac 100644 --- a/src/enums.ts +++ b/src/enums.ts @@ -24,10 +24,15 @@ export enum Events { PromiseNotResolved = "PromiseNotResolved", MarkedRevert = "MarkedRevert", + // Configurations + PlugAdded = "PlugAdded", + // RequestHandler RequestSubmitted = "RequestSubmitted", RequestCancelled = "RequestCancelled", FeesIncreased = "FeesIncreased", + RequestSettled = "RequestSettled", + RequestCompletedWithErrors = "RequestCompletedWithErrors", // WritePrecompile WriteProofRequested = "WriteProofRequested", @@ -50,6 +55,7 @@ export enum Contracts { FeesPlug = "FeesPlug", ContractFactoryPlug = "ContractFactoryPlug", FastSwitchboard = "FastSwitchboard", + CCTPSwitchboard = "CCTPSwitchboard", SocketBatcher = "SocketBatcher", SocketFeeManager = "SocketFeeManager", AddressResolver = "AddressResolver", diff --git a/src/events.ts b/src/events.ts index 1d57f1aa..c70e5ffb 100644 --- a/src/events.ts +++ b/src/events.ts @@ -21,8 +21,12 @@ export const requestHandlerEvents = [ Events.RequestSubmitted, Events.FeesIncreased, Events.RequestCancelled, + Events.RequestSettled, + Events.RequestCompletedWithErrors, ]; +export const configurationsEvents = [Events.PlugAdded]; + export const writePrecompileEvents = [ Events.WriteProofRequested, Events.WriteProofUploaded, diff --git a/src/index.ts b/src/index.ts index 39a65132..9238c022 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,3 +5,4 @@ export * from "./finality"; export * from "./types"; export * from "./constants"; export * from "./signer"; +export * from "./cctp"; \ No newline at end of file diff --git a/src/types.ts b/src/types.ts index 1a047bcc..ba32e046 100644 --- a/src/types.ts +++ b/src/types.ts @@ -19,6 +19,7 @@ export type ChainAddressesObj = { Socket: string; SocketBatcher: string; FastSwitchboard: string; + CCTPSwitchboard: string; ContractFactoryPlug: string; SocketFeesManager?: string; FeesPlug?: string; From b6a40fb3f5ad08d52ef65fef13e1eb9b545b3824 Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Thu, 3 Jul 2025 11:33:28 +0200 Subject: [PATCH 15/18] fix: cr fixes: remove comments, remove debug events --- Errors.md | 193 ++-- EventTopics.md | 394 ++++----- FunctionSignatures.md | 934 ++++++++++---------- contracts/evmx/fees/Credit.sol | 8 +- contracts/evmx/interfaces/IWatcher.sol | 1 - contracts/evmx/plugs/FeesPlug.sol | 2 - contracts/evmx/watcher/Configurations.sol | 9 +- contracts/evmx/watcher/RequestHandler.sol | 28 - contracts/utils/common/Structs.sol | 1 - foundry.toml | 46 +- hardhat-scripts/deploy/3.configureChains.ts | 17 +- 11 files changed, 787 insertions(+), 846 deletions(-) diff --git a/Errors.md b/Errors.md index d9ec5c3c..d90a2cb6 100644 --- a/Errors.md +++ b/Errors.md @@ -1,155 +1,154 @@ # Custom Error Codes - ## evmx/fees/FeesPool.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ------------------ | ------------ | | `TransferFailed()` | `0x90b8ec18` | ## evmx/helpers/AsyncPromise.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------------- | ------------ | | `PromiseAlreadyResolved()` | `0x56b63537` | -| `OnlyInvoker()` | `0x74ed21f5` | -| `PromiseAlreadySetUp()` | `0x927c53d5` | -| `PromiseRevertFailed()` | `0x0175b9de` | -| `NotLatestPromise()` | `0x39ca95d3` | +| `OnlyInvoker()` | `0x74ed21f5` | +| `PromiseAlreadySetUp()` | `0x927c53d5` | +| `PromiseRevertFailed()` | `0x0175b9de` | +| `NotLatestPromise()` | `0x39ca95d3` | ## evmx/plugs/ContractFactoryPlug.sol -| Error | Signature | -|-------|-----------| -| `DeploymentFailed()` | `0x30116425` | +| Error | Signature | +| -------------------------------- | ------------ | +| `DeploymentFailed()` | `0x30116425` | | `ExecutionFailed(bytes32,bytes)` | `0xd255d8a3` | -| `information(bool,,bytes)` | `0x3a82a1f3` | +| `information(bool,,bytes)` | `0x3a82a1f3` | ## evmx/plugs/FeesPlug.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| --------------------------------------------------- | ------------ | | `InsufficientTokenBalance(address,uint256,uint256)` | `0xebd6ced9` | -| `InvalidDepositAmount()` | `0xfe9ba5cd` | -| `TokenNotWhitelisted(address)` | `0xea3bff2e` | +| `InvalidDepositAmount()` | `0xfe9ba5cd` | +| `TokenNotWhitelisted(address)` | `0xea3bff2e` | ## evmx/watcher/Configurations.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------------------------- | ------------ | | `InvalidSwitchboardTest(bytes32,bytes32)` | `0x702f36a1` | ## evmx/watcher/RequestHandler.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------- | ------------ | | `InsufficientMaxFees()` | `0x0e5bc492` | ## protocol/Socket.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------------------------- | ------------ | | `PayloadAlreadyExecuted(ExecutionStatus)` | `0xf4c54edd` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InsufficientMsgValue()` | `0x78f38f76` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InsufficientMsgValue()` | `0x78f38f76` | ## protocol/SocketConfig.sol -| Error | Signature | -|-------|-----------| -| `SwitchboardExists()` | `0x2dff8555` | +| Error | Signature | +| ------------------------------- | ------------ | +| `SwitchboardExists()` | `0x2dff8555` | | `SwitchboardExistsOrDisabled()` | `0x1c7d2487` | ## protocol/SocketFeeManager.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------- | ------------ | | `InsufficientFees()` | `0x8d53e553` | -| `FeeTooLow()` | `0x732f9413` | +| `FeeTooLow()` | `0x732f9413` | ## protocol/SocketUtils.sol -| Error | Signature | -|-------|-----------| -| `OnlyOffChain()` | `0x9cbfe066` | +| Error | Signature | +| -------------------- | ------------ | +| `OnlyOffChain()` | `0x9cbfe066` | | `SimulationFailed()` | `0x2fbab3ac` | ## protocol/switchboard/FastSwitchboard.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ------------------- | ------------ | | `AlreadyAttested()` | `0x35d90805` | | `WatcherNotFound()` | `0xa278e4ad` | ## utils/AccessControl.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ------------------- | ------------ | | `NoPermit(bytes32)` | `0x962f6333` | ## utils/common/Converters.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------------- | ------------ | | `NotAnEvmAddress(bytes32)` | `0x33b960d0` | ## utils/common/Errors.sol -| Error | Signature | -|-------|-----------| -| `ZeroAddress()` | `0xd92e233d` | -| `InvalidTransmitter()` | `0x58a70a0a` | -| `InvalidTokenAddress()` | `0x1eb00b06` | -| `InvalidSwitchboard()` | `0xf63c9e4d` | -| `SocketAlreadyInitialized()` | `0xc9500b00` | -| `NotSocket()` | `0xc59f8f7c` | -| `PlugNotFound()` | `0x5f1ac76a` | -| `ResolvingScheduleTooEarly()` | `0x207e8731` | -| `CallFailed()` | `0x3204506f` | -| `InvalidAppGateway()` | `0x82ded261` | -| `AppGatewayAlreadyCalled()` | `0xb224683f` | -| `InvalidCallerTriggered()` | `0x3292d247` | -| `InvalidPromise()` | `0x45f2d176` | -| `InvalidWatcherSignature()` | `0x5029f14f` | -| `NonceUsed()` | `0x1f6d5aef` | -| `AsyncModifierNotSet()` | `0xcae106f9` | -| `WatcherNotSet()` | `0x42d473a7` | -| `InvalidTarget()` | `0x82d5d76a` | -| `InvalidIndex()` | `0x63df8171` | -| `InvalidChainSlug()` | `0xbff6b106` | -| `InvalidPayloadSize()` | `0xfbdf7954` | -| `InvalidOnChainAddress()` | `0xb758c606` | -| `InvalidScheduleDelay()` | `0x9a993219` | -| `AuctionClosed()` | `0x36b6b46d` | -| `AuctionNotOpen()` | `0xf0460077` | -| `BidExceedsMaxFees()` | `0x4c923f3c` | -| `LowerBidAlreadyExists()` | `0xaaa1f709` | -| `RequestCountMismatch()` | `0x98bbcbff` | -| `InvalidAmount()` | `0x2c5211c6` | -| `InsufficientCreditsAvailable()` | `0xe61dc0aa` | -| `InsufficientBalance()` | `0xf4d678b8` | -| `InvalidCaller()` | `0x48f5c3ed` | -| `InvalidGateway()` | `0xfc9dfe85` | -| `RequestAlreadyCancelled()` | `0xc70f47d8` | -| `DeadlineNotPassedForOnChainRevert()` | `0x7006aa10` | -| `InvalidBid()` | `0xc6388ef7` | -| `MaxReAuctionCountReached()` | `0xf2b4388c` | -| `MaxMsgValueLimitExceeded()` | `0x97b4e8ce` | -| `OnlyWatcherAllowed()` | `0xdf7d227c` | -| `InvalidPrecompileData()` | `0x320062c0` | -| `InvalidCallType()` | `0x39d2eb55` | -| `NotRequestHandler()` | `0x8f8cba5b` | -| `NotInvoker()` | `0x8a6353d1` | -| `NotPromiseResolver()` | `0x86d876b2` | -| `RequestPayloadCountLimitExceeded()` | `0xcbef144b` | -| `InsufficientFees()` | `0x8d53e553` | -| `RequestAlreadySettled()` | `0x66fad465` | -| `NoWriteRequest()` | `0x9dcd3065` | -| `AlreadyAssigned()` | `0x9688dc51` | -| `OnlyAppGateway()` | `0xfec944ea` | +| Error | Signature | +| --------------------------------------------- | ------------ | +| `ZeroAddress()` | `0xd92e233d` | +| `InvalidTransmitter()` | `0x58a70a0a` | +| `InvalidTokenAddress()` | `0x1eb00b06` | +| `InvalidSwitchboard()` | `0xf63c9e4d` | +| `SocketAlreadyInitialized()` | `0xc9500b00` | +| `NotSocket()` | `0xc59f8f7c` | +| `PlugNotFound()` | `0x5f1ac76a` | +| `ResolvingScheduleTooEarly()` | `0x207e8731` | +| `CallFailed()` | `0x3204506f` | +| `InvalidAppGateway()` | `0x82ded261` | +| `AppGatewayAlreadyCalled()` | `0xb224683f` | +| `InvalidCallerTriggered()` | `0x3292d247` | +| `InvalidPromise()` | `0x45f2d176` | +| `InvalidWatcherSignature()` | `0x5029f14f` | +| `NonceUsed()` | `0x1f6d5aef` | +| `AsyncModifierNotSet()` | `0xcae106f9` | +| `WatcherNotSet()` | `0x42d473a7` | +| `InvalidTarget()` | `0x82d5d76a` | +| `InvalidIndex()` | `0x63df8171` | +| `InvalidChainSlug()` | `0xbff6b106` | +| `InvalidPayloadSize()` | `0xfbdf7954` | +| `InvalidOnChainAddress()` | `0xb758c606` | +| `InvalidScheduleDelay()` | `0x9a993219` | +| `AuctionClosed()` | `0x36b6b46d` | +| `AuctionNotOpen()` | `0xf0460077` | +| `BidExceedsMaxFees()` | `0x4c923f3c` | +| `LowerBidAlreadyExists()` | `0xaaa1f709` | +| `RequestCountMismatch()` | `0x98bbcbff` | +| `InvalidAmount()` | `0x2c5211c6` | +| `InsufficientCreditsAvailable()` | `0xe61dc0aa` | +| `InsufficientBalance()` | `0xf4d678b8` | +| `InvalidCaller()` | `0x48f5c3ed` | +| `InvalidGateway()` | `0xfc9dfe85` | +| `RequestAlreadyCancelled()` | `0xc70f47d8` | +| `DeadlineNotPassedForOnChainRevert()` | `0x7006aa10` | +| `InvalidBid()` | `0xc6388ef7` | +| `MaxReAuctionCountReached()` | `0xf2b4388c` | +| `MaxMsgValueLimitExceeded()` | `0x97b4e8ce` | +| `OnlyWatcherAllowed()` | `0xdf7d227c` | +| `InvalidPrecompileData()` | `0x320062c0` | +| `InvalidCallType()` | `0x39d2eb55` | +| `NotRequestHandler()` | `0x8f8cba5b` | +| `NotInvoker()` | `0x8a6353d1` | +| `NotPromiseResolver()` | `0x86d876b2` | +| `RequestPayloadCountLimitExceeded()` | `0xcbef144b` | +| `InsufficientFees()` | `0x8d53e553` | +| `RequestAlreadySettled()` | `0x66fad465` | +| `NoWriteRequest()` | `0x9dcd3065` | +| `AlreadyAssigned()` | `0x9688dc51` | +| `OnlyAppGateway()` | `0xfec944ea` | | `NewMaxFeesLowerThanCurrent(uint256,uint256)` | `0x1345dda1` | -| `InvalidContract()` | `0x6eefed20` | -| `InvalidData()` | `0x5cb045db` | -| `InvalidSignature()` | `0x8baa579f` | -| `DeadlinePassed()` | `0x70f65caa` | +| `InvalidContract()` | `0x6eefed20` | +| `InvalidData()` | `0x5cb045db` | +| `InvalidSignature()` | `0x8baa579f` | +| `DeadlinePassed()` | `0x70f65caa` | diff --git a/EventTopics.md b/EventTopics.md index 4781eea2..7daf3e8c 100644 --- a/EventTopics.md +++ b/EventTopics.md @@ -2,271 +2,269 @@ ## AuctionManager -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `AuctionEndDelaySecondsSet` | `(auctionEndDelaySeconds: uint256)` | `0xf38f0d9dc8459cf5426728c250d115196a4c065ebc1a6c29da24764a8c0da722` | -| `AuctionEnded` | `(requestCount: uint40, winningBid: tuple)` | `0xede4ec1efc469fac10dcb4930f70be4cd21f3700ed61c91967c19a7cd7c0d86e` | -| `AuctionRestarted` | `(requestCount: uint40)` | `0x071867b21946ec4655665f0d4515d3757a5a52f144c762ecfdfb11e1da542b82` | -| `AuctionStarted` | `(requestCount: uint40)` | `0xcd040613cf8ef0cfcaa3af0d711783e827a275fc647c116b74595bf17cb9364f` | -| `BidPlaced` | `(requestCount: uint40, bid: tuple)` | `0x7f79485e4c9aeea5d4899bc6f7c63b22ac1f4c01d2d28c801e94732fee657b5d` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `MaxReAuctionCountSet` | `(maxReAuctionCount: uint256)` | `0x2f6fadde7ab8ab83d21ab10c3bc09dde179f8696d47c4176581facf0c6f96bbf` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------- | +| `AuctionEndDelaySecondsSet` | `(auctionEndDelaySeconds: uint256)` | `0xf38f0d9dc8459cf5426728c250d115196a4c065ebc1a6c29da24764a8c0da722` | +| `AuctionEnded` | `(requestCount: uint40, winningBid: tuple)` | `0xede4ec1efc469fac10dcb4930f70be4cd21f3700ed61c91967c19a7cd7c0d86e` | +| `AuctionRestarted` | `(requestCount: uint40)` | `0x071867b21946ec4655665f0d4515d3757a5a52f144c762ecfdfb11e1da542b82` | +| `AuctionStarted` | `(requestCount: uint40)` | `0xcd040613cf8ef0cfcaa3af0d711783e827a275fc647c116b74595bf17cb9364f` | +| `BidPlaced` | `(requestCount: uint40, bid: tuple)` | `0x7f79485e4c9aeea5d4899bc6f7c63b22ac1f4c01d2d28c801e94732fee657b5d` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `MaxReAuctionCountSet` | `(maxReAuctionCount: uint256)` | `0x2f6fadde7ab8ab83d21ab10c3bc09dde179f8696d47c4176581facf0c6f96bbf` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## Socket -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `AppGatewayCallRequested` | `(triggerId: bytes32, appGatewayId: bytes32, switchboard: bytes32, plug: bytes32, overrides: bytes, payload: bytes)` | `0xf83cee1d13047d8a1785495ac352da7c9ac5725641f76506899def19750c7696` | -| `ExecutionFailed` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x385334bc68a32c4d164625189adc7633e6074eb1b837fb4d11d768245151e4ce` | -| `ExecutionSuccess` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x324d63a433b21a12b90e79cd2ba736b2a5238be6165e03b750fa4a7d5193d5d9` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `PlugConnected` | `(plug: address, appGatewayId: bytes32, switchboard: address)` | `0x90c5924e27cfb6e3a688e729083681f30494ae2615ae14aac3bc807a0c436a88` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | -| `SocketFeeManagerUpdated` | `(oldSocketFeeManager: address, newSocketFeeManager: address)` | `0xdcb02e10d5220346a4638aa2826eaab1897306623bc40a427049e4ebd12255b4` | -| `SwitchboardAdded` | `(switchboard: address)` | `0x1595852923edfbbf906f09fc8523e4cfb022a194773c4d1509446b614146ee88` | -| `SwitchboardDisabled` | `(switchboard: address)` | `0x1b4ee41596b4e754e5665f01ed6122b356f7b36ea0a02030804fac7fa0fdddfc` | -| `SwitchboardEnabled` | `(switchboard: address)` | `0x6909a9974e3eec619bc479ba882d30a5ef1219b72ab1ce6a354516e91be317b8` | +| Event | Arguments | Topic | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `AppGatewayCallRequested` | `(triggerId: bytes32, appGatewayId: bytes32, switchboard: bytes32, plug: bytes32, overrides: bytes, payload: bytes)` | `0xf83cee1d13047d8a1785495ac352da7c9ac5725641f76506899def19750c7696` | +| `ExecutionFailed` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x385334bc68a32c4d164625189adc7633e6074eb1b837fb4d11d768245151e4ce` | +| `ExecutionSuccess` | `(payloadId: bytes32, exceededMaxCopy: bool, returnData: bytes)` | `0x324d63a433b21a12b90e79cd2ba736b2a5238be6165e03b750fa4a7d5193d5d9` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `PlugConnected` | `(plug: address, appGatewayId: bytes32, switchboard: address)` | `0x90c5924e27cfb6e3a688e729083681f30494ae2615ae14aac3bc807a0c436a88` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| `SocketFeeManagerUpdated` | `(oldSocketFeeManager: address, newSocketFeeManager: address)` | `0xdcb02e10d5220346a4638aa2826eaab1897306623bc40a427049e4ebd12255b4` | +| `SwitchboardAdded` | `(switchboard: address)` | `0x1595852923edfbbf906f09fc8523e4cfb022a194773c4d1509446b614146ee88` | +| `SwitchboardDisabled` | `(switchboard: address)` | `0x1b4ee41596b4e754e5665f01ed6122b356f7b36ea0a02030804fac7fa0fdddfc` | +| `SwitchboardEnabled` | `(switchboard: address)` | `0x6909a9974e3eec619bc479ba882d30a5ef1219b72ab1ce6a354516e91be317b8` | ## SocketBatcher -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| Event | Arguments | Topic | +| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | ## SocketFeeManager -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | -| `SocketFeesUpdated` | `(oldFees: uint256, newFees: uint256)` | `0xcbd4d756fb6198bbcc2e4013cce929f504ad46e9d97c543ef9a8dfea3e407053` | +| Event | Arguments | Topic | +| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| `SocketFeesUpdated` | `(oldFees: uint256, newFees: uint256)` | `0xcbd4d756fb6198bbcc2e4013cce929f504ad46e9d97c543ef9a8dfea3e407053` | ## FeesManager -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `CreditsBlocked` | `(requestCount: uint40, consumeFrom: address, amount: uint256)` | `0xf037c15aef41440aa823cf1fdeaea332105d8b23d52557f6670189b5d76f1eed` | -| `CreditsTransferred` | `(from: address, to: address, amount: uint256)` | `0xed198cadddd93e734cbf04cb1c3226d9bafaeb504cedbd8ee36b830b0cb9e7a5` | -| `CreditsUnblocked` | `(requestCount: uint40, consumeFrom: address)` | `0x45db29ef2701319155cac058aa2f56ce1f73e0e238161d3db9f8c9a47655210d` | -| `CreditsUnblockedAndAssigned` | `(requestCount: uint40, consumeFrom: address, transmitter: address, amount: uint256)` | `0x38fd327622576a468e1b2818b00f50c8854703633ef8e583e1f31662888ffac2` | -| `CreditsUnwrapped` | `(consumeFrom: address, amount: uint256)` | `0xdcc9473b722b4c953617ab373840b365298a520bc7f20ce94fa7314f4a857774` | -| `CreditsWrapped` | `(consumeFrom: address, amount: uint256)` | `0x40246503613721eb4acf4020c6c56b6a16e5d08713316db0bea5210e8819c592` | -| `Deposited` | `(chainSlug: uint32, token: address, depositTo: address, creditAmount: uint256, nativeAmount: uint256)` | `0x72aedd284699bbd7a987e6942b824cfd6c627e354cb5a0760ac5768acd473f4a` | -| `FeesPlugSet` | `(chainSlug: uint32, feesPlug: bytes32)` | `0x677a00737c8099aa9e6c554104ca7941deb59125335cfb3d0d9f604f178db59c` | -| `FeesPoolSet` | `(feesPool: address)` | `0xd07af3fd70b48ab3c077a8d45c3a288498d905d0e3d1e65bc171f6c2e890d8ef` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `WithdrawFailed` | `(payloadId: bytes32)` | `0xea147eb2109f71b4bda9e57528ba08b84821087a31cb43a7851dc6ff743d9be7` | +| Event | Arguments | Topic | +| ----------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `CreditsBlocked` | `(requestCount: uint40, consumeFrom: address, amount: uint256)` | `0xf037c15aef41440aa823cf1fdeaea332105d8b23d52557f6670189b5d76f1eed` | +| `CreditsTransferred` | `(from: address, to: address, amount: uint256)` | `0xed198cadddd93e734cbf04cb1c3226d9bafaeb504cedbd8ee36b830b0cb9e7a5` | +| `CreditsUnblocked` | `(requestCount: uint40, consumeFrom: address)` | `0x45db29ef2701319155cac058aa2f56ce1f73e0e238161d3db9f8c9a47655210d` | +| `CreditsUnblockedAndAssigned` | `(requestCount: uint40, consumeFrom: address, transmitter: address, amount: uint256)` | `0x38fd327622576a468e1b2818b00f50c8854703633ef8e583e1f31662888ffac2` | +| `CreditsUnwrapped` | `(consumeFrom: address, amount: uint256)` | `0xdcc9473b722b4c953617ab373840b365298a520bc7f20ce94fa7314f4a857774` | +| `CreditsWrapped` | `(consumeFrom: address, amount: uint256)` | `0x40246503613721eb4acf4020c6c56b6a16e5d08713316db0bea5210e8819c592` | +| `Deposited` | `(chainSlug: uint32, token: address, depositTo: address, creditAmount: uint256, nativeAmount: uint256)` | `0x72aedd284699bbd7a987e6942b824cfd6c627e354cb5a0760ac5768acd473f4a` | +| `FeesPlugSet` | `(chainSlug: uint32, feesPlug: bytes32)` | `0x677a00737c8099aa9e6c554104ca7941deb59125335cfb3d0d9f604f178db59c` | +| `FeesPoolSet` | `(feesPool: address)` | `0xd07af3fd70b48ab3c077a8d45c3a288498d905d0e3d1e65bc171f6c2e890d8ef` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `WithdrawFailed` | `(payloadId: bytes32)` | `0xea147eb2109f71b4bda9e57528ba08b84821087a31cb43a7851dc6ff743d9be7` | ## FeesPool -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `NativeDeposited` | `(from: address, amount: uint256)` | `0xb5d7700fb0cf415158b8db7cc7c39f0eab16a825c92e221404b4c8bb099b4bbb` | -| `NativeWithdrawn` | `(success: bool, to: address, amount: uint256)` | `0xa81f1c8490022ee829d2e1a231053f5dbecad46caee71f6ea38a9db663a3f12b` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ---------------------------- | ----------------------------------------------- | -------------------------------------------------------------------- | +| `NativeDeposited` | `(from: address, amount: uint256)` | `0xb5d7700fb0cf415158b8db7cc7c39f0eab16a825c92e221404b4c8bb099b4bbb` | +| `NativeWithdrawn` | `(success: bool, to: address, amount: uint256)` | `0xa81f1c8490022ee829d2e1a231053f5dbecad46caee71f6ea38a9db663a3f12b` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## AddressResolver -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `AsyncDeployerUpdated` | `(asyncDeployer_: address)` | `0x4df9cdd01544e8f6b0326650bc0b55611f47ce5ba2faa522d21fb675e9fc1f73` | -| `ContractAddressUpdated` | `(contractId_: bytes32, contractAddress_: address)` | `0xdf5ec2c15e11ce657bb21bc09c0b5ba95e315b4dba9934c6e311f47559babf28` | -| `DefaultAuctionManagerUpdated` | `(defaultAuctionManager_: address)` | `0x60f296739208a505ead7fb622df0f76b7791b824481b120a2300bdaf85e3e3d6` | -| `DeployForwarderUpdated` | `(deployForwarder_: address)` | `0x237b9bc9fef7508a02ca9ccca81f6965e500064a58024cae1218035da865fd2b` | -| `FeesManagerUpdated` | `(feesManager_: address)` | `0x94e67aa1341a65767dfde81e62fd265bfbade1f5744bfd3cd73f99a6eca0572a` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `WatcherUpdated` | `(watcher_: address)` | `0xc13081d38d92b454cdb6ca20bbc65c12fa43a7a14a1529204ced5b6350052bb0` | +| Event | Arguments | Topic | +| ------------------------------ | --------------------------------------------------- | -------------------------------------------------------------------- | +| `AsyncDeployerUpdated` | `(asyncDeployer_: address)` | `0x4df9cdd01544e8f6b0326650bc0b55611f47ce5ba2faa522d21fb675e9fc1f73` | +| `ContractAddressUpdated` | `(contractId_: bytes32, contractAddress_: address)` | `0xdf5ec2c15e11ce657bb21bc09c0b5ba95e315b4dba9934c6e311f47559babf28` | +| `DefaultAuctionManagerUpdated` | `(defaultAuctionManager_: address)` | `0x60f296739208a505ead7fb622df0f76b7791b824481b120a2300bdaf85e3e3d6` | +| `DeployForwarderUpdated` | `(deployForwarder_: address)` | `0x237b9bc9fef7508a02ca9ccca81f6965e500064a58024cae1218035da865fd2b` | +| `FeesManagerUpdated` | `(feesManager_: address)` | `0x94e67aa1341a65767dfde81e62fd265bfbade1f5744bfd3cd73f99a6eca0572a` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `WatcherUpdated` | `(watcher_: address)` | `0xc13081d38d92b454cdb6ca20bbc65c12fa43a7a14a1529204ced5b6350052bb0` | ## AsyncDeployer -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `AsyncPromiseDeployed` | `(newAsyncPromise: address, salt: bytes32)` | `0xb6c5491cf83e09749b1a4dd6a9f07b0e925fcb0a915ac8c2b40e8ab28191c270` | -| `ForwarderDeployed` | `(newForwarder: address, salt: bytes32)` | `0x4dbbecb9cf9c8b93da9743a2b48ea52efe68d69230ab1c1b711891d9d223b29f` | -| `ImplementationUpdated` | `(contractName: string, newImplementation: address)` | `0xa1e41aa2c2f3f20d9b63ac06b634d2788768d6034f3d9192cdf7d07374bb16f4` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| Event | Arguments | Topic | +| ---------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------- | +| `AsyncPromiseDeployed` | `(newAsyncPromise: address, salt: bytes32)` | `0xb6c5491cf83e09749b1a4dd6a9f07b0e925fcb0a915ac8c2b40e8ab28191c270` | +| `ForwarderDeployed` | `(newForwarder: address, salt: bytes32)` | `0x4dbbecb9cf9c8b93da9743a2b48ea52efe68d69230ab1c1b711891d9d223b29f` | +| `ImplementationUpdated` | `(contractName: string, newImplementation: address)` | `0xa1e41aa2c2f3f20d9b63ac06b634d2788768d6034f3d9192cdf7d07374bb16f4` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | ## AsyncPromise -| Event | Arguments | Topic | -| ----- | --------- | ----- | +| Event | Arguments | Topic | +| ------------- | ------------------- | -------------------------------------------------------------------- | | `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | ## DeployForwarder -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| Event | Arguments | Topic | +| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | ## Forwarder -| Event | Arguments | Topic | -| ----- | --------- | ----- | +| Event | Arguments | Topic | +| ------------- | ------------------- | -------------------------------------------------------------------- | | `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | ## ProxyFactory -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `AdminChanged` | `(proxy: address, admin: address)` | `0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f` | -| `Deployed` | `(proxy: address, implementation: address, admin: address)` | `0xc95935a66d15e0da5e412aca0ad27ae891d20b2fb91cf3994b6a3bf2b8178082` | -| `Upgraded` | `(proxy: address, implementation: address)` | `0x5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c7` | +| Event | Arguments | Topic | +| -------------- | ----------------------------------------------------------- | -------------------------------------------------------------------- | +| `AdminChanged` | `(proxy: address, admin: address)` | `0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f` | +| `Deployed` | `(proxy: address, implementation: address, admin: address)` | `0xc95935a66d15e0da5e412aca0ad27ae891d20b2fb91cf3994b6a3bf2b8178082` | +| `Upgraded` | `(proxy: address, implementation: address)` | `0x5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c7` | ## TestUSDC -| Event | Arguments | Topic | -| ----- | --------- | ----- | +| Event | Arguments | Topic | +| ---------- | ----------------------------------------------------- | -------------------------------------------------------------------- | | `Approval` | `(owner: address, spender: address, amount: uint256)` | `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` | -| `Transfer` | `(from: address, to: address, amount: uint256)` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | +| `Transfer` | `(from: address, to: address, amount: uint256)` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | ## ContractFactoryPlug -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | -| `Deployed` | `(addr: address, salt: bytes32, returnData: bytes)` | `0x1246c6f8fd9f4abc542c7c8c8f793cfcde6b67aed1976a38aa134fc24af2dfe3` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ---------------------------- | --------------------------------------------------- | -------------------------------------------------------------------- | +| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | +| `Deployed` | `(addr: address, salt: bytes32, returnData: bytes)` | `0x1246c6f8fd9f4abc542c7c8c8f793cfcde6b67aed1976a38aa134fc24af2dfe3` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## FeesPlug -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | -| `FeesDeposited` | `(token: address, receiver: address, creditAmount: uint256, nativeAmount: uint256)` | `0xeb4e1b24b7fe377de69f80f7380bda5ba4b43176c6a4d300a3be9009c49f4228` | -| `FeesWithdrawn` | `(token: address, receiver: address, amount: uint256)` | `0x5e110f8bc8a20b65dcc87f224bdf1cc039346e267118bae2739847f07321ffa8` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | -| `TokenRemovedFromWhitelist` | `(token: address)` | `0xdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d917` | -| `TokenWhitelisted` | `(token: address)` | `0x6a65f90b1a644d2faac467a21e07e50e3f8fa5846e26231d30ae79a417d3d262` | +| Event | Arguments | Topic | +| ---------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `ConnectorPlugDisconnected` | `()` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | +| `FeesDeposited` | `(token: address, receiver: address, creditAmount: uint256, nativeAmount: uint256)` | `0xeb4e1b24b7fe377de69f80f7380bda5ba4b43176c6a4d300a3be9009c49f4228` | +| `FeesWithdrawn` | `(token: address, receiver: address, amount: uint256)` | `0x5e110f8bc8a20b65dcc87f224bdf1cc039346e267118bae2739847f07321ffa8` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| `TokenRemovedFromWhitelist` | `(token: address)` | `0xdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d917` | +| `TokenWhitelisted` | `(token: address)` | `0x6a65f90b1a644d2faac467a21e07e50e3f8fa5846e26231d30ae79a417d3d262` | ## Configurations -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `IsValidPlugSet` | `(appGateway: address, chainSlug: uint32, plug: bytes32, isValid: bool)` | `0xd7a90efd60960a8435ef282822190655f6bd2ffa14bb350dc23d6f6956056d7e` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `PlugAdded` | `(appGatewayId: bytes32, chainSlug: uint32, plug: bytes32)` | `0x3734a2406c5c2f2556c82a0819c51e42a135dd102465cc9856594481ea2f1637` | -| `SocketSet` | `(chainSlug: uint32, socket: bytes32)` | `0x3200bf6ad2ab31b9220ed9d2f83089d7a1332f55aaa3825c57510743a315165b` | -| `SwitchboardSet` | `(chainSlug: uint32, sbType: bytes32, switchboard: bytes32)` | `0xcdfbfa261040f4dffb03c7d9493f74b575f2ae533bb43fd7b5d5b24ac9d804f4` | -| `VerifyConnectionsSB` | `(switchboard: bytes32, switchboardExpected: bytes32)` | `0xf55cb41249952cf17b38f1473238606bcd5048a5202d544f5d401c24a1208403` | +| Event | Arguments | Topic | +| ---------------------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------- | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `IsValidPlugSet` | `(appGateway: address, chainSlug: uint32, plug: bytes32, isValid: bool)` | `0xd7a90efd60960a8435ef282822190655f6bd2ffa14bb350dc23d6f6956056d7e` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `PlugAdded` | `(appGatewayId: bytes32, chainSlug: uint32, plug: bytes32)` | `0x3734a2406c5c2f2556c82a0819c51e42a135dd102465cc9856594481ea2f1637` | +| `SocketSet` | `(chainSlug: uint32, socket: bytes32)` | `0x3200bf6ad2ab31b9220ed9d2f83089d7a1332f55aaa3825c57510743a315165b` | +| `SwitchboardSet` | `(chainSlug: uint32, sbType: bytes32, switchboard: bytes32)` | `0xcdfbfa261040f4dffb03c7d9493f74b575f2ae533bb43fd7b5d5b24ac9d804f4` | ## PromiseResolver -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `MarkedRevert` | `(payloadId: bytes32, isRevertingOnchain: bool)` | `0xcf1fd844cb4d32cbebb5ca6ce4ac834fe98da3ddac44deb77fffd22ad933824c` | -| `PromiseNotResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0xbcf0d0c678940566e9e64f0c871439395bd5fb5c39bca3547b126fe6ee467937` | -| `PromiseResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0x1b1b5810494fb3e17f7c46547e6e67cd6ad3e6001ea6fb7d12ea0241ba13c4ba` | +| Event | Arguments | Topic | +| -------------------- | ------------------------------------------------ | -------------------------------------------------------------------- | +| `MarkedRevert` | `(payloadId: bytes32, isRevertingOnchain: bool)` | `0xcf1fd844cb4d32cbebb5ca6ce4ac834fe98da3ddac44deb77fffd22ad933824c` | +| `PromiseNotResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0xbcf0d0c678940566e9e64f0c871439395bd5fb5c39bca3547b126fe6ee467937` | +| `PromiseResolved` | `(payloadId: bytes32, asyncPromise: address)` | `0x1b1b5810494fb3e17f7c46547e6e67cd6ad3e6001ea6fb7d12ea0241ba13c4ba` | ## RequestHandler -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `FeesIncreased` | `(requestCount: uint40, newMaxFees: uint256)` | `0xf258fca4e49b803ee2a4c2e33b6fcf18bc3982df21f111c00677025bf1ccbb6a` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `PayloadIdData` | `(requestCount: uint40, batchCount: uint40, payloadCount: uint40, chainSlug: uint32, switchboard: bytes32, packed: bytes)` | `0x40cd955f96207785cb90a63920257959a7ca0c5f89377eaefbe53ccaa8e4b380` | -| `RequestCancelled` | `(requestCount: uint40)` | `0xff191657769be72fc08def44c645014c60d18cb24b9ca05c9a33406a28253245` | -| `RequestCompletedWithErrors` | `(requestCount: uint40)` | `0xd8d9915dc14b5a29b66cb263e1ea1e99e60418fc21d97f0fbf09cae1281291e2` | -| `RequestSettled` | `(requestCount: uint40, winner: address)` | `0x1234f98acbe1548b214f4528461a5377f1e2349569c04caa59325e488e7d2aa4` | -| `RequestSubmitted` | `(hasWrite: bool, requestCount: uint40, totalEstimatedWatcherFees: uint256, requestParams: tuple, payloadParamsArray: tuple[])` | `0x762bac43d5d7689b8911c5654a9d5550804373cead33bc98282067e6166e518f` | +| Event | Arguments | Topic | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `FeesIncreased` | `(requestCount: uint40, newMaxFees: uint256)` | `0xf258fca4e49b803ee2a4c2e33b6fcf18bc3982df21f111c00677025bf1ccbb6a` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RequestCancelled` | `(requestCount: uint40)` | `0xff191657769be72fc08def44c645014c60d18cb24b9ca05c9a33406a28253245` | +| `RequestCompletedWithErrors` | `(requestCount: uint40)` | `0xd8d9915dc14b5a29b66cb263e1ea1e99e60418fc21d97f0fbf09cae1281291e2` | +| `RequestSettled` | `(requestCount: uint40, winner: address)` | `0x1234f98acbe1548b214f4528461a5377f1e2349569c04caa59325e488e7d2aa4` | +| `RequestSubmitted` | `(hasWrite: bool, requestCount: uint40, totalEstimatedWatcherFees: uint256, requestParams: tuple, payloadParamsArray: tuple[])` | `0x762bac43d5d7689b8911c5654a9d5550804373cead33bc98282067e6166e518f` | ## Watcher -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `TriggerFailed` | `(triggerId: bytes32)` | `0x4386783bb0f7cad4ba12f033dbec03dc3441e7757a122f3097a7a4d945c98040` | -| `TriggerFeesSet` | `(triggerFees: uint256)` | `0x7df3967b7c8727af5ac0ee9825d88aafeb899d769bc428b91f8967fa0b623084` | -| `TriggerSucceeded` | `(triggerId: bytes32)` | `0x92d20fbcbf31370b8218e10ed00c5aad0e689022da30a08905ba5ced053219eb` | +| Event | Arguments | Topic | +| ---------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | +| `AppGatewayCallFailed` | `(triggerId: bytes32)` | `0xcaf8475fdade8465ea31672463949e6cf1797fdcdd11eeddbbaf857e1e5907b7` | +| `CalledAppGateway` | `(triggerId: bytes32)` | `0xf659ffb3875368f54fb4ab8f5412ac4518af79701a48076f7a58d4448e4bdd0b` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `TriggerFailed` | `(triggerId: bytes32)` | `0x4386783bb0f7cad4ba12f033dbec03dc3441e7757a122f3097a7a4d945c98040` | +| `TriggerFeesSet` | `(triggerFees: uint256)` | `0x7df3967b7c8727af5ac0ee9825d88aafeb899d769bc428b91f8967fa0b623084` | +| `TriggerSucceeded` | `(triggerId: bytes32)` | `0x92d20fbcbf31370b8218e10ed00c5aad0e689022da30a08905ba5ced053219eb` | ## FastSwitchboard -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `Attested` | `(payloadId_: bytes32, watcher: address)` | `0x3d83c7bc55c269e0bc853ddc0d7b9fca30216ecc43779acb4e36b7e0ad1c71e4` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | -| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | +| Event | Arguments | Topic | +| ---------------------------- | ----------------------------------------- | -------------------------------------------------------------------- | +| `Attested` | `(payloadId_: bytes32, watcher: address)` | `0x3d83c7bc55c269e0bc853ddc0d7b9fca30216ecc43779acb4e36b7e0ad1c71e4` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `RoleGranted` | `(role: bytes32, grantee: address)` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `(role: bytes32, revokee: address)` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## ReadPrecompile -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | -| `ReadFeesSet` | `(readFees: uint256)` | `0xc674cb6dde3a59f84dbf226832e606ffc54ac8a169e1568fc834c7813010f926` | +| Event | Arguments | Topic | +| --------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | +| `ReadFeesSet` | `(readFees: uint256)` | `0xc674cb6dde3a59f84dbf226832e606ffc54ac8a169e1568fc834c7813010f926` | | `ReadRequested` | `(transaction: tuple, readAtBlockNumber: uint256, payloadId: bytes32)` | `0xbcad63ac625c0f3cb23b62b126567728fcf5950ca8e559150e764eced73e794a` | ## SchedulePrecompile -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `ExpiryTimeSet` | `(expiryTime_: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | -| `MaxScheduleDelayInSecondsSet` | `(maxScheduleDelayInSeconds_: uint256)` | `0xfd5e4f0e96753ffb08a583390c2f151c51001d8e560625ab93b7fa7b4dac6d75` | -| `ScheduleCallbackFeesSet` | `(scheduleCallbackFees_: uint256)` | `0x82a2f41efc81ce7bfabc0affda7354dae42a3d09bd74a6196e8904b223138a52` | -| `ScheduleFeesPerSecondSet` | `(scheduleFeesPerSecond_: uint256)` | `0x7901a21229f6d2543d8676f53e21214d15f42513e7d46e0dcb510357222bdc7c` | -| `ScheduleRequested` | `(payloadId: bytes32, executeAfter: uint256, deadline: uint256)` | `0xd099d3e3d0f0e2c9c40e0066affeea125aab71d763b7ab0a279ccec3dff70b64` | -| `ScheduleResolved` | `(payloadId: bytes32)` | `0x925dc6c3ebffa07cac89d6e9675f1a5d04e045f2ed9a4fa442665935cb73e26b` | +| Event | Arguments | Topic | +| ------------------------------ | ---------------------------------------------------------------- | -------------------------------------------------------------------- | +| `ExpiryTimeSet` | `(expiryTime_: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | +| `MaxScheduleDelayInSecondsSet` | `(maxScheduleDelayInSeconds_: uint256)` | `0xfd5e4f0e96753ffb08a583390c2f151c51001d8e560625ab93b7fa7b4dac6d75` | +| `ScheduleCallbackFeesSet` | `(scheduleCallbackFees_: uint256)` | `0x82a2f41efc81ce7bfabc0affda7354dae42a3d09bd74a6196e8904b223138a52` | +| `ScheduleFeesPerSecondSet` | `(scheduleFeesPerSecond_: uint256)` | `0x7901a21229f6d2543d8676f53e21214d15f42513e7d46e0dcb510357222bdc7c` | +| `ScheduleRequested` | `(payloadId: bytes32, executeAfter: uint256, deadline: uint256)` | `0xd099d3e3d0f0e2c9c40e0066affeea125aab71d763b7ab0a279ccec3dff70b64` | +| `ScheduleResolved` | `(payloadId: bytes32)` | `0x925dc6c3ebffa07cac89d6e9675f1a5d04e045f2ed9a4fa442665935cb73e26b` | ## WritePrecompile -| Event | Arguments | Topic | -| ----- | --------- | ----- | -| `ChainMaxMsgValueLimitsUpdated` | `(chainSlug: uint32, maxMsgValueLimit: uint256)` | `0x439087d094fe7dacbba3f0c67032041952d8bd58a891e15af10ced28fed0eb91` | -| `ContractFactoryPlugSet` | `(chainSlug: uint32, contractFactoryPlug: bytes32)` | `0xfad552a6feb82bef23201b8dce04b2460bff41b00f26fef3d791572cfdab49c2` | -| `DigestWithSourceParams` | `(digest: bytes32, digestParams: tuple)` | `0x093e9b93d5aafe2a01beeb5ad1e80356601b533260651c08eda18b79912f315b` | -| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | -| `FeesSet` | `(writeFees: uint256)` | `0x3346af6da1932164d501f2ec28f8c5d686db5828a36b77f2da4332d89184fe7b` | -| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | -| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | -| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | -| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | -| `WriteProofRequested` | `(transmitter: address, digest: bytes32, prevBatchDigestHash: bytes32, deadline: uint256, payloadParams: tuple)` | `0x3247df5b4e8df4ac60c2c1f803b404ee16bc9d84a6b7649865464a8a397b9acb` | -| `WriteProofUploaded` | `(payloadId: bytes32, proof: bytes)` | `0xd8fe3a99a88c9630360418877afdf14e3e79f0f25fee162aeb230633ea740156` | - +| Event | Arguments | Topic | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `ChainMaxMsgValueLimitsUpdated` | `(chainSlug: uint32, maxMsgValueLimit: uint256)` | `0x439087d094fe7dacbba3f0c67032041952d8bd58a891e15af10ced28fed0eb91` | +| `ContractFactoryPlugSet` | `(chainSlug: uint32, contractFactoryPlug: bytes32)` | `0xfad552a6feb82bef23201b8dce04b2460bff41b00f26fef3d791572cfdab49c2` | +| `ExpiryTimeSet` | `(expiryTime: uint256)` | `0x07e837e13ad9a34715a6bd45f49bbf12de19f06df79cb0be12b3a7d7f2397fa9` | +| `FeesSet` | `(writeFees: uint256)` | `0x3346af6da1932164d501f2ec28f8c5d686db5828a36b77f2da4332d89184fe7b` | +| `Initialized` | `(version: uint64)` | `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2` | +| `OwnershipHandoverCanceled` | `(pendingOwner: address)` | `0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92` | +| `OwnershipHandoverRequested` | `(pendingOwner: address)` | `0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d` | +| `OwnershipTransferred` | `(oldOwner: address, newOwner: address)` | `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0` | +| `WriteProofRequested` | `(transmitter: address, digest: bytes32, prevBatchDigestHash: bytes32, deadline: uint256, payloadParams: tuple)` | `0x3247df5b4e8df4ac60c2c1f803b404ee16bc9d84a6b7649865464a8a397b9acb` | +| `WriteProofUploaded` | `(payloadId: bytes32, proof: bytes)` | `0xd8fe3a99a88c9630360418877afdf14e3e79f0f25fee162aeb230633ea740156` | diff --git a/FunctionSignatures.md b/FunctionSignatures.md index cfd25dce..0b76cd2b 100644 --- a/FunctionSignatures.md +++ b/FunctionSignatures.md @@ -2,562 +2,560 @@ ## AuctionManager -| Function | Signature | -| -------- | --------- | -| `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `auctionEndDelaySeconds` | `0x9087dfdb` | -| `auctionManager` | `0xb0192f9a` | -| `auctionStatus` | `0xd7d5fbf6` | -| `bid` | `0xfcdf49c2` | -| `bidTimeout` | `0x94090d0b` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `consumeFrom` | `0x40dd78be` | -| `creationCodeWithArgs` | `0xc126dcc4` | -| `deployForwarder__` | `0xd4e3b034` | -| `endAuction` | `0x1212e653` | -| `evmxSlug` | `0x8bae77c2` | -| `expireBid` | `0x1dd5022c` | -| `feesManager__` | `0x70568b58` | -| `forwarderAddresses` | `0x5390fdcb` | -| `getOnChainAddress` | `0xb6abffd7` | -| `getOverrideParams` | `0x54f0a866` | -| `grantRole` | `0x2f2ff15d` | -| `handleRevert` | `0x44792f25` | -| `hasRole` | `0x91d14854` | -| `initialize` | `0x86891c9b` | -| `initializeOnChain` | `0x86f01739` | -| `isAsyncModifierSet` | `0xb69e0c4a` | -| `isValidPromise` | `0xb690b962` | -| `maxFees` | `0xe83e34b1` | -| `maxReAuctionCount` | `0xc367b376` | -| `onCompleteData` | `0xb52fa926` | -| `onRequestComplete` | `0x5ed1f959` | -| `overrideParams` | `0xec5490fe` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `addressResolver__` | `0x6a750469` | +| `asyncDeployer__` | `0x2a39e801` | +| `auctionEndDelaySeconds` | `0x9087dfdb` | +| `auctionManager` | `0xb0192f9a` | +| `auctionStatus` | `0xd7d5fbf6` | +| `bid` | `0xfcdf49c2` | +| `bidTimeout` | `0x94090d0b` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `consumeFrom` | `0x40dd78be` | +| `creationCodeWithArgs` | `0xc126dcc4` | +| `deployForwarder__` | `0xd4e3b034` | +| `endAuction` | `0x1212e653` | +| `evmxSlug` | `0x8bae77c2` | +| `expireBid` | `0x1dd5022c` | +| `feesManager__` | `0x70568b58` | +| `forwarderAddresses` | `0x5390fdcb` | +| `getOnChainAddress` | `0xb6abffd7` | +| `getOverrideParams` | `0x54f0a866` | +| `grantRole` | `0x2f2ff15d` | +| `handleRevert` | `0x44792f25` | +| `hasRole` | `0x91d14854` | +| `initialize` | `0x86891c9b` | +| `initializeOnChain` | `0x86f01739` | +| `isAsyncModifierSet` | `0xb69e0c4a` | +| `isValidPromise` | `0xb690b962` | +| `maxFees` | `0xe83e34b1` | +| `maxReAuctionCount` | `0xc367b376` | +| `onCompleteData` | `0xb52fa926` | +| `onRequestComplete` | `0x5ed1f959` | +| `overrideParams` | `0xec5490fe` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `reAuctionCount` | `0x9b4b22d3` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `sbType` | `0x745de344` | -| `setAddress` | `0x85bf312c` | -| `setAuctionEndDelaySeconds` | `0x88606b1a` | -| `setMaxReAuctionCount` | `0x64c71403` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | -| `winningBids` | `0x9133f232` | +| `reAuctionCount` | `0x9b4b22d3` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `sbType` | `0x745de344` | +| `setAddress` | `0x85bf312c` | +| `setAuctionEndDelaySeconds` | `0x88606b1a` | +| `setMaxReAuctionCount` | `0x64c71403` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | +| `winningBids` | `0x9133f232` | ## Socket -| Function | Signature | -| -------- | --------- | -| `OFF_CHAIN_CALLER` | `0xcb2cb4f6` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `chainSlug` | `0xb349ba65` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `connect` | `0xb3bde1aa` | -| `disableSwitchboard` | `0xe545b261` | -| `enableSwitchboard` | `0xf97a498a` | -| `execute` | `0xafa8b480` | -| `getPlugConfig` | `0xf9778ee0` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `isValidSwitchboard` | `0xb2d67675` | -| `maxCopyBytes` | `0x212249d4` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `OFF_CHAIN_CALLER` | `0xcb2cb4f6` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `chainSlug` | `0xb349ba65` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `connect` | `0xb3bde1aa` | +| `disableSwitchboard` | `0xc4d9a820` | +| `enableSwitchboard` | `0xf97a498a` | +| `execute` | `0xafa8b480` | +| `getPlugConfig` | `0xf9778ee0` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `isValidSwitchboard` | `0xb2d67675` | +| `maxCopyBytes` | `0x212249d4` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payloadExecuted` | `0x3eaeac3d` | -| `payloadIdToDigest` | `0x7c8552b2` | -| `registerSwitchboard` | `0x74f5b1fc` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `setMaxCopyBytes` | `0x4fc7d6e9` | -| `setSocketFeeManager` | `0x25bd97e5` | -| `simulate` | `0x91bf8275` | -| `socketFeeManager` | `0xde5b8838` | -| `transferOwnership` | `0xf2fde38b` | -| `triggerCounter` | `0x8b0021de` | -| `version` | `0x54fd4d50` | +| `payloadExecuted` | `0x3eaeac3d` | +| `payloadIdToDigest` | `0x7c8552b2` | +| `registerSwitchboard` | `0x74f5b1fc` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `setMaxCopyBytes` | `0x4fc7d6e9` | +| `setSocketFeeManager` | `0x25bd97e5` | +| `simulate` | `0x91bf8275` | +| `socketFeeManager` | `0xde5b8838` | +| `transferOwnership` | `0xf2fde38b` | +| `triggerCounter` | `0x8b0021de` | +| `version` | `0x54fd4d50` | ## SocketBatcher -| Function | Signature | -| -------- | --------- | -| `attestAndExecute` | `0x66c7748a` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `attestAndExecute` | `0x66c7748a` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `socket__` | `0xc6a261d2` | -| `transferOwnership` | `0xf2fde38b` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `socket__` | `0xc6a261d2` | +| `transferOwnership` | `0xf2fde38b` | ## SocketFeeManager -| Function | Signature | -| -------- | --------- | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `getMinSocketFees` | `0xd383b688` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `getMinSocketFees` | `0xd383b688` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payAndCheckFees` | `0xd9d29ae3` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `setSocketFees` | `0x47a406f6` | -| `socketFees` | `0xab1b33a8` | -| `transferOwnership` | `0xf2fde38b` | +| `payAndCheckFees` | `0xd9d29ae3` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `setSocketFees` | `0x47a406f6` | +| `socketFees` | `0xab1b33a8` | +| `transferOwnership` | `0xf2fde38b` | ## FeesManager -| Function | Signature | -| -------- | --------- | -| `addressResolver__` | `0x6a750469` | -| `approveAppGateway` | `0xa3b53d8b` | +| Function | Signature | +| -------------------------------- | ------------ | +| `addressResolver__` | `0x6a750469` | +| `approveAppGateway` | `0xa3b53d8b` | | `approveAppGatewayWithSignature` | `0x94b649ec` | -| `approveAppGateways` | `0x86d23ab2` | -| `asyncDeployer__` | `0x2a39e801` | -| `blockCredits` | `0x9e434307` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deployForwarder__` | `0xd4e3b034` | -| `deposit` | `0x5671d329` | -| `evmxSlug` | `0x8bae77c2` | -| `feesManager__` | `0x70568b58` | -| `feesPlugs` | `0x23f5ee8a` | -| `feesPool` | `0x6b259690` | -| `getAvailableCredits` | `0xb065a8e5` | -| `handleRevert` | `0x44792f25` | -| `initialize` | `0xbf2c8539` | -| `isApproved` | `0xa389783e` | -| `isCreditSpendable` | `0x4f8990fd` | -| `isNonceUsed` | `0xcab7e8eb` | -| `onRequestComplete` | `0x5ed1f959` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestBlockedCredits` | `0xb62d25ac` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `sbType` | `0x745de344` | -| `setFeesPlug` | `0xd6a9a8b7` | -| `setFeesPool` | `0xd6684588` | -| `tokenOnChainBalances` | `0x3b27866d` | -| `transferCredits` | `0xf1686c89` | -| `transferOwnership` | `0xf2fde38b` | -| `unblockAndAssignCredits` | `0x01958181` | -| `unblockCredits` | `0xa0b32314` | -| `unwrap` | `0x7647691d` | -| `userCredits` | `0x20babb92` | -| `watcher__` | `0x300bb063` | -| `withdrawCredits` | `0xcfc6dbd9` | -| `wrap` | `0x023276f0` | +| `approveAppGateways` | `0x86d23ab2` | +| `asyncDeployer__` | `0x2a39e801` | +| `blockCredits` | `0x9e434307` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deployForwarder__` | `0xd4e3b034` | +| `deposit` | `0x5671d329` | +| `evmxSlug` | `0x8bae77c2` | +| `feesManager__` | `0x70568b58` | +| `feesPlugs` | `0x23f5ee8a` | +| `feesPool` | `0x6b259690` | +| `getAvailableCredits` | `0xb065a8e5` | +| `handleRevert` | `0x44792f25` | +| `initialize` | `0xbf2c8539` | +| `isApproved` | `0xa389783e` | +| `isCreditSpendable` | `0x4f8990fd` | +| `isNonceUsed` | `0xcab7e8eb` | +| `onRequestComplete` | `0x5ed1f959` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `renounceOwnership` | `0x715018a6` | +| `requestBlockedCredits` | `0xb62d25ac` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `sbType` | `0x745de344` | +| `setFeesPlug` | `0xd6a9a8b7` | +| `setFeesPool` | `0xd6684588` | +| `tokenOnChainBalances` | `0x3b27866d` | +| `transferCredits` | `0xf1686c89` | +| `transferOwnership` | `0xf2fde38b` | +| `unblockAndAssignCredits` | `0x01958181` | +| `unblockCredits` | `0xa0b32314` | +| `unwrap` | `0x7647691d` | +| `userCredits` | `0x20babb92` | +| `watcher__` | `0x300bb063` | +| `withdrawCredits` | `0xcfc6dbd9` | +| `wrap` | `0x023276f0` | ## FeesPool -| Function | Signature | -| -------- | --------- | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `getBalance` | `0x12065fe0` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `getBalance` | `0x12065fe0` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `revokeRole` | `0xd547741f` | -| `transferOwnership` | `0xf2fde38b` | -| `withdraw` | `0xf3fef3a3` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `revokeRole` | `0xd547741f` | +| `transferOwnership` | `0xf2fde38b` | +| `withdraw` | `0xf3fef3a3` | ## AddressResolver -| Function | Signature | -| -------- | --------- | -| `asyncDeployer__` | `0x2a39e801` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `contractAddresses` | `0xf689e892` | -| `defaultAuctionManager` | `0x8f27cdc6` | -| `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `initialize` | `0xc4d66de8` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `asyncDeployer__` | `0x2a39e801` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `contractAddresses` | `0xf689e892` | +| `defaultAuctionManager` | `0x8f27cdc6` | +| `deployForwarder__` | `0xd4e3b034` | +| `feesManager__` | `0x70568b58` | +| `initialize` | `0xc4d66de8` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `setAsyncDeployer` | `0xcb0ffff8` | -| `setContractAddress` | `0xe001f841` | -| `setDefaultAuctionManager` | `0xede8b4b5` | -| `setDeployForwarder` | `0xaeaee8a6` | -| `setFeesManager` | `0x1c89382a` | -| `setWatcher` | `0x24f48bc5` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `setAsyncDeployer` | `0xcb0ffff8` | +| `setContractAddress` | `0xe001f841` | +| `setDefaultAuctionManager` | `0xede8b4b5` | +| `setDeployForwarder` | `0xaeaee8a6` | +| `setFeesManager` | `0x1c89382a` | +| `setWatcher` | `0x24f48bc5` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | ## AsyncDeployer -| Function | Signature | -| -------- | --------- | -| `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `asyncPromiseBeacon` | `0xc0fbc0ef` | -| `asyncPromiseCounter` | `0x97cdbf4c` | -| `asyncPromiseImplementation` | `0x59531b8d` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deployAsyncPromiseContract` | `0x9851be0b` | -| `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `forwarderBeacon` | `0x945709ae` | -| `forwarderImplementation` | `0xe38d60a1` | -| `getAsyncPromiseAddress` | `0x104f39b4` | -| `getForwarderAddress` | `0x9c038b01` | -| `getOrDeployForwarderContract` | `0xe9bf1edf` | -| `initialize` | `0x485cc955` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | +| Function | Signature | +| ------------------------------- | ------------ | +| `addressResolver__` | `0x6a750469` | +| `asyncDeployer__` | `0x2a39e801` | +| `asyncPromiseBeacon` | `0xc0fbc0ef` | +| `asyncPromiseCounter` | `0x97cdbf4c` | +| `asyncPromiseImplementation` | `0x59531b8d` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deployAsyncPromiseContract` | `0x9851be0b` | +| `deployForwarder__` | `0xd4e3b034` | +| `feesManager__` | `0x70568b58` | +| `forwarderBeacon` | `0x945709ae` | +| `forwarderImplementation` | `0xe38d60a1` | +| `getAsyncPromiseAddress` | `0x104f39b4` | +| `getForwarderAddress` | `0x9c038b01` | +| `getOrDeployForwarderContract` | `0xe9bf1edf` | +| `initialize` | `0x485cc955` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | | `setAsyncPromiseImplementation` | `0xeb506eab` | -| `setForwarderImplementation` | `0x83b1e974` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | +| `setForwarderImplementation` | `0x83b1e974` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | ## AsyncPromise -| Function | Signature | -| -------- | --------- | +| Function | Signature | +| ------------------- | ------------ | | `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `callbackData` | `0xef44c272` | -| `callbackSelector` | `0x2764f92f` | +| `asyncDeployer__` | `0x2a39e801` | +| `callbackData` | `0xef44c272` | +| `callbackSelector` | `0x2764f92f` | | `deployForwarder__` | `0xd4e3b034` | -| `exceededMaxCopy` | `0xaf598c7c` | -| `feesManager__` | `0x70568b58` | -| `initialize` | `0x0ece6089` | -| `localInvoker` | `0x45eb87f4` | +| `exceededMaxCopy` | `0xaf598c7c` | +| `feesManager__` | `0x70568b58` | +| `initialize` | `0x0ece6089` | +| `localInvoker` | `0x45eb87f4` | | `markOnchainRevert` | `0xd0e7af1b` | -| `markResolved` | `0x822d5d1f` | -| `requestCount` | `0x5badbe4c` | -| `rescueFunds` | `0x6ccae054` | -| `returnData` | `0xebddbaf6` | -| `state` | `0xc19d93fb` | -| `then` | `0x0bf2ba15` | -| `watcher__` | `0x300bb063` | +| `markResolved` | `0x822d5d1f` | +| `requestCount` | `0x5badbe4c` | +| `rescueFunds` | `0x6ccae054` | +| `returnData` | `0xebddbaf6` | +| `state` | `0xc19d93fb` | +| `then` | `0x0bf2ba15` | +| `watcher__` | `0x300bb063` | ## DeployForwarder -| Function | Signature | -| -------- | --------- | -| `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deploy` | `0x940f11af` | -| `deployForwarder__` | `0xd4e3b034` | -| `deployerSwitchboardType` | `0xaa381f9a` | -| `feesManager__` | `0x70568b58` | -| `initialize` | `0x6133f985` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `addressResolver__` | `0x6a750469` | +| `asyncDeployer__` | `0x2a39e801` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deploy` | `0x940f11af` | +| `deployForwarder__` | `0xd4e3b034` | +| `deployerSwitchboardType` | `0xaa381f9a` | +| `feesManager__` | `0x70568b58` | +| `initialize` | `0x6133f985` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `saltCounter` | `0xa04c6809` | -| `transferOwnership` | `0xf2fde38b` | -| `watcher__` | `0x300bb063` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `saltCounter` | `0xa04c6809` | +| `transferOwnership` | `0xf2fde38b` | +| `watcher__` | `0x300bb063` | ## Forwarder -| Function | Signature | -| -------- | --------- | +| Function | Signature | +| ------------------- | ------------ | | `addressResolver__` | `0x6a750469` | -| `asyncDeployer__` | `0x2a39e801` | -| `chainSlug` | `0xb349ba65` | +| `asyncDeployer__` | `0x2a39e801` | +| `chainSlug` | `0xb349ba65` | | `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `getChainSlug` | `0x0b8c6568` | +| `feesManager__` | `0x70568b58` | +| `getChainSlug` | `0x0b8c6568` | | `getOnChainAddress` | `0x9da48789` | -| `initialize` | `0x148841cb` | -| `onChainAddress` | `0x8bd0b363` | -| `rescueFunds` | `0x6ccae054` | -| `watcher__` | `0x300bb063` | +| `initialize` | `0x148841cb` | +| `onChainAddress` | `0x8bd0b363` | +| `rescueFunds` | `0x6ccae054` | +| `watcher__` | `0x300bb063` | ## ProxyFactory -| Function | Signature | -| -------- | --------- | -| `adminOf` | `0x2abbef15` | -| `changeAdmin` | `0x1acfd02a` | -| `deploy` | `0x545e7c61` | -| `deployAndCall` | `0x4314f120` | -| `deployDeterministic` | `0x3729f922` | -| `deployDeterministicAndCall` | `0xa97b90d5` | -| `initCodeHash` | `0xdb4c545e` | +| Function | Signature | +| ----------------------------- | ------------ | +| `adminOf` | `0x2abbef15` | +| `changeAdmin` | `0x1acfd02a` | +| `deploy` | `0x545e7c61` | +| `deployAndCall` | `0x4314f120` | +| `deployDeterministic` | `0x3729f922` | +| `deployDeterministicAndCall` | `0xa97b90d5` | +| `initCodeHash` | `0xdb4c545e` | | `predictDeterministicAddress` | `0x5414dff0` | -| `upgrade` | `0x99a88ec4` | -| `upgradeAndCall` | `0x9623609d` | +| `upgrade` | `0x99a88ec4` | +| `upgradeAndCall` | `0x9623609d` | ## TestUSDC -| Function | Signature | -| -------- | --------- | +| Function | Signature | +| ------------------ | ------------ | | `DOMAIN_SEPARATOR` | `0x3644e515` | -| `allowance` | `0xdd62ed3e` | -| `approve` | `0x095ea7b3` | -| `balanceOf` | `0x70a08231` | -| `decimals` | `0x313ce567` | -| `mint` | `0x40c10f19` | -| `name` | `0x06fdde03` | -| `nonces` | `0x7ecebe00` | -| `owner` | `0x8da5cb5b` | -| `permit` | `0xd505accf` | -| `symbol` | `0x95d89b41` | -| `totalSupply` | `0x18160ddd` | -| `transfer` | `0xa9059cbb` | -| `transferFrom` | `0x23b872dd` | +| `allowance` | `0xdd62ed3e` | +| `approve` | `0x095ea7b3` | +| `balanceOf` | `0x70a08231` | +| `decimals` | `0x313ce567` | +| `mint` | `0x40c10f19` | +| `name` | `0x06fdde03` | +| `nonces` | `0x7ecebe00` | +| `owner` | `0x8da5cb5b` | +| `permit` | `0xd505accf` | +| `symbol` | `0x95d89b41` | +| `totalSupply` | `0x18160ddd` | +| `transfer` | `0xa9059cbb` | +| `transferFrom` | `0x23b872dd` | ## ContractFactoryPlug -| Function | Signature | -| -------- | --------- | -| `appGatewayId` | `0x1c335f49` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `connectSocket` | `0x258d19c8` | -| `deployContract` | `0xa0695389` | -| `getAddress` | `0x94ca2cb5` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `initSocket` | `0xa07d8545` | -| `isSocketInitialized` | `0x9a7d9a9b` | -| `overrides` | `0x4a85f041` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `appGatewayId` | `0x1c335f49` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `connectSocket` | `0x258d19c8` | +| `deployContract` | `0xa0695389` | +| `getAddress` | `0x94ca2cb5` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `initSocket` | `0xa07d8545` | +| `isSocketInitialized` | `0x9a7d9a9b` | +| `overrides` | `0x4a85f041` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `socket__` | `0xc6a261d2` | -| `transferOwnership` | `0xf2fde38b` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `socket__` | `0xc6a261d2` | +| `transferOwnership` | `0xf2fde38b` | ## Configurations -| Function | Signature | -| -------- | --------- | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `getPlugConfigs` | `0x25945c1a` | -| `initialize` | `0x485cc955` | -| `isValidPlug` | `0x00f9b9f4` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `getPlugConfigs` | `0x25945c1a` | +| `initialize` | `0x485cc955` | +| `isValidPlug` | `0x00f9b9f4` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `setAppGatewayConfigs` | `0xebfb22cd` | -| `setIsValidPlug` | `0x4842c37a` | -| `setSocket` | `0x38d4de67` | -| `setSwitchboard` | `0x491eac1f` | -| `sockets` | `0xb44a23ab` | -| `switchboards` | `0xaa539546` | -| `transferOwnership` | `0xf2fde38b` | -| `verifyConnections` | `0x36cb19fb` | -| `watcher__` | `0x300bb063` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `setAppGatewayConfigs` | `0xebfb22cd` | +| `setIsValidPlug` | `0x4842c37a` | +| `setSocket` | `0x38d4de67` | +| `setSwitchboard` | `0x491eac1f` | +| `sockets` | `0xb44a23ab` | +| `switchboards` | `0xaa539546` | +| `transferOwnership` | `0xf2fde38b` | +| `verifyConnections` | `0x36cb19fb` | +| `watcher__` | `0x300bb063` | ## PromiseResolver -| Function | Signature | -| -------- | --------- | -| `markRevert` | `0x56501015` | -| `rescueFunds` | `0x6ccae054` | +| Function | Signature | +| ----------------- | ------------ | +| `markRevert` | `0x56501015` | +| `rescueFunds` | `0x6ccae054` | | `resolvePromises` | `0xbf8484b8` | -| `watcher__` | `0x300bb063` | +| `watcher__` | `0x300bb063` | ## RequestHandler -| Function | Signature | -| -------- | --------- | -| `addressResolver__` | `0x6a750469` | -| `assignTransmitter` | `0xae5e9c48` | -| `asyncDeployer__` | `0x2a39e801` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `cancelRequest` | `0x3b5fd6fb` | -| `cancelRequestForReverts` | `0x82970278` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `deployForwarder__` | `0xd4e3b034` | -| `feesManager__` | `0x70568b58` | -| `getBatchPayloadIds` | `0xfd83cd1f` | -| `getPayload` | `0xb48fd0fe` | -| `getPrecompileFees` | `0xabac263c` | -| `getRequest` | `0xcf39abf6` | -| `getRequestBatchIds` | `0xe138fadb` | -| `handleRevert` | `0xcc88d3f9` | -| `increaseFees` | `0x10205541` | -| `initialize` | `0x485cc955` | -| `nextBatchCount` | `0x333a3963` | -| `nextRequestCount` | `0xfef72893` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payloadCounter` | `0x550ce1d5` | -| `precompiles` | `0x9932450b` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `setPrecompile` | `0x122e0042` | -| `setRequestPayloadCountLimit` | `0x8526582b` | -| `submitRequest` | `0xf91ba7cc` | -| `transferOwnership` | `0xf2fde38b` | +| Function | Signature | +| ------------------------------ | ------------ | +| `addressResolver__` | `0x6a750469` | +| `assignTransmitter` | `0xae5e9c48` | +| `asyncDeployer__` | `0x2a39e801` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `cancelRequest` | `0x3b5fd6fb` | +| `cancelRequestForReverts` | `0x82970278` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `deployForwarder__` | `0xd4e3b034` | +| `feesManager__` | `0x70568b58` | +| `getBatchPayloadIds` | `0xfd83cd1f` | +| `getPayload` | `0xb48fd0fe` | +| `getPrecompileFees` | `0xabac263c` | +| `getRequest` | `0xcf39abf6` | +| `getRequestBatchIds` | `0xe138fadb` | +| `handleRevert` | `0xcc88d3f9` | +| `increaseFees` | `0x10205541` | +| `initialize` | `0x485cc955` | +| `nextBatchCount` | `0x333a3963` | +| `nextRequestCount` | `0xfef72893` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `payloadCounter` | `0x550ce1d5` | +| `precompiles` | `0x9932450b` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `setPrecompile` | `0x122e0042` | +| `setRequestPayloadCountLimit` | `0x8526582b` | +| `submitRequest` | `0xf91ba7cc` | +| `transferOwnership` | `0xf2fde38b` | | `updateRequestAndProcessBatch` | `0x46464471` | -| `watcher__` | `0x300bb063` | +| `watcher__` | `0x300bb063` | ## Watcher -| Function | Signature | -| -------- | --------- | -| `addressResolver__` | `0x6a750469` | -| `appGatewayTemp` | `0x1394c029` | -| `asyncDeployer__` | `0x2a39e801` | -| `callAppGateways` | `0x0050bef1` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `cancelRequest` | `0x50ad0779` | -| `clearQueue` | `0xf22cb874` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `configurations__` | `0x52a3bbeb` | -| `deployForwarder__` | `0xd4e3b034` | -| `evmxSlug` | `0x8bae77c2` | -| `feesManager__` | `0x70568b58` | -| `getCurrentRequestCount` | `0x5715abbb` | -| `getPayloadParams` | `0xae5eeb77` | -| `getPrecompileFees` | `0xabac263c` | -| `getRequestParams` | `0x71263d0d` | -| `increaseFees` | `0xe9b304da` | -| `initialize` | `0xaaf7fc1a` | -| `isAppGatewayCalled` | `0xa79da6c7` | -| `isNonceUsed` | `0x5d00bb12` | -| `isWatcher` | `0x84785ecd` | -| `latestAsyncPromise` | `0xb8a8ba52` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `addressResolver__` | `0x6a750469` | +| `appGatewayTemp` | `0x1394c029` | +| `asyncDeployer__` | `0x2a39e801` | +| `callAppGateways` | `0x0050bef1` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `cancelRequest` | `0x50ad0779` | +| `clearQueue` | `0xf22cb874` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `configurations__` | `0x52a3bbeb` | +| `deployForwarder__` | `0xd4e3b034` | +| `evmxSlug` | `0x8bae77c2` | +| `feesManager__` | `0x70568b58` | +| `getCurrentRequestCount` | `0x5715abbb` | +| `getPayloadParams` | `0xae5eeb77` | +| `getPrecompileFees` | `0xabac263c` | +| `getRequestParams` | `0x71263d0d` | +| `increaseFees` | `0xe9b304da` | +| `initialize` | `0xaaf7fc1a` | +| `isAppGatewayCalled` | `0xa79da6c7` | +| `isNonceUsed` | `0x5d00bb12` | +| `isWatcher` | `0x84785ecd` | +| `latestAsyncPromise` | `0xb8a8ba52` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `payloadQueue` | `0x74f00ffb` | -| `promiseResolver__` | `0xdee152be` | -| `queue` | `0x65967f1a` | -| `queueAndSubmit` | `0x9d4c9df7` | -| `renounceOwnership` | `0x715018a6` | -| `requestHandler__` | `0x55184561` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0xa58c6fc5` | -| `setCoreContracts` | `0xefa891c4` | -| `setIsValidPlug` | `0x06c0a40a` | -| `setTriggerFees` | `0xaeb30511` | -| `submitRequest` | `0x4890b5ef` | -| `transferOwnership` | `0xf2fde38b` | -| `triggerFees` | `0x73f76aec` | -| `triggerFromChainSlug` | `0xd12b4f12` | -| `triggerFromPlug` | `0x3b847d12` | -| `watcherMultiCall` | `0x8021e82b` | -| `watcher__` | `0x300bb063` | +| `payloadQueue` | `0x74f00ffb` | +| `promiseResolver__` | `0xdee152be` | +| `queue` | `0x65967f1a` | +| `queueAndSubmit` | `0x9d4c9df7` | +| `renounceOwnership` | `0x715018a6` | +| `requestHandler__` | `0x55184561` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0xa58c6fc5` | +| `setCoreContracts` | `0xefa891c4` | +| `setIsValidPlug` | `0x06c0a40a` | +| `setTriggerFees` | `0xaeb30511` | +| `submitRequest` | `0x4890b5ef` | +| `transferOwnership` | `0xf2fde38b` | +| `triggerFees` | `0x73f76aec` | +| `triggerFromChainSlug` | `0xd12b4f12` | +| `triggerFromPlug` | `0x3b847d12` | +| `watcherMultiCall` | `0x8021e82b` | +| `watcher__` | `0x300bb063` | ## FastSwitchboard -| Function | Signature | -| -------- | --------- | -| `allowPayload` | `0x31c23f66` | -| `attest` | `0x63671b60` | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `chainSlug` | `0xb349ba65` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `grantRole` | `0x2f2ff15d` | -| `hasRole` | `0x91d14854` | -| `isAttested` | `0xc13c2396` | -| `owner` | `0x8da5cb5b` | +| Function | Signature | +| ---------------------------- | ------------ | +| `allowPayload` | `0x31c23f66` | +| `attest` | `0x63671b60` | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `chainSlug` | `0xb349ba65` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `grantRole` | `0x2f2ff15d` | +| `hasRole` | `0x91d14854` | +| `isAttested` | `0xc13c2396` | +| `owner` | `0x8da5cb5b` | | `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `registerSwitchboard` | `0x74f5b1fc` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `revokeRole` | `0xd547741f` | -| `socket__` | `0xc6a261d2` | -| `transferOwnership` | `0xf2fde38b` | +| `registerSwitchboard` | `0x74f5b1fc` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `revokeRole` | `0xd547741f` | +| `socket__` | `0xc6a261d2` | +| `transferOwnership` | `0xf2fde38b` | ## ReadPrecompile -| Function | Signature | -| -------- | --------- | -| `expiryTime` | `0x99bc0aea` | -| `getPrecompileFees` | `0xb7a3d04c` | -| `handlePayload` | `0x1d5e1d98` | -| `readFees` | `0xe06357a2` | -| `rescueFunds` | `0x6ccae054` | -| `resolvePayload` | `0xea92e825` | -| `setExpiryTime` | `0x30fc4cff` | -| `setFees` | `0x3d18678e` | +| Function | Signature | +| ------------------------------ | ------------ | +| `expiryTime` | `0x99bc0aea` | +| `getPrecompileFees` | `0xb7a3d04c` | +| `handlePayload` | `0x1d5e1d98` | +| `readFees` | `0xe06357a2` | +| `rescueFunds` | `0x6ccae054` | +| `resolvePayload` | `0xea92e825` | +| `setExpiryTime` | `0x30fc4cff` | +| `setFees` | `0x3d18678e` | | `validateAndGetPrecompileData` | `0x997f5bef` | -| `watcher__` | `0x300bb063` | +| `watcher__` | `0x300bb063` | ## SchedulePrecompile -| Function | Signature | -| -------- | --------- | -| `expiryTime` | `0x99bc0aea` | -| `getPrecompileFees` | `0xb7a3d04c` | -| `handlePayload` | `0x1d5e1d98` | -| `maxScheduleDelayInSeconds` | `0x3ef01cdb` | -| `rescueFunds` | `0x6ccae054` | -| `resolvePayload` | `0xea92e825` | -| `scheduleCallbackFees` | `0x4c5b6007` | -| `scheduleFeesPerSecond` | `0x852a74c1` | -| `setExpiryTime` | `0x30fc4cff` | +| Function | Signature | +| ------------------------------ | ------------ | +| `expiryTime` | `0x99bc0aea` | +| `getPrecompileFees` | `0xb7a3d04c` | +| `handlePayload` | `0x1d5e1d98` | +| `maxScheduleDelayInSeconds` | `0x3ef01cdb` | +| `rescueFunds` | `0x6ccae054` | +| `resolvePayload` | `0xea92e825` | +| `scheduleCallbackFees` | `0x4c5b6007` | +| `scheduleFeesPerSecond` | `0x852a74c1` | +| `setExpiryTime` | `0x30fc4cff` | | `setMaxScheduleDelayInSeconds` | `0x12953318` | -| `setScheduleCallbackFees` | `0xec8fd71e` | -| `setScheduleFeesPerSecond` | `0x28e59e57` | +| `setScheduleCallbackFees` | `0xec8fd71e` | +| `setScheduleFeesPerSecond` | `0x28e59e57` | | `validateAndGetPrecompileData` | `0x997f5bef` | -| `watcher__` | `0x300bb063` | +| `watcher__` | `0x300bb063` | ## WritePrecompile -| Function | Signature | -| -------- | --------- | -| `cancelOwnershipHandover` | `0x54d1f13d` | -| `chainMaxMsgValueLimit` | `0x01d1e126` | -| `completeOwnershipHandover` | `0xf04e283e` | -| `contractFactoryPlugs` | `0x35426631` | -| `digestHashes` | `0xd1a862bf` | -| `encodeU64Borsh` | `0xacc1b559` | -| `expiryTime` | `0x99bc0aea` | -| `getDigest` | `0x91b6288b` | -| `getPrecompileFees` | `0xb7a3d04c` | -| `getPrevBatchDigestHash` | `0x372863a1` | -| `handlePayload` | `0x1d5e1d98` | -| `initialize` | `0xeb990c59` | -| `owner` | `0x8da5cb5b` | -| `ownershipHandoverExpiresAt` | `0xfee81cf4` | -| `renounceOwnership` | `0x715018a6` | -| `requestOwnershipHandover` | `0x25692962` | -| `rescueFunds` | `0x6ccae054` | -| `resolvePayload` | `0xea92e825` | -| `setContractFactoryPlugs` | `0x8b198f5c` | -| `setExpiryTime` | `0x30fc4cff` | -| `setFees` | `0x3d18678e` | -| `transferOwnership` | `0xf2fde38b` | +| Function | Signature | +| ------------------------------ | ------------ | +| `cancelOwnershipHandover` | `0x54d1f13d` | +| `chainMaxMsgValueLimit` | `0x01d1e126` | +| `completeOwnershipHandover` | `0xf04e283e` | +| `contractFactoryPlugs` | `0x35426631` | +| `digestHashes` | `0xd1a862bf` | +| `expiryTime` | `0x99bc0aea` | +| `getDigest` | `0x91b6288b` | +| `getPrecompileFees` | `0xb7a3d04c` | +| `getPrevBatchDigestHash` | `0x372863a1` | +| `handlePayload` | `0x1d5e1d98` | +| `initialize` | `0xeb990c59` | +| `owner` | `0x8da5cb5b` | +| `ownershipHandoverExpiresAt` | `0xfee81cf4` | +| `renounceOwnership` | `0x715018a6` | +| `requestOwnershipHandover` | `0x25692962` | +| `rescueFunds` | `0x6ccae054` | +| `resolvePayload` | `0xea92e825` | +| `setContractFactoryPlugs` | `0x8b198f5c` | +| `setExpiryTime` | `0x30fc4cff` | +| `setFees` | `0x3d18678e` | +| `transferOwnership` | `0xf2fde38b` | | `updateChainMaxMsgValueLimits` | `0x6a7aa6ac` | -| `uploadProof` | `0x81b48fcf` | +| `uploadProof` | `0x81b48fcf` | | `validateAndGetPrecompileData` | `0x997f5bef` | -| `watcherProofs` | `0x3fa3166b` | -| `watcher__` | `0x300bb063` | -| `writeFees` | `0x5c664aeb` | - +| `watcherProofs` | `0x3fa3166b` | +| `watcher__` | `0x300bb063` | +| `writeFees` | `0x5c664aeb` | diff --git a/contracts/evmx/fees/Credit.sol b/contracts/evmx/fees/Credit.sol index 463589f2..cb822c04 100644 --- a/contracts/evmx/fees/Credit.sol +++ b/contracts/evmx/fees/Credit.sol @@ -32,7 +32,7 @@ abstract contract FeesManagerStorage is IFeesManager { // slot 52 /// @notice user credits => stores fees for user, app gateway, transmitters and watcher precompile - mapping(address => UserCredits) public userCredits; // TODO:GW: what is the "userAddress" ? is is just EVMx address ? + mapping(address => UserCredits) public userCredits; // slot 53 /// @notice Mapping to track request credits details for each request count @@ -42,18 +42,18 @@ abstract contract FeesManagerStorage is IFeesManager { // slot 54 // user approved app gateways // userAddress => appGateway => isApproved - mapping(address => mapping(address => bool)) public isApproved; //TODO:GW: what is the "userAddress" ? is this an on-chain address ? if yes than it needs to be bytes32 + mapping(address => mapping(address => bool)) public isApproved; // slot 55 // token pool balances // chainSlug => token address => amount - mapping(uint32 => mapping(address => uint256)) public tokenOnChainBalances; // TODO:GW: what is that ? // how does it map to multi-chain with Solana + mapping(uint32 => mapping(address => uint256)) public tokenOnChainBalances; // slot 56 /// @notice Mapping to track nonce to whether it has been used /// @dev address => signatureNonce => isNonceUsed /// @dev used by watchers or other users in signatures - mapping(address => mapping(uint256 => bool)) public isNonceUsed; // TODO:GW: earlier it was just "uint256 => bool" now it has "address" why ? if it is a watcher address it is just for evm or should be bytes32 ? + mapping(address => mapping(uint256 => bool)) public isNonceUsed; // slot 57 /// @notice Mapping to track fees plug for each chain slug diff --git a/contracts/evmx/interfaces/IWatcher.sol b/contracts/evmx/interfaces/IWatcher.sol index 97fd6725..7f127de9 100644 --- a/contracts/evmx/interfaces/IWatcher.sol +++ b/contracts/evmx/interfaces/IWatcher.sol @@ -89,6 +89,5 @@ interface IWatcher { function setIsValidPlug(bool isValid_, uint32 chainSlug_, bytes32 onchainAddress_) external; - // TODO:GW: what calls this ? - can it also be a Solana watcher key ? function isWatcher(address account_) external view returns (bool); } diff --git a/contracts/evmx/plugs/FeesPlug.sol b/contracts/evmx/plugs/FeesPlug.sol index 6927ce92..3e035125 100644 --- a/contracts/evmx/plugs/FeesPlug.sol +++ b/contracts/evmx/plugs/FeesPlug.sol @@ -103,7 +103,6 @@ contract FeesPlug is IFeesPlug, PlugBase, AccessControl { /// @notice Adds a token to the whitelist /// @param token_ The token address to whitelist - // TODO:GW: what is that toknen used for ? is it EVM specific ? function whitelistToken(address token_) external onlyOwner { if (token_.code.length == 0) revert InvalidTokenAddress(); whitelistedTokens[token_] = true; @@ -117,7 +116,6 @@ contract FeesPlug is IFeesPlug, PlugBase, AccessControl { emit TokenRemovedFromWhitelist(token_); } - // TODO:GW: what is calling this function ? - is it only EVM specific ? function connectSocket( bytes32 appGatewayId_, address socket_, diff --git a/contracts/evmx/watcher/Configurations.sol b/contracts/evmx/watcher/Configurations.sol index d5fdf34d..3c130f0b 100644 --- a/contracts/evmx/watcher/Configurations.sol +++ b/contracts/evmx/watcher/Configurations.sol @@ -14,8 +14,6 @@ abstract contract ConfigurationsStorage is IConfigurations { // slots [0-49] reserved for gap uint256[50] _gap_before; - error InvalidSwitchboardTest(bytes32 sb, bytes32 sbExpected); - // slot 50 /// @notice Maps network and plug to their configuration /// @dev chainSlug => plug => PlugConfig @@ -46,8 +44,6 @@ abstract contract ConfigurationsStorage is IConfigurations { /// @notice Configuration contract for the Watcher Precompile system /// @dev Handles the mapping between networks, plugs, and app gateways for payload execution contract Configurations is ConfigurationsStorage, Initializable, Ownable, WatcherBase { - // TODO:GW: remove after testing Solana - event VerifyConnectionsSB(bytes32 switchboard, bytes32 switchboardExpected); /// @notice Emitted when a new plug is configured for an app gateway /// @param appGatewayId The id of the app gateway @@ -163,13 +159,10 @@ contract Configurations is ConfigurationsStorage, Initializable, Ownable, Watche bytes32 target_, address appGateway_, bytes32 switchboardType_ - // ) external { ) external view { (bytes32 appGatewayId, bytes32 switchboard) = getPlugConfigs(chainSlug_, target_); if (appGatewayId != toBytes32Format(appGateway_)) revert InvalidGateway(); - // emit VerifyConnectionsSB(switchboard, switchboards[chainSlug_][switchboardType_]); - // if (switchboard != switchboards[chainSlug_][switchboardType_]) revert InvalidSwitchboard(); - if (switchboard != switchboards[chainSlug_][switchboardType_]) revert InvalidSwitchboardTest(switchboard, switchboards[chainSlug_][switchboardType_]); + if (switchboard != switchboards[chainSlug_][switchboardType_]) revert InvalidSwitchboard(); } /** diff --git a/contracts/evmx/watcher/RequestHandler.sol b/contracts/evmx/watcher/RequestHandler.sol index d9bd933b..ad1a6b71 100644 --- a/contracts/evmx/watcher/RequestHandler.sol +++ b/contracts/evmx/watcher/RequestHandler.sol @@ -75,16 +75,6 @@ contract RequestHandler is RequestHandlerStorage, Initializable, Ownable, Addres event RequestCompletedWithErrors(uint40 requestCount); event RequestCancelled(uint40 requestCount); - // TODO: remove after testing Solana - event PayloadIdData( - uint40 requestCount, - uint40 batchCount, - uint40 payloadCount, - uint32 chainSlug, - bytes32 switchboard, - bytes packed - ); - modifier isRequestCancelled(uint40 requestCount_) { if (_requests[requestCount_].requestTrackingParams.isRequestCancelled) revert RequestAlreadyCancelled(); @@ -264,24 +254,6 @@ contract RequestHandler is RequestHandlerStorage, Initializable, Ownable, Addres ); _batchPayloadIds[nextBatchCount].push(payloadId); - // TODO: remove after testing Solana - uint32 chainSlugParam = queuePayloadParam.transaction.chainSlug; - bytes memory packed = abi.encodePacked( - requestCount_, - nextBatchCount, - payloadCount, - chainSlugParam, - switchboard - ); - emit PayloadIdData( - requestCount_, - nextBatchCount, - payloadCount, - chainSlugParam, - switchboard, - packed - ); - // create prev digest hash PayloadParams memory p; p.requestCount = requestCount_; diff --git a/contracts/utils/common/Structs.sol b/contracts/utils/common/Structs.sol index 3592a67f..b8b26830 100644 --- a/contracts/utils/common/Structs.sol +++ b/contracts/utils/common/Structs.sol @@ -219,7 +219,6 @@ struct SolanaInstructionData { bytes32 programId; bytes32[] accounts; bytes8 instructionDiscriminator; - // TODO:GW: in one of functionArguments is an array it might need a special handling and encoding // for now we assume the all functionArguments are simple types (uint256, address, bool, etc.) not complex types (struct, array, etc.) bytes[] functionArguments; } diff --git a/foundry.toml b/foundry.toml index a63f4924..4c30208e 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,27 +10,27 @@ evm_version = 'paris' via_ir = false [labels] -0xEBBCa7Aa182fE5Fa6f891a776582Ce945E4ff43a = "AddressResolver" -0xa4FF2b386291A6DbBb6186A1fff37C235E9AF698 = "AddressResolverImpl" -0xD4E83aaDF6893e1a1C41646c068e5795d8708429 = "AsyncDeployer" -0x4b731545444500093957B3521E1A29b1e9BB989d = "AsyncDeployerImpl" -0xf5Ec4693bC9E3df9C248299C1bF5E97cbfaDb413 = "AuctionManager" -0xdDc5460808D19bce6cA05b1DaC425ee80C0A0086 = "AuctionManagerImpl" -0x48b3A2a434b9fE975E4B79a3C28c37Bc06a28f8b = "Configurations" -0x3A0123540353594D8beB826371D18d1F9EA2f01d = "ConfigurationsImpl" -0x7597271576B01bA949b9162870878192811e9268 = "DeployForwarder" -0xE7F208422F817cd703C83A859A2068bf1fF047B3 = "DeployForwarderImpl" -0xE7e73a8ffcF155BCe71BaB0a3b7c8BB68cfb6Bf0 = "ERC1967Factory" -0x357529E7D3F2fC1448560D095337D1bEaaA51Db4 = "FeesManager" -0x6944dC2Ae8ca915c4eE15b8b437E09aD8eBF2ED9 = "FeesManagerImpl" +0x531b5626BD2514c746ae08D2D2BbAED6948C802F = "AddressResolver" +0x4Fe8DCD92026E29f8D8393611fA225c342E00db8 = "AddressResolverImpl" +0xACEBD9E6089Af301abE05d74f3a8d5A5a1A262f3 = "AsyncDeployer" +0x422214a85832DAAd3D8ABDf0cf67B47a8c889139 = "AsyncDeployerImpl" +0xC388B7c73321B1DE8d523061c6668EC38CfDA486 = "AuctionManager" +0x387d44F7CdcC8924Aa4B4a9b6Ea72Ed1059A041F = "AuctionManagerImpl" +0x9318Be24d10051ca03CC475b03eC6a844F95e724 = "Configurations" +0xBBC5Da309288Ada3C0704d7F2cA95a00DAc7aF81 = "ConfigurationsImpl" +0x8B89Aea83e86786310287118F78508E940bd4395 = "DeployForwarder" +0xf8bda7d44BACB038a7F9eA09301e75e640226717 = "DeployForwarderImpl" +0x003b65f7D0d91C994Db0048DA148571E7f038861 = "ERC1967Factory" +0x16132fa79CB1EE693B0a7d2c0C888870e5B0ef91 = "FeesManager" +0x82C8EAbEFb20E1a2798f121F80bDcf1e7eD6119D = "FeesManagerImpl" 0x9De353dD1131aB4e502590D3a1832652FA316268 = "FeesPool" -0xB1365F70cF2c9d5858F12c8DfB5ECBb66543538C = "PromiseResolver" -0x055C05c3f7cC24f216d42B30c4B94b343eF62f4e = "ReadPrecompile" -0xD243A5761C30Caf3ECC9305F778Ca111698E1182 = "RequestHandler" -0x8A59c8Ec8279366778f7fC4d8f7Ca111D4CfBD3D = "RequestHandlerImpl" -0x36b13Ae0b6d533d8B98EC6d7C7086Eec11361F4A = "SchedulePrecompile" -0xDF6726Cc8867e6AEd6C20f4696a8B98a46036467 = "Watcher" -0x86a2659B57e393aC5Ea4e8bf97e4b1e595a2f9C2 = "WatcherImpl" -0x4276fDBc8383De3CB6F527a40D2e5E4725Ec8BBb = "WritePrecompile" -0xDd13A39F991A7Dd702a0BEBcB31EB2e54d1625E6 = "WritePrecompileImpl" -0x4530a440dcc32206f901325143132da1eDB8d2E9 = "APP_GATEWAY" +0x478Dd0858d6857C2c950E6a08CAB2A96756a3721 = "PromiseResolver" +0x208E78F90713235c5638Fc55Aa15b27ec7CBae9e = "ReadPrecompile" +0xa5d02842BA8B48c5aA22919Cb71D8366252dB452 = "RequestHandler" +0x2e03FEDC25923F7684827bC8f0c8D8dD49a9Bb8A = "RequestHandlerImpl" +0x47eDE68C04f09db20331B85570150a7096c02D86 = "SchedulePrecompile" +0x1A1b863100202c72Db1e4b2aedA11E9381A25f8c = "Watcher" +0x0f2B8e35189F498067886e1093528e32418C1DCb = "WatcherImpl" +0x59F89D9092db218b1D287B93E7bbF754aCFaEE33 = "WritePrecompile" +0x28380539d14F2475881E0E4693593AB09Ba116D0 = "WritePrecompileImpl" +0x5b0a2656b79212f7Fa6FD77F9583290386860EC4 = "APP_GATEWAY" diff --git a/hardhat-scripts/deploy/3.configureChains.ts b/hardhat-scripts/deploy/3.configureChains.ts index 445457d9..dc2948a3 100644 --- a/hardhat-scripts/deploy/3.configureChains.ts +++ b/hardhat-scripts/deploy/3.configureChains.ts @@ -104,22 +104,7 @@ async function setOnchainContracts( [chain, FAST_SWITCHBOARD_TYPE, toBytes32Format(switchboard)], signer ); - console.log("XXX Setting solana switchboard"); - console.log("FAST_SWITCHBOARD_TYPE: ", FAST_SWITCHBOARD_TYPE); - const solanaSwitchboard = process.env.SWITCHBOARD_SOLANA; - if (!solanaSwitchboard) throw new Error("SWITCHBOARD_SOLANA is not set"); - console.log("solanaSwitchboard as bytes32 reversed: ", Buffer.from(toBytes32Format(solanaSwitchboard)).toString("hex")); - await updateContractSettings( - EVMX_CHAIN_ID, - Contracts.Configurations, - "switchboards", - [ChainSlug.SOLANA_DEVNET, FAST_SWITCHBOARD_TYPE], - solanaSwitchboard, - "setSwitchboard", - [ChainSlug.SOLANA_DEVNET, FAST_SWITCHBOARD_TYPE, toBytes32Format(solanaSwitchboard)], - signer - ); - + await updateContractSettings( EVMX_CHAIN_ID, Contracts.Configurations, From e05c835548061814ca5dde81c18e8dcd0fb80553 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 3 Jul 2025 15:48:55 +0530 Subject: [PATCH 16/18] fix: fallback target address --- contracts/evmx/helpers/Forwarder.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/evmx/helpers/Forwarder.sol b/contracts/evmx/helpers/Forwarder.sol index 2f86fd39..9c53ba22 100644 --- a/contracts/evmx/helpers/Forwarder.sol +++ b/contracts/evmx/helpers/Forwarder.sol @@ -58,7 +58,7 @@ contract Forwarder is ForwarderStorage, Initializable, AddressResolverUtil { /// @notice Returns the on-chain address associated with this forwarder. /// @return The on-chain address. - function getOnChainAddress() external view override returns (bytes32) { + function getOnChainAddress() public view override returns (bytes32) { if (oldOnChainAddress != address(0)) { return toBytes32Format(oldOnChainAddress); } @@ -103,7 +103,7 @@ contract Forwarder is ForwarderStorage, Initializable, AddressResolverUtil { queueParams.overrideParams = overrideParams; queueParams.transaction = Transaction({ chainSlug: chainSlug, - target: onChainAddress, + target: getOnChainAddress(), payload: msg.data }); queueParams.switchboardType = sbType; From c5707ce0e2bf8d3643ef1ef3b93795a08a6023df Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 3 Jul 2025 16:22:45 +0530 Subject: [PATCH 17/18] fix: lint --- contracts/evmx/watcher/Configurations.sol | 1 - .../evmx/watcher/precompiles/WritePrecompile.sol | 11 ++++++----- hardhat-scripts/verify/verify.ts | 2 +- src/cctp.ts | 2 +- src/index.ts | 2 +- test/apps/Counter.t.sol | 2 +- test/apps/ParallelCounter.t.sol | 2 +- test/apps/SuperToken.t.sol | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/contracts/evmx/watcher/Configurations.sol b/contracts/evmx/watcher/Configurations.sol index 3c130f0b..dc0b3694 100644 --- a/contracts/evmx/watcher/Configurations.sol +++ b/contracts/evmx/watcher/Configurations.sol @@ -44,7 +44,6 @@ abstract contract ConfigurationsStorage is IConfigurations { /// @notice Configuration contract for the Watcher Precompile system /// @dev Handles the mapping between networks, plugs, and app gateways for payload execution contract Configurations is ConfigurationsStorage, Initializable, Ownable, WatcherBase { - /// @notice Emitted when a new plug is configured for an app gateway /// @param appGatewayId The id of the app gateway /// @param chainSlug The identifier of the destination network diff --git a/contracts/evmx/watcher/precompiles/WritePrecompile.sol b/contracts/evmx/watcher/precompiles/WritePrecompile.sol index ab69f652..120354f2 100644 --- a/contracts/evmx/watcher/precompiles/WritePrecompile.sol +++ b/contracts/evmx/watcher/precompiles/WritePrecompile.sol @@ -155,12 +155,13 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc { ( address appGateway, - Transaction memory transaction, - , // _writeFinality + Transaction memory transaction, // _writeFinality + , uint256 gasLimit, uint256 value, - // bytes32 switchboard - ) = abi.decode( + + ) = // bytes32 switchboard + abi.decode( payloadParams.precompileData, (address, Transaction, WriteFinality, uint256, uint256, bytes32) ); @@ -304,4 +305,4 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyWatcher { RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); } -} \ No newline at end of file +} diff --git a/hardhat-scripts/verify/verify.ts b/hardhat-scripts/verify/verify.ts index 9f6871ba..eaec585c 100644 --- a/hardhat-scripts/verify/verify.ts +++ b/hardhat-scripts/verify/verify.ts @@ -67,7 +67,7 @@ export const main = async () => { } await storeUnVerifiedParams(unverifiedChainParams, chain, mode); - await new Promise(resolve => setTimeout(resolve, 1000)); + await new Promise((resolve) => setTimeout(resolve, 1000)); retryCount++; if (unverifiedChainParams.length == 0) break; } diff --git a/src/cctp.ts b/src/cctp.ts index 7b9dde13..c0436393 100644 --- a/src/cctp.ts +++ b/src/cctp.ts @@ -31,4 +31,4 @@ export const CCTP_DOMAINS: { [ChainSlug.ARBITRUM]: 3, [ChainSlug.BASE]: 6, [ChainSlug.POLYGON_MAINNET]: 7, -}; \ No newline at end of file +}; diff --git a/src/index.ts b/src/index.ts index 9238c022..e58e42d5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,4 +5,4 @@ export * from "./finality"; export * from "./types"; export * from "./constants"; export * from "./signer"; -export * from "./cctp"; \ No newline at end of file +export * from "./cctp"; diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index 4d0b5010..3472fe0b 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -90,7 +90,7 @@ contract CounterTest is AppGatewayBaseSetup { counterGateway ); address optCounter = fromBytes32Format(optCounterBytes32); - + uint256 arbCounterBefore = Counter(arbCounter).counter(); uint256 optCounterBefore = Counter(optCounter).counter(); diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index 3acd413c..51763bb3 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -137,7 +137,7 @@ contract ParallelCounterTest is AppGatewayBaseSetup { parallelCounterGateway ); address arbCounter = fromBytes32Format(arbCounterBytes32); - + (bytes32 optCounterBytes32, address optCounterForwarder) = getOnChainAndForwarderAddresses( optChainSlug, counterId1, diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index 3b35db2d..18a9ea24 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -151,7 +151,7 @@ contract SuperTokenTest is AppGatewayBaseSetup { IAppGateway(appContracts.superTokenApp) ); address onChainOpt = fromBytes32Format(onChainOptBytes32); - + uint256 arbBalanceBefore = SuperToken(onChainArb).balanceOf(owner); uint256 optBalanceBefore = SuperToken(onChainOpt).balanceOf(owner); From ee27c1fea06599badac4f2a0213fca05c3c7878c Mon Sep 17 00:00:00 2001 From: Gregory The Dev Date: Thu, 3 Jul 2025 13:03:40 +0200 Subject: [PATCH 18/18] fix: remove comments after yarn lints makes them unusable --- contracts/evmx/watcher/precompiles/WritePrecompile.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/evmx/watcher/precompiles/WritePrecompile.sol b/contracts/evmx/watcher/precompiles/WritePrecompile.sol index 120354f2..be56971f 100644 --- a/contracts/evmx/watcher/precompiles/WritePrecompile.sol +++ b/contracts/evmx/watcher/precompiles/WritePrecompile.sol @@ -155,12 +155,12 @@ contract WritePrecompile is WritePrecompileStorage, Initializable, Ownable, Watc { ( address appGateway, - Transaction memory transaction, // _writeFinality + Transaction memory transaction,– , uint256 gasLimit, uint256 value, - ) = // bytes32 switchboard + ) = abi.decode( payloadParams.precompileData, (address, Transaction, WriteFinality, uint256, uint256, bytes32)