Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 979 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw ERC20 | 20533871 | 133 days ago | IN | 0 ETH | 0.00057213 | ||||
Migrate | 18866002 | 367 days ago | IN | 0 ETH | 0.00090763 | ||||
Migrate | 18201702 | 460 days ago | IN | 0 ETH | 0.00096882 | ||||
Migrate | 18012489 | 486 days ago | IN | 0 ETH | 0.00106431 | ||||
Migrate | 17067779 | 619 days ago | IN | 0 ETH | 0.00455006 | ||||
Migrate | 16613902 | 683 days ago | IN | 0 ETH | 0.00204259 | ||||
Migrate | 16133656 | 750 days ago | IN | 0 ETH | 0.00158443 | ||||
Migrate | 16111926 | 753 days ago | IN | 0 ETH | 0.00205167 | ||||
Migrate | 16100008 | 755 days ago | IN | 0 ETH | 0.00176278 | ||||
Migrate | 16076838 | 758 days ago | IN | 0 ETH | 0.00171443 | ||||
Migrate | 16076426 | 758 days ago | IN | 0 ETH | 0.00130584 | ||||
Migrate | 16063787 | 760 days ago | IN | 0 ETH | 0.00125886 | ||||
Migrate | 16011587 | 767 days ago | IN | 0 ETH | 0.0015053 | ||||
Migrate | 16011339 | 767 days ago | IN | 0 ETH | 0.00145862 | ||||
Migrate | 15988830 | 770 days ago | IN | 0 ETH | 0.00160678 | ||||
Migrate | 15867511 | 787 days ago | IN | 0 ETH | 0.00127336 | ||||
Migrate | 15860700 | 788 days ago | IN | 0 ETH | 0.00105631 | ||||
Migrate | 15820538 | 794 days ago | IN | 0 ETH | 0.00197735 | ||||
Migrate | 15771284 | 801 days ago | IN | 0 ETH | 0.00160396 | ||||
Migrate | 15721339 | 808 days ago | IN | 0 ETH | 0.00377773 | ||||
Migrate | 15720241 | 808 days ago | IN | 0 ETH | 0.00138397 | ||||
Migrate | 15643775 | 818 days ago | IN | 0 ETH | 0.00134045 | ||||
Migrate | 15581252 | 827 days ago | IN | 0 ETH | 0.00053042 | ||||
Migrate | 15576537 | 828 days ago | IN | 0 ETH | 0.0015386 | ||||
Migrate | 15547435 | 832 days ago | IN | 0 ETH | 0.0016791 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Migrator
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 100000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.3; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function mint(address to, uint256 amount) external; function burn(address from, uint256 amount) external; function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); } contract Migrator is AccessControl { using ECDSA for bytes32; // Roles bytes32 public constant WITHDRAWER_ROLE = keccak256("WITHDRAWER_ROLE"); bytes32 public constant TOKEN_ADDRESS_SETTER_ROLE = keccak256("TOKEN_ADDRESS_SETTER_ROLE"); bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); bytes32 public constant TRUSTY_ROLE = keccak256("TRUSTY_ROLE"); // Variables mapping (address => uint256) public usersStatus; address[] public tokensAddress; uint256 public minimumRequiredSignature; uint256 public startBlock; uint256 public migrationStatusBound = 63; constructor(address _admin, uint256 _minimumRequiredSignature, address _trusty_address, address _token_setter_address) { require(_admin != address(0), "Migrator::constructor: Zero address detected"); _setupRole(DEFAULT_ADMIN_ROLE, _admin); _setupRole(TRUSTY_ROLE, _trusty_address); _setupRole(TOKEN_ADDRESS_SETTER_ROLE, _token_setter_address); minimumRequiredSignature = _minimumRequiredSignature; } function verify(bytes32 hash, bytes calldata sigs) internal view returns (address) { address oracle = hash.recover(sigs); require(hasRole(ORACLE_ROLE, oracle), "Migrator::verify: Signer is not valid"); return oracle; } function migrate(uint256[] calldata amount, uint256[] calldata expireBlocks, uint256 migrationStatus, bytes[] calldata sigs) public { require(startBlock < block.number, "Migrator::migrate: Migrator is not started yet"); require(usersStatus[msg.sender] & migrationStatus == 0, "Migrator::migrate: You have used this option before"); require(amount.length <= tokensAddress.length, "Migrator::migrate: Amount is not valid"); require(migrationStatus <= migrationStatusBound, "Migrator::migrate: Migration status is invalid"); address lastOracle; for (uint256 index = 0; index < minimumRequiredSignature; ++index) { require(expireBlocks[index] >= block.number, "Migrator::migrate: Signature is expired"); bytes32 _hash = keccak256(abi.encodePacked(msg.sender, expireBlocks[index], migrationStatus, getChainID(), amount)); address oracle = verify(_hash.toEthSignedMessageHash(), sigs[index]); require(oracle > lastOracle, "Migrator::verify: Signers are same"); lastOracle = oracle; } for (uint256 index = 0; index < amount.length; ++index) { if (amount[index] != 0) { IERC20(tokensAddress[index]).transfer(msg.sender, amount[index]); } } usersStatus[msg.sender] = usersStatus[msg.sender] | migrationStatus; emit Migrate(msg.sender, amount, migrationStatus); } function withdrawERC20(address token, address to, uint256 amount) public { require(to != address(0), "Migrator::withdraw: Zero address detected"); require(hasRole(WITHDRAWER_ROLE, msg.sender), "Caller is not an admin"); IERC20(token).transfer(to, amount); emit Withdraw(token, to, amount); } function getChainID() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } function setTokensAddress(address[] calldata addresses) public { require(hasRole(TOKEN_ADDRESS_SETTER_ROLE, msg.sender), "Caller is not allowed to call this function"); for(uint256 index = 0; index < addresses.length; ++index) { require(addresses[index] != address(0), "Migrator::setTokensAddress: Zero address detected"); } tokensAddress = addresses; emit SetTokensAddress(addresses); } function setStartBlock(uint256 value) public { require(hasRole(TRUSTY_ROLE, msg.sender), "Caller is not allowed to call this function"); startBlock = value; emit SetStartBlock(value); } function setMinimumRequiredSignature(uint256 _minimumRequiredSignature) public { require( hasRole(TRUSTY_ROLE, msg.sender), "Caller is not allowed to call this function" ); minimumRequiredSignature = _minimumRequiredSignature; emit MinimumRequiredSignatureSet(_minimumRequiredSignature); } function setMigrationStatusBound(uint256 _migrationStatusBound) public { require( hasRole(TRUSTY_ROLE, msg.sender), "Caller is not allowed to call this function" ); migrationStatusBound = _migrationStatusBound; emit SetMigrationStatusBound(_migrationStatusBound); } event Withdraw(address token, address to, uint256 amount); event MinimumRequiredSignatureSet(uint256 minimumRequiredSignature); event Migrate(address userAddress, uint256[] amount, uint256 migrationStatus); event SetTokensAddress(address[] addresses); event SetStartBlock(uint256 value); event SetMigrationStatusBound(uint256 _migrationStatusBound); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 100000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_minimumRequiredSignature","type":"uint256"},{"internalType":"address","name":"_trusty_address","type":"address"},{"internalType":"address","name":"_token_setter_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"migrationStatus","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minimumRequiredSignature","type":"uint256"}],"name":"MinimumRequiredSignatureSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_migrationStatusBound","type":"uint256"}],"name":"SetMigrationStatusBound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetStartBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"SetTokensAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ADDRESS_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRUSTY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"uint256[]","name":"expireBlocks","type":"uint256[]"},{"internalType":"uint256","name":"migrationStatus","type":"uint256"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationStatusBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumRequiredSignature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_migrationStatusBound","type":"uint256"}],"name":"setMigrationStatusBound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumRequiredSignature","type":"uint256"}],"name":"setMinimumRequiredSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setTokensAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usersStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052603f6005553480156200001657600080fd5b5060405162002715380380620027158339810160408190526200003991620001e7565b6001600160a01b038416620000a95760405162461bcd60e51b815260206004820152602c60248201527f4d69677261746f723a3a636f6e7374727563746f723a205a65726f206164647260448201526b195cdcc819195d1958dd195960a21b606482015260840160405180910390fd5b620000b66000856200011a565b620000e27f0db189261133fd7647d3308512b693b47bed44004cac80fb59aa64b63a231e2c836200011a565b6200010e7f5882de9ce8aec66c092c1189623abf28cbc63467b1e41bf3ee0b226bb1987aba826200011a565b5050600355506200023b565b6200012682826200012a565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000126576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001863390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b0381168114620001e257600080fd5b919050565b60008060008060808587031215620001fe57600080fd5b6200020985620001ca565b9350602085015192506200022060408601620001ca565b91506200023060608601620001ca565b905092959194509250565b6124ca806200024b6000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a92b117116100e3578063d4eed89b1161008c578063e5ccd48411610066578063e5ccd484146103c0578063f35e4a6e146103d3578063f65ec975146103e657600080fd5b8063d4eed89b14610391578063d547741f1461039a578063dafdf4c4146103ad57600080fd5b806391d14854116100bd57806391d148541461031e578063a217fddf14610362578063c519dfbb1461036a57600080fd5b80637a92b117146102c457806380f341ed146102e457806385f438c1146102f757600080fd5b806336568abe116101455780634f8115a21161011f5780634f8115a21461027d578063564b81ef146102b5578063603c5889146102bb57600080fd5b806336568abe1461024e57806344004cc11461026157806348cd4cb11461027457600080fd5b8063248a9ca311610176578063248a9ca3146101ef5780632f2ff15d1461021257806334ddb95d1461022757600080fd5b806301ffc9a71461019257806307e2cea5146101ba575b600080fd5b6101a56101a036600461200e565b6103f9565b60405190151581526020015b60405180910390f35b6101e17f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef181565b6040519081526020016101b1565b6101e16101fd366004611fc9565b60009081526020819052604090206001015490565b610225610220366004611fe2565b610492565b005b6101e17f0db189261133fd7647d3308512b693b47bed44004cac80fb59aa64b63a231e2c81565b61022561025c366004611fe2565b6104bd565b61022561026f366004611e85565b610575565b6101e160045481565b61029061028b366004611fc9565b6107b6565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b1565b466101e1565b6101e160055481565b6101e16102d2366004611e6a565b60016020526000908152604090205481565b6102256102f2366004611fc9565b6107ed565b6101e17f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101a561032c366004611fe2565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101e1600081565b6101e17f5882de9ce8aec66c092c1189623abf28cbc63467b1e41bf3ee0b226bb1987aba81565b6101e160035481565b6102256103a8366004611fe2565b6108e7565b6102256103bb366004611fc9565b61090d565b6102256103ce366004611f03565b610a00565b6102256103e1366004611fc9565b611046565b6102256103f4366004611ec1565b611139565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061048c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546104ae813361132a565b6104b883836113fa565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61057182826114ea565b5050565b73ffffffffffffffffffffffffffffffffffffffff8216610618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d69677261746f723a3a77697468647261773a205a65726f206164647265737360448201527f2064657465637465640000000000000000000000000000000000000000000000606482015260840161055e565b3360009081527f10d7f32a6930100c7e03899d583513ff548ac958e569f497049662337b6f49b9602052604090205460ff166106b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616c6c6572206973206e6f7420616e2061646d696e00000000000000000000604482015260640161055e565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561072057600080fd5b505af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107589190611fa7565b506040805173ffffffffffffffffffffffffffffffffffffffff8086168252841660208201529081018290527f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060600160405180910390a1505050565b600281815481106107c657600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3360009081527f86478efbeb8bbab7a7555c56aa6ccb47dce5f91a755e3fa27d39e665871a7b98602052604090205460ff166108ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60038190556040518181527f56d6e071fcef02790d62fce568ce7db2a2417110238a7bdbbd55a0d59c7d51cd906020015b60405180910390a150565b600082815260208190526040902060010154610903813361132a565b6104b883836114ea565b3360009081527f86478efbeb8bbab7a7555c56aa6ccb47dce5f91a755e3fa27d39e665871a7b98602052604090205460ff166109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60058190556040518181527f27d678ab0c82892829a989198ace38f71e6deabcfd0e9a7f84a18f3a844a2dca906020016108dc565b4360045410610a91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d69677261746f723a3a6d6967726174653a204d69677261746f72206973206e60448201527f6f74207374617274656420796574000000000000000000000000000000000000606482015260840161055e565b33600090815260016020526040902054831615610b30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d69677261746f723a3a6d6967726174653a20596f752068617665207573656460448201527f2074686973206f7074696f6e206265666f726500000000000000000000000000606482015260840161055e565b600254861115610bc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d69677261746f723a3a6d6967726174653a20416d6f756e74206973206e6f7460448201527f2076616c69640000000000000000000000000000000000000000000000000000606482015260840161055e565b600554831115610c54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d69677261746f723a3a6d6967726174653a204d6967726174696f6e2073746160448201527f74757320697320696e76616c6964000000000000000000000000000000000000606482015260840161055e565b6000805b600354811015610eb35743878783818110610c7557610c75612436565b905060200201351015610d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d69677261746f723a3a6d6967726174653a205369676e61747572652069732060448201527f6578706972656400000000000000000000000000000000000000000000000000606482015260840161055e565b600033888884818110610d1f57610d1f612436565b9050602002013587610d2e4690565b8d8d604051602001610d4596959493929190612050565b6040516020818303038152906040528051906020012090506000610de2610db9836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b878786818110610dcb57610dcb612436565b9050602002810190610ddd9190612280565b6115a1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1611610e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4d69677261746f723a3a7665726966793a205369676e6572732061726520736160448201527f6d65000000000000000000000000000000000000000000000000000000000000606482015260840161055e565b9250610eac90508161239f565b9050610c58565b5060005b87811015610fea57888882818110610ed157610ed1612436565b90506020020135600014610fda5760028181548110610ef257610ef2612436565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338b8b85818110610f2c57610f2c612436565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff90941660048501526020029190910135602483015250604401602060405180830381600087803b158015610fa057600080fd5b505af1158015610fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd89190611fa7565b505b610fe38161239f565b9050610eb7565b503360008181526001602052604090819020805487179055517fca1b67cacd037cc1977c2ad9ec9a8a5ace74ea474e8b2c319a6431f38ed9073891611034918b908b90899061215a565b60405180910390a15050505050505050565b3360009081527f86478efbeb8bbab7a7555c56aa6ccb47dce5f91a755e3fa27d39e665871a7b98602052604090205460ff16611104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60048190556040518181527f63b90b79f11a0f132bcb2c4a4ddd44abda45c1308a83b2919318df7f5f8b7be4906020016108dc565b3360009081527f48c673c2bab5a1c80d473c4579c15ab5f131eaebc1fffa095fea89861e462255602052604090205460ff166111f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60005b818110156112df57600083838381811061121657611216612436565b905060200201602081019061122b9190611e6a565b73ffffffffffffffffffffffffffffffffffffffff1614156112cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d69677261746f723a3a736574546f6b656e73416464726573733a205a65726f60448201527f2061646472657373206465746563746564000000000000000000000000000000606482015260840161055e565b6112d88161239f565b90506111fa565b506112ec60028383611d5f565b507f3cb8668555516cec929d500a0cdc5417cd4275bb72ed273dc35d37c968bd1039828260405161131e9291906121d6565b60405180910390a15050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610571576113808173ffffffffffffffffffffffffffffffffffffffff1660146116c5565b61138b8360206116c5565b60405160200161139c9291906120d9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261055e9160040161222f565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166105715760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561148c3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156105715760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806115e684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899392505061190f9050565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fa629f6981c2f6895a67dc766e8e03ff72d04a413d0d8773a3ca56e9e474032c1602052604090205490915060ff166116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d69677261746f723a3a7665726966793a205369676e6572206973206e6f742060448201527f76616c6964000000000000000000000000000000000000000000000000000000606482015260840161055e565b949350505050565b606060006116d48360026122fd565b6116df9060026122e5565b67ffffffffffffffff8111156116f7576116f7612465565b6040519080825280601f01601f191660200182016040528015611721576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061175857611758612436565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106117bb576117bb612436565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006117f78460026122fd565b6118029060016122e5565b90505b600181111561189f577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061184357611843612436565b1a60f81b82828151811061185957611859612436565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936118988161236a565b9050611805565b508315611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161055e565b9392505050565b600080600061191e8585611933565b9150915061192b816119a3565b509392505050565b60008082516041141561196a5760208301516040840151606085015160001a61195e87828585611bff565b9450945050505061199c565b8251604014156119945760208301516040840151611989868383611d17565b93509350505061199c565b506000905060025b9250929050565b60008160048111156119b7576119b7612407565b14156119c05750565b60018160048111156119d4576119d4612407565b1415611a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161055e565b6002816004811115611a5057611a50612407565b1415611ab8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161055e565b6003816004811115611acc57611acc612407565b1415611b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161055e565b6004816004811115611b6e57611b6e612407565b1415611bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161055e565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c365750600090506003611d0e565b8460ff16601b14158015611c4e57508460ff16601c14155b15611c5f5750600090506004611d0e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611cb3573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611d0757600060019250925050611d0e565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01611d5187828885611bff565b935093505050935093915050565b828054828255906000526020600020908101928215611dd7579160200282015b82811115611dd75781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190611d7f565b50611de3929150611de7565b5090565b5b80821115611de35760008155600101611de8565b803573ffffffffffffffffffffffffffffffffffffffff81168114611e2057600080fd5b919050565b60008083601f840112611e3757600080fd5b50813567ffffffffffffffff811115611e4f57600080fd5b6020830191508360208260051b850101111561199c57600080fd5b600060208284031215611e7c57600080fd5b61190882611dfc565b600080600060608486031215611e9a57600080fd5b611ea384611dfc565b9250611eb160208501611dfc565b9150604084013590509250925092565b60008060208385031215611ed457600080fd5b823567ffffffffffffffff811115611eeb57600080fd5b611ef785828601611e25565b90969095509350505050565b60008060008060008060006080888a031215611f1e57600080fd5b873567ffffffffffffffff80821115611f3657600080fd5b611f428b838c01611e25565b909950975060208a0135915080821115611f5b57600080fd5b611f678b838c01611e25565b909750955060408a0135945060608a0135915080821115611f8757600080fd5b50611f948a828b01611e25565b989b979a50959850939692959293505050565b600060208284031215611fb957600080fd5b8151801515811461190857600080fd5b600060208284031215611fdb57600080fd5b5035919050565b60008060408385031215611ff557600080fd5b8235915061200560208401611dfc565b90509250929050565b60006020828403121561202057600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461190857600080fd5b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008760601b16815285601482015284603482015283605482015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156120b957600080fd5b8260051b8085607485013760009201607401918252509695505050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161211181601785016020880161233a565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161214e81602884016020880161233a565b01602801949350505050565b73ffffffffffffffffffffffffffffffffffffffff851681526060602082015282606082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156121af57600080fd5b8360051b808660808501376000908301608001908152604090920192909252949350505050565b60208082528181018390526000908460408401835b868110156122245773ffffffffffffffffffffffffffffffffffffffff61221184611dfc565b16825291830191908301906001016121eb565b509695505050505050565b602081526000825180602084015261224e81604085016020870161233a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126122b557600080fd5b83018035915067ffffffffffffffff8211156122d057600080fd5b60200191503681900382131561199c57600080fd5b600082198211156122f8576122f86123d8565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612335576123356123d8565b500290565b60005b8381101561235557818101518382015260200161233d565b83811115612364576000848401525b50505050565b600081612379576123796123d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156123d1576123d16123d8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212206b1ba16935878db4a1cb18bdec2b47fcfbb7680e1edd4f940f9acd0e87d2b57a64736f6c634300080700330000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf606900000000000000000000000000000000000000000000000000000000000000020000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf60690000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf6069
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a92b117116100e3578063d4eed89b1161008c578063e5ccd48411610066578063e5ccd484146103c0578063f35e4a6e146103d3578063f65ec975146103e657600080fd5b8063d4eed89b14610391578063d547741f1461039a578063dafdf4c4146103ad57600080fd5b806391d14854116100bd57806391d148541461031e578063a217fddf14610362578063c519dfbb1461036a57600080fd5b80637a92b117146102c457806380f341ed146102e457806385f438c1146102f757600080fd5b806336568abe116101455780634f8115a21161011f5780634f8115a21461027d578063564b81ef146102b5578063603c5889146102bb57600080fd5b806336568abe1461024e57806344004cc11461026157806348cd4cb11461027457600080fd5b8063248a9ca311610176578063248a9ca3146101ef5780632f2ff15d1461021257806334ddb95d1461022757600080fd5b806301ffc9a71461019257806307e2cea5146101ba575b600080fd5b6101a56101a036600461200e565b6103f9565b60405190151581526020015b60405180910390f35b6101e17f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef181565b6040519081526020016101b1565b6101e16101fd366004611fc9565b60009081526020819052604090206001015490565b610225610220366004611fe2565b610492565b005b6101e17f0db189261133fd7647d3308512b693b47bed44004cac80fb59aa64b63a231e2c81565b61022561025c366004611fe2565b6104bd565b61022561026f366004611e85565b610575565b6101e160045481565b61029061028b366004611fc9565b6107b6565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b1565b466101e1565b6101e160055481565b6101e16102d2366004611e6a565b60016020526000908152604090205481565b6102256102f2366004611fc9565b6107ed565b6101e17f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101a561032c366004611fe2565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101e1600081565b6101e17f5882de9ce8aec66c092c1189623abf28cbc63467b1e41bf3ee0b226bb1987aba81565b6101e160035481565b6102256103a8366004611fe2565b6108e7565b6102256103bb366004611fc9565b61090d565b6102256103ce366004611f03565b610a00565b6102256103e1366004611fc9565b611046565b6102256103f4366004611ec1565b611139565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061048c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546104ae813361132a565b6104b883836113fa565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61057182826114ea565b5050565b73ffffffffffffffffffffffffffffffffffffffff8216610618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d69677261746f723a3a77697468647261773a205a65726f206164647265737360448201527f2064657465637465640000000000000000000000000000000000000000000000606482015260840161055e565b3360009081527f10d7f32a6930100c7e03899d583513ff548ac958e569f497049662337b6f49b9602052604090205460ff166106b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616c6c6572206973206e6f7420616e2061646d696e00000000000000000000604482015260640161055e565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561072057600080fd5b505af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107589190611fa7565b506040805173ffffffffffffffffffffffffffffffffffffffff8086168252841660208201529081018290527f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060600160405180910390a1505050565b600281815481106107c657600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3360009081527f86478efbeb8bbab7a7555c56aa6ccb47dce5f91a755e3fa27d39e665871a7b98602052604090205460ff166108ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60038190556040518181527f56d6e071fcef02790d62fce568ce7db2a2417110238a7bdbbd55a0d59c7d51cd906020015b60405180910390a150565b600082815260208190526040902060010154610903813361132a565b6104b883836114ea565b3360009081527f86478efbeb8bbab7a7555c56aa6ccb47dce5f91a755e3fa27d39e665871a7b98602052604090205460ff166109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60058190556040518181527f27d678ab0c82892829a989198ace38f71e6deabcfd0e9a7f84a18f3a844a2dca906020016108dc565b4360045410610a91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d69677261746f723a3a6d6967726174653a204d69677261746f72206973206e60448201527f6f74207374617274656420796574000000000000000000000000000000000000606482015260840161055e565b33600090815260016020526040902054831615610b30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d69677261746f723a3a6d6967726174653a20596f752068617665207573656460448201527f2074686973206f7074696f6e206265666f726500000000000000000000000000606482015260840161055e565b600254861115610bc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d69677261746f723a3a6d6967726174653a20416d6f756e74206973206e6f7460448201527f2076616c69640000000000000000000000000000000000000000000000000000606482015260840161055e565b600554831115610c54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d69677261746f723a3a6d6967726174653a204d6967726174696f6e2073746160448201527f74757320697320696e76616c6964000000000000000000000000000000000000606482015260840161055e565b6000805b600354811015610eb35743878783818110610c7557610c75612436565b905060200201351015610d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d69677261746f723a3a6d6967726174653a205369676e61747572652069732060448201527f6578706972656400000000000000000000000000000000000000000000000000606482015260840161055e565b600033888884818110610d1f57610d1f612436565b9050602002013587610d2e4690565b8d8d604051602001610d4596959493929190612050565b6040516020818303038152906040528051906020012090506000610de2610db9836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b878786818110610dcb57610dcb612436565b9050602002810190610ddd9190612280565b6115a1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1611610e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4d69677261746f723a3a7665726966793a205369676e6572732061726520736160448201527f6d65000000000000000000000000000000000000000000000000000000000000606482015260840161055e565b9250610eac90508161239f565b9050610c58565b5060005b87811015610fea57888882818110610ed157610ed1612436565b90506020020135600014610fda5760028181548110610ef257610ef2612436565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338b8b85818110610f2c57610f2c612436565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff90941660048501526020029190910135602483015250604401602060405180830381600087803b158015610fa057600080fd5b505af1158015610fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd89190611fa7565b505b610fe38161239f565b9050610eb7565b503360008181526001602052604090819020805487179055517fca1b67cacd037cc1977c2ad9ec9a8a5ace74ea474e8b2c319a6431f38ed9073891611034918b908b90899061215a565b60405180910390a15050505050505050565b3360009081527f86478efbeb8bbab7a7555c56aa6ccb47dce5f91a755e3fa27d39e665871a7b98602052604090205460ff16611104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60048190556040518181527f63b90b79f11a0f132bcb2c4a4ddd44abda45c1308a83b2919318df7f5f8b7be4906020016108dc565b3360009081527f48c673c2bab5a1c80d473c4579c15ab5f131eaebc1fffa095fea89861e462255602052604090205460ff166111f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746860448201527f69732066756e6374696f6e000000000000000000000000000000000000000000606482015260840161055e565b60005b818110156112df57600083838381811061121657611216612436565b905060200201602081019061122b9190611e6a565b73ffffffffffffffffffffffffffffffffffffffff1614156112cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d69677261746f723a3a736574546f6b656e73416464726573733a205a65726f60448201527f2061646472657373206465746563746564000000000000000000000000000000606482015260840161055e565b6112d88161239f565b90506111fa565b506112ec60028383611d5f565b507f3cb8668555516cec929d500a0cdc5417cd4275bb72ed273dc35d37c968bd1039828260405161131e9291906121d6565b60405180910390a15050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610571576113808173ffffffffffffffffffffffffffffffffffffffff1660146116c5565b61138b8360206116c5565b60405160200161139c9291906120d9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261055e9160040161222f565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166105715760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561148c3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156105715760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806115e684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899392505061190f9050565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fa629f6981c2f6895a67dc766e8e03ff72d04a413d0d8773a3ca56e9e474032c1602052604090205490915060ff166116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d69677261746f723a3a7665726966793a205369676e6572206973206e6f742060448201527f76616c6964000000000000000000000000000000000000000000000000000000606482015260840161055e565b949350505050565b606060006116d48360026122fd565b6116df9060026122e5565b67ffffffffffffffff8111156116f7576116f7612465565b6040519080825280601f01601f191660200182016040528015611721576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061175857611758612436565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106117bb576117bb612436565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006117f78460026122fd565b6118029060016122e5565b90505b600181111561189f577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061184357611843612436565b1a60f81b82828151811061185957611859612436565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936118988161236a565b9050611805565b508315611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161055e565b9392505050565b600080600061191e8585611933565b9150915061192b816119a3565b509392505050565b60008082516041141561196a5760208301516040840151606085015160001a61195e87828585611bff565b9450945050505061199c565b8251604014156119945760208301516040840151611989868383611d17565b93509350505061199c565b506000905060025b9250929050565b60008160048111156119b7576119b7612407565b14156119c05750565b60018160048111156119d4576119d4612407565b1415611a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161055e565b6002816004811115611a5057611a50612407565b1415611ab8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161055e565b6003816004811115611acc57611acc612407565b1415611b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161055e565b6004816004811115611b6e57611b6e612407565b1415611bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161055e565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c365750600090506003611d0e565b8460ff16601b14158015611c4e57508460ff16601c14155b15611c5f5750600090506004611d0e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611cb3573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611d0757600060019250925050611d0e565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01611d5187828885611bff565b935093505050935093915050565b828054828255906000526020600020908101928215611dd7579160200282015b82811115611dd75781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190611d7f565b50611de3929150611de7565b5090565b5b80821115611de35760008155600101611de8565b803573ffffffffffffffffffffffffffffffffffffffff81168114611e2057600080fd5b919050565b60008083601f840112611e3757600080fd5b50813567ffffffffffffffff811115611e4f57600080fd5b6020830191508360208260051b850101111561199c57600080fd5b600060208284031215611e7c57600080fd5b61190882611dfc565b600080600060608486031215611e9a57600080fd5b611ea384611dfc565b9250611eb160208501611dfc565b9150604084013590509250925092565b60008060208385031215611ed457600080fd5b823567ffffffffffffffff811115611eeb57600080fd5b611ef785828601611e25565b90969095509350505050565b60008060008060008060006080888a031215611f1e57600080fd5b873567ffffffffffffffff80821115611f3657600080fd5b611f428b838c01611e25565b909950975060208a0135915080821115611f5b57600080fd5b611f678b838c01611e25565b909750955060408a0135945060608a0135915080821115611f8757600080fd5b50611f948a828b01611e25565b989b979a50959850939692959293505050565b600060208284031215611fb957600080fd5b8151801515811461190857600080fd5b600060208284031215611fdb57600080fd5b5035919050565b60008060408385031215611ff557600080fd5b8235915061200560208401611dfc565b90509250929050565b60006020828403121561202057600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461190857600080fd5b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008760601b16815285601482015284603482015283605482015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156120b957600080fd5b8260051b8085607485013760009201607401918252509695505050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161211181601785016020880161233a565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161214e81602884016020880161233a565b01602801949350505050565b73ffffffffffffffffffffffffffffffffffffffff851681526060602082015282606082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156121af57600080fd5b8360051b808660808501376000908301608001908152604090920192909252949350505050565b60208082528181018390526000908460408401835b868110156122245773ffffffffffffffffffffffffffffffffffffffff61221184611dfc565b16825291830191908301906001016121eb565b509695505050505050565b602081526000825180602084015261224e81604085016020870161233a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126122b557600080fd5b83018035915067ffffffffffffffff8211156122d057600080fd5b60200191503681900382131561199c57600080fd5b600082198211156122f8576122f86123d8565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612335576123356123d8565b500290565b60005b8381101561235557818101518382015260200161233d565b83811115612364576000848401525b50505050565b600081612379576123796123d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156123d1576123d16123d8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212206b1ba16935878db4a1cb18bdec2b47fcfbb7680e1edd4f940f9acd0e87d2b57a64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf606900000000000000000000000000000000000000000000000000000000000000020000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf60690000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf6069
-----Decoded View---------------
Arg [0] : _admin (address): 0x4ec123eb00322507FC47B4f026c64f6D9ECf6069
Arg [1] : _minimumRequiredSignature (uint256): 2
Arg [2] : _trusty_address (address): 0x4ec123eb00322507FC47B4f026c64f6D9ECf6069
Arg [3] : _token_setter_address (address): 0x4ec123eb00322507FC47B4f026c64f6D9ECf6069
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf6069
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 0000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf6069
Arg [3] : 0000000000000000000000004ec123eb00322507fc47b4f026c64f6d9ecf6069
Loading...
Loading
Loading...
Loading
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.