Overview
ETH Balance
More Info
ContractCreator
Multichain Info
Latest 25 from a total of 359 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send | 5873036 | 343 days ago | IN | 0.0000379 ETH | 0.00068406 | ||||
Send | 5872739 | 343 days ago | IN | 0.0000379 ETH | 0.0007983 | ||||
Send | 5872466 | 343 days ago | IN | 0.00003789 ETH | 0.00010371 | ||||
Send | 5872166 | 343 days ago | IN | 0.00003789 ETH | 0.00010371 | ||||
Send | 5871881 | 343 days ago | IN | 0.0000379 ETH | 0.00010373 | ||||
Send | 5871594 | 343 days ago | IN | 0.00003789 ETH | 0.00010372 | ||||
Send | 5871396 | 343 days ago | IN | 0.0000379 ETH | 0.00010372 | ||||
Send | 5871238 | 344 days ago | IN | 0.00003789 ETH | 0.00010371 | ||||
Send | 5870872 | 344 days ago | IN | 0.0000379 ETH | 0.00010368 | ||||
Send | 5870452 | 344 days ago | IN | 0.00003789 ETH | 0.00010368 | ||||
Send | 5870162 | 344 days ago | IN | 0.00003789 ETH | 0.0001037 | ||||
Send | 5869879 | 344 days ago | IN | 0.00003789 ETH | 0.0001038 | ||||
Send | 5869591 | 344 days ago | IN | 0.00003789 ETH | 0.00010539 | ||||
Send | 5869295 | 344 days ago | IN | 0.0000387 ETH | 0.00014036 | ||||
Send | 5869025 | 344 days ago | IN | 0.00003943 ETH | 0.00088913 | ||||
Send | 5868738 | 344 days ago | IN | 0.00003898 ETH | 0.00085327 | ||||
Send | 5868462 | 344 days ago | IN | 0.00003823 ETH | 0.000974 | ||||
Send | 5868180 | 344 days ago | IN | 0.00003831 ETH | 0.00440002 | ||||
Send | 5867885 | 344 days ago | IN | 0.00003805 ETH | 0.00097332 | ||||
Send | 5867599 | 344 days ago | IN | 0.00003789 ETH | 0.00092911 | ||||
Send | 5867345 | 344 days ago | IN | 0.00003789 ETH | 0.00036872 | ||||
Send | 5867027 | 344 days ago | IN | 0.0000379 ETH | 0.00062492 | ||||
Send | 5866752 | 344 days ago | IN | 0.0000379 ETH | 0.00082497 | ||||
Send | 5866464 | 344 days ago | IN | 0.00003789 ETH | 0.00137048 | ||||
Send | 5866197 | 344 days ago | IN | 0.00003789 ETH | 0.00062042 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Send | 5873036 | 343 days ago | 0.0000379 ETH | ||||
Send | 5872739 | 343 days ago | 0.0000379 ETH | ||||
Send | 5872466 | 343 days ago | 0.00003789 ETH | ||||
Send | 5872166 | 343 days ago | 0.00003789 ETH | ||||
Send | 5871881 | 343 days ago | 0.0000379 ETH | ||||
Send | 5871594 | 343 days ago | 0.00003789 ETH | ||||
Send | 5871396 | 343 days ago | 0.0000379 ETH | ||||
Send | 5871238 | 344 days ago | 0.00003789 ETH | ||||
Send | 5870872 | 344 days ago | 0.0000379 ETH | ||||
Send | 5870452 | 344 days ago | 0.00003789 ETH | ||||
Send | 5870162 | 344 days ago | 0.00003789 ETH | ||||
Send | 5869879 | 344 days ago | 0.00003789 ETH | ||||
Send | 5869591 | 344 days ago | 0.00003789 ETH | ||||
Send | 5869295 | 344 days ago | 0.0000387 ETH | ||||
Send | 5869025 | 344 days ago | 0.00003943 ETH | ||||
Send | 5868738 | 344 days ago | 0.00003898 ETH | ||||
Send | 5868462 | 344 days ago | 0.00003823 ETH | ||||
Send | 5868180 | 344 days ago | 0.00003831 ETH | ||||
Send | 5867885 | 344 days ago | 0.00003805 ETH | ||||
Send | 5867599 | 344 days ago | 0.00003789 ETH | ||||
Send | 5867345 | 344 days ago | 0.00003789 ETH | ||||
Send | 5867027 | 344 days ago | 0.0000379 ETH | ||||
Send | 5866752 | 344 days ago | 0.0000379 ETH | ||||
Send | 5866464 | 344 days ago | 0.00003789 ETH | ||||
Send | 5866197 | 344 days ago | 0.00003789 ETH |
Contract Source Code (Solidity Standard Json-Input format)
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity 0.8.17; import "./base/BaseMessagePort.sol"; import "./base/PortLookup.sol"; import "ORMP/src/interfaces/IORMP.sol"; import "ORMP/src/user/AppBase.sol"; import "@openzeppelin/contracts/access/Ownable2Step.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; contract ORMPUpgradeablePort is Ownable2Step, AppBase, BaseMessagePort, PortLookup { using EnumerableSet for EnumerableSet.AddressSet; address public ormp; EnumerableSet.AddressSet internal historyORMPSet; event SetORMP(address previousORMP, address currentORMP); event HistoryORMPAdded(address ormp); event HistoryORMPDeleted(address ormp); modifier onlyORMP() override { require(historyORMPSet.contains(msg.sender), "!ormps"); _; } constructor(address dao, address ormp_, string memory name) BaseMessagePort(name) { _transferOwnership(dao); ormp = ormp_; historyORMPSet.add(ormp_); } /// @notice How to migrate to new ORMP contract. /// 1. setORMP to new ORMP contract. /// 2. delete previousORMP after relay on-flight message. function setORMP(address ormp_) external onlyOwner { address previousORMP = ormp; ormp = ormp_; require(historyORMPSet.add(ormp_), "!add"); emit SetORMP(previousORMP, ormp_); emit HistoryORMPAdded(ormp_); } function delORMP(address ormp_) external onlyOwner { require(ormp != ormp_, "sender"); require(historyORMPSet.remove(ormp_), "!del"); emit HistoryORMPDeleted(ormp_); } function setAppConfig(address ormp_, address oracle, address relayer) external onlyOwner { require(historyORMPSet.contains(ormp_), "!exist"); IORMP(ormp_).setAppConfig(oracle, relayer); } function setURI(string calldata uri) external onlyOwner { _setURI(uri); } function setToPort(uint256 _toChainId, address _toPortAddress) external onlyOwner { _setToPort(_toChainId, _toPortAddress); } function setFromPort(uint256 _fromChainId, address _fromPortAddress) external onlyOwner { _setFromPort(_fromChainId, _fromPortAddress); } function historyORMPLength() public view returns (uint256) { return historyORMPSet.length(); } function historyORMPs() public view returns (address[] memory) { return historyORMPSet.values(); } function historyORMPAt(uint256 index) public view returns (address) { return historyORMPSet.at(index); } function historyORMPContains(address ormp_) public view returns (bool) { return historyORMPSet.contains(ormp_); } function _send(address fromDapp, uint256 toChainId, address toDapp, bytes calldata message, bytes calldata params) internal override { (uint256 gasLimit, address refund, bytes memory ormpParams) = abi.decode(params, (uint256, address, bytes)); bytes memory encoded = abi.encodeWithSelector(this.recv.selector, fromDapp, toDapp, message); IORMP(ormp).send{value: msg.value}(toChainId, _checkedToPort(toChainId), gasLimit, encoded, refund, ormpParams); } function recv(address fromDapp, address toDapp, bytes calldata message) public payable virtual onlyORMP { uint256 fromChainId = _fromChainId(); require(_xmsgSender() == _checkedFromPort(fromChainId), "!auth"); _recv(fromChainId, fromDapp, toDapp, message); } function fee(uint256 toChainId, address fromDapp, address toDapp, bytes calldata message, bytes calldata params) external view override returns (uint256) { (uint256 gasLimit,, bytes memory ormpParams) = abi.decode(params, (uint256, address, bytes)); bytes memory encoded = abi.encodeWithSelector(this.recv.selector, fromDapp, toDapp, message); return IORMP(ormp).fee(toChainId, address(this), gasLimit, encoded, ormpParams); } }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. 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)); }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity 0.8.17; import "../Common.sol"; interface IORMP { /// @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. /// @return Return the hash of the message as message id. /// @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 returns (bytes32); /// @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); /// @dev Recv verified message and dispatch to destination user application address. /// @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 returns (bool dispatchResult); function prove() external view returns (bytes32[32] memory); /// @dev Fetch user application config. /// @notice If user application has not configured, then the default config is used. /// @param ua User application contract address. function getAppConfig(address ua) external view returns (address oracle, address relayer); /// @notice Set user application config. /// @param oracle Oracle which user application choose. /// @param relayer Relayer which user application choose. function setAppConfig(address oracle, address relayer) external; function defaultUC() external view returns (address oracle, address relayer); /// @dev Check the msg if it is dispatched. /// @param msgHash Hash of the checked message. /// @return Return the dispatched result of the checked message. function dones(bytes32 msgHash) external view returns (bool); /// @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; /// @dev Fetch hash. /// @param oracle The oracle address. /// @param lookupKey The key for loop up hash. /// @return Return the hash imported by the oracle. function hashLookup(address oracle, bytes32 lookupKey) external view returns (bytes32); }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.17; import "../interfaces/IORMP.sol"; // https://eips.ethereum.org/EIPS/eip-5164 abstract contract AppBase { modifier onlyORMP() virtual { _; } function _messageId() internal pure returns (bytes32 _msgDataMessageId) { require(msg.data.length >= 84, "!messageId"); assembly { _msgDataMessageId := calldataload(sub(calldatasize(), 84)) } } function _fromChainId() internal pure returns (uint256 _msgDataFromChainId) { require(msg.data.length >= 52, "!fromChainId"); assembly { _msgDataFromChainId := calldataload(sub(calldatasize(), 52)) } } function _xmsgSender() internal pure returns (address payable _from) { require(msg.data.length >= 20, "!xmsgSender"); assembly { _from := shr(96, calldataload(sub(calldatasize(), 20))) } } }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.0; interface IMessagePort { error MessageFailure(bytes errorData); /// @dev Send a cross-chain message over the MessagePort. /// @notice Send a cross-chain message over the MessagePort. /// @param toChainId The message destination chain id. <https://eips.ethereum.org/EIPS/eip-155> /// @param toDapp The user application contract address which receive the message. /// @param message The calldata which encoded by ABI Encoding. /// @param params Extend parameters to adapt to different message protocols. function send(uint256 toChainId, address toDapp, bytes calldata message, bytes calldata params) external payable; /// @notice Get a quote in source native gas, for the amount that send() requires to pay for message delivery. /// It should be noted that not all ports will implement this interface. /// @dev If the messaging protocol does not support on-chain fetch fee, then revert with "Unimplemented!". /// @param toChainId The message destination chain id. <https://eips.ethereum.org/EIPS/eip-155> /// @param fromDapp The user application contract address which send the message. /// @param toDapp The user application contract address which receive the message. /// @param message The calldata which encoded by ABI Encoding. /// @param params Extend parameters to adapt to different message protocols. function fee(uint256 toChainId, address fromDapp, address toDapp, bytes calldata message, bytes calldata params) external view returns (uint256); }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.0; interface IPortMetadata { event URI(string uri); /// @notice Get the port name, it's globally unique and immutable. /// @return The MessagePort name. function name() external view returns (string memory); /// @return The port metadata uri. function uri() external view returns (string memory); }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import "../../interfaces/IMessagePort.sol"; import "./PortMetadata.sol"; abstract contract BaseMessagePort is IMessagePort, PortMetadata { constructor(string memory name) PortMetadata(name) {} function LOCAL_CHAINID() public view returns (uint256) { return block.chainid; } /// @dev Send a cross-chain message over the MessagePort. /// Port developer should implement this, then it will be called by `send`. /// @param fromDapp The real sender account who send the message. /// @param toChainId The message destination chain id. <https://eips.ethereum.org/EIPS/eip-155> /// @param toDapp The user application contract address which receive the message. /// @param message The calldata which encoded by ABI Encoding. /// @param params Extend parameters to adapt to different message protocols. function _send(address fromDapp, uint256 toChainId, address toDapp, bytes calldata message, bytes calldata params) internal virtual; function send(uint256 toChainId, address toDapp, bytes calldata message, bytes calldata params) public payable { _send(msg.sender, toChainId, toDapp, message, params); } /// @dev Make toDapp accept messages. /// This should be called by message port when a message is received. /// @param fromChainId The source chainId, standard evm chainId. /// @param fromDapp The message sender in source chain. /// @param toDapp The message receiver in dest chain. /// @param message The message body. function _recv(uint256 fromChainId, address fromDapp, address toDapp, bytes memory message) internal returns (bytes memory) { (bool success, bytes memory returndata) = toDapp.call{value: msg.value}(abi.encodePacked(message, fromChainId, fromDapp)); if (success) { return returndata; } else { revert MessageFailure(returndata); } } function fee(uint256, address, address, bytes calldata, bytes calldata) external view virtual returns (uint256) { revert("Unimplemented!"); } }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.0; abstract contract FromPortLookup { event SetFromPort(uint256 fromChainId, address fromPort); // fromChainId => fromPortAddress mapping(uint256 => address) public fromPortLookup; function _setFromPort(uint256 fromChainId, address fromPort) internal virtual { fromPortLookup[fromChainId] = fromPort; emit SetFromPort(fromChainId, fromPort); } function _fromPort(uint256 fromChainId) internal view returns (address) { return fromPortLookup[fromChainId]; } function _checkedFromPort(uint256 fromChainId) internal view returns (address l) { l = fromPortLookup[fromChainId]; require(l != address(0), "!fromPort"); } }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import "./FromPortLookup.sol"; import "./ToPortLookup.sol"; abstract contract PortLookup is FromPortLookup, ToPortLookup {}
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import "../../interfaces/IPortMetadata.sol"; contract PortMetadata is IPortMetadata { string internal _name; string internal _uri; constructor(string memory name_) { _name = name_; } function _setURI(string memory uri_) internal virtual { _uri = uri_; emit URI(uri_); } function name() public view virtual returns (string memory) { return _name; } function uri() public view virtual returns (string memory) { return _uri; } }
// This file is part of Darwinia. // Copyright (C) 2018-2023 Darwinia Network // SPDX-License-Identifier: GPL-3.0 // // Darwinia is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Darwinia is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Darwinia. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.0; abstract contract ToPortLookup { event SetToPort(uint256 toChainId, address toPort); // toChainId => toPortAddress mapping(uint256 => address) public toPortLookup; function _setToPort(uint256 toChainId, address toPort) internal virtual { toPortLookup[toChainId] = toPort; emit SetToPort(toChainId, toPort); } function _toPort(uint256 toChainId) internal view returns (address) { return toPortLookup[toChainId]; } function _checkedToPort(uint256 toChainId) internal view returns (address l) { l = toPortLookup[toChainId]; require(l != address(0), "!toPort"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; import "./Ownable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); _transferOwnership(sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
{ "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
API[{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"ormp_","type":"address"},{"internalType":"string","name":"name","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes","name":"errorData","type":"bytes"}],"name":"MessageFailure","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ormp","type":"address"}],"name":"HistoryORMPAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ormp","type":"address"}],"name":"HistoryORMPDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fromChainId","type":"uint256"},{"indexed":false,"internalType":"address","name":"fromPort","type":"address"}],"name":"SetFromPort","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousORMP","type":"address"},{"indexed":false,"internalType":"address","name":"currentORMP","type":"address"}],"name":"SetORMP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":false,"internalType":"address","name":"toPort","type":"address"}],"name":"SetToPort","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"URI","type":"event"},{"inputs":[],"name":"LOCAL_CHAINID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ormp_","type":"address"}],"name":"delORMP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"fromDapp","type":"address"},{"internalType":"address","name":"toDapp","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fromPortLookup","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"historyORMPAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ormp_","type":"address"}],"name":"historyORMPContains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"historyORMPLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"historyORMPs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ormp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromDapp","type":"address"},{"internalType":"address","name":"toDapp","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"recv","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"address","name":"toDapp","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"ormp_","type":"address"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"address","name":"relayer","type":"address"}],"name":"setAppConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromChainId","type":"uint256"},{"internalType":"address","name":"_fromPortAddress","type":"address"}],"name":"setFromPort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ormp_","type":"address"}],"name":"setORMP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_toChainId","type":"uint256"},{"internalType":"address","name":"_toPortAddress","type":"address"}],"name":"setToPort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"toPortLookup","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002500380380620025008339810160408190526200003491620001c0565b80806200004133620000a1565b60026200004f828262000349565b5050506200006383620000a160201b60201c565b600680546001600160a01b0319166001600160a01b03841617905562000097600783620000cb602090811b62000e5017901c565b5050505062000415565b600180546001600160a01b0319169055620000c881620000eb602090811b62000e7917901c565b50565b6000620000e2836001600160a01b0384166200013b565b90505b92915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526001830160205260408120546200018457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620000e5565b506000620000e5565b80516001600160a01b0381168114620001a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620001d657600080fd5b620001e1846200018d565b92506020620001f28186016200018d565b60408601519093506001600160401b03808211156200021057600080fd5b818701915087601f8301126200022557600080fd5b8151818111156200023a576200023a620001aa565b604051601f8201601f19908116603f01168101908382118183101715620002655762000265620001aa565b816040528281528a868487010111156200027e57600080fd5b600093505b82841015620002a2578484018601518185018701529285019262000283565b60008684830101528096505050505050509250925092565b600181811c90821680620002cf57607f821691505b602082108103620002f057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034457600081815260208120601f850160051c810160208610156200031f5750805b601f850160051c820191505b8181101562000340578281556001016200032b565b5050505b505050565b81516001600160401b03811115620003655762000365620001aa565b6200037d81620003768454620002ba565b84620002f6565b602080601f831160018114620003b557600084156200039c5750858301515b600019600386901b1c1916600185901b17855562000340565b600085815260208120601f198616915b82811015620003e657888601518255948401946001909101908401620003c5565b5085821015620004055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6120db80620004256000396000f3fe60806040526004361061018b5760003560e01c80637e136c64116100d6578063ea3de3d31161007f578063fa418ef211610059578063fa418ef214610496578063fd0d5a19146104b6578063fd937499146104d857600080fd5b8063ea3de3d314610441578063eac989f814610461578063f2fde38b1461047657600080fd5b8063968c4441116100b0578063968c4441146103d3578063b0ff5e7214610403578063e30c39781461041657600080fd5b80637e136c64146103455780638da5cb5b14610365578063964188a11461039057600080fd5b80634d16220d116101385780636b75f311116101125780636b75f311146102fb578063715018a61461031b57806379ba50971461033057600080fd5b80634d16220d146102985780634d8464a6146102b857806366c16c90146102d857600080fd5b8063376451181161016957806337645118146101f0578063394d1bca14610242578063416d69431461025557600080fd5b806302fe53051461019057806306fdde03146101b257806316fe55ae146101dd575b600080fd5b34801561019c57600080fd5b506101b06101ab366004611805565b6104f8565b005b3480156101be57600080fd5b506101c7610543565b6040516101d491906118b5565b60405180910390f35b6101b06101eb3660046118ea565b6105d5565b3480156101fc57600080fd5b5060065461021d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d4565b6101b0610250366004611976565b6105ec565b34801561026157600080fd5b5061021d6102703660046119db565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102a457600080fd5b5061021d6102b33660046119db565b610754565b3480156102c457600080fd5b506101b06102d33660046119f4565b610767565b3480156102e457600080fd5b506102ed6108c4565b6040519081526020016101d4565b34801561030757600080fd5b506101b0610316366004611a11565b6108d5565b34801561032757600080fd5b506101b06108e7565b34801561033c57600080fd5b506101b06108fb565b34801561035157600080fd5b506101b0610360366004611a41565b6109b0565b34801561037157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661021d565b34801561039c57600080fd5b5061021d6103ab3660046119db565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103df57600080fd5b506103f36103ee3660046119f4565b610ab7565b60405190151581526020016101d4565b34801561040f57600080fd5b50466102ed565b34801561042257600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff1661021d565b34801561044d57600080fd5b506101b061045c3660046119f4565b610ac4565b34801561046d57600080fd5b506101c7610c10565b34801561048257600080fd5b506101b06104913660046119f4565b610c1f565b3480156104a257600080fd5b506101b06104b1366004611a11565b610ccf565b3480156104c257600080fd5b506104cb610ce1565b6040516101d49190611a8c565b3480156104e457600080fd5b506102ed6104f3366004611ae6565b610ced565b610500610eee565b61053f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f6f92505050565b5050565b60606002805461055290611b85565b80601f016020809104026020016040519081016040528092919081815260200182805461057e90611b85565b80156105cb5780601f106105a0576101008083540402835291602001916105cb565b820191906000526020600020905b8154815290600101906020018083116105ae57829003601f168201915b5050505050905090565b6105e433878787878787610fab565b505050505050565b6105f7600733611101565b610662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f726d7073000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600061066c611130565b9050610677816111c5565b73ffffffffffffffffffffffffffffffffffffffff16610695611256565b73ffffffffffffffffffffffffffffffffffffffff1614610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21617574680000000000000000000000000000000000000000000000000000006044820152606401610659565b6105e481868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112ee92505050565b60006107616007836113ea565b92915050565b61076f610eee565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831617909255166107be600783610e50565b610826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106599060208082526004908201527f2161646400000000000000000000000000000000000000000000000000000000604082015260600190565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f2546b320a5e5d5577ddc36cd3d83b9f37f6c4d73a7d940d473cd72e52c1fd894910160405180910390a160405173ffffffffffffffffffffffffffffffffffffffff831681527f8af9a700c7743999640a0e8ccf8c7a29e0c3100288901cccd7a9a6b371edbab3906020015b60405180910390a15050565b60006108d060076113f6565b905090565b6108dd610eee565b61053f8282611400565b6108ef610eee565b6108f96000611484565b565b600154339073ffffffffffffffffffffffffffffffffffffffff1681146109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610659565b6109ad81611484565b50565b6109b8610eee565b6109c3600784611101565b610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f21657869737400000000000000000000000000000000000000000000000000006044820152606401610659565b6040517f8b22909100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528281166024830152841690638b22909190604401600060405180830381600087803b158015610a9a57600080fd5b505af1158015610aae573d6000803e3d6000fd5b50505050505050565b6000610761600783611101565b610acc610eee565b60065473ffffffffffffffffffffffffffffffffffffffff808316911603610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f73656e64657200000000000000000000000000000000000000000000000000006044820152606401610659565b610b5b6007826114b5565b610bc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106599060208082526004908201527f2164656c00000000000000000000000000000000000000000000000000000000604082015260600190565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f933e5878af9aa566b0832891947f17052b71c97fff8a7c8a1553af62bcc2239d906020015b60405180910390a150565b60606003805461055290611b85565b610c27610eee565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610c8a60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610cd7610eee565b61053f82826114d7565b60606108d0600761155b565b60008080610cfd84860186611c07565b9250509150600063394d1bca60e01b8a8a8a8a604051602401610d239493929190611cf2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260065491517f1c2b2da600000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff90911690631c2b2da690610e00908e903090889087908990600401611d6a565b602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190611dc3565b9b9a5050505050505050505050565b6000610e728373ffffffffffffffffffffffffffffffffffffffff8416611568565b9392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610659565b6003610f7b8282611e27565b507f3d7a9962f6da134f6896430d6867bd08e3546dbf9570df877e7cec39ba4305f081604051610c0591906118b5565b60008080610fbb84860186611c07565b925092509250600063394d1bca60e01b8b8a8a8a604051602401610fe29493929190611cf2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915260065490915073ffffffffffffffffffffffffffffffffffffffff16635e26462c348c61108b816115b7565b888689896040518863ffffffff1660e01b81526004016110b096959493929190611f41565b60206040518083038185885af11580156110ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110f39190611dc3565b505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610e72565b6000603436101561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2166726f6d436861696e496400000000000000000000000000000000000000006044820152606401610659565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013590565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f2166726f6d506f727400000000000000000000000000000000000000000000006044820152606401610659565b919050565b600060143610156112c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21786d736753656e6465720000000000000000000000000000000000000000006044820152606401610659565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b60606000808473ffffffffffffffffffffffffffffffffffffffff163485898960405160200161132093929190611fa5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261135891611ff1565b60006040518083038185875af1925050503d8060008114611395576040519150601f19603f3d011682016040523d82523d6000602084013e61139a565b606091505b509150915081156113ae5791506113e29050565b806040517f36062f3b00000000000000000000000000000000000000000000000000000000815260040161065991906118b5565b949350505050565b6000610e728383611643565b6000610761825490565b60008281526004602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527f0af978625e8057086204bc8e9edca58fe4c3a75fa68ff732101b10f0fabb4d5391016108b8565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109ad81610e79565b6000610e728373ffffffffffffffffffffffffffffffffffffffff841661166d565b60008281526005602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527f3809e7e78b64016949ed1e373600a15f50af589e9e62eff47273a7dfe9bed0aa91016108b8565b60606000610e7283611760565b60008181526001830160205260408120546115af57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610761565b506000610761565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21746f506f7274000000000000000000000000000000000000000000000000006044820152606401610659565b600082600001828154811061165a5761165a61200d565b9060005260206000200154905092915050565b6000818152600183016020526040812054801561175657600061169160018361203c565b85549091506000906116a59060019061203c565b905081811461170a5760008660000182815481106116c5576116c561200d565b90600052602060002001549050808760000184815481106116e8576116e861200d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061171b5761171b612076565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610761565b6000915050610761565b6060816000018054806020026020016040519081016040528092919081815260200182805480156117b057602002820191906000526020600020905b81548152602001906001019080831161179c575b50505050509050919050565b60008083601f8401126117ce57600080fd5b50813567ffffffffffffffff8111156117e657600080fd5b6020830191508360208285010111156117fe57600080fd5b9250929050565b6000806020838503121561181857600080fd5b823567ffffffffffffffff81111561182f57600080fd5b61183b858286016117bc565b90969095509350505050565b60005b8381101561186257818101518382015260200161184a565b50506000910152565b60008151808452611883816020860160208601611847565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610e72602083018461186b565b73ffffffffffffffffffffffffffffffffffffffff811681146109ad57600080fd5b6000806000806000806080878903121561190357600080fd5b863595506020870135611915816118c8565b9450604087013567ffffffffffffffff8082111561193257600080fd5b61193e8a838b016117bc565b9096509450606089013591508082111561195757600080fd5b5061196489828a016117bc565b979a9699509497509295939492505050565b6000806000806060858703121561198c57600080fd5b8435611997816118c8565b935060208501356119a7816118c8565b9250604085013567ffffffffffffffff8111156119c357600080fd5b6119cf878288016117bc565b95989497509550505050565b6000602082840312156119ed57600080fd5b5035919050565b600060208284031215611a0657600080fd5b8135610e72816118c8565b60008060408385031215611a2457600080fd5b823591506020830135611a36816118c8565b809150509250929050565b600080600060608486031215611a5657600080fd5b8335611a61816118c8565b92506020840135611a71816118c8565b91506040840135611a81816118c8565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611ada57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611aa8565b50909695505050505050565b600080600080600080600060a0888a031215611b0157600080fd5b873596506020880135611b13816118c8565b95506040880135611b23816118c8565b9450606088013567ffffffffffffffff80821115611b4057600080fd5b611b4c8b838c016117bc565b909650945060808a0135915080821115611b6557600080fd5b50611b728a828b016117bc565b989b979a50959850939692959293505050565b600181811c90821680611b9957607f821691505b602082108103611bd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611c1c57600080fd5b833592506020840135611c2e816118c8565b9150604084013567ffffffffffffffff80821115611c4b57600080fd5b818601915086601f830112611c5f57600080fd5b813581811115611c7157611c71611bd8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611cb757611cb7611bd8565b81604052828152896020848701011115611cd057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b85815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260a060608201526000611da560a083018561186b565b8281036080840152611db7818561186b565b98975050505050505050565b600060208284031215611dd557600080fd5b5051919050565b601f821115611e2257600081815260208120601f850160051c81016020861015611e035750805b601f850160051c820191505b818110156105e457828155600101611e0f565b505050565b815167ffffffffffffffff811115611e4157611e41611bd8565b611e5581611e4f8454611b85565b84611ddc565b602080601f831160018114611ea85760008415611e725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556105e4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611ef557888601518255948401946001909101908401611ed6565b5085821015611f3157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015286604084015260c06060840152611f7d60c084018761186b565b818616608085015283810360a0850152611f97818661186b565b9a9950505050505050505050565b60008451611fb7818460208901611847565b919091019283525060601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166020820152603401919050565b60008251612003818460208701611847565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81810381811115610761577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207c4ac243f65d845ddcb1bc13f84e53c94b2a321158af56130b845cf78774928764736f6c63430008110033000000000000000000000000701609866556cb9a1fbd6b40201cd5899c9d2d560000000000000000000000009bec71b9c646653c6c73af8d4b7e5f84a5420005000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000064f524d502d550000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061018b5760003560e01c80637e136c64116100d6578063ea3de3d31161007f578063fa418ef211610059578063fa418ef214610496578063fd0d5a19146104b6578063fd937499146104d857600080fd5b8063ea3de3d314610441578063eac989f814610461578063f2fde38b1461047657600080fd5b8063968c4441116100b0578063968c4441146103d3578063b0ff5e7214610403578063e30c39781461041657600080fd5b80637e136c64146103455780638da5cb5b14610365578063964188a11461039057600080fd5b80634d16220d116101385780636b75f311116101125780636b75f311146102fb578063715018a61461031b57806379ba50971461033057600080fd5b80634d16220d146102985780634d8464a6146102b857806366c16c90146102d857600080fd5b8063376451181161016957806337645118146101f0578063394d1bca14610242578063416d69431461025557600080fd5b806302fe53051461019057806306fdde03146101b257806316fe55ae146101dd575b600080fd5b34801561019c57600080fd5b506101b06101ab366004611805565b6104f8565b005b3480156101be57600080fd5b506101c7610543565b6040516101d491906118b5565b60405180910390f35b6101b06101eb3660046118ea565b6105d5565b3480156101fc57600080fd5b5060065461021d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d4565b6101b0610250366004611976565b6105ec565b34801561026157600080fd5b5061021d6102703660046119db565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102a457600080fd5b5061021d6102b33660046119db565b610754565b3480156102c457600080fd5b506101b06102d33660046119f4565b610767565b3480156102e457600080fd5b506102ed6108c4565b6040519081526020016101d4565b34801561030757600080fd5b506101b0610316366004611a11565b6108d5565b34801561032757600080fd5b506101b06108e7565b34801561033c57600080fd5b506101b06108fb565b34801561035157600080fd5b506101b0610360366004611a41565b6109b0565b34801561037157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661021d565b34801561039c57600080fd5b5061021d6103ab3660046119db565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103df57600080fd5b506103f36103ee3660046119f4565b610ab7565b60405190151581526020016101d4565b34801561040f57600080fd5b50466102ed565b34801561042257600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff1661021d565b34801561044d57600080fd5b506101b061045c3660046119f4565b610ac4565b34801561046d57600080fd5b506101c7610c10565b34801561048257600080fd5b506101b06104913660046119f4565b610c1f565b3480156104a257600080fd5b506101b06104b1366004611a11565b610ccf565b3480156104c257600080fd5b506104cb610ce1565b6040516101d49190611a8c565b3480156104e457600080fd5b506102ed6104f3366004611ae6565b610ced565b610500610eee565b61053f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f6f92505050565b5050565b60606002805461055290611b85565b80601f016020809104026020016040519081016040528092919081815260200182805461057e90611b85565b80156105cb5780601f106105a0576101008083540402835291602001916105cb565b820191906000526020600020905b8154815290600101906020018083116105ae57829003601f168201915b5050505050905090565b6105e433878787878787610fab565b505050505050565b6105f7600733611101565b610662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f216f726d7073000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600061066c611130565b9050610677816111c5565b73ffffffffffffffffffffffffffffffffffffffff16610695611256565b73ffffffffffffffffffffffffffffffffffffffff1614610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21617574680000000000000000000000000000000000000000000000000000006044820152606401610659565b6105e481868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112ee92505050565b60006107616007836113ea565b92915050565b61076f610eee565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831617909255166107be600783610e50565b610826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106599060208082526004908201527f2161646400000000000000000000000000000000000000000000000000000000604082015260600190565b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f2546b320a5e5d5577ddc36cd3d83b9f37f6c4d73a7d940d473cd72e52c1fd894910160405180910390a160405173ffffffffffffffffffffffffffffffffffffffff831681527f8af9a700c7743999640a0e8ccf8c7a29e0c3100288901cccd7a9a6b371edbab3906020015b60405180910390a15050565b60006108d060076113f6565b905090565b6108dd610eee565b61053f8282611400565b6108ef610eee565b6108f96000611484565b565b600154339073ffffffffffffffffffffffffffffffffffffffff1681146109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610659565b6109ad81611484565b50565b6109b8610eee565b6109c3600784611101565b610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f21657869737400000000000000000000000000000000000000000000000000006044820152606401610659565b6040517f8b22909100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528281166024830152841690638b22909190604401600060405180830381600087803b158015610a9a57600080fd5b505af1158015610aae573d6000803e3d6000fd5b50505050505050565b6000610761600783611101565b610acc610eee565b60065473ffffffffffffffffffffffffffffffffffffffff808316911603610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f73656e64657200000000000000000000000000000000000000000000000000006044820152606401610659565b610b5b6007826114b5565b610bc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106599060208082526004908201527f2164656c00000000000000000000000000000000000000000000000000000000604082015260600190565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f933e5878af9aa566b0832891947f17052b71c97fff8a7c8a1553af62bcc2239d906020015b60405180910390a150565b60606003805461055290611b85565b610c27610eee565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610c8a60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610cd7610eee565b61053f82826114d7565b60606108d0600761155b565b60008080610cfd84860186611c07565b9250509150600063394d1bca60e01b8a8a8a8a604051602401610d239493929190611cf2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260065491517f1c2b2da600000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff90911690631c2b2da690610e00908e903090889087908990600401611d6a565b602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190611dc3565b9b9a5050505050505050505050565b6000610e728373ffffffffffffffffffffffffffffffffffffffff8416611568565b9392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610659565b6003610f7b8282611e27565b507f3d7a9962f6da134f6896430d6867bd08e3546dbf9570df877e7cec39ba4305f081604051610c0591906118b5565b60008080610fbb84860186611c07565b925092509250600063394d1bca60e01b8b8a8a8a604051602401610fe29493929190611cf2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915260065490915073ffffffffffffffffffffffffffffffffffffffff16635e26462c348c61108b816115b7565b888689896040518863ffffffff1660e01b81526004016110b096959493929190611f41565b60206040518083038185885af11580156110ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110f39190611dc3565b505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610e72565b6000603436101561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2166726f6d436861696e496400000000000000000000000000000000000000006044820152606401610659565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013590565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f2166726f6d506f727400000000000000000000000000000000000000000000006044820152606401610659565b919050565b600060143610156112c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21786d736753656e6465720000000000000000000000000000000000000000006044820152606401610659565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b60606000808473ffffffffffffffffffffffffffffffffffffffff163485898960405160200161132093929190611fa5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261135891611ff1565b60006040518083038185875af1925050503d8060008114611395576040519150601f19603f3d011682016040523d82523d6000602084013e61139a565b606091505b509150915081156113ae5791506113e29050565b806040517f36062f3b00000000000000000000000000000000000000000000000000000000815260040161065991906118b5565b949350505050565b6000610e728383611643565b6000610761825490565b60008281526004602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527f0af978625e8057086204bc8e9edca58fe4c3a75fa68ff732101b10f0fabb4d5391016108b8565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109ad81610e79565b6000610e728373ffffffffffffffffffffffffffffffffffffffff841661166d565b60008281526005602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527f3809e7e78b64016949ed1e373600a15f50af589e9e62eff47273a7dfe9bed0aa91016108b8565b60606000610e7283611760565b60008181526001830160205260408120546115af57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610761565b506000610761565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1680611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21746f506f7274000000000000000000000000000000000000000000000000006044820152606401610659565b600082600001828154811061165a5761165a61200d565b9060005260206000200154905092915050565b6000818152600183016020526040812054801561175657600061169160018361203c565b85549091506000906116a59060019061203c565b905081811461170a5760008660000182815481106116c5576116c561200d565b90600052602060002001549050808760000184815481106116e8576116e861200d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061171b5761171b612076565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610761565b6000915050610761565b6060816000018054806020026020016040519081016040528092919081815260200182805480156117b057602002820191906000526020600020905b81548152602001906001019080831161179c575b50505050509050919050565b60008083601f8401126117ce57600080fd5b50813567ffffffffffffffff8111156117e657600080fd5b6020830191508360208285010111156117fe57600080fd5b9250929050565b6000806020838503121561181857600080fd5b823567ffffffffffffffff81111561182f57600080fd5b61183b858286016117bc565b90969095509350505050565b60005b8381101561186257818101518382015260200161184a565b50506000910152565b60008151808452611883816020860160208601611847565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610e72602083018461186b565b73ffffffffffffffffffffffffffffffffffffffff811681146109ad57600080fd5b6000806000806000806080878903121561190357600080fd5b863595506020870135611915816118c8565b9450604087013567ffffffffffffffff8082111561193257600080fd5b61193e8a838b016117bc565b9096509450606089013591508082111561195757600080fd5b5061196489828a016117bc565b979a9699509497509295939492505050565b6000806000806060858703121561198c57600080fd5b8435611997816118c8565b935060208501356119a7816118c8565b9250604085013567ffffffffffffffff8111156119c357600080fd5b6119cf878288016117bc565b95989497509550505050565b6000602082840312156119ed57600080fd5b5035919050565b600060208284031215611a0657600080fd5b8135610e72816118c8565b60008060408385031215611a2457600080fd5b823591506020830135611a36816118c8565b809150509250929050565b600080600060608486031215611a5657600080fd5b8335611a61816118c8565b92506020840135611a71816118c8565b91506040840135611a81816118c8565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015611ada57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611aa8565b50909695505050505050565b600080600080600080600060a0888a031215611b0157600080fd5b873596506020880135611b13816118c8565b95506040880135611b23816118c8565b9450606088013567ffffffffffffffff80821115611b4057600080fd5b611b4c8b838c016117bc565b909650945060808a0135915080821115611b6557600080fd5b50611b728a828b016117bc565b989b979a50959850939692959293505050565b600181811c90821680611b9957607f821691505b602082108103611bd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611c1c57600080fd5b833592506020840135611c2e816118c8565b9150604084013567ffffffffffffffff80821115611c4b57600080fd5b818601915086601f830112611c5f57600080fd5b813581811115611c7157611c71611bd8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611cb757611cb7611bd8565b81604052828152896020848701011115611cd057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b85815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260a060608201526000611da560a083018561186b565b8281036080840152611db7818561186b565b98975050505050505050565b600060208284031215611dd557600080fd5b5051919050565b601f821115611e2257600081815260208120601f850160051c81016020861015611e035750805b601f850160051c820191505b818110156105e457828155600101611e0f565b505050565b815167ffffffffffffffff811115611e4157611e41611bd8565b611e5581611e4f8454611b85565b84611ddc565b602080601f831160018114611ea85760008415611e725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556105e4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611ef557888601518255948401946001909101908401611ed6565b5085821015611f3157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015286604084015260c06060840152611f7d60c084018761186b565b818616608085015283810360a0850152611f97818661186b565b9a9950505050505050505050565b60008451611fb7818460208901611847565b919091019283525060601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166020820152603401919050565b60008251612003818460208701611847565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81810381811115610761577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207c4ac243f65d845ddcb1bc13f84e53c94b2a321158af56130b845cf78774928764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000701609866556cb9a1fbd6b40201cd5899c9d2d560000000000000000000000009bec71b9c646653c6c73af8d4b7e5f84a5420005000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000064f524d502d550000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : dao (address): 0x701609866556Cb9A1FBD6B40201cD5899c9D2d56
Arg [1] : ormp_ (address): 0x9BEc71b9C646653C6C73Af8D4B7E5f84a5420005
Arg [2] : name (string): ORMP-U
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000701609866556cb9a1fbd6b40201cd5899c9d2d56
Arg [1] : 0000000000000000000000009bec71b9c646653c6c73af8d4b7e5f84a5420005
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 4f524d502d550000000000000000000000000000000000000000000000000000
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.