Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
6640269 | 39 days ago | 0.00000039 ETH | ||||
6640269 | 39 days ago | 0.0000275 ETH | ||||
6640269 | 39 days ago | 0.00001357 ETH | ||||
6640269 | 39 days ago | 0.00004147 ETH | ||||
6639874 | 39 days ago | 0.00000039 ETH | ||||
6639874 | 39 days ago | 0.0000275 ETH | ||||
6639874 | 39 days ago | 0.00001071 ETH | ||||
6639874 | 39 days ago | 0.0000386 ETH | ||||
6639607 | 39 days ago | 0.00000039 ETH | ||||
6639607 | 39 days ago | 0.0000275 ETH | ||||
6639607 | 39 days ago | 0.00001071 ETH | ||||
6639607 | 39 days ago | 0.0000386 ETH | ||||
6639356 | 39 days ago | 0.00000039 ETH | ||||
6639356 | 39 days ago | 0.0000275 ETH | ||||
6639356 | 39 days ago | 0.00004099 ETH | ||||
6639356 | 39 days ago | 0.00006888 ETH | ||||
6626154 | 41 days ago | 0.00000039 ETH | ||||
6626154 | 41 days ago | 0.0000275 ETH | ||||
6626154 | 41 days ago | 0.00001706 ETH | ||||
6626154 | 41 days ago | 0.00004496 ETH | ||||
6625878 | 41 days ago | 0.00000039 ETH | ||||
6625878 | 41 days ago | 0.0000275 ETH | ||||
6625878 | 41 days ago | 0.00003307 ETH | ||||
6625878 | 41 days ago | 0.00006096 ETH | ||||
6625129 | 41 days ago | 0.00000039 ETH |
Loading...
Loading
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)
// 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"); } }
// 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; } }
// 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)); }
// 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; } }
// 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); }
// 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); }
// 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); }
// 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); } }
// 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; } }
{ "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/" ] }
[{"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"}]
Contract Creation Code
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
Loading...
Loading
[ 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.