Sepolia Testnet

Contract

0x13b2211a7cA45Db2808F6dB05557ce5347e3634e

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
66402692024-09-06 0:43:3639 days ago1725583416
0x13b2211a...347e3634e
0.00000039 ETH
66402692024-09-06 0:43:3639 days ago1725583416
0x13b2211a...347e3634e
0.0000275 ETH
66402692024-09-06 0:43:3639 days ago1725583416
0x13b2211a...347e3634e
0.00001357 ETH
66402692024-09-06 0:43:3639 days ago1725583416
0x13b2211a...347e3634e
0.00004147 ETH
66398742024-09-05 23:10:3639 days ago1725577836
0x13b2211a...347e3634e
0.00000039 ETH
66398742024-09-05 23:10:3639 days ago1725577836
0x13b2211a...347e3634e
0.0000275 ETH
66398742024-09-05 23:10:3639 days ago1725577836
0x13b2211a...347e3634e
0.00001071 ETH
66398742024-09-05 23:10:3639 days ago1725577836
0x13b2211a...347e3634e
0.0000386 ETH
66396072024-09-05 22:09:2439 days ago1725574164
0x13b2211a...347e3634e
0.00000039 ETH
66396072024-09-05 22:09:2439 days ago1725574164
0x13b2211a...347e3634e
0.0000275 ETH
66396072024-09-05 22:09:2439 days ago1725574164
0x13b2211a...347e3634e
0.00001071 ETH
66396072024-09-05 22:09:2439 days ago1725574164
0x13b2211a...347e3634e
0.0000386 ETH
66393562024-09-05 21:09:2439 days ago1725570564
0x13b2211a...347e3634e
0.00000039 ETH
66393562024-09-05 21:09:2439 days ago1725570564
0x13b2211a...347e3634e
0.0000275 ETH
66393562024-09-05 21:09:2439 days ago1725570564
0x13b2211a...347e3634e
0.00004099 ETH
66393562024-09-05 21:09:2439 days ago1725570564
0x13b2211a...347e3634e
0.00006888 ETH
66261542024-09-03 16:13:2441 days ago1725380004
0x13b2211a...347e3634e
0.00000039 ETH
66261542024-09-03 16:13:2441 days ago1725380004
0x13b2211a...347e3634e
0.0000275 ETH
66261542024-09-03 16:13:2441 days ago1725380004
0x13b2211a...347e3634e
0.00001706 ETH
66261542024-09-03 16:13:2441 days ago1725380004
0x13b2211a...347e3634e
0.00004496 ETH
66258782024-09-03 15:10:2441 days ago1725376224
0x13b2211a...347e3634e
0.00000039 ETH
66258782024-09-03 15:10:2441 days ago1725376224
0x13b2211a...347e3634e
0.0000275 ETH
66258782024-09-03 15:10:2441 days ago1725376224
0x13b2211a...347e3634e
0.00003307 ETH
66258782024-09-03 15:10:2441 days ago1725376224
0x13b2211a...347e3634e
0.00006096 ETH
66251292024-09-03 12:17:4841 days ago1725365868
0x13b2211a...347e3634e
0.00000039 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ORMP

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
london EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : ORMP.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import "./Channel.sol";
import "./interfaces/IOracle.sol";
import "./interfaces/IRelayer.sol";
import "./security/ReentrancyGuard.sol";
import "./security/ExcessivelySafeCall.sol";

/// @title ORMP
/// @notice An endpoint is a type of network node for cross-chain communication.
/// It is an interface exposed by a communication channel.
/// @dev An endpoint is associated with an immutable channel and user configuration.
contract ORMP is ReentrancyGuard, Channel {
    using ExcessivelySafeCall for address;

    event MessageAssigned(
        bytes32 indexed msgHash,
        address indexed oracle,
        address indexed relayer,
        uint256 oracleFee,
        uint256 relayerFee,
        bytes params
    );
    event HashImported(address indexed oracle, uint256 chainId, address channel, uint256 msgIndex, bytes32 hash);

    /// oracle => lookupKey => hash
    mapping(address => mapping(bytes32 => bytes32)) public hashLookup;

    constructor(address dao) Channel(dao) {}

    function version() public pure returns (string memory) {
        return "2.1.0";
    }

    /// @dev Send a cross-chain message over the endpoint.
    /// @notice follow https://eips.ethereum.org/EIPS/eip-5750
    /// @param toChainId The Message destination chain id.
    /// @param to User application contract address which receive the message.
    /// @param gasLimit Gas limit for destination user application used.
    /// @param encoded The calldata which encoded by ABI Encoding.
    /// @param refund Return extra fee to refund address.
    /// @param params General extensibility for relayer to custom functionality.
    function send(
        uint256 toChainId,
        address to,
        uint256 gasLimit,
        bytes calldata encoded,
        address refund,
        bytes calldata params
    ) external payable sendNonReentrant returns (bytes32) {
        // user application address.
        address ua = msg.sender;
        // send message by channel, return the hash of the message as id.
        bytes32 msgHash = _send(ua, toChainId, to, gasLimit, encoded);

        // handle fee
        _handleFee(ua, refund, msgHash, toChainId, gasLimit, encoded, params);

        return msgHash;
    }

    /// @dev Import hash by any oracle address.
    /// @notice Hash is an abstract of the proof system, it can be a block hash or a message root hash,
    ///  		specifically provided by oracles.
    /// @param chainId The source chain id.
    /// @param channel The message channel.
    /// @param msgIndex The source chain message index.
    /// @param hash_ The hash to import.
    function importHash(uint256 chainId, address channel, uint256 msgIndex, bytes32 hash_) external {
        bytes32 lookupKey = keccak256(abi.encode(chainId, channel, msgIndex));
        hashLookup[msg.sender][lookupKey] = hash_;
        emit HashImported(msg.sender, chainId, channel, msgIndex, hash_);
    }

    function _handleFee(
        address ua,
        address refund,
        bytes32 msgHash,
        uint256 toChainId,
        uint256 gasLimit,
        bytes calldata encoded,
        bytes calldata params
    ) internal {
        // fetch user application's config.
        UC memory uc = getAppConfig(ua);
        // handle relayer fee
        uint256 relayerFee = _handleRelayer(uc.relayer, toChainId, ua, gasLimit, encoded, params);
        // handle oracle fee
        uint256 oracleFee = _handleOracle(uc.oracle, toChainId, ua);

        emit MessageAssigned(msgHash, uc.oracle, uc.relayer, oracleFee, relayerFee, params);

        // refund
        require(msg.value >= relayerFee + oracleFee, "!fee");
        if (msg.value > relayerFee + oracleFee) {
            uint256 refundFee = msg.value - (relayerFee + oracleFee);
            _sendValue(refund, refundFee);
        }
    }

    /// @notice Get a quote in source native gas, for the amount that send() requires to pay for message delivery.
    /// @param toChainId The Message destination chain id.
    //  @param ua User application contract address which send the message.
    /// @param gasLimit Gas limit for destination user application used.
    /// @param encoded The calldata which encoded by ABI Encoding.
    /// @param params General extensibility for relayer to custom functionality.
    function fee(uint256 toChainId, address ua, uint256 gasLimit, bytes calldata encoded, bytes calldata params)
        external
        view
        returns (uint256)
    {
        UC memory uc = getAppConfig(ua);
        uint256 relayerFee = IRelayer(uc.relayer).fee(toChainId, ua, gasLimit, encoded, params);
        uint256 oracleFee = IOracle(uc.oracle).fee(toChainId, ua);
        return relayerFee + oracleFee;
    }

    function _handleRelayer(
        address relayer,
        uint256 toChainId,
        address ua,
        uint256 gasLimit,
        bytes calldata encoded,
        bytes calldata params
    ) internal returns (uint256) {
        uint256 relayerFee = IRelayer(relayer).fee(toChainId, ua, gasLimit, encoded, params);
        _sendValue(relayer, relayerFee);
        return relayerFee;
    }

    function _handleOracle(address oracle, uint256 toChainId, address ua) internal returns (uint256) {
        uint256 oracleFee = IOracle(oracle).fee(toChainId, ua);
        _sendValue(oracle, oracleFee);
        return oracleFee;
    }

    /// @dev Recv verified message from Channel and dispatch to destination user application address.
    /// @notice Only channel could call this function.
    /// @param message Verified receive message info.
    /// @param proof Message proof of this message.
    /// @return dispatchResult Result of the message dispatch.
    function recv(Message calldata message, bytes calldata proof)
        external
        recvNonReentrant
        returns (bool dispatchResult)
    {
        bytes32 msgHash = _recv(message, proof);
        dispatchResult = _dispatch(message, msgHash);
        // emit dispatched message event.
        emit MessageDispatched(msgHash, dispatchResult);
    }

    /// @dev Dispatch the cross chain message.
    function _dispatch(Message memory message, bytes32 msgHash) private returns (bool dispatchResult) {
        // where 5000 is the gas required for the operation between the call to gasleft()
        uint256 gasAvailable = gasleft() - 5000;
        require(gasAvailable - gasAvailable / 64 > message.gasLimit, "!gas");
        // Deliver the message to user application contract address.
        (dispatchResult,) = message.to.excessivelySafeCall(
            message.gasLimit, 0, 0, abi.encodePacked(message.encoded, msgHash, message.fromChainId, message.from)
        );
    }

    /// @dev Replacement for Solidity's `transfer`: sends `amount` wei to
    /// `recipient`, forwarding all available gas and reverting on errors.
    function _sendValue(address recipient, uint256 amount) internal {
        (bool success,) = recipient.call{value: amount}("");
        require(success, "!send");
    }
}

File 2 of 9 : Channel.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import "./UserConfig.sol";
import "./interfaces/IVerifier.sol";

/// @title Channel
/// @notice A channel is a logical connection over cross-chain network.
/// It used for cross-chain message transfer.
/// - Accepts messages to be dispatched to destination chains,
///   constructs a Merkle tree of the messages.
/// - Dispatches verified messages from source chains.
contract Channel is UserConfig {
    /// @dev msgHash => isDispathed.
    mapping(bytes32 => bool) public dones;

    /// @dev message count.
    uint256 public count;

    /// @dev Self contract address cache.
    address private immutable __self = address(this);

    /// @dev Notifies an observer that the message has been accepted.
    /// @param msgHash Hash of the message.
    /// @param message Accepted message info.
    event MessageAccepted(bytes32 indexed msgHash, Message message);
    /// @dev Notifies an observer that the message has been dispatched.
    /// @param msgHash Hash of the message.
    /// @param dispatchResult The message dispatch result.
    event MessageDispatched(bytes32 indexed msgHash, bool dispatchResult);

    /// @dev Init code.
    constructor(address dao) UserConfig(dao) {}

    /// @dev Fetch local chain id.
    /// @return chainId Local chain id.
    function LOCAL_CHAINID() public view returns (uint256) {
        return block.chainid;
    }

    /// @dev Send message.
    /// @param from User application contract address which send the message.
    /// @param toChainId The Message destination chain id.
    /// @param to User application contract address which receive the message.
    /// @param gasLimit Gas limit for destination user application used.
    /// @param encoded The calldata which encoded by ABI Encoding.
    function _send(address from, uint256 toChainId, address to, uint256 gasLimit, bytes calldata encoded)
        internal
        returns (bytes32)
    {
        // only cross-chain message
        require(toChainId != LOCAL_CHAINID(), "!cross-chain");
        // constuct message object.
        Message memory message = Message({
            channel: __self,
            index: count,
            fromChainId: LOCAL_CHAINID(),
            from: from,
            toChainId: toChainId,
            to: to,
            gasLimit: gasLimit,
            encoded: encoded
        });
        // hash the message.
        bytes32 msgHash = hash(message);

        // emit accepted message event.
        emit MessageAccepted(msgHash, message);

        // increase message count
        count = count + 1;

        // return this message hash.
        return msgHash;
    }

    /// @dev Receive messages.
    /// @notice Only message.to's config relayer could relay this message.
    /// @param message Received message info.
    /// @param proof Message proof of this message.
    function _recv(Message calldata message, bytes calldata proof) internal returns (bytes32) {
        // get message.to user config.
        UC memory uc = getAppConfig(message.to);
        // only the config relayer could relay this message.
        require(uc.relayer == msg.sender, "!auth");
        // verify message by the config oracle.
        require(IVerifier(uc.oracle).verifyMessageProof(message, proof), "!proof");
        // check destination chain id is correct.
        require(LOCAL_CHAINID() == message.toChainId, "!toChainId");
        // hash the message.
        bytes32 msgHash = hash(message);
        // check the message is not dispatched.
        require(dones[msgHash] == false, "done");

        // set the message is dispatched.
        dones[msgHash] = true;

        return msgHash;
    }
}

File 3 of 9 : Common.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/// @dev The block of control information and data for comminicate
/// between user applications. Messages are the exchange medium
/// used by channels to send and receive data through cross-chain networks.
/// A message is sent from a source chain to a destination chain.
/// @param index The leaf index lives in channel's incremental mekle tree.
/// @param fromChainId The message source chain id.
/// @param from User application contract address which send the message.
/// @param toChainId The message destination chain id.
/// @param to User application contract address which receive the message.
/// @param gasLimit Gas limit for destination UA used.
/// @param encoded The calldata which encoded by ABI Encoding.
struct Message {
    address channel;
    uint256 index;
    uint256 fromChainId;
    address from;
    uint256 toChainId;
    address to;
    uint256 gasLimit;
    bytes encoded; /*(abi.encodePacked(SELECTOR, PARAMS))*/
}

/// @dev Hash of the message.
function hash(Message memory message) pure returns (bytes32) {
    return keccak256(abi.encode(message));
}

File 4 of 9 : UserConfig.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/// @dev User application custom configuration.
/// @param oracle Oracle contract address.
/// @param relayer Relayer contract address.
struct UC {
    address oracle;
    address relayer;
}

/// @title UserConfig
/// @notice User config could select their own relayer and oracle.
/// The default configuration is used by default.
/// @dev Only setter could set default user config.
contract UserConfig {
    /// @dev Setter address.
    address public setter;
    /// @dev Default user config.
    UC public defaultUC;
    /// @dev ua => uc.
    mapping(address => UC) public ucOf;

    /// @dev Notifies an observer that the default user config has updated.
    /// @param oracle Default oracle.
    /// @param relayer Default relayer.
    event DefaultConfigUpdated(address oracle, address relayer);
    /// @dev Notifies an observer that the user application config has updated.
    /// @param ua User application contract address.
    /// @param oracle Oracle which the user application choose.
    /// @param relayer Relayer which the user application choose.
    event AppConfigUpdated(address indexed ua, address oracle, address relayer);
    /// @dev Notifies an observer that the setter is changed.
    /// @param oldSetter Old setter address.
    /// @param newSetter New setter address.
    event SetterChanged(address indexed oldSetter, address indexed newSetter);

    modifier onlySetter() {
        require(msg.sender == setter, "!auth");
        _;
    }

    constructor(address dao) {
        setter = dao;
    }

    /// @dev Change setter.
    /// @notice Only current setter could call.
    /// @param newSetter New setter.
    function changeSetter(address newSetter) external onlySetter {
        address oldSetter = setter;
        setter = newSetter;
        emit SetterChanged(oldSetter, newSetter);
    }

    /// @dev Set default user config for all user application.
    /// @notice Only setter could call.
    /// @param oracle Default oracle.
    /// @param relayer Default relayer.
    function setDefaultConfig(address oracle, address relayer) external onlySetter {
        defaultUC = UC(oracle, relayer);
        emit DefaultConfigUpdated(oracle, relayer);
    }

    /// @notice Set user application config.
    /// @param oracle Oracle which user application.
    /// @param relayer Relayer which user application choose.
    function setAppConfig(address oracle, address relayer) external {
        ucOf[msg.sender] = UC(oracle, relayer);
        emit AppConfigUpdated(msg.sender, oracle, relayer);
    }

    /// @dev Fetch user application config.
    /// @notice If user application has not configured, then the default user config is used.
    /// @param ua User application contract address.
    /// @return user application config.
    function getAppConfig(address ua) public view returns (UC memory) {
        UC memory c = ucOf[ua];

        if (c.relayer == address(0x0)) {
            c.relayer = defaultUC.relayer;
        }

        if (c.oracle == address(0x0)) {
            c.oracle = defaultUC.oracle;
        }

        return c;
    }
}

File 5 of 9 : IOracle.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import "./IVerifier.sol";

interface IOracle is IVerifier {
    /// @notice Fetch oracle price to relay message root to the destination chain.
    /// @param toChainId The destination chain id.
    /// @param ua The user application which send the message.
    /// @return Oracle price in source native gas.
    function fee(uint256 toChainId, address ua) external view returns (uint256);
}

File 6 of 9 : IRelayer.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

interface IRelayer {
    /// @notice Fetch relayer price to relay message to the destination chain.
    /// @param toChainId The destination chain id.
    /// @param ua The user application which send the message.
    /// @param gasLimit Gas limit for destination user application used.
    /// @param encoded The calldata which encoded by ABI Encoding.
    /// @param params General extensibility for relayer to custom functionality.
    /// @return Relayer price in source native gas.
    function fee(uint256 toChainId, address ua, uint256 gasLimit, bytes calldata encoded, bytes calldata params)
        external
        view
        returns (uint256);
}

File 7 of 9 : IVerifier.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import "../Common.sol";

interface IVerifier {
    /// @notice Verify message proof
    /// @dev Message proof provided by relayer. Oracle should provide message root of
    ///      source chain, and verify the merkle proof of the message hash.
    /// @param message The message info.
    /// @param proof Proof of the message
    /// @return Result of the message verify.
    function verifyMessageProof(Message calldata message, bytes calldata proof) external view returns (bool);
}

File 8 of 9 : ExcessivelySafeCall.sol
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity 0.8.17;

// Inspired: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/util/ExcessivelySafeCall.sol

library ExcessivelySafeCall {
    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _value Value in wei to send to the account
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeCall(address _target, uint256 _gas, uint256 _value, uint16 _maxCopy, bytes memory _calldata)
        internal
        returns (bool, bytes memory)
    {
        // set up for assembly call
        uint256 _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly ("memory-safe") {
            _success :=
                call(
                    _gas, // gas
                    _target, // recipient
                    _value, // ether value
                    add(_calldata, 0x20), // inloc
                    mload(_calldata), // inlen
                    0, // outloc
                    0 // outlen
                )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeStaticCall(address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata)
        internal
        view
        returns (bool, bytes memory)
    {
        // set up for assembly call
        uint256 _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly ("memory-safe") {
            _success :=
                staticcall(
                    _gas, // gas
                    _target, // recipient
                    add(_calldata, 0x20), // inloc
                    mload(_calldata), // inlen
                    0, // outloc
                    0 // outlen
                )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }
}

File 9 of 9 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

abstract contract ReentrancyGuard {
    // send and receive nonreentrant lock
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _send_state = 1;
    uint256 private _receive_state = 1;

    modifier sendNonReentrant() {
        require(_send_state == _NOT_ENTERED, "!send-reentrancy");
        _send_state = _ENTERED;
        _;
        _send_state = _NOT_ENTERED;
    }

    modifier recvNonReentrant() {
        require(_receive_state == _NOT_ENTERED, "!recv-reentrancy");
        _receive_state = _ENTERED;
        _;
        _receive_state = _NOT_ENTERED;
    }
}

Settings
{
  "viaIR": false,
  "optimizer": {
    "runs": 999999,
    "enabled": true
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {},
  "remappings": [
    "subapi/=lib/subapi/",
    "ORMP/=lib/ORMP/",
    "@darwinia-msgport/=lib/darwinia-msgport/",
    "@openzeppelin/[email protected]/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@safe-smart-account/=lib/subapi/lib/safe-smart-account/contracts/",
    "@sphinx-labs/contracts/=lib/sphinx/packages/contracts/contracts/foundry/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/darwinia-msgport/lib/solmate/src/",
    "create3-deploy/=lib/create3-deploy/"
  ]
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"dao","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ua","type":"address"},{"indexed":false,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"address","name":"relayer","type":"address"}],"name":"AppConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"address","name":"relayer","type":"address"}],"name":"DefaultConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address","name":"channel","type":"address"},{"indexed":false,"internalType":"uint256","name":"msgIndex","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"HashImported","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"msgHash","type":"bytes32"},{"components":[{"internalType":"address","name":"channel","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"indexed":false,"internalType":"struct Message","name":"message","type":"tuple"}],"name":"MessageAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"msgHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":true,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"oracleFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"relayerFee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"params","type":"bytes"}],"name":"MessageAssigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"msgHash","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"dispatchResult","type":"bool"}],"name":"MessageDispatched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldSetter","type":"address"},{"indexed":true,"internalType":"address","name":"newSetter","type":"address"}],"name":"SetterChanged","type":"event"},{"inputs":[],"name":"LOCAL_CHAINID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newSetter","type":"address"}],"name":"changeSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultUC","outputs":[{"internalType":"address","name":"oracle","type":"address"},{"internalType":"address","name":"relayer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"dones","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"ua","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"encoded","type":"bytes"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ua","type":"address"}],"name":"getAppConfig","outputs":[{"components":[{"internalType":"address","name":"oracle","type":"address"},{"internalType":"address","name":"relayer","type":"address"}],"internalType":"struct UC","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hashLookup","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"channel","type":"address"},{"internalType":"uint256","name":"msgIndex","type":"uint256"},{"internalType":"bytes32","name":"hash_","type":"bytes32"}],"name":"importHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"channel","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct Message","name":"message","type":"tuple"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"recv","outputs":[{"internalType":"bool","name":"dispatchResult","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"encoded","type":"bytes"},{"internalType":"address","name":"refund","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"send","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"oracle","type":"address"},{"internalType":"address","name":"relayer","type":"address"}],"name":"setAppConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracle","type":"address"},{"internalType":"address","name":"relayer","type":"address"}],"name":"setDefaultConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ucOf","outputs":[{"internalType":"address","name":"oracle","type":"address"},{"internalType":"address","name":"relayer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

60a06040526001600081905580553060805234801561001d57600080fd5b50604051611f1c380380611f1c83398101604081905261003c91610061565b600280546001600160a01b0319166001600160a01b0392909216919091179055610091565b60006020828403121561007357600080fd5b81516001600160a01b038116811461008a57600080fd5b9392505050565b608051611e706100ac6000396000610bfa0152611e706000f3fe6080604052600436106100f35760003560e01c806354fd4d501161008a5780638b229091116100595780638b2290911461038f578063b0ff5e72146103af578063ee6ad167146103c2578063f67c907c146103f257600080fd5b806354fd4d50146102d8578063559e7230146103245780635e26462c1461035c5780635f3abe961461036f57600080fd5b80633f3108f7116100c65780633f3108f7146101de57806341342249146102305780634872824f146102845780634ea59979146102b857600080fd5b806306661abd146100f85780630f988a73146101215780631c2b2da6146101435780633c50e17814610163575b600080fd5b34801561010457600080fd5b5061010e60075481565b6040519081526020015b60405180910390f35b34801561012d57600080fd5b5061014161013c36600461158e565b610422565b005b34801561014f57600080fd5b5061010e61015e3660046115f9565b61051f565b34801561016f57600080fd5b506101b161017e36600461158e565b6005602052600090815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff918216911682565b6040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015201610118565b3480156101ea57600080fd5b5060025461020b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610118565b34801561023c57600080fd5b5061025061024b36600461158e565b610674565b60408051825173ffffffffffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610118565b34801561029057600080fd5b506003546004546101b19173ffffffffffffffffffffffffffffffffffffffff908116911682565b3480156102c457600080fd5b506101416102d336600461168d565b61072b565b3480156102e457600080fd5b50604080518082018252600581527f322e312e3000000000000000000000000000000000000000000000000000000060208201529051610118919061172e565b34801561033057600080fd5b5061010e61033f366004611741565b600860209081526000928352604080842090915290825290205481565b61010e61036a36600461176b565b61084e565b34801561037b57600080fd5b5061014161038a366004611812565b6108f9565b34801561039b57600080fd5b506101416103aa36600461168d565b6109e3565b3480156103bb57600080fd5b504661010e565b3480156103ce57600080fd5b506103e26103dd36600461184d565b610aa2565b6040519015158152602001610118565b3480156103fe57600080fd5b506103e261040d3660046118bf565b60066020526000908152604090205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146104a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f216175746800000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fb0999394a8202229d1e14c6290230863233f18473f7504b3a7b1a27f9b014c9d90600090a35050565b60008061052b88610674565b90506000816020015173ffffffffffffffffffffffffffffffffffffffff16631c2b2da68b8b8b8b8b8b8b6040518863ffffffff1660e01b81526004016105789796959493929190611921565b602060405180830381865afa158015610595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b9919061197e565b82516040517fa1dbf432000000000000000000000000000000000000000000000000000000008152600481018d905273ffffffffffffffffffffffffffffffffffffffff8c811660248301529293506000929091169063a1dbf43290604401602060405180830381865afa158015610635573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610659919061197e565b905061066581836119c6565b9b9a5050505050505050505050565b6040805180820182526000808252602080830182905273ffffffffffffffffffffffffffffffffffffffff858116835260058252918490208451808601909552805483168552600101549091169083018190529091906106ed5760045473ffffffffffffffffffffffffffffffffffffffff1660208201525b805173ffffffffffffffffffffffffffffffffffffffff166107255760035473ffffffffffffffffffffffffffffffffffffffff1681525b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f2161757468000000000000000000000000000000000000000000000000000000604482015260640161049f565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff8481168083529084166020928301819052600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116841790915560048054909116821790558351918252918101919091527f504f152883e6158786ddfcce63f4d4d95ce8e404b1f6e6365a06f63849b7cb95910160405180910390a15050565b60006001600054146108bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f2173656e642d7265656e7472616e637900000000000000000000000000000000604482015260640161049f565b6002600090815533906108d3828c8c8c8c8c610b7f565b90506108e68287838e8d8d8d8c8c610d2a565b60016000559a9950505050505050505050565b604080516020810186905273ffffffffffffffffffffffffffffffffffffffff85169181019190915260608101839052600090608001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012033600081815260088452848120838252845284902087905589855273ffffffffffffffffffffffffffffffffffffffff89169285019290925291830186905260608301859052909250907fa931ec14fe958397dcb26e285e56292c13d77907712b51bbaa24cfc9349b789d9060800160405180910390a25050505050565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff848116808352848216602080850182815233600081815260058452889020965187549087167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617885591516001909701805497909616969091169590951790935584519182529181019190915290917f86b44d92ad94c11b25d0f08d0f55e8e235b4d165e62e541c02e8ee19f551c97b910160405180910390a25050565b60006001805414610b0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f21726563762d7265656e7472616e637900000000000000000000000000000000604482015260640161049f565b60026001556000610b21858585610e8e565b9050610b35610b2f86611add565b82611169565b9150807f62b1dc20fd6f1518626da5b6f9897e8cd4ebadbad071bb66dc96a37c970087a883604051610b6b911515815260200190565b60405180910390a250600180559392505050565b6000468603610bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2163726f73732d636861696e0000000000000000000000000000000000000000604482015260640161049f565b60006040518061010001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020016007548152602001610c434690565b81526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452509293509150610cd3905082611289565b9050807fcfb9b3466878aff0c7df17da215fd57d59eb245a5d03f5a7b57294d54581eb1883604051610d059190611b7f565b60405180910390a2600754610d1b9060016119c6565b60075598975050505050505050565b6000610d358a610674565b90506000610d4d8260200151898d8a8a8a8a8a6112b9565b90506000610d6083600001518a8e61135b565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff168b7f3832f95736b288316c84b775a004a9d17177362548ce253cba9acb4801875f4d84868a8a604051610dce9493929190611c1c565b60405180910390a4610de081836119c6565b341015610e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049f9060208082526004908201527f2166656500000000000000000000000000000000000000000000000000000000604082015260600190565b610e5581836119c6565b341115610e80576000610e6882846119c6565b610e729034611c46565b9050610e7e8c8261140b565b505b505050505050505050505050565b600080610ea461024b60c0870160a0880161158e565b602081015190915073ffffffffffffffffffffffffffffffffffffffff163314610f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f2161757468000000000000000000000000000000000000000000000000000000604482015260640161049f565b80516040517f651b04a700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063651b04a790610f8390889088908890600401611cbd565b602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc49190611d89565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f2170726f6f660000000000000000000000000000000000000000000000000000604482015260640161049f565b60808501354614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f21746f436861696e496400000000000000000000000000000000000000000000604482015260640161049f565b60006110aa6110a587611add565b611289565b60008181526006602052604090205490915060ff1615611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049f9060208082526004908201527f646f6e6500000000000000000000000000000000000000000000000000000000604082015260600190565b600081815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559150509392505050565b6000806113885a61117a9190611c46565b60c085015190915061118d604083611dab565b6111979083611c46565b11611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049f9060208082526004908201527f2167617300000000000000000000000000000000000000000000000000000000604082015260600190565b6112808460c001516000808760e001518789604001518a6060015160405160200161122e9493929190611de6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905260a089015173ffffffffffffffffffffffffffffffffffffffff16939291906114da565b50949350505050565b60008160405160200161129c9190611b7f565b604051602081830303815290604052805190602001209050919050565b6000808973ffffffffffffffffffffffffffffffffffffffff16631c2b2da68a8a8a8a8a8a8a6040518863ffffffff1660e01b81526004016113019796959493929190611921565b602060405180830381865afa15801561131e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611342919061197e565b905061134e8a8261140b565b9998505050505050505050565b6040517fa1dbf4320000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152600091829186169063a1dbf43290604401602060405180830381865afa1580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f7919061197e565b9050611403858261140b565b949350505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611465576040519150601f19603f3d011682016040523d82523d6000602084013e61146a565b606091505b50509050806114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f2173656e64000000000000000000000000000000000000000000000000000000604482015260640161049f565b505050565b6000606060008060008661ffff1667ffffffffffffffff811115611500576115006119d9565b6040519080825280601f01601f19166020018201604052801561152a576020820181803683370190505b5090506000808751602089018b8e8ef191503d92508683111561154b578692505b828152826000602083013e90999098509650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461158957600080fd5b919050565b6000602082840312156115a057600080fd5b6115a982611565565b9392505050565b60008083601f8401126115c257600080fd5b50813567ffffffffffffffff8111156115da57600080fd5b6020830191508360208285010111156115f257600080fd5b9250929050565b600080600080600080600060a0888a03121561161457600080fd5b8735965061162460208901611565565b955060408801359450606088013567ffffffffffffffff8082111561164857600080fd5b6116548b838c016115b0565b909650945060808a013591508082111561166d57600080fd5b5061167a8a828b016115b0565b989b979a50959850939692959293505050565b600080604083850312156116a057600080fd5b6116a983611565565b91506116b760208401611565565b90509250929050565b60005b838110156116db5781810151838201526020016116c3565b50506000910152565b600081518084526116fc8160208601602086016116c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115a960208301846116e4565b6000806040838503121561175457600080fd5b61175d83611565565b946020939093013593505050565b60008060008060008060008060c0898b03121561178757600080fd5b8835975061179760208a01611565565b965060408901359550606089013567ffffffffffffffff808211156117bb57600080fd5b6117c78c838d016115b0565b90975095508591506117db60808c01611565565b945060a08b01359150808211156117f157600080fd5b506117fe8b828c016115b0565b999c989b5096995094979396929594505050565b6000806000806080858703121561182857600080fd5b8435935061183860208601611565565b93969395505050506040820135916060013590565b60008060006040848603121561186257600080fd5b833567ffffffffffffffff8082111561187a57600080fd5b90850190610100828803121561188f57600080fd5b909350602085013590808211156118a557600080fd5b506118b2868287016115b0565b9497909650939450505050565b6000602082840312156118d157600080fd5b5035919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015260a06060820152600061195d60a0830186886118d8565b82810360808401526119708185876118d8565b9a9950505050505050505050565b60006020828403121561199057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561072557610725611997565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715611a2c57611a2c6119d9565b60405290565b600082601f830112611a4357600080fd5b813567ffffffffffffffff80821115611a5e57611a5e6119d9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611aa457611aa46119d9565b81604052838152866020858801011115611abd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006101008236031215611af057600080fd5b611af8611a08565b611b0183611565565b81526020830135602082015260408301356040820152611b2360608401611565565b606082015260808301356080820152611b3e60a08401611565565b60a082015260c083013560c082015260e083013567ffffffffffffffff811115611b6757600080fd5b611b7336828601611a32565b60e08301525092915050565b60208152600073ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408401526040840151606084015280606085015116608084015250608083015160a083015260a0830151611bf560c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015160e083015260e08301516101008081850152506114036101208401826116e4565b848152836020820152606060408201526000611c3c6060830184866118d8565b9695505050505050565b8181038181111561072557610725611997565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611c8e57600080fd5b830160208101925035905067ffffffffffffffff811115611cae57600080fd5b8036038213156115f257600080fd5b60408152600073ffffffffffffffffffffffffffffffffffffffff80611ce287611565565b166040840152602086013560608401526040860135608084015280611d0960608801611565565b1660a084015250608085013560c0830152611d2660a08601611565565b73ffffffffffffffffffffffffffffffffffffffff811660e08401525061010060c086013581840152611d5c60e0870187611c59565b82610120860152611d72610140860182846118d8565b925050508281036020840152611c3c8185876118d8565b600060208284031215611d9b57600080fd5b815180151581146115a957600080fd5b600082611de1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008551611df8818460208a016116c0565b9190910193845250602083019190915260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016604082015260540191905056fea2646970667358221220f4f907731981d0e9b53fa0376e8696ff7cb105e8691bb13685ec3ec20f4aa5c564736f6c63430008110033000000000000000000000000040f331774ed6bb161412b4cedb1358b382af3a5

Deployed Bytecode

0x6080604052600436106100f35760003560e01c806354fd4d501161008a5780638b229091116100595780638b2290911461038f578063b0ff5e72146103af578063ee6ad167146103c2578063f67c907c146103f257600080fd5b806354fd4d50146102d8578063559e7230146103245780635e26462c1461035c5780635f3abe961461036f57600080fd5b80633f3108f7116100c65780633f3108f7146101de57806341342249146102305780634872824f146102845780634ea59979146102b857600080fd5b806306661abd146100f85780630f988a73146101215780631c2b2da6146101435780633c50e17814610163575b600080fd5b34801561010457600080fd5b5061010e60075481565b6040519081526020015b60405180910390f35b34801561012d57600080fd5b5061014161013c36600461158e565b610422565b005b34801561014f57600080fd5b5061010e61015e3660046115f9565b61051f565b34801561016f57600080fd5b506101b161017e36600461158e565b6005602052600090815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff918216911682565b6040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015201610118565b3480156101ea57600080fd5b5060025461020b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610118565b34801561023c57600080fd5b5061025061024b36600461158e565b610674565b60408051825173ffffffffffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610118565b34801561029057600080fd5b506003546004546101b19173ffffffffffffffffffffffffffffffffffffffff908116911682565b3480156102c457600080fd5b506101416102d336600461168d565b61072b565b3480156102e457600080fd5b50604080518082018252600581527f322e312e3000000000000000000000000000000000000000000000000000000060208201529051610118919061172e565b34801561033057600080fd5b5061010e61033f366004611741565b600860209081526000928352604080842090915290825290205481565b61010e61036a36600461176b565b61084e565b34801561037b57600080fd5b5061014161038a366004611812565b6108f9565b34801561039b57600080fd5b506101416103aa36600461168d565b6109e3565b3480156103bb57600080fd5b504661010e565b3480156103ce57600080fd5b506103e26103dd36600461184d565b610aa2565b6040519015158152602001610118565b3480156103fe57600080fd5b506103e261040d3660046118bf565b60066020526000908152604090205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146104a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f216175746800000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fb0999394a8202229d1e14c6290230863233f18473f7504b3a7b1a27f9b014c9d90600090a35050565b60008061052b88610674565b90506000816020015173ffffffffffffffffffffffffffffffffffffffff16631c2b2da68b8b8b8b8b8b8b6040518863ffffffff1660e01b81526004016105789796959493929190611921565b602060405180830381865afa158015610595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b9919061197e565b82516040517fa1dbf432000000000000000000000000000000000000000000000000000000008152600481018d905273ffffffffffffffffffffffffffffffffffffffff8c811660248301529293506000929091169063a1dbf43290604401602060405180830381865afa158015610635573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610659919061197e565b905061066581836119c6565b9b9a5050505050505050505050565b6040805180820182526000808252602080830182905273ffffffffffffffffffffffffffffffffffffffff858116835260058252918490208451808601909552805483168552600101549091169083018190529091906106ed5760045473ffffffffffffffffffffffffffffffffffffffff1660208201525b805173ffffffffffffffffffffffffffffffffffffffff166107255760035473ffffffffffffffffffffffffffffffffffffffff1681525b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f2161757468000000000000000000000000000000000000000000000000000000604482015260640161049f565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff8481168083529084166020928301819052600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116841790915560048054909116821790558351918252918101919091527f504f152883e6158786ddfcce63f4d4d95ce8e404b1f6e6365a06f63849b7cb95910160405180910390a15050565b60006001600054146108bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f2173656e642d7265656e7472616e637900000000000000000000000000000000604482015260640161049f565b6002600090815533906108d3828c8c8c8c8c610b7f565b90506108e68287838e8d8d8d8c8c610d2a565b60016000559a9950505050505050505050565b604080516020810186905273ffffffffffffffffffffffffffffffffffffffff85169181019190915260608101839052600090608001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012033600081815260088452848120838252845284902087905589855273ffffffffffffffffffffffffffffffffffffffff89169285019290925291830186905260608301859052909250907fa931ec14fe958397dcb26e285e56292c13d77907712b51bbaa24cfc9349b789d9060800160405180910390a25050505050565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff848116808352848216602080850182815233600081815260058452889020965187549087167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617885591516001909701805497909616969091169590951790935584519182529181019190915290917f86b44d92ad94c11b25d0f08d0f55e8e235b4d165e62e541c02e8ee19f551c97b910160405180910390a25050565b60006001805414610b0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f21726563762d7265656e7472616e637900000000000000000000000000000000604482015260640161049f565b60026001556000610b21858585610e8e565b9050610b35610b2f86611add565b82611169565b9150807f62b1dc20fd6f1518626da5b6f9897e8cd4ebadbad071bb66dc96a37c970087a883604051610b6b911515815260200190565b60405180910390a250600180559392505050565b6000468603610bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2163726f73732d636861696e0000000000000000000000000000000000000000604482015260640161049f565b60006040518061010001604052807f00000000000000000000000013b2211a7ca45db2808f6db05557ce5347e3634e73ffffffffffffffffffffffffffffffffffffffff1681526020016007548152602001610c434690565b81526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452509293509150610cd3905082611289565b9050807fcfb9b3466878aff0c7df17da215fd57d59eb245a5d03f5a7b57294d54581eb1883604051610d059190611b7f565b60405180910390a2600754610d1b9060016119c6565b60075598975050505050505050565b6000610d358a610674565b90506000610d4d8260200151898d8a8a8a8a8a6112b9565b90506000610d6083600001518a8e61135b565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff168b7f3832f95736b288316c84b775a004a9d17177362548ce253cba9acb4801875f4d84868a8a604051610dce9493929190611c1c565b60405180910390a4610de081836119c6565b341015610e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049f9060208082526004908201527f2166656500000000000000000000000000000000000000000000000000000000604082015260600190565b610e5581836119c6565b341115610e80576000610e6882846119c6565b610e729034611c46565b9050610e7e8c8261140b565b505b505050505050505050505050565b600080610ea461024b60c0870160a0880161158e565b602081015190915073ffffffffffffffffffffffffffffffffffffffff163314610f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f2161757468000000000000000000000000000000000000000000000000000000604482015260640161049f565b80516040517f651b04a700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063651b04a790610f8390889088908890600401611cbd565b602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc49190611d89565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f2170726f6f660000000000000000000000000000000000000000000000000000604482015260640161049f565b60808501354614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f21746f436861696e496400000000000000000000000000000000000000000000604482015260640161049f565b60006110aa6110a587611add565b611289565b60008181526006602052604090205490915060ff1615611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049f9060208082526004908201527f646f6e6500000000000000000000000000000000000000000000000000000000604082015260600190565b600081815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559150509392505050565b6000806113885a61117a9190611c46565b60c085015190915061118d604083611dab565b6111979083611c46565b11611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049f9060208082526004908201527f2167617300000000000000000000000000000000000000000000000000000000604082015260600190565b6112808460c001516000808760e001518789604001518a6060015160405160200161122e9493929190611de6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905260a089015173ffffffffffffffffffffffffffffffffffffffff16939291906114da565b50949350505050565b60008160405160200161129c9190611b7f565b604051602081830303815290604052805190602001209050919050565b6000808973ffffffffffffffffffffffffffffffffffffffff16631c2b2da68a8a8a8a8a8a8a6040518863ffffffff1660e01b81526004016113019796959493929190611921565b602060405180830381865afa15801561131e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611342919061197e565b905061134e8a8261140b565b9998505050505050505050565b6040517fa1dbf4320000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152600091829186169063a1dbf43290604401602060405180830381865afa1580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f7919061197e565b9050611403858261140b565b949350505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611465576040519150601f19603f3d011682016040523d82523d6000602084013e61146a565b606091505b50509050806114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f2173656e64000000000000000000000000000000000000000000000000000000604482015260640161049f565b505050565b6000606060008060008661ffff1667ffffffffffffffff811115611500576115006119d9565b6040519080825280601f01601f19166020018201604052801561152a576020820181803683370190505b5090506000808751602089018b8e8ef191503d92508683111561154b578692505b828152826000602083013e90999098509650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461158957600080fd5b919050565b6000602082840312156115a057600080fd5b6115a982611565565b9392505050565b60008083601f8401126115c257600080fd5b50813567ffffffffffffffff8111156115da57600080fd5b6020830191508360208285010111156115f257600080fd5b9250929050565b600080600080600080600060a0888a03121561161457600080fd5b8735965061162460208901611565565b955060408801359450606088013567ffffffffffffffff8082111561164857600080fd5b6116548b838c016115b0565b909650945060808a013591508082111561166d57600080fd5b5061167a8a828b016115b0565b989b979a50959850939692959293505050565b600080604083850312156116a057600080fd5b6116a983611565565b91506116b760208401611565565b90509250929050565b60005b838110156116db5781810151838201526020016116c3565b50506000910152565b600081518084526116fc8160208601602086016116c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115a960208301846116e4565b6000806040838503121561175457600080fd5b61175d83611565565b946020939093013593505050565b60008060008060008060008060c0898b03121561178757600080fd5b8835975061179760208a01611565565b965060408901359550606089013567ffffffffffffffff808211156117bb57600080fd5b6117c78c838d016115b0565b90975095508591506117db60808c01611565565b945060a08b01359150808211156117f157600080fd5b506117fe8b828c016115b0565b999c989b5096995094979396929594505050565b6000806000806080858703121561182857600080fd5b8435935061183860208601611565565b93969395505050506040820135916060013590565b60008060006040848603121561186257600080fd5b833567ffffffffffffffff8082111561187a57600080fd5b90850190610100828803121561188f57600080fd5b909350602085013590808211156118a557600080fd5b506118b2868287016115b0565b9497909650939450505050565b6000602082840312156118d157600080fd5b5035919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015260a06060820152600061195d60a0830186886118d8565b82810360808401526119708185876118d8565b9a9950505050505050505050565b60006020828403121561199057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561072557610725611997565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715611a2c57611a2c6119d9565b60405290565b600082601f830112611a4357600080fd5b813567ffffffffffffffff80821115611a5e57611a5e6119d9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611aa457611aa46119d9565b81604052838152866020858801011115611abd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006101008236031215611af057600080fd5b611af8611a08565b611b0183611565565b81526020830135602082015260408301356040820152611b2360608401611565565b606082015260808301356080820152611b3e60a08401611565565b60a082015260c083013560c082015260e083013567ffffffffffffffff811115611b6757600080fd5b611b7336828601611a32565b60e08301525092915050565b60208152600073ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408401526040840151606084015280606085015116608084015250608083015160a083015260a0830151611bf560c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015160e083015260e08301516101008081850152506114036101208401826116e4565b848152836020820152606060408201526000611c3c6060830184866118d8565b9695505050505050565b8181038181111561072557610725611997565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611c8e57600080fd5b830160208101925035905067ffffffffffffffff811115611cae57600080fd5b8036038213156115f257600080fd5b60408152600073ffffffffffffffffffffffffffffffffffffffff80611ce287611565565b166040840152602086013560608401526040860135608084015280611d0960608801611565565b1660a084015250608085013560c0830152611d2660a08601611565565b73ffffffffffffffffffffffffffffffffffffffff811660e08401525061010060c086013581840152611d5c60e0870187611c59565b82610120860152611d72610140860182846118d8565b925050508281036020840152611c3c8185876118d8565b600060208284031215611d9b57600080fd5b815180151581146115a957600080fd5b600082611de1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008551611df8818460208a016116c0565b9190910193845250602083019190915260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016604082015260540191905056fea2646970667358221220f4f907731981d0e9b53fa0376e8696ff7cb105e8691bb13685ec3ec20f4aa5c564736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000040f331774ed6bb161412b4cedb1358b382af3a5

-----Decoded View---------------
Arg [0] : dao (address): 0x040f331774Ed6BB161412B4cEDb1358B382aF3A5

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000040f331774ed6bb161412b4cedb1358b382af3a5


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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.