Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
InterchainAccountIsm
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; // ============ Internal Imports ============ import {AbstractRoutingIsm} from "./AbstractRoutingIsm.sol"; import {IMailbox} from "../../interfaces/IMailbox.sol"; import {IInterchainSecurityModule} from "../../interfaces/IInterchainSecurityModule.sol"; import {Message} from "../../libs/Message.sol"; import {InterchainAccountMessage} from "../../middleware/libs/InterchainAccountMessage.sol"; import {PackageVersioned} from "../../PackageVersioned.sol"; /** * @title InterchainAccountIsm */ contract InterchainAccountIsm is AbstractRoutingIsm, PackageVersioned { IMailbox private immutable mailbox; // ============ Constructor ============ constructor(address _mailbox) { mailbox = IMailbox(_mailbox); } // ============ Public Functions ============ /** * @notice Returns the ISM responsible for verifying _message * @param _message Formatted Hyperlane message (see Message.sol). * @return module The ISM to use to verify _message */ function route( bytes calldata _message ) public view virtual override returns (IInterchainSecurityModule) { address _ism = InterchainAccountMessage.ism(Message.body(_message)); if (_ism == address(0)) { return mailbox.defaultIsm(); } else { return IInterchainSecurityModule(_ism); } } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; // ============ Internal Imports ============ import {IInterchainSecurityModule} from "../../interfaces/IInterchainSecurityModule.sol"; import {IRoutingIsm} from "../../interfaces/isms/IRoutingIsm.sol"; /** * @title RoutingIsm */ abstract contract AbstractRoutingIsm is IRoutingIsm { // ============ Constants ============ // solhint-disable-next-line const-name-snakecase uint8 public constant moduleType = uint8(IInterchainSecurityModule.Types.ROUTING); // ============ Virtual Functions ============ // ======= OVERRIDE THESE TO IMPLEMENT ======= /** * @notice Returns the ISM responsible for verifying _message * @dev Can change based on the content of _message * @param _message Formatted Hyperlane message (see Message.sol). * @return module The ISM to use to verify _message */ function route( bytes calldata _message ) public view virtual returns (IInterchainSecurityModule); // ============ Public Functions ============ /** * @notice Routes _metadata and _message to the correct ISM * @param _metadata ABI encoded module metadata * @param _message Formatted Hyperlane message (see Message.sol). */ function verify( bytes calldata _metadata, bytes calldata _message ) public returns (bool) { return route(_message).verify(_metadata, _message); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; import {IInterchainSecurityModule} from "./IInterchainSecurityModule.sol"; import {IPostDispatchHook} from "./hooks/IPostDispatchHook.sol"; interface IMailbox { // ============ Events ============ /** * @notice Emitted when a new message is dispatched via Hyperlane * @param sender The address that dispatched the message * @param destination The destination domain of the message * @param recipient The message recipient address on `destination` * @param message Raw bytes of message */ event Dispatch( address indexed sender, uint32 indexed destination, bytes32 indexed recipient, bytes message ); /** * @notice Emitted when a new message is dispatched via Hyperlane * @param messageId The unique message identifier */ event DispatchId(bytes32 indexed messageId); /** * @notice Emitted when a Hyperlane message is processed * @param messageId The unique message identifier */ event ProcessId(bytes32 indexed messageId); /** * @notice Emitted when a Hyperlane message is delivered * @param origin The origin domain of the message * @param sender The message sender address on `origin` * @param recipient The address that handled the message */ event Process( uint32 indexed origin, bytes32 indexed sender, address indexed recipient ); function localDomain() external view returns (uint32); function delivered(bytes32 messageId) external view returns (bool); function defaultIsm() external view returns (IInterchainSecurityModule); function defaultHook() external view returns (IPostDispatchHook); function requiredHook() external view returns (IPostDispatchHook); function latestDispatchedId() external view returns (bytes32); function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody ) external payable returns (bytes32 messageId); function quoteDispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody ) external view returns (uint256 fee); function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata body, bytes calldata defaultHookMetadata ) external payable returns (bytes32 messageId); function quoteDispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody, bytes calldata defaultHookMetadata ) external view returns (uint256 fee); function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata body, bytes calldata customHookMetadata, IPostDispatchHook customHook ) external payable returns (bytes32 messageId); function quoteDispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody, bytes calldata customHookMetadata, IPostDispatchHook customHook ) external view returns (uint256 fee); function process( bytes calldata metadata, bytes calldata message ) external payable; function recipientIsm( address recipient ) external view returns (IInterchainSecurityModule module); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.6.11; interface IInterchainSecurityModule { enum Types { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // used with relayer carrying no metadata CCIP_READ, ARB_L2_TO_L1, WEIGHTED_MERKLE_ROOT_MULTISIG, WEIGHTED_MESSAGE_ID_MULTISIG, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of security model * encoded by this ISM. * @dev Relayers infer how to fetch and format metadata. */ function moduleType() external view returns (uint8); /** * @notice Defines a security model responsible for verifying interchain * messages based on the provided metadata. * @param _metadata Off-chain metadata provided by a relayer, specific to * the security model encoded by the module (e.g. validator signatures) * @param _message Hyperlane encoded interchain message * @return True if the message was verified */ function verify( bytes calldata _metadata, bytes calldata _message ) external returns (bool); } interface ISpecifiesInterchainSecurityModule { function interchainSecurityModule() external view returns (IInterchainSecurityModule); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; import {TypeCasts} from "./TypeCasts.sol"; /** * @title Hyperlane Message Library * @notice Library for formatted messages used by Mailbox **/ library Message { using TypeCasts for bytes32; uint256 private constant VERSION_OFFSET = 0; uint256 private constant NONCE_OFFSET = 1; uint256 private constant ORIGIN_OFFSET = 5; uint256 private constant SENDER_OFFSET = 9; uint256 private constant DESTINATION_OFFSET = 41; uint256 private constant RECIPIENT_OFFSET = 45; uint256 private constant BODY_OFFSET = 77; /** * @notice Returns formatted (packed) Hyperlane message with provided fields * @dev This function should only be used in memory message construction. * @param _version The version of the origin and destination Mailboxes * @param _nonce A nonce to uniquely identify the message on its origin chain * @param _originDomain Domain of origin chain * @param _sender Address of sender as bytes32 * @param _destinationDomain Domain of destination chain * @param _recipient Address of recipient on destination chain as bytes32 * @param _messageBody Raw bytes of message body * @return Formatted message */ function formatMessage( uint8 _version, uint32 _nonce, uint32 _originDomain, bytes32 _sender, uint32 _destinationDomain, bytes32 _recipient, bytes calldata _messageBody ) internal pure returns (bytes memory) { return abi.encodePacked( _version, _nonce, _originDomain, _sender, _destinationDomain, _recipient, _messageBody ); } /** * @notice Returns the message ID. * @param _message ABI encoded Hyperlane message. * @return ID of `_message` */ function id(bytes memory _message) internal pure returns (bytes32) { return keccak256(_message); } /** * @notice Returns the message version. * @param _message ABI encoded Hyperlane message. * @return Version of `_message` */ function version(bytes calldata _message) internal pure returns (uint8) { return uint8(bytes1(_message[VERSION_OFFSET:NONCE_OFFSET])); } /** * @notice Returns the message nonce. * @param _message ABI encoded Hyperlane message. * @return Nonce of `_message` */ function nonce(bytes calldata _message) internal pure returns (uint32) { return uint32(bytes4(_message[NONCE_OFFSET:ORIGIN_OFFSET])); } /** * @notice Returns the message origin domain. * @param _message ABI encoded Hyperlane message. * @return Origin domain of `_message` */ function origin(bytes calldata _message) internal pure returns (uint32) { return uint32(bytes4(_message[ORIGIN_OFFSET:SENDER_OFFSET])); } /** * @notice Returns the message sender as bytes32. * @param _message ABI encoded Hyperlane message. * @return Sender of `_message` as bytes32 */ function sender(bytes calldata _message) internal pure returns (bytes32) { return bytes32(_message[SENDER_OFFSET:DESTINATION_OFFSET]); } /** * @notice Returns the message sender as address. * @param _message ABI encoded Hyperlane message. * @return Sender of `_message` as address */ function senderAddress( bytes calldata _message ) internal pure returns (address) { return sender(_message).bytes32ToAddress(); } /** * @notice Returns the message destination domain. * @param _message ABI encoded Hyperlane message. * @return Destination domain of `_message` */ function destination( bytes calldata _message ) internal pure returns (uint32) { return uint32(bytes4(_message[DESTINATION_OFFSET:RECIPIENT_OFFSET])); } /** * @notice Returns the message recipient as bytes32. * @param _message ABI encoded Hyperlane message. * @return Recipient of `_message` as bytes32 */ function recipient( bytes calldata _message ) internal pure returns (bytes32) { return bytes32(_message[RECIPIENT_OFFSET:BODY_OFFSET]); } /** * @notice Returns the message recipient as address. * @param _message ABI encoded Hyperlane message. * @return Recipient of `_message` as address */ function recipientAddress( bytes calldata _message ) internal pure returns (address) { return recipient(_message).bytes32ToAddress(); } /** * @notice Returns the message body. * @param _message ABI encoded Hyperlane message. * @return Body of `_message` */ function body( bytes calldata _message ) internal pure returns (bytes calldata) { return bytes(_message[BODY_OFFSET:]); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; import {CallLib} from "./Call.sol"; import {TypeCasts} from "../../libs/TypeCasts.sol"; /** * Format of message: * [ 0: 32] ICA owner * [ 32: 64] ICA ISM * [ 64:????] Calls, abi encoded */ library InterchainAccountMessage { using TypeCasts for bytes32; /** * @notice Returns formatted (packed) InterchainAccountMessage * @dev This function should only be used in memory message construction. * @param _owner The owner of the interchain account * @param _ism The address of the remote ISM * @param _to The address of the contract to call * @param _value The value to include in the call * @param _data The calldata * @return Formatted message body */ function encode( address _owner, bytes32 _ism, address _to, uint256 _value, bytes memory _data ) internal pure returns (bytes memory) { CallLib.Call[] memory _calls = new CallLib.Call[](1); _calls[0] = CallLib.build(_to, _value, _data); return abi.encode(TypeCasts.addressToBytes32(_owner), _ism, _calls); } /** * @notice Returns formatted (packed) InterchainAccountMessage * @dev This function should only be used in memory message construction. * @param _owner The owner of the interchain account * @param _ism The address of the remote ISM * @param _calls The sequence of calls to make * @return Formatted message body */ function encode( bytes32 _owner, bytes32 _ism, CallLib.Call[] calldata _calls ) internal pure returns (bytes memory) { return abi.encode(_owner, _ism, _calls); } /** * @notice Returns formatted (packed) InterchainAccountMessage * @dev This function should only be used in memory message construction. * @param _owner The owner of the interchain account * @param _ism The address of the remote ISM * @param _calls The sequence of calls to make * @return Formatted message body */ function encode( address _owner, bytes32 _ism, CallLib.Call[] calldata _calls ) internal pure returns (bytes memory) { return encode(TypeCasts.addressToBytes32(_owner), _ism, _calls); } /** * @notice Parses and returns the calls from the provided message * @param _message The interchain account message * @return The array of calls */ function decode( bytes calldata _message ) internal pure returns (bytes32, bytes32, CallLib.Call[] memory) { return abi.decode(_message, (bytes32, bytes32, CallLib.Call[])); } /** * @notice Parses and returns the ISM address from the provided message * @param _message The interchain account message * @return The ISM encoded in the message */ function ism(bytes calldata _message) internal pure returns (address) { return address(bytes20(_message[44:64])); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.6.11; /** * @title PackageVersioned * @notice Package version getter for contracts **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT string public constant PACKAGE_VERSION = "5.8.3"; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol"; interface IRoutingIsm is IInterchainSecurityModule { /** * @notice Returns the ISM responsible for verifying _message * @dev Can change based on the content of _message * @param _message Formatted Hyperlane message (see Message.sol). * @return module The ISM to use to verify _message */ function route( bytes calldata _message ) external view returns (IInterchainSecurityModule); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; /*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@*/ interface IPostDispatchHook { enum Types { UNUSED, ROUTING, AGGREGATION, MERKLE_TREE, INTERCHAIN_GAS_PAYMASTER, FALLBACK_ROUTING, ID_AUTH_ISM, PAUSABLE, PROTOCOL_FEE, LAYER_ZERO_V1, RATE_LIMITED, ARB_L2_TO_L1, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of hook */ function hookType() external view returns (uint8); /** * @notice Returns whether the hook supports metadata * @param metadata metadata * @return Whether the hook supports metadata */ function supportsMetadata( bytes calldata metadata ) external view returns (bool); /** * @notice Post action after a message is dispatched via the Mailbox * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call */ function postDispatch( bytes calldata metadata, bytes calldata message ) external payable; /** * @notice Compute the payment required by the postDispatch call * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call * @return Quoted payment for the postDispatch call */ function quoteDispatch( bytes calldata metadata, bytes calldata message ) external view returns (uint256); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.6.11; library TypeCasts { // alignment preserving cast function addressToBytes32(address _addr) internal pure returns (bytes32) { return bytes32(uint256(uint160(_addr))); } // alignment preserving cast function bytes32ToAddress(bytes32 _buf) internal pure returns (address) { require( uint256(_buf) <= uint256(type(uint160).max), "TypeCasts: bytes32ToAddress overflow" ); return address(uint160(uint256(_buf))); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.13; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {TypeCasts} from "../../libs/TypeCasts.sol"; library CallLib { struct StaticCall { // supporting non EVM targets bytes32 to; bytes data; } struct Call { // supporting non EVM targets bytes32 to; uint256 value; bytes data; } struct StaticCallWithCallback { StaticCall _call; bytes callback; } function call( Call memory _call ) internal returns (bytes memory returnData) { return Address.functionCallWithValue( TypeCasts.bytes32ToAddress(_call.to), _call.data, _call.value ); } function staticcall( StaticCall memory _call ) private view returns (bytes memory) { return Address.functionStaticCall( TypeCasts.bytes32ToAddress(_call.to), _call.data ); } function staticcall( StaticCallWithCallback memory _call ) internal view returns (bytes memory callback) { return bytes.concat(_call.callback, staticcall(_call._call)); } function multicall(Call[] memory calls) internal { uint256 i = 0; uint256 len = calls.length; while (i < len) { call(calls[i]); unchecked { ++i; } } } function multistaticcall( StaticCallWithCallback[] memory _calls ) internal view returns (bytes[] memory) { uint256 i = 0; uint256 len = _calls.length; bytes[] memory callbacks = new bytes[](len); while (i < len) { callbacks[i] = staticcall(_calls[i]); unchecked { ++i; } } return callbacks; } function multicallto(address to, bytes[] memory calls) internal { uint256 i = 0; uint256 len = calls.length; while (i < len) { Address.functionCall(to, calls[i]); unchecked { ++i; } } } function build( bytes32 to, bytes memory data ) internal pure returns (StaticCall memory) { return StaticCall(to, data); } function build( address to, bytes memory data ) internal pure returns (StaticCall memory) { return build(TypeCasts.addressToBytes32(to), data); } function build( bytes32 to, uint256 value, bytes memory data ) internal pure returns (Call memory) { return Call(to, value, data); } function build( address to, uint256 value, bytes memory data ) internal pure returns (Call memory) { return Call(TypeCasts.addressToBytes32(to), value, data); } function build( bytes32 to, bytes memory data, bytes memory callback ) internal pure returns (StaticCallWithCallback memory) { return StaticCallWithCallback(build(to, data), callback); } function build( address to, bytes memory data, bytes memory callback ) internal pure returns (StaticCallWithCallback memory) { return StaticCallWithCallback(build(to, data), callback); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_mailbox","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"PACKAGE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moduleType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"route","outputs":[{"internalType":"contract IInterchainSecurityModule","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_metadata","type":"bytes"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b5060405161062438038061062483398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161059961008b600039600061014801526105996000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806315ce45a2146100515780636465e69f1461008e57806393c44847146100a8578063f7e83aee146100f1575b600080fd5b61006461005f3660046102fd565b610114565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610096600181565b60405160ff9091168152602001610085565b6100e46040518060400160405280600581526020017f352e382e3300000000000000000000000000000000000000000000000000000081525081565b604051610085919061033f565b6101046100ff3660046103ab565b6101e6565b6040519015158152602001610085565b600080610129610124858561027c565b610298565b905073ffffffffffffffffffffffffffffffffffffffff81166101dd577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e5f516e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d59190610417565b9150506101e0565b90505b92915050565b60006101f28383610114565b73ffffffffffffffffffffffffffffffffffffffff1663f7e83aee868686866040518563ffffffff1660e01b8152600401610230949392919061049d565b6020604051808303816000875af115801561024f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027391906104cf565b95945050505050565b36600061028c83604d81876104f1565b915091505b9250929050565b60006102a86040602c84866104f1565b6102b19161051b565b60601c9392505050565b60008083601f8401126102cd57600080fd5b50813567ffffffffffffffff8111156102e557600080fd5b60208301915083602082850101111561029157600080fd5b6000806020838503121561031057600080fd5b823567ffffffffffffffff81111561032757600080fd5b610333858286016102bb565b90969095509350505050565b600060208083528351808285015260005b8181101561036c57858101830151858201604001528201610350565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b600080600080604085870312156103c157600080fd5b843567ffffffffffffffff808211156103d957600080fd5b6103e5888389016102bb565b909650945060208701359150808211156103fe57600080fd5b5061040b878288016102bb565b95989497509550505050565b60006020828403121561042957600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461044d57600080fd5b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6040815260006104b1604083018688610454565b82810360208401526104c4818587610454565b979650505050505050565b6000602082840312156104e157600080fd5b8151801515811461044d57600080fd5b6000808585111561050157600080fd5b8386111561050e57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561055b5780818660140360031b1b83161692505b50509291505056fea2646970667358221220ab5614a9d4f2a0a73356cba200d7365e32058945643f5e98a56319fdc94068bc64736f6c634300081300330000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806315ce45a2146100515780636465e69f1461008e57806393c44847146100a8578063f7e83aee146100f1575b600080fd5b61006461005f3660046102fd565b610114565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610096600181565b60405160ff9091168152602001610085565b6100e46040518060400160405280600581526020017f352e382e3300000000000000000000000000000000000000000000000000000081525081565b604051610085919061033f565b6101046100ff3660046103ab565b6101e6565b6040519015158152602001610085565b600080610129610124858561027c565b610298565b905073ffffffffffffffffffffffffffffffffffffffff81166101dd577f0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e73ffffffffffffffffffffffffffffffffffffffff16636e5f516e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d59190610417565b9150506101e0565b90505b92915050565b60006101f28383610114565b73ffffffffffffffffffffffffffffffffffffffff1663f7e83aee868686866040518563ffffffff1660e01b8152600401610230949392919061049d565b6020604051808303816000875af115801561024f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027391906104cf565b95945050505050565b36600061028c83604d81876104f1565b915091505b9250929050565b60006102a86040602c84866104f1565b6102b19161051b565b60601c9392505050565b60008083601f8401126102cd57600080fd5b50813567ffffffffffffffff8111156102e557600080fd5b60208301915083602082850101111561029157600080fd5b6000806020838503121561031057600080fd5b823567ffffffffffffffff81111561032757600080fd5b610333858286016102bb565b90969095509350505050565b600060208083528351808285015260005b8181101561036c57858101830151858201604001528201610350565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b600080600080604085870312156103c157600080fd5b843567ffffffffffffffff808211156103d957600080fd5b6103e5888389016102bb565b909650945060208701359150808211156103fe57600080fd5b5061040b878288016102bb565b95989497509550505050565b60006020828403121561042957600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461044d57600080fd5b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6040815260006104b1604083018688610454565b82810360208401526104c4818587610454565b979650505050505050565b6000602082840312156104e157600080fd5b8151801515811461044d57600080fd5b6000808585111561050157600080fd5b8386111561050e57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561055b5780818660140360031b1b83161692505b50509291505056fea2646970667358221220ab5614a9d4f2a0a73356cba200d7365e32058945643f5e98a56319fdc94068bc64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e
-----Decoded View---------------
Arg [0] : _mailbox (address): 0x3a464f746D23Ab22155710f44dB16dcA53e0775E
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.