Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DOR
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; contract DOR is Ownable2Step { // constants string public constant dor = "Treehouse Ethereum Staking Rate - Consensus"; // address public immutable owner; uint256 public immutable dorId = 0; uint256 public immutable decimals = 9; uint256 private DOR_START_DAY = getStartOfDayTimestamp(block.timestamp); string[] private tenors = ["1d", "7d", "30d"]; uint256 private latestRoundId = 0; uint256 private latestRoundPublishedAt = 0; uint256 private activeTenorsLastUpdateBlock; constructor() Ownable(msg.sender) { // owner = msg.sender; activeTenorsLastUpdateBlock = block.number; activeTenorsFromBlock[block.number] = tenors; } // errors error Unauthorised(); error InvalidDorId(uint256 correctDorId); error InvalidRoundId(uint256 latestRoundId); error ArrayLengthMismatch(); error NotActiveTenor(string[] activeTenors); // events event ActiveTenorsUpdate(address updatedBy, uint256 updatedAtBlock, string[] tenors); event NewDorConsensusRound( uint256 indexed roundId, uint256 publishedAt, address publishedBy, string[] tenors, int256[] consensusValues, uint256[] realisationDates ); // define the tenor data struct struct TenorData { int256 consensusValue; uint256 realisationDate; } struct PanelistTenorPredictionData { string panelistName; int256 panelistSubmittedValue; } struct RoundData { uint256 publishedAt; mapping(string tenor => TenorData tenorData) tenorDataMap; mapping(string tenor => PanelistTenorPredictionData[] panelistTenorPredictionData) tenorPanelistPredictionMap; } // map roundId to active tenors to save historical state mapping(uint256 roundId => string[] activeTenors) private activeTenorsFromBlock; // map roundId to round containing all the tenor infos mapping(uint256 roundId => RoundData roundData) private roundDataFromRoundId; // create the tenor info struct for submission struct TenorInfo { string tenor; int256 consensusValue; uint256 realisationDate; } struct PanelistPredictionInfo { string tenor; string[] panelistNames; int256[] panelistSubmittedValues; } /// @dev Convert any timestamp to SOD timestamp as date representation function getStartOfDayTimestamp(uint256 timestamp) private pure returns (uint256 sodTimestamp) { return (timestamp / 1 days) * 1 days; } // support functions function isActiveTenor(string memory _tenor) internal view returns (bool) { for (uint256 i = 0; i < tenors.length; i++) { if (keccak256(abi.encodePacked((_tenor))) == keccak256(abi.encodePacked((tenors[i])))) { return true; } } return false; } function isActiveTenor(string memory _tenor, string[] memory _tenors) internal pure returns (bool) { for (uint256 i = 0; i < _tenors.length; i++) { if (keccak256(abi.encodePacked((_tenor))) == keccak256(abi.encodePacked((_tenors[i])))) { return true; } } return false; } // define write functions function updateActiveTenors(string[] memory _tenors) public onlyOwner { tenors = _tenors; // update the activeTenorsLastUpdateBlock to allow historical queries using blockchain state activeTenorsLastUpdateBlock = block.number; // save the active tenors to round in mapping activeTenorsFromBlock[block.number] = _tenors; // emit event emit ActiveTenorsUpdate(msg.sender, block.number, _tenors); } function publishConsensus( uint256 _dorId, uint256 _roundId, uint256 _publishedAt, TenorInfo[] calldata _tenorInfo, PanelistPredictionInfo[] calldata _panelistPredictionInfo ) public onlyOwner { // data validation // require(_dorId == dorId, "Submitted data for wrong DOR ID"); if (_dorId != dorId) revert InvalidDorId(dorId); // require(_roundId > latestRoundId, "Submitted round data is not latest"); // require(latestRoundId == 0 || _roundId == latestRoundId + 1, "Submitted round ID is not valid"); if (latestRoundId != 0 && _roundId != latestRoundId + 1) revert InvalidRoundId(latestRoundId); // require(_tenorInfo.length == tenors.length, "Submitted tenor count does not match active ones"); if (_tenorInfo.length != tenors.length) revert ArrayLengthMismatch(); if (_roundId == 0) DOR_START_DAY = getStartOfDayTimestamp(_publishedAt); int256[] memory cvs = new int256[](tenors.length); uint256[] memory rds = new uint256[](tenors.length); // run through each active tenor for (uint256 i = 0; i < _tenorInfo.length; i++) { // require(isActiveTenor(_tenorInfo[i].tenor), "Submitted tenor(s) don't match active ones"); if (!isActiveTenor(_tenorInfo[i].tenor)) revert NotActiveTenor(tenors); // update the storage variable with consensus and panelist predictions roundDataFromRoundId[_roundId].tenorDataMap[_tenorInfo[i].tenor] = TenorData({ consensusValue: _tenorInfo[i].consensusValue, realisationDate: _tenorInfo[i].realisationDate }); // loop through all panelists for (uint256 j = 0; j < _panelistPredictionInfo[i].panelistNames.length; j++) { roundDataFromRoundId[_roundId].tenorPanelistPredictionMap[_panelistPredictionInfo[i].tenor].push( PanelistTenorPredictionData({ panelistName: _panelistPredictionInfo[i].panelistNames[j], panelistSubmittedValue: _panelistPredictionInfo[i].panelistSubmittedValues[j] }) ); } // get values for event cvs[i] = _tenorInfo[i].consensusValue; rds[i] = _tenorInfo[i].realisationDate; } // update latestRoundId latestRoundId = _roundId; // update latestRoundPublishedAt latestRoundPublishedAt = _publishedAt; // add publish time to the main storage roundDataFromRoundId[_roundId].publishedAt = _publishedAt; emit NewDorConsensusRound(_roundId, _publishedAt, msg.sender, tenors, cvs, rds); } // define read functions function getFirstRoundPublishTime() public view returns (uint256 firstRoundPublishTime) { return DOR_START_DAY; } function getActiveTenors() public view returns (string[] memory activeTenors) { return tenors; } function getActiveTenorsUpdateBlock() public view returns (uint256 activeTenorsUpdateBlock) { return activeTenorsLastUpdateBlock; } function getLatestRound() public view returns (uint256 latestRound) { return latestRoundId; } function getLatestRoundPublishTime() public view returns (uint256 latestRoundPublishTime) { return latestRoundPublishedAt; } function getLatestRoundData(string calldata _tenor) public view returns ( uint256 roundId, uint256 publishedAt, TenorData memory tenorData, PanelistTenorPredictionData[] memory panelistTenorPredictionData ) { // check if requested tenor is active // require(isActiveTenor(_tenor), "Requested tenor don't match any active ones"); if (!isActiveTenor(_tenor)) revert NotActiveTenor(tenors); return ( latestRoundId, latestRoundPublishedAt, roundDataFromRoundId[latestRoundId].tenorDataMap[_tenor], roundDataFromRoundId[latestRoundId].tenorPanelistPredictionMap[_tenor] ); } function getRoundDataFromId(uint256 _roundId, string calldata _tenor) public view returns ( uint256 roundId, uint256 publishedAt, TenorData memory tenorData, PanelistTenorPredictionData[] memory panelistTenorPredictionData ) { // check if requested round is valid // require(_roundId <= latestRoundId, "Requested round ID is not valid"); if (_roundId > latestRoundId) revert InvalidRoundId(latestRoundId); // check if requested tenor is active as of historical state // require( // isActiveTenor(_tenor, activeTenorsFromBlock[getActiveTenorsUpdateBlock()]), // "Requested tenor don't match any active ones" // ); if (!isActiveTenor(_tenor, activeTenorsFromBlock[getActiveTenorsUpdateBlock()])) revert NotActiveTenor(tenors); return ( _roundId, roundDataFromRoundId[_roundId].publishedAt, roundDataFromRoundId[_roundId].tenorDataMap[_tenor], roundDataFromRoundId[_roundId].tenorPanelistPredictionMap[_tenor] ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol) pragma solidity ^0.8.20; import {Ownable} from "./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. * * This extension of the {Ownable} contract includes a two-step mechanism to transfer * ownership, where the new owner must call {acceptOwnership} in order to replace the * old one. This can help prevent common mistakes, such as transfers of ownership to * incorrect accounts, or to contracts that are unable to interact with the * permission system. * * The initial owner is specified at deployment time in the constructor for `Ownable`. 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. * * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer. */ 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(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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 v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
{ "remappings": [ "forge-std/=lib/forge-std/src/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"correctDorId","type":"uint256"}],"name":"InvalidDorId","type":"error"},{"inputs":[{"internalType":"uint256","name":"latestRoundId","type":"uint256"}],"name":"InvalidRoundId","type":"error"},{"inputs":[{"internalType":"string[]","name":"activeTenors","type":"string[]"}],"name":"NotActiveTenor","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"Unauthorised","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"updatedAtBlock","type":"uint256"},{"indexed":false,"internalType":"string[]","name":"tenors","type":"string[]"}],"name":"ActiveTenorsUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"publishedAt","type":"uint256"},{"indexed":false,"internalType":"address","name":"publishedBy","type":"address"},{"indexed":false,"internalType":"string[]","name":"tenors","type":"string[]"},{"indexed":false,"internalType":"int256[]","name":"consensusValues","type":"int256[]"},{"indexed":false,"internalType":"uint256[]","name":"realisationDates","type":"uint256[]"}],"name":"NewDorConsensusRound","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"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dorId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveTenors","outputs":[{"internalType":"string[]","name":"activeTenors","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveTenorsUpdateBlock","outputs":[{"internalType":"uint256","name":"activeTenorsUpdateBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFirstRoundPublishTime","outputs":[{"internalType":"uint256","name":"firstRoundPublishTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestRound","outputs":[{"internalType":"uint256","name":"latestRound","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tenor","type":"string"}],"name":"getLatestRoundData","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"publishedAt","type":"uint256"},{"components":[{"internalType":"int256","name":"consensusValue","type":"int256"},{"internalType":"uint256","name":"realisationDate","type":"uint256"}],"internalType":"struct DOR.TenorData","name":"tenorData","type":"tuple"},{"components":[{"internalType":"string","name":"panelistName","type":"string"},{"internalType":"int256","name":"panelistSubmittedValue","type":"int256"}],"internalType":"struct DOR.PanelistTenorPredictionData[]","name":"panelistTenorPredictionData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestRoundPublishTime","outputs":[{"internalType":"uint256","name":"latestRoundPublishTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"},{"internalType":"string","name":"_tenor","type":"string"}],"name":"getRoundDataFromId","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"publishedAt","type":"uint256"},{"components":[{"internalType":"int256","name":"consensusValue","type":"int256"},{"internalType":"uint256","name":"realisationDate","type":"uint256"}],"internalType":"struct DOR.TenorData","name":"tenorData","type":"tuple"},{"components":[{"internalType":"string","name":"panelistName","type":"string"},{"internalType":"int256","name":"panelistSubmittedValue","type":"int256"}],"internalType":"struct DOR.PanelistTenorPredictionData[]","name":"panelistTenorPredictionData","type":"tuple[]"}],"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":"uint256","name":"_dorId","type":"uint256"},{"internalType":"uint256","name":"_roundId","type":"uint256"},{"internalType":"uint256","name":"_publishedAt","type":"uint256"},{"components":[{"internalType":"string","name":"tenor","type":"string"},{"internalType":"int256","name":"consensusValue","type":"int256"},{"internalType":"uint256","name":"realisationDate","type":"uint256"}],"internalType":"struct DOR.TenorInfo[]","name":"_tenorInfo","type":"tuple[]"},{"components":[{"internalType":"string","name":"tenor","type":"string"},{"internalType":"string[]","name":"panelistNames","type":"string[]"},{"internalType":"int256[]","name":"panelistSubmittedValues","type":"int256[]"}],"internalType":"struct DOR.PanelistPredictionInfo[]","name":"_panelistPredictionInfo","type":"tuple[]"}],"name":"publishConsensus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_tenors","type":"string[]"}],"name":"updateActiveTenors","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040525f608052600960a052610016426100ff565b6002556040518060600160405280604051806040016040528060028152602001610c5960f21b8152508152602001604051806040016040528060028152602001610dd960f21b8152508152602001604051806040016040528060038152602001620ccc1960ea1b815250815250600390600361009392919061018b565b505f6004555f6005553480156100a7575f5ffd5b5033806100cd57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100d681610120565b504360068190555f908152600760205260409020600380546100f99291906101df565b506104e8565b5f61010d6201518083610285565b61011a90620151806102a4565b92915050565b600180546001600160a01b03191690556101398161013c565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f209081019282156101cf579160200282015b828111156101cf57825182906101bf908261035f565b50916020019190600101906101a9565b506101db929150610223565b5090565b828054828255905f5260205f209081019282156101cf575f5260205f209182015b828111156101cf5781610213848261041c565b5091600101919060010190610200565b808211156101db575f610236828261023f565b50600101610223565b50805461024b906102db565b5f825580601f1061025a575050565b601f0160209004905f5260205f209081019061013991905b808211156101db575f8155600101610272565b5f8261029f57634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761011a57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806102ef57607f821691505b60208210810361030d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561035a57805f5260205f20601f840160051c810160208510156103385750805b601f840160051c820191505b81811015610357575f8155600101610344565b50505b505050565b81516001600160401b03811115610378576103786102c7565b61038c8161038684546102db565b84610313565b6020601f8211600181146103c1575f83156103a75750848201515b600184901b5f19600386901b1c198216175b855550610357565b5f84815260208120601f198516915b828110156103f057878501518255602094850194600190920191016103d0565b508482101561040d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b818103610427575050565b61043182546102db565b6001600160401b03811115610448576104486102c7565b6104568161038684546102db565b5f601f821160018114610485575f83156103a7575081850154600184901b5f19600386901b1c198216176103b9565b5f8581526020808220868352908220601f198616925b838110156104bb578286015482556001958601959091019060200161049b565b50858310156104d857818501545f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611b216105175f395f61013b01525f818161019c0152818161027101526102a50152611b215ff3fe608060405234801561000f575f5ffd5b5060043610610106575f3560e01c806379ba50971161009e578063c697886b1161006e578063c697886b14610215578063c93f20781461021d578063e30c397814610230578063e495fcf714610241578063f2fde38b14610254575f5ffd5b806379ba5097146101be5780638da5cb5b146101c657806393a15096146101ea578063a7666f66146101f2575f5ffd5b8063708fe4df116100d9578063708fe4df14610172578063715018a61461017a578063782475321461018257806379b58e4014610197575f5ffd5b806308942b041461010a5780631490014a14610121578063313ce567146101365780634cb85cf71461015d575b5f5ffd5b6006545b6040519081526020015b60405180910390f35b61013461012f3660046111fb565b610267565b005b61010e7f000000000000000000000000000000000000000000000000000000000000000081565b6101656107ef565b60405161011891906112b2565b60045461010e565b61013461080b565b61018a61081e565b6040516101189190611325565b61010e7f000000000000000000000000000000000000000000000000000000000000000081565b6101346108f2565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610118565b60055461010e565b610205610200366004611374565b610936565b60405161011894939291906113b2565b60025461010e565b61020561022b366004611449565b610b33565b6001546001600160a01b03166101d2565b61013461024f3660046114d4565b610e34565b6101346102623660046115f8565b610eb3565b61026f610f23565b7f000000000000000000000000000000000000000000000000000000000000000087146102d6576040516309d955bb60e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526024015b60405180910390fd5b600454158015906102f457506004546102f0906001611632565b8614155b15610316576004805460405163325a5bd760e21b8152918201526024016102cd565b60035483146103385760405163512509d360e11b815260040160405180910390fd5b855f0361034c5761034885610f4f565b6002555b6003545f906001600160401b0381111561036857610368611490565b604051908082528060200260200182016040528015610391578160200160208202803683370190505b506003549091505f906001600160401b038111156103b1576103b1611490565b6040519080825280602002602001820160405280156103da578160200160208202803683370190505b5090505f5b85811015610786576104518787838181106103fc576103fc611645565b905060200281019061040e9190611659565b6104189080611677565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610f7092505050565b610471576003604051633a26eddd60e21b81526004016102cd91906117af565b604051806040016040528088888481811061048e5761048e611645565b90506020028101906104a09190611659565b6020013581526020018888848181106104bb576104bb611645565b90506020028101906104cd9190611659565b6040908101359091525f8b81526008602052206001018888848181106104f5576104f5611645565b90506020028101906105079190611659565b6105119080611677565b60405161051f9291906117c1565b90815260405160209181900382019020825181559101516001909101555f5b85858381811061055057610550611645565b90506020028101906105629190611659565b6105709060208101906117d0565b90508110156106f2575f8a815260086020526040902060020186868481811061059b5761059b611645565b90506020028101906105ad9190611659565b6105b79080611677565b6040516105c59291906117c1565b908152602001604051809103902060405180604001604052808888868181106105f0576105f0611645565b90506020028101906106029190611659565b6106109060208101906117d0565b8581811061062057610620611645565b90506020028101906106329190611677565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200188888681811061067d5761067d611645565b905060200281019061068f9190611659565b61069d9060408101906117d0565b858181106106ad576106ad611645565b6020908102929092013590925283546001810185555f94855293208251929360020201918291506106de9082611861565b50602091909101516001918201550161053e565b5086868281811061070557610705611645565b90506020028101906107179190611659565b6020013583828151811061072d5761072d611645565b60200260200101818152505086868281811061074b5761074b611645565b905060200281019061075d9190611659565b6040013582828151811061077357610773611645565b60209081029190910101526001016103df565b50600488905560058790555f88815260086020526040908190208890555188907f420533878b4127065da171661db0019c81c6966bddaa66858086c000fcca9775906107dc908a90339060039088908890611955565b60405180910390a2505050505050505050565b6040518060600160405280602b8152602001611ac1602b913981565b610813610f23565b61081c5f611003565b565b60606003805480602002602001604051908101604052809291908181526020015f905b828210156108e9578382905f5260205f2001805461085e906116b9565b80601f016020809104026020016040519081016040528092919081815260200182805461088a906116b9565b80156108d55780601f106108ac576101008083540402835291602001916108d5565b820191905f5260205f20905b8154815290600101906020018083116108b857829003601f168201915b505050505081526020019060010190610841565b50505050905090565b60015433906001600160a01b0316811461092a5760405163118cdaa760e01b81526001600160a01b03821660048201526024016102cd565b61093381611003565b50565b5f5f61095360405180604001604052805f81526020015f81525090565b606061099386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610f7092505050565b6109b3576003604051633a26eddd60e21b81526004016102cd91906117af565b60045460055460085f60045481526020019081526020015f2060010188886040516109df9291906117c1565b908152602001604051809103902060085f60045481526020019081526020015f206002018989604051610a139291906117c1565b90815260408051918290036020908101832083830183528454845260019094015483820152835482518183028101830190935280835292939283915f9084015b82821015610b1c578382905f5260205f2090600202016040518060400160405290815f82018054610a83906116b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf906116b9565b8015610afa5780601f10610ad157610100808354040283529160200191610afa565b820191905f5260205f20905b815481529060010190602001808311610add57829003601f168201915b5050505050815260200160018201548152505081526020019060010190610a53565b505050509050935093509350935092959194509250565b5f5f610b5060405180604001604052805f81526020015f81525090565b6060600454871115610b79576004805460405163325a5bd760e21b8152918201526024016102cd565b610c9b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250600793509150610bbe905060065490565b81526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015610c92578382905f5260205f20018054610c07906116b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c33906116b9565b8015610c7e5780601f10610c5557610100808354040283529160200191610c7e565b820191905f5260205f20905b815481529060010190602001808311610c6157829003601f168201915b505050505081526020019060010190610bea565b5050505061101c565b610cbb576003604051633a26eddd60e21b81526004016102cd91906117af565b5f87815260086020526040908190208054915189929160010190610ce2908a908a906117c1565b908152602001604051809103902060085f8b81526020019081526020015f206002018989604051610d149291906117c1565b90815260408051918290036020908101832083830183528454845260019094015483820152835482518183028101830190935280835292939283915f9084015b82821015610e1d578382905f5260205f2090600202016040518060400160405290815f82018054610d84906116b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610db0906116b9565b8015610dfb5780601f10610dd257610100808354040283529160200191610dfb565b820191905f5260205f20905b815481529060010190602001808311610dde57829003601f168201915b5050505050815260200160018201548152505081526020019060010190610d54565b505050509050935093509350935093509350935093565b610e3c610f23565b8051610e4f9060039060208401906110fe565b504360068190555f9081526007602090815260409091208251610e74928401906110fe565b507f99e570002fefdbf82d8b33bd0c0672ab394251311af0d43e007d86095da75525334383604051610ea8939291906119d4565b60405180910390a150565b610ebb610f23565b600180546001600160a01b0383166001600160a01b03199091168117909155610eeb5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b0316331461081c5760405163118cdaa760e01b81523360048201526024016102cd565b5f610f5d6201518083611a03565b610f6a9062015180611a22565b92915050565b5f805b600354811015610ffb5760038181548110610f9057610f90611645565b905f5260205f2001604051602001610fa89190611a39565b6040516020818303038152906040528051906020012083604051602001610fcf9190611aaa565b6040516020818303038152906040528051906020012003610ff35750600192915050565b600101610f73565b505f92915050565b600180546001600160a01b0319169055610933816110af565b5f805b82518110156110a65782818151811061103a5761103a611645565b60200260200101516040516020016110529190611aaa565b60405160208183030381529060405280519060200120846040516020016110799190611aaa565b604051602081830303815290604052805190602001200361109e576001915050610f6a565b60010161101f565b505f9392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215611142579160200282015b8281111561114257825182906111329082611861565b509160200191906001019061111c565b5061114e929150611152565b5090565b8082111561114e575f611165828261116e565b50600101611152565b50805461117a906116b9565b5f825580601f10611189575050565b601f0160209004905f5260205f209081019061093391905b8082111561114e575f81556001016111a1565b5f5f83601f8401126111c4575f5ffd5b5081356001600160401b038111156111da575f5ffd5b6020830191508360208260051b85010111156111f4575f5ffd5b9250929050565b5f5f5f5f5f5f5f60a0888a031215611211575f5ffd5b87359650602088013595506040880135945060608801356001600160401b0381111561123b575f5ffd5b6112478a828b016111b4565b90955093505060808801356001600160401b03811115611265575f5ffd5b6112718a828b016111b4565b989b979a50959850939692959293505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112c46020830184611284565b9392505050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561131957601f19858403018852611303838351611284565b60209889019890935091909101906001016112e7565b50909695505050505050565b602081525f6112c460208301846112cb565b5f5f83601f840112611347575f5ffd5b5081356001600160401b0381111561135d575f5ffd5b6020830191508360208285010111156111f4575f5ffd5b5f5f60208385031215611385575f5ffd5b82356001600160401b0381111561139a575f5ffd5b6113a685828601611337565b90969095509350505050565b5f60a08201868352856020840152845160408401526020850151606084015260a0608084015280845180835260c08501915060c08160051b8601019250602086015f5b8281101561143a5760bf19878603018452815180516040875261141b6040880182611284565b60209283015197830197909752509384019391909101906001016113f5565b50929998505050505050505050565b5f5f5f6040848603121561145b575f5ffd5b8335925060208401356001600160401b03811115611477575f5ffd5b61148386828701611337565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156114cc576114cc611490565b604052919050565b5f602082840312156114e4575f5ffd5b81356001600160401b038111156114f9575f5ffd5b8201601f81018413611509575f5ffd5b80356001600160401b0381111561152257611522611490565b8060051b611532602082016114a4565b9182526020818401810192908101908784111561154d575f5ffd5b6020850192505b838310156115ed5782356001600160401b03811115611571575f5ffd5b8501603f81018913611581575f5ffd5b60208101356001600160401b0381111561159d5761159d611490565b6115b0601f8201601f19166020016114a4565b8181526040838301018b10156115c4575f5ffd5b816040840160208301375f60208383010152808552505050602082019150602083019250611554565b979650505050505050565b5f60208284031215611608575f5ffd5b81356001600160a01b03811681146112c4575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610f6a57610f6a61161e565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261166d575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261168c575f5ffd5b8301803591506001600160401b038211156116a5575f5ffd5b6020019150368190038213156111f4575f5ffd5b600181811c908216806116cd57607f821691505b6020821081036116eb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f82825480855260208501945060208160051b830101845f5260205f205f5b8381101561131957601f198584030188525f825461172d816116b9565b808652600182168015611747576001811461176357611797565b60ff1983166020880152602082151560051b8801019350611797565b855f5260205f205f5b8381101561178e5781546020828b01015260018201915060208101905061176c565b88016020019450505b50505060209890980197925060019182019101611710565b602081525f6112c460208301846116f1565b818382375f9101908152919050565b5f5f8335601e198436030181126117e5575f5ffd5b8301803591506001600160401b038211156117fe575f5ffd5b6020019150600581901b36038213156111f4575f5ffd5b601f82111561185c57805f5260205f20601f840160051c8101602085101561183a5750805b601f840160051c820191505b81811015611859575f8155600101611846565b50505b505050565b81516001600160401b0381111561187a5761187a611490565b61188e8161188884546116b9565b84611815565b6020601f8211600181146118c0575f83156118a95750848201515b5f19600385901b1c1916600184901b178455611859565b5f84815260208120601f198516915b828110156118ef57878501518255602094850194600190920191016118cf565b508482101561190c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8151808452602084019350602083015f5b8281101561194b57815186526020958601959091019060010161192d565b5093949350505050565b8581526001600160a01b038516602082015260a0604082018190525f9061197e908301866116f1565b8281036060840152845180825260208087019201905f5b818110156119b3578351835260209384019390920191600101611995565b505083810360808501526119c7818661191b565b9998505050505050505050565b60018060a01b0384168152826020820152606060408201525f6119fa60608301846112cb565b95945050505050565b5f82611a1d57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610f6a57610f6a61161e565b5f5f8354611a46816116b9565b600182168015611a5d5760018114611a7257611a9f565b60ff1983168652811515820286019350611a9f565b865f5260205f205f5b83811015611a9757815488820152600190910190602001611a7b565b505081860193505b509195945050505050565b5f82518060208501845e5f92019182525091905056fe54726565686f75736520457468657265756d205374616b696e672052617465202d20436f6e73656e737573a2646970667358221220c32fcf69924f185248b03c790a3b1e4875e5bc2faf670a541bc8fc26d630172564736f6c634300081c0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610106575f3560e01c806379ba50971161009e578063c697886b1161006e578063c697886b14610215578063c93f20781461021d578063e30c397814610230578063e495fcf714610241578063f2fde38b14610254575f5ffd5b806379ba5097146101be5780638da5cb5b146101c657806393a15096146101ea578063a7666f66146101f2575f5ffd5b8063708fe4df116100d9578063708fe4df14610172578063715018a61461017a578063782475321461018257806379b58e4014610197575f5ffd5b806308942b041461010a5780631490014a14610121578063313ce567146101365780634cb85cf71461015d575b5f5ffd5b6006545b6040519081526020015b60405180910390f35b61013461012f3660046111fb565b610267565b005b61010e7f000000000000000000000000000000000000000000000000000000000000000981565b6101656107ef565b60405161011891906112b2565b60045461010e565b61013461080b565b61018a61081e565b6040516101189190611325565b61010e7f000000000000000000000000000000000000000000000000000000000000000081565b6101346108f2565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610118565b60055461010e565b610205610200366004611374565b610936565b60405161011894939291906113b2565b60025461010e565b61020561022b366004611449565b610b33565b6001546001600160a01b03166101d2565b61013461024f3660046114d4565b610e34565b6101346102623660046115f8565b610eb3565b61026f610f23565b7f000000000000000000000000000000000000000000000000000000000000000087146102d6576040516309d955bb60e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526024015b60405180910390fd5b600454158015906102f457506004546102f0906001611632565b8614155b15610316576004805460405163325a5bd760e21b8152918201526024016102cd565b60035483146103385760405163512509d360e11b815260040160405180910390fd5b855f0361034c5761034885610f4f565b6002555b6003545f906001600160401b0381111561036857610368611490565b604051908082528060200260200182016040528015610391578160200160208202803683370190505b506003549091505f906001600160401b038111156103b1576103b1611490565b6040519080825280602002602001820160405280156103da578160200160208202803683370190505b5090505f5b85811015610786576104518787838181106103fc576103fc611645565b905060200281019061040e9190611659565b6104189080611677565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610f7092505050565b610471576003604051633a26eddd60e21b81526004016102cd91906117af565b604051806040016040528088888481811061048e5761048e611645565b90506020028101906104a09190611659565b6020013581526020018888848181106104bb576104bb611645565b90506020028101906104cd9190611659565b6040908101359091525f8b81526008602052206001018888848181106104f5576104f5611645565b90506020028101906105079190611659565b6105119080611677565b60405161051f9291906117c1565b90815260405160209181900382019020825181559101516001909101555f5b85858381811061055057610550611645565b90506020028101906105629190611659565b6105709060208101906117d0565b90508110156106f2575f8a815260086020526040902060020186868481811061059b5761059b611645565b90506020028101906105ad9190611659565b6105b79080611677565b6040516105c59291906117c1565b908152602001604051809103902060405180604001604052808888868181106105f0576105f0611645565b90506020028101906106029190611659565b6106109060208101906117d0565b8581811061062057610620611645565b90506020028101906106329190611677565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200188888681811061067d5761067d611645565b905060200281019061068f9190611659565b61069d9060408101906117d0565b858181106106ad576106ad611645565b6020908102929092013590925283546001810185555f94855293208251929360020201918291506106de9082611861565b50602091909101516001918201550161053e565b5086868281811061070557610705611645565b90506020028101906107179190611659565b6020013583828151811061072d5761072d611645565b60200260200101818152505086868281811061074b5761074b611645565b905060200281019061075d9190611659565b6040013582828151811061077357610773611645565b60209081029190910101526001016103df565b50600488905560058790555f88815260086020526040908190208890555188907f420533878b4127065da171661db0019c81c6966bddaa66858086c000fcca9775906107dc908a90339060039088908890611955565b60405180910390a2505050505050505050565b6040518060600160405280602b8152602001611ac1602b913981565b610813610f23565b61081c5f611003565b565b60606003805480602002602001604051908101604052809291908181526020015f905b828210156108e9578382905f5260205f2001805461085e906116b9565b80601f016020809104026020016040519081016040528092919081815260200182805461088a906116b9565b80156108d55780601f106108ac576101008083540402835291602001916108d5565b820191905f5260205f20905b8154815290600101906020018083116108b857829003601f168201915b505050505081526020019060010190610841565b50505050905090565b60015433906001600160a01b0316811461092a5760405163118cdaa760e01b81526001600160a01b03821660048201526024016102cd565b61093381611003565b50565b5f5f61095360405180604001604052805f81526020015f81525090565b606061099386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610f7092505050565b6109b3576003604051633a26eddd60e21b81526004016102cd91906117af565b60045460055460085f60045481526020019081526020015f2060010188886040516109df9291906117c1565b908152602001604051809103902060085f60045481526020019081526020015f206002018989604051610a139291906117c1565b90815260408051918290036020908101832083830183528454845260019094015483820152835482518183028101830190935280835292939283915f9084015b82821015610b1c578382905f5260205f2090600202016040518060400160405290815f82018054610a83906116b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf906116b9565b8015610afa5780601f10610ad157610100808354040283529160200191610afa565b820191905f5260205f20905b815481529060010190602001808311610add57829003601f168201915b5050505050815260200160018201548152505081526020019060010190610a53565b505050509050935093509350935092959194509250565b5f5f610b5060405180604001604052805f81526020015f81525090565b6060600454871115610b79576004805460405163325a5bd760e21b8152918201526024016102cd565b610c9b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250600793509150610bbe905060065490565b81526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015610c92578382905f5260205f20018054610c07906116b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c33906116b9565b8015610c7e5780601f10610c5557610100808354040283529160200191610c7e565b820191905f5260205f20905b815481529060010190602001808311610c6157829003601f168201915b505050505081526020019060010190610bea565b5050505061101c565b610cbb576003604051633a26eddd60e21b81526004016102cd91906117af565b5f87815260086020526040908190208054915189929160010190610ce2908a908a906117c1565b908152602001604051809103902060085f8b81526020019081526020015f206002018989604051610d149291906117c1565b90815260408051918290036020908101832083830183528454845260019094015483820152835482518183028101830190935280835292939283915f9084015b82821015610e1d578382905f5260205f2090600202016040518060400160405290815f82018054610d84906116b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610db0906116b9565b8015610dfb5780601f10610dd257610100808354040283529160200191610dfb565b820191905f5260205f20905b815481529060010190602001808311610dde57829003601f168201915b5050505050815260200160018201548152505081526020019060010190610d54565b505050509050935093509350935093509350935093565b610e3c610f23565b8051610e4f9060039060208401906110fe565b504360068190555f9081526007602090815260409091208251610e74928401906110fe565b507f99e570002fefdbf82d8b33bd0c0672ab394251311af0d43e007d86095da75525334383604051610ea8939291906119d4565b60405180910390a150565b610ebb610f23565b600180546001600160a01b0383166001600160a01b03199091168117909155610eeb5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b0316331461081c5760405163118cdaa760e01b81523360048201526024016102cd565b5f610f5d6201518083611a03565b610f6a9062015180611a22565b92915050565b5f805b600354811015610ffb5760038181548110610f9057610f90611645565b905f5260205f2001604051602001610fa89190611a39565b6040516020818303038152906040528051906020012083604051602001610fcf9190611aaa565b6040516020818303038152906040528051906020012003610ff35750600192915050565b600101610f73565b505f92915050565b600180546001600160a01b0319169055610933816110af565b5f805b82518110156110a65782818151811061103a5761103a611645565b60200260200101516040516020016110529190611aaa565b60405160208183030381529060405280519060200120846040516020016110799190611aaa565b604051602081830303815290604052805190602001200361109e576001915050610f6a565b60010161101f565b505f9392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215611142579160200282015b8281111561114257825182906111329082611861565b509160200191906001019061111c565b5061114e929150611152565b5090565b8082111561114e575f611165828261116e565b50600101611152565b50805461117a906116b9565b5f825580601f10611189575050565b601f0160209004905f5260205f209081019061093391905b8082111561114e575f81556001016111a1565b5f5f83601f8401126111c4575f5ffd5b5081356001600160401b038111156111da575f5ffd5b6020830191508360208260051b85010111156111f4575f5ffd5b9250929050565b5f5f5f5f5f5f5f60a0888a031215611211575f5ffd5b87359650602088013595506040880135945060608801356001600160401b0381111561123b575f5ffd5b6112478a828b016111b4565b90955093505060808801356001600160401b03811115611265575f5ffd5b6112718a828b016111b4565b989b979a50959850939692959293505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112c46020830184611284565b9392505050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561131957601f19858403018852611303838351611284565b60209889019890935091909101906001016112e7565b50909695505050505050565b602081525f6112c460208301846112cb565b5f5f83601f840112611347575f5ffd5b5081356001600160401b0381111561135d575f5ffd5b6020830191508360208285010111156111f4575f5ffd5b5f5f60208385031215611385575f5ffd5b82356001600160401b0381111561139a575f5ffd5b6113a685828601611337565b90969095509350505050565b5f60a08201868352856020840152845160408401526020850151606084015260a0608084015280845180835260c08501915060c08160051b8601019250602086015f5b8281101561143a5760bf19878603018452815180516040875261141b6040880182611284565b60209283015197830197909752509384019391909101906001016113f5565b50929998505050505050505050565b5f5f5f6040848603121561145b575f5ffd5b8335925060208401356001600160401b03811115611477575f5ffd5b61148386828701611337565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156114cc576114cc611490565b604052919050565b5f602082840312156114e4575f5ffd5b81356001600160401b038111156114f9575f5ffd5b8201601f81018413611509575f5ffd5b80356001600160401b0381111561152257611522611490565b8060051b611532602082016114a4565b9182526020818401810192908101908784111561154d575f5ffd5b6020850192505b838310156115ed5782356001600160401b03811115611571575f5ffd5b8501603f81018913611581575f5ffd5b60208101356001600160401b0381111561159d5761159d611490565b6115b0601f8201601f19166020016114a4565b8181526040838301018b10156115c4575f5ffd5b816040840160208301375f60208383010152808552505050602082019150602083019250611554565b979650505050505050565b5f60208284031215611608575f5ffd5b81356001600160a01b03811681146112c4575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610f6a57610f6a61161e565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261166d575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261168c575f5ffd5b8301803591506001600160401b038211156116a5575f5ffd5b6020019150368190038213156111f4575f5ffd5b600181811c908216806116cd57607f821691505b6020821081036116eb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f82825480855260208501945060208160051b830101845f5260205f205f5b8381101561131957601f198584030188525f825461172d816116b9565b808652600182168015611747576001811461176357611797565b60ff1983166020880152602082151560051b8801019350611797565b855f5260205f205f5b8381101561178e5781546020828b01015260018201915060208101905061176c565b88016020019450505b50505060209890980197925060019182019101611710565b602081525f6112c460208301846116f1565b818382375f9101908152919050565b5f5f8335601e198436030181126117e5575f5ffd5b8301803591506001600160401b038211156117fe575f5ffd5b6020019150600581901b36038213156111f4575f5ffd5b601f82111561185c57805f5260205f20601f840160051c8101602085101561183a5750805b601f840160051c820191505b81811015611859575f8155600101611846565b50505b505050565b81516001600160401b0381111561187a5761187a611490565b61188e8161188884546116b9565b84611815565b6020601f8211600181146118c0575f83156118a95750848201515b5f19600385901b1c1916600184901b178455611859565b5f84815260208120601f198516915b828110156118ef57878501518255602094850194600190920191016118cf565b508482101561190c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8151808452602084019350602083015f5b8281101561194b57815186526020958601959091019060010161192d565b5093949350505050565b8581526001600160a01b038516602082015260a0604082018190525f9061197e908301866116f1565b8281036060840152845180825260208087019201905f5b818110156119b3578351835260209384019390920191600101611995565b505083810360808501526119c7818661191b565b9998505050505050505050565b60018060a01b0384168152826020820152606060408201525f6119fa60608301846112cb565b95945050505050565b5f82611a1d57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610f6a57610f6a61161e565b5f5f8354611a46816116b9565b600182168015611a5d5760018114611a7257611a9f565b60ff1983168652811515820286019350611a9f565b865f5260205f205f5b83811015611a9757815488820152600190910190602001611a7b565b505081860193505b509195945050505050565b5f82518060208501845e5f92019182525091905056fe54726565686f75736520457468657265756d205374616b696e672052617465202d20436f6e73656e737573a2646970667358221220c32fcf69924f185248b03c790a3b1e4875e5bc2faf670a541bc8fc26d630172564736f6c634300081c0033
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.