false
true
0

Contract Address Details

0xD3b9A1DCAbd16c482785Fd4265cB4580B84cdeD7

Contract Name
Tellor360
Creator
0xd93641–df4e11 at 0xfbe4bc–379723
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
13 Transactions
Transfers
0 Transfers
Gas Used
451,220
Last Balance Update
25890685
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
Tellor360




Optimization enabled
true
Compiler version
v0.8.3+commit.8d00100c




Optimization runs
300
EVM Version
istanbul




Verified at
2026-02-26T18:30:59.867462Z

Constructor Arguments

000000000000000000000000b3b662644f8d3138df63d2f43068ea621e2981f9

Arg [0] (address) : 0xb3b662644f8d3138df63d2f43068ea621e2981f9

              

tellor360/contracts/Tellor360.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

import "./BaseToken.sol";
import "./NewTransition.sol";
import "./interfaces/ITellorFlex.sol";

/**
 @author Tellor Inc.
 @title Tellor360
 @dev This is the controller contract which defines the functionality for
 * changing the oracle contract address, as well as minting and migrating tokens
*/
contract Tellor360 is BaseToken, NewTransition {
    // Events
    event NewOracleAddress(address _newOracle, uint256 _timestamp);
    event NewProposedOracleAddress(
        address _newProposedOracle,
        uint256 _timestamp
    );

    // Functions
    /**
     * @dev Constructor used to store new flex oracle address
     * @param _flexAddress is the new oracle contract which will replace the
     * tellorX oracle
     */
    constructor(address _flexAddress) {
        require(_flexAddress != address(0), "oracle address must be non-zero");
        addresses[keccak256("_ORACLE_CONTRACT_FOR_INIT")] = _flexAddress;
    }

    /**
     * @dev Use this function to initiate the contract
     */
    function init() external {
        require(uints[keccak256("_INIT")] == 0, "should only happen once");
        uints[keccak256("_INIT")] = 1;
        // retrieve new oracle address from Tellor360 contract address storage
        NewTransition _newController = NewTransition(
            addresses[_TELLOR_CONTRACT]
        );
        address _flexAddress = _newController.getAddressVars(
            keccak256("_ORACLE_CONTRACT_FOR_INIT")
        );
        //on switch over, require tellorFlex values are over 12 hours old
        //then when we switch, the governance switch can be instantaneous
        bytes32 _id = 0x83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce4992;
        uint256 _firstTimestamp = IOracle(_flexAddress)
            .getTimestampbyQueryIdandIndex(_id, 0);
        require(
            block.timestamp - _firstTimestamp >= 12 hours,
            "contract should be at least 12 hours old"
        );
        addresses[_ORACLE_CONTRACT] = _flexAddress; //used by Liquity+AMPL for this contract's reads
        //init minting uints (timestamps)
        uints[keccak256("_LAST_RELEASE_TIME_TEAM")] = block.timestamp;
        uints[keccak256("_LAST_RELEASE_TIME_DAO")] = block.timestamp - 12 weeks;
        // transfer dispute fees collected during transition period to team
        _doTransfer(
            addresses[_GOVERNANCE_CONTRACT],
            addresses[_OWNER],
            balanceOf(addresses[_GOVERNANCE_CONTRACT])
        );
    }

    /**
     * @dev Mints tokens of the sender from the old contract to the sender
     */
    function migrate() external {
        require(!migrated[msg.sender], "Already migrated");
        _doMint(
            msg.sender,
            BaseToken(addresses[_OLD_TELLOR]).balanceOf(msg.sender)
        );
        migrated[msg.sender] = true;
    }

    /**
     * @dev Use this function to withdraw released tokens to the oracle
     */
    function mintToOracle() external {
        require(uints[keccak256("_INIT")] == 1, "tellor360 not initiated");
        // X - 0.02X = 144 daily time based rewards. X = 146.94
        uint256 _releasedAmount = (146.94 ether *
            (block.timestamp - uints[keccak256("_LAST_RELEASE_TIME_DAO")])) /
            86400;
        uints[keccak256("_LAST_RELEASE_TIME_DAO")] = block.timestamp;
        uint256 _stakingRewards = (_releasedAmount * 2) / 100;
        _doMint(addresses[_ORACLE_CONTRACT], _releasedAmount - _stakingRewards);
        // Send staking rewards
        _doMint(address(this), _stakingRewards);
        _allowances[address(this)][
            addresses[_ORACLE_CONTRACT]
        ] = _stakingRewards;
        ITellorFlex(addresses[_ORACLE_CONTRACT]).addStakingRewards(
            _stakingRewards
        );
    }

    /**
     * @dev Use this function to withdraw released tokens to the team
     */
    function mintToTeam() external {
        require(uints[keccak256("_INIT")] == 1, "tellor360 not initiated");
        uint256 _releasedAmount = (146.94 ether *
            (block.timestamp - uints[keccak256("_LAST_RELEASE_TIME_TEAM")])) /
            (86400);
        uints[keccak256("_LAST_RELEASE_TIME_TEAM")] = block.timestamp;
        _doMint(addresses[_OWNER], _releasedAmount);
    }

    /**
     * @dev This function allows team to gain control of any tokens sent directly to this
     * contract (and send them back))
     */
    function transferOutOfContract() external {
        _doTransfer(address(this), addresses[_OWNER], balanceOf(address(this)));
    }

    /**
     * @dev Use this function to update the oracle contract
     */
    function updateOracleAddress() external {
        bytes32 _queryID = keccak256(
            abi.encode("TellorOracleAddress", abi.encode(bytes("")))
        );
        bytes memory _proposedOracleAddressBytes;
        (, _proposedOracleAddressBytes, ) = IOracle(addresses[_ORACLE_CONTRACT])
            .getDataBefore(_queryID, block.timestamp - 12 hours);
        address _proposedOracle = abi.decode(
            _proposedOracleAddressBytes,
            (address)
        );
        // If the oracle address being reported is the same as the proposed oracle then update the oracle contract
        // only if 7 days have passed since the new oracle address was made official
        // and if 12 hours have passed since query id 1 was first reported on the new oracle contract
        if (_proposedOracle == addresses[keccak256("_PROPOSED_ORACLE")]) {
            require(
                block.timestamp >
                    uints[keccak256("_TIME_PROPOSED_UPDATED")] + 7 days,
                "must wait 7 days after proposing new oracle"
            );
            bytes32 _id = 0x83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce4992;
            uint256 _firstTimestamp = IOracle(_proposedOracle)
                .getTimestampbyQueryIdandIndex(_id, 0);
            require(
                block.timestamp - _firstTimestamp >= 12 hours,
                "contract should be at least 12 hours old"
            );
            addresses[_ORACLE_CONTRACT] = _proposedOracle;
            emit NewOracleAddress(_proposedOracle, block.timestamp);
        }
        // Otherwise if the current reported oracle is not the proposed oracle, then propose it and
        // start the clock on the 7 days before it can be made official
        else {
            require(_isValid(_proposedOracle), "invalid oracle address");
            addresses[keccak256("_PROPOSED_ORACLE")] = _proposedOracle;
            uints[keccak256("_TIME_PROPOSED_UPDATED")] = block.timestamp;
            emit NewProposedOracleAddress(_proposedOracle, block.timestamp);
        }
    }

    /**
     * @dev Used during the upgrade process to verify valid Tellor Contracts
     */
    function verify() external pure returns (uint256) {
        return 9999;
    }

    /**Internal Functions */
    /**
     * @dev Used during the upgrade process to verify valid Tellor Contracts and ensure
     * they have the right signature
     * @param _contract is the address of the Tellor contract to verify
     * @return bool of whether or not the address is a valid Tellor contract
     */
    function _isValid(address _contract) internal returns (bool) {
        (bool _success, bytes memory _data) = address(_contract).call(
            abi.encodeWithSelector(0xfc735e99, "") // verify() signature
        );
        require(
            _success && abi.decode(_data, (uint256)) > 9000, // An arbitrary number to ensure that the contract is valid
            "New contract is invalid"
        );
        return true;
    }
}
        

/tellor3/TellorVariables.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.4;

/**
 @author Tellor Inc.
 @title TellorVariables
 @dev Helper contract to store hashes of variables
*/
contract TellorVariables {
    bytes32 constant _BLOCK_NUMBER =
        0x4b4cefd5ced7569ef0d091282b4bca9c52a034c56471a6061afd1bf307a2de7c; //keccak256("_BLOCK_NUMBER");
    bytes32 constant _CURRENT_CHALLENGE =
        0xd54702836c9d21d0727ffacc3e39f57c92b5ae0f50177e593bfb5ec66e3de280; //keccak256("_CURRENT_CHALLENGE");
    bytes32 constant _CURRENT_REQUESTID =
        0xf5126bb0ac211fbeeac2c0e89d4c02ac8cadb2da1cfb27b53c6c1f4587b48020; //keccak256("_CURRENT_REQUESTID");
    bytes32 constant _CURRENT_REWARD =
        0xd415862fd27fb74541e0f6f725b0c0d5b5fa1f22367d9b78ec6f61d97d05d5f8; //keccak256("_CURRENT_REWARD");
    bytes32 constant _CURRENT_TOTAL_TIPS =
        0x09659d32f99e50ac728058418d38174fe83a137c455ff1847e6fb8e15f78f77a; //keccak256("_CURRENT_TOTAL_TIPS");
    bytes32 constant _DEITY =
        0x5fc094d10c65bc33cc842217b2eccca0191ff24148319da094e540a559898961; //keccak256("_DEITY");
    bytes32 constant _DIFFICULTY =
        0xf758978fc1647996a3d9992f611883adc442931dc49488312360acc90601759b; //keccak256("_DIFFICULTY");
    bytes32 constant _DISPUTE_COUNT =
        0x310199159a20c50879ffb440b45802138b5b162ec9426720e9dd3ee8bbcdb9d7; //keccak256("_DISPUTE_COUNT");
    bytes32 constant _DISPUTE_FEE =
        0x675d2171f68d6f5545d54fb9b1fb61a0e6897e6188ca1cd664e7c9530d91ecfc; //keccak256("_DISPUTE_FEE");
    bytes32 constant _DISPUTE_ROUNDS =
        0x6ab2b18aafe78fd59c6a4092015bddd9fcacb8170f72b299074f74d76a91a923; //keccak256("_DISPUTE_ROUNDS");
    bytes32 constant _EXTENSION =
        0x2b2a1c876f73e67ebc4f1b08d10d54d62d62216382e0f4fd16c29155818207a4; //keccak256("_EXTENSION");
    bytes32 constant _FEE =
        0x1da95f11543c9b03927178e07951795dfc95c7501a9d1cf00e13414ca33bc409; //keccak256("_FEE");
    bytes32 constant _FORK_EXECUTED =
        0xda571dfc0b95cdc4a3835f5982cfdf36f73258bee7cb8eb797b4af8b17329875; //keccak256("_FORK_EXECUTED");
    bytes32 constant _LOCK =
        0xd051321aa26ce60d202f153d0c0e67687e975532ab88ce92d84f18e39895d907;
    bytes32 constant _MIGRATOR =
        0xc6b005d45c4c789dfe9e2895b51df4336782c5ff6bd59a5c5c9513955aa06307; //keccak256("_MIGRATOR");
    bytes32 constant _MIN_EXECUTION_DATE =
        0x46f7d53798d31923f6952572c6a19ad2d1a8238d26649c2f3493a6d69e425d28; //keccak256("_MIN_EXECUTION_DATE");
    bytes32 constant _MINER_SLOT =
        0x6de96ee4d33a0617f40a846309c8759048857f51b9d59a12d3c3786d4778883d; //keccak256("_MINER_SLOT");
    bytes32 constant _NUM_OF_VOTES =
        0x1da378694063870452ce03b189f48e04c1aa026348e74e6c86e10738514ad2c4; //keccak256("_NUM_OF_VOTES");
    bytes32 constant _OLD_TELLOR =
        0x56e0987db9eaec01ed9e0af003a0fd5c062371f9d23722eb4a3ebc74f16ea371; //keccak256("_OLD_TELLOR");
    bytes32 constant _ORIGINAL_ID =
        0xed92b4c1e0a9e559a31171d487ecbec963526662038ecfa3a71160bd62fb8733; //keccak256("_ORIGINAL_ID");
    bytes32 constant _OWNER =
        0x7a39905194de50bde334d18b76bbb36dddd11641d4d50b470cb837cf3bae5def; //keccak256("_OWNER");
    bytes32 constant _PAID =
        0x29169706298d2b6df50a532e958b56426de1465348b93650fca42d456eaec5fc; //keccak256("_PAID");
    bytes32 constant _PENDING_OWNER =
        0x7ec081f029b8ac7e2321f6ae8c6a6a517fda8fcbf63cabd63dfffaeaafa56cc0; //keccak256("_PENDING_OWNER");
    bytes32 constant _REQUEST_COUNT =
        0x3f8b5616fa9e7f2ce4a868fde15c58b92e77bc1acd6769bf1567629a3dc4c865; //keccak256("_REQUEST_COUNT");
    bytes32 constant _REQUEST_ID =
        0x9f47a2659c3d32b749ae717d975e7962959890862423c4318cf86e4ec220291f; //keccak256("_REQUEST_ID");
    bytes32 constant _REQUEST_Q_POSITION =
        0xf68d680ab3160f1aa5d9c3a1383c49e3e60bf3c0c031245cbb036f5ce99afaa1; //keccak256("_REQUEST_Q_POSITION");
    bytes32 constant _SLOT_PROGRESS =
        0xdfbec46864bc123768f0d134913175d9577a55bb71b9b2595fda21e21f36b082; //keccak256("_SLOT_PROGRESS");
    bytes32 constant _STAKE_AMOUNT =
        0x5d9fadfc729fd027e395e5157ef1b53ef9fa4a8f053043c5f159307543e7cc97; //keccak256("_STAKE_AMOUNT");
    bytes32 constant _STAKE_COUNT =
        0x10c168823622203e4057b65015ff4d95b4c650b308918e8c92dc32ab5a0a034b; //keccak256("_STAKE_COUNT");
    bytes32 constant _T_BLOCK =
        0xf3b93531fa65b3a18680d9ea49df06d96fbd883c4889dc7db866f8b131602dfb; //keccak256("_T_BLOCK");
    bytes32 constant _TALLY_DATE =
        0xf9e1ae10923bfc79f52e309baf8c7699edb821f91ef5b5bd07be29545917b3a6; //keccak256("_TALLY_DATE");
    bytes32 constant _TARGET_MINERS =
        0x0b8561044b4253c8df1d9ad9f9ce2e0f78e4bd42b2ed8dd2e909e85f750f3bc1; //keccak256("_TARGET_MINERS");
    bytes32 constant _TELLOR_CONTRACT =
        0x0f1293c916694ac6af4daa2f866f0448d0c2ce8847074a7896d397c961914a08; //keccak256("_TELLOR_CONTRACT");
    bytes32 constant _TELLOR_GETTERS =
        0xabd9bea65759494fe86471c8386762f989e1f2e778949e94efa4a9d1c4b3545a; //keccak256("_TELLOR_GETTERS");
    bytes32 constant _TIME_OF_LAST_NEW_VALUE =
        0x2c8b528fbaf48aaf13162a5a0519a7ad5a612da8ff8783465c17e076660a59f1; //keccak256("_TIME_OF_LAST_NEW_VALUE");
    bytes32 constant _TIME_TARGET =
        0xd4f87b8d0f3d3b7e665df74631f6100b2695daa0e30e40eeac02172e15a999e1; //keccak256("_TIME_TARGET");
    bytes32 constant _TIMESTAMP =
        0x2f9328a9c75282bec25bb04befad06926366736e0030c985108445fa728335e5; //keccak256("_TIMESTAMP");
    bytes32 constant _TOTAL_SUPPLY =
        0xe6148e7230ca038d456350e69a91b66968b222bfac9ebfbea6ff0a1fb7380160; //keccak256("_TOTAL_SUPPLY");
    bytes32 constant _TOTAL_TIP =
        0x1590276b7f31dd8e2a06f9a92867333eeb3eddbc91e73b9833e3e55d8e34f77d; //keccak256("_TOTAL_TIP");
    bytes32 constant _VALUE =
        0x9147231ab14efb72c38117f68521ddef8de64f092c18c69dbfb602ffc4de7f47; //keccak256("_VALUE");
    bytes32 constant _EIP_SLOT =
        0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3;
}
          

/interfaces/IGovernance.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

interface IGovernance{
    enum VoteResult {FAILED,PASSED,INVALID}
    function setApprovedFunction(bytes4 _func, bool _val) external;
    function beginDispute(bytes32 _queryId,uint256 _timestamp) external;
    function delegate(address _delegate) external;
    function delegateOfAt(address _user, uint256 _blockNumber) external view returns (address);
    function executeVote(uint256 _disputeId) external;
    function proposeVote(address _contract,bytes4 _function, bytes calldata _data, uint256 _timestamp) external;
    function tallyVotes(uint256 _disputeId) external;
    function updateMinDisputeFee() external;
    function verify() external pure returns(uint);
    function vote(uint256 _disputeId, bool _supports, bool _invalidQuery) external;
    function voteFor(address[] calldata _addys,uint256 _disputeId, bool _supports, bool _invalidQuery) external;
    function getDelegateInfo(address _holder) external view returns(address,uint);
    function isApprovedGovernanceContract(address _contract) external view returns(bool);
    function isFunctionApproved(bytes4 _func) external view returns(bool);
    function getVoteCount() external view returns(uint256);
    function getVoteRounds(bytes32 _hash) external view returns(uint256[] memory);
    function getVoteInfo(uint256 _disputeId) external view returns(bytes32,uint256[8] memory,bool[2] memory,VoteResult,bytes memory,bytes4,address[2] memory);
    function getDisputeInfo(uint256 _disputeId) external view returns(uint256,uint256,bytes memory, address);
    function getOpenDisputesOnId(uint256 _queryId) external view returns(uint256);
    function didVote(uint256 _disputeId, address _voter) external view returns(bool);
    function getVoteTallyByAddress(address _voter) external view returns (uint256);
    //testing
    function testMin(uint256 a, uint256 b) external pure returns (uint256);
}
          

/tellor3/TellorStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.4;

/**
  @author Tellor Inc.
  @title TellorStorage
  @dev Contains all the variables/structs used by Tellor
*/
contract TellorStorage {
    //Internal struct for use in proof-of-work submission
    struct Details {
        uint256 value;
        address miner;
    }
    struct Dispute {
        bytes32 hash; //unique hash of dispute: keccak256(_miner,_requestId,_timestamp)
        int256 tally; //current tally of votes for - against measure
        bool executed; //is the dispute settled
        bool disputeVotePassed; //did the vote pass?
        bool isPropFork; //true for fork proposal NEW
        address reportedMiner; //miner who submitted the 'bad value' will get disputeFee if dispute vote fails
        address reportingParty; //miner reporting the 'bad value'-pay disputeFee will get reportedMiner's stake if dispute vote passes
        address proposedForkAddress; //new fork address (if fork proposal)
        mapping(bytes32 => uint256) disputeUintVars;
        mapping(address => bool) voted; //mapping of address to whether or not they voted
    }
    struct StakeInfo {
        uint256 currentStatus; //0-not Staked, 1=Staked, 2=LockedForWithdraw 3= OnDispute 4=ReadyForUnlocking 5=Unlocked
        uint256 startDate; //stake start date
    }
    //Internal struct to allow balances to be queried by blocknumber for voting purposes
    struct Checkpoint {
        uint128 fromBlock; // fromBlock is the block number that the value was generated from
        uint128 value; // value is the amount of tokens at a specific block number
    }
    struct Request {
        uint256[] requestTimestamps; //array of all newValueTimestamps requested
        mapping(bytes32 => uint256) apiUintVars;
        mapping(uint256 => uint256) minedBlockNum; //[apiId][minedTimestamp]=>block.number
        //This the time series of finalValues stored by the contract where uint UNIX timestamp is mapped to value
        mapping(uint256 => uint256) finalValues;
        mapping(uint256 => bool) inDispute; //checks if API id is in dispute or finalized.
        mapping(uint256 => address[5]) minersByValue;
        mapping(uint256 => uint256[5]) valuesByTimestamp;
    }
    uint256[51] requestQ; //uint50 array of the top50 requests by payment amount
    uint256[] public newValueTimestamps; //array of all timestamps requested
    //This is a boolean that tells you if a given challenge has been completed by a given miner
    mapping(uint256 => uint256) requestIdByTimestamp; //minedTimestamp to apiId
    mapping(uint256 => uint256) requestIdByRequestQIndex; //link from payoutPoolIndex (position in payout pool array) to apiId
    mapping(uint256 => Dispute) public disputesById; //disputeId=> Dispute details
    mapping(bytes32 => uint256) public requestIdByQueryHash; // api bytes32 gets an id = to count of requests array
    mapping(bytes32 => uint256) public disputeIdByDisputeHash; //maps a hash to an ID for each dispute
    mapping(bytes32 => mapping(address => bool)) public minersByChallenge;
    Details[5] public currentMiners; //This struct is for organizing the five mined values to find the median
    mapping(address => StakeInfo) stakerDetails; //mapping from a persons address to their staking info
    mapping(uint256 => Request) requestDetails;
    mapping(bytes32 => uint256) public uints;
    mapping(bytes32 => address) public addresses;
    mapping(bytes32 => bytes32) public bytesVars;
    //ERC20 storage
    mapping(address => Checkpoint[]) public balances;
    mapping(address => mapping(address => uint256)) public _allowances;
    //Migration storage
    mapping(address => bool) public migrated;
}




          

/interfaces/IOracle.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

interface IOracle{
    function getReportTimestampByIndex(bytes32 _queryId, uint256 _index) external view returns(uint256);
    function getNewValueCountbyQueryId(bytes32 _queryId) external view returns(uint256);
    function getValueByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(bytes memory);
    function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(uint256);
    function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(address);
    function getReporterLastTimestamp(address _reporter) external view returns(uint256);
    function reportingLock() external view returns(uint256);
    function removeValue(bytes32 _queryId, uint256 _timestamp) external;
    function getReportsSubmittedByAddress(address _reporter) external view returns(uint256);
    function getTipsByUser(address _user) external view returns(uint256);
    function tipQuery(bytes32 _queryId, uint256 _tip, bytes memory _queryData) external;
    function submitValue(bytes32 _queryId, bytes calldata _value, uint256 _nonce, bytes memory _queryData) external;
    function burnTips() external;
    function verify() external pure returns(uint);
    function changeReportingLock(uint256 _newReportingLock) external;
    function changeTimeBasedReward(uint256 _newTimeBasedReward) external;
    function getTipsById(bytes32 _queryId) external view returns(uint256);
    function getTimestampCountById(bytes32 _queryId) external view returns(uint256);
    function getTimestampIndexByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(uint256);
    function getCurrentValue(bytes32 _queryId) external view returns(bytes memory);
    function getTimeOfLastNewValue() external view returns(uint256);
    function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index) external view returns(uint256);
    function getDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns(bool, bytes memory, uint256);
    function getTokenAddress() external view returns(address);
    function getStakeAmount() external view returns(uint256);
    function isInDispute(bytes32 _queryId, uint256 _timestamp) external view returns(bool);
    function slashReporter(address _reporter, address _recipient) external returns(uint256);
    function retrieveData(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bytes memory);
    function getStakerInfo(address _stakerAddress)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        );

    
}

          

/TellorVars.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

import "./tellor3/TellorVariables.sol";

/**
 @author Tellor Inc.
 @title TellorVariables
 @dev Helper contract to store hashes of variables.
 * For each of the bytes32 constants, the values are equal to
 * keccak256([VARIABLE NAME])
*/
contract TellorVars is TellorVariables {
    // Storage
    address constant TELLOR_ADDRESS =
        0x88dF592F8eb5D7Bd38bFeF7dEb0fBc02cf3778a0; // Address of main Tellor Contract
    // Hashes for each pertinent contract
    bytes32 constant _GOVERNANCE_CONTRACT =
        0xefa19baa864049f50491093580c5433e97e8d5e41f8db1a61108b4fa44cacd93;
    bytes32 constant _ORACLE_CONTRACT =
        0xfa522e460446113e8fd353d7fa015625a68bc0369712213a42e006346440891e;
    bytes32 constant _TREASURY_CONTRACT =
        0x1436a1a60dca0ebb2be98547e57992a0fa082eb479e7576303cbd384e934f1fa;
    bytes32 constant _SWITCH_TIME =
        0x6c0e91a96227393eb6e42b88e9a99f7c5ebd588098b549c949baf27ac9509d8f;
    bytes32 constant _MINIMUM_DISPUTE_FEE =
        0x7335d16d7e7f6cb9f532376441907fe76aa2ea267285c82892601f4755ed15f0;
}
          

/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

interface ITellorFlex {
    function addStakingRewards(uint256 _amount) external;
}
          

/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

import "./oldContracts/contracts/TellorVars.sol";
import "./oldContracts/contracts/interfaces/IOracle.sol";
import "./oldContracts/contracts/tellor3/TellorStorage.sol";

/**
 @author Tellor Inc.
 @title NewTransition
* @dev The Transition contract links to the Oracle contract and
* allows parties (like Liquity) to continue to use the master
* address to access values which use legacy query IDs (request IDs). 
*/
contract NewTransition is TellorStorage, TellorVars {
    // Functions
    //Getters
    /**
     * @dev Allows Tellor to read data from the addressVars mapping
     * @param _data is the keccak256("_VARIABLE_NAME") of the variable that is being accessed.
     * These are examples of how the variables are saved within other functions:
     * addressVars[keccak256("_OWNER")]
     * addressVars[keccak256("_TELLOR_CONTRACT")]
     * @return address of the requested variable
     */
    function getAddressVars(bytes32 _data) external view returns (address) {
        return addresses[_data];
    }

    /**
     * @dev Returns the latest value for a specific request ID.
     * @param _requestId the requestId to look up
     * @return uint256 the latest value of the request ID
     * @return bool whether or not the value was successfully retrieved
     */
    function getLastNewValueById(uint256 _requestId)
        external
        view
        returns (uint256, bool)
    {
        uint256 _count = getNewValueCountbyRequestId(_requestId);
        if (_count == 0) {
            return (0, false);
        }
        uint256 _latestTimestamp = getTimestampbyRequestIDandIndex(
            _requestId,
            _count - 1
        );
        return (retrieveData(_requestId, _latestTimestamp), true);
    }

    /**
     * @dev Function is solely for the parachute contract
     */
    function getNewCurrentVariables()
        external
        view
        returns (
            bytes32 _c,
            uint256[5] memory _r,
            uint256 _diff,
            uint256 _tip
        )
    {
        _r = [uint256(1), uint256(1), uint256(1), uint256(1), uint256(1)];
        _diff = 0;
        _tip = 0;
        _c = keccak256(
            abi.encode(
                IOracle(addresses[_ORACLE_CONTRACT]).getTimeOfLastNewValue()
            )
        );
    }

    /**
     * @dev Counts the number of values that have been submitted for the requestId.
     * @param _requestId the requestId to look up
     * @return uint256 count of the number of values received for the requestId
     */
    function getNewValueCountbyRequestId(uint256 _requestId)
        public
        view
        returns (uint256)
    {
        (bytes32 _queryId, ) = _getQueryIdAndDecimals(_requestId);
        IOracle _oracle = IOracle(addresses[_ORACLE_CONTRACT]);
        // try the new oracle first
        try _oracle.getNewValueCountbyQueryId(_queryId) returns (
            uint256 _valueCount
        ) {
            if (_valueCount == 0) {
                return 0;
            }
            // if last value is disputed, subtract 1 from the count until a non-disputed value is found
            uint256 _timestamp = _oracle.getTimestampbyQueryIdandIndex(
                _queryId,
                _valueCount - 1
            );
            while (
                _oracle.isInDispute(_queryId, _timestamp) &&
                _valueCount > 1
            ) {
                _valueCount--;
                _timestamp = _oracle.getTimestampbyQueryIdandIndex(
                    _queryId,
                    _valueCount - 1
                );
            }
            if (
                _valueCount == 1 &&
                _oracle.isInDispute(_queryId, _timestamp)
            ) {
                return 0;
            }
            return _valueCount;
        } catch {
            return
                IOracle(addresses[_ORACLE_CONTRACT]).getTimestampCountById(
                    bytes32(_requestId)
                );
        }
    }

    /**
     * @dev Gets the timestamp for the value based on its index
     * @param _requestId is the requestId to look up
     * @param _index is the value index to look up
     * @return uint256 timestamp
     */
    function getTimestampbyRequestIDandIndex(uint256 _requestId, uint256 _index)
        public
        view
        returns (uint256)
    {
        (bytes32 _queryId, ) = _getQueryIdAndDecimals(_requestId);
        try
            IOracle(addresses[_ORACLE_CONTRACT]).getTimestampbyQueryIdandIndex(
                _queryId,
                _index
            )
        returns (uint256 _val) {
            if(_requestId == 1 && _val > block.timestamp - 15 minutes) {
                ( , , _val) = IOracle(addresses[_ORACLE_CONTRACT]).getDataBefore(_queryId, block.timestamp - 15 minutes);
            }
            return _val;
        } catch {
            return
                IOracle(addresses[_ORACLE_CONTRACT]).getReportTimestampByIndex(
                    bytes32(_requestId),
                    _index
                );
        }
    }

    /**
     * @dev Getter for the variables saved under the TellorStorageStruct uints variable
     * @param _data the variable to pull from the mapping. _data = keccak256("_VARIABLE_NAME")
     * where variable_name is the variables/strings used to save the data in the mapping.
     * The variables names in the TellorVariables contract
     * @return uint256 of specified variable
     */
    function getUintVar(bytes32 _data) external view returns (uint256) {
        return uints[_data];
    }

    /**
     * @dev Getter for if the party is migrated
     * @param _addy address of party
     * @return bool if the party is migrated
     */
    function isMigrated(address _addy) external view returns (bool) {
        return migrated[_addy];
    }

    /**
     * @dev Retrieve value from oracle based on timestamp
     * @param _requestId being requested
     * @param _timestamp to retrieve data/value from
     * @return uint256 value for timestamp submitted
     */
    function retrieveData(uint256 _requestId, uint256 _timestamp)
        public
        view
        returns (uint256)
    {
        (bytes32 _queryId, uint256 _decimalsAdjustment) = _getQueryIdAndDecimals(
            _requestId
        );
        try
            IOracle(addresses[_ORACLE_CONTRACT]).getValueByTimestamp(
                bytes32(_requestId),
                _timestamp
            )
        returns (bytes memory _val) {
            return _sliceUint(_val);
        } catch {
            bytes memory _val;
            if (_requestId == 1) {
                (, _val, ) = IOracle(addresses[_ORACLE_CONTRACT])
                    .getDataBefore(_queryId, block.timestamp - 15 minutes);
            } else {
                 _val = IOracle(addresses[_ORACLE_CONTRACT])
                .retrieveData(_queryId, _timestamp);
            }
            return (_sliceUint(_val) / (10**_decimalsAdjustment));
        }
    }



    // Internal functions
    /**
     * @dev Utilized to help slice a bytes variable into a uint
     * @param _b is the bytes variable to be sliced
     * @return _number of the sliced uint256
     */
    function _sliceUint(bytes memory _b)
        internal
        pure
        returns (uint256 _number)
    {
        for (uint256 _i = 0; _i < _b.length; _i++) {
            _number = _number * 2**8;
            _number = _number + uint8(_b[_i]);
        }
    }

    function _getQueryIdAndDecimals(uint256 _requestId) internal pure returns (bytes32, uint256) {
        bytes32 _queryId;
        uint256 _decimalsAdjustment;
        if(_requestId == 1) {
            _queryId = 0x83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce4992; // SpotPrice(eth, usd)
            _decimalsAdjustment = 12;
        } else if(_requestId == 10) {
            _queryId = 0x0d12ad49193163bbbeff4e6db8294ced23ff8605359fd666799d4e25a3aa0e3a; // AmpleforthCustomSpotPrice(0x)
            _decimalsAdjustment = 0;
        } else if(_requestId == 41) {
            _queryId = 0x612ec1d9cee860bb87deb6370ed0ae43345c9302c085c1dfc4c207cbec2970d7; // AmpleforthUSPCE(0x)
            _decimalsAdjustment = 0;
        } else {
            _queryId = bytes32(_requestId);
            _decimalsAdjustment = 0;
        }
        return(_queryId, _decimalsAdjustment);
    }
}
          

/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

import "./oldContracts/contracts/TellorVars.sol";
import "./oldContracts/contracts/interfaces/IGovernance.sol";
import "./oldContracts/contracts/tellor3/TellorStorage.sol";

/**
 @author Tellor Inc.
 @title BaseToken
 @dev Contains the methods related to ERC20 transfers, allowance, and storage
*/
contract BaseToken is TellorStorage, TellorVars {
    // Events
    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _value
    ); // ERC20 Approval event
    event Transfer(address indexed _from, address indexed _to, uint256 _value); // ERC20 Transfer Event

    // Functions
    /**
     * @dev This function approves a _spender an _amount of tokens to use
     * @param _spender address receiving the allowance
     * @param _amount amount the spender is being approved for
     * @return bool true if spender approved successfully
     */
    function approve(address _spender, uint256 _amount)
        external
        returns (bool)
    {
        require(_spender != address(0), "ERC20: approve to the zero address");
        _allowances[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }

    /**
     * @notice Allows tellor team to transfer stake of disputed TellorX reporter
     * NOTE: this does not affect TellorFlex stakes, only disputes during 360 transition period
     * @param _from the staker address holding the tokens being transferred
     * @param _to the address of the recipient
     */
    function teamTransferDisputedStake(address _from, address _to) external {
        require(
            msg.sender == addresses[_OWNER],
            "only owner can transfer disputed staked"
        );
        require(
            stakerDetails[_from].currentStatus == 3,
            "_from address not disputed"
        );
        stakerDetails[_from].currentStatus = 0;
        _doTransfer(_from, _to, uints[_STAKE_AMOUNT]);
    }

    /**
     * @dev Transfers _amount tokens from message sender to _to address
     * @param _to token recipient
     * @param _amount amount of tokens to send
     * @return success whether the transfer was successful
     */
    function transfer(address _to, uint256 _amount)
        external
        returns (bool success)
    {
        _doTransfer(msg.sender, _to, _amount);
        return true;
    }

    /**
     * @notice Send _amount tokens to _to from _from on the condition it
     * is approved by _from
     * @param _from the address holding the tokens being transferred
     * @param _to the address of the recipient
     * @param _amount the amount of tokens to be transferred
     * @return success whether the transfer was successful
     */
    function transferFrom(
        address _from,
        address _to,
        uint256 _amount
    ) external returns (bool success) {
        require(
            _allowances[_from][msg.sender] >= _amount,
            "Allowance is wrong"
        );
        _allowances[_from][msg.sender] -= _amount;
        _doTransfer(_from, _to, _amount);
        return true;
    }

    // Getters
    /**
     * @dev Getter function for remaining spender balance
     * @param _user address of party with the balance
     * @param _spender address of spender of said user's balance
     * @return uint256 the remaining allowance of tokens granted to the _spender from the _user
     */
    function allowance(address _user, address _spender)
        external
        view
        returns (uint256)
    {
        return _allowances[_user][_spender];
    }

    /**
     * @dev This function returns whether or not a given user is allowed to trade a given amount
     * and removes the staked amount if they are staked in TellorX and disputed
     * @param _user address of user
     * @param _amount to check if the user can spend
     * @return bool true if they are allowed to spend the amount being checked
     */
    function allowedToTrade(address _user, uint256 _amount)
        public
        view
        returns (bool)
    {
        if (stakerDetails[_user].currentStatus == 3) {
            // Subtracts the stakeAmount from balance if the _user is staked and disputed in TellorX
            return (balanceOf(_user) - uints[_STAKE_AMOUNT] >= _amount);
        }
        return (balanceOf(_user) >= _amount); // Else, check if balance is greater than amount they want to spend
    }

    /**
     * @dev Gets the balance of a given address
     * @param _user the address whose balance to look up
     * @return uint256 the balance of the given _user address
     */
    function balanceOf(address _user) public view returns (uint256) {
        return balanceOfAt(_user, block.number);
    }

    /**
     * @dev Gets the historic balance of a given _user address at a specific _blockNumber
     * @param _user the address whose balance to look up
     * @param _blockNumber the block number at which the balance is queried
     * @return uint256 the balance of the _user address at the _blockNumber specified
     */
    function balanceOfAt(address _user, uint256 _blockNumber)
        public
        view
        returns (uint256)
    {
        TellorStorage.Checkpoint[] storage checkpoints = balances[_user];
        if (
            checkpoints.length == 0 || checkpoints[0].fromBlock > _blockNumber
        ) {
            return 0;
        } else {
            if (_blockNumber >= checkpoints[checkpoints.length - 1].fromBlock)
                return checkpoints[checkpoints.length - 1].value;
            // Binary search of the value in the array
            uint256 _min = 0;
            uint256 _max = checkpoints.length - 2;
            while (_max > _min) {
                uint256 _mid = (_max + _min + 1) / 2;
                if (checkpoints[_mid].fromBlock == _blockNumber) {
                    return checkpoints[_mid].value;
                } else if (checkpoints[_mid].fromBlock < _blockNumber) {
                    _min = _mid;
                } else {
                    _max = _mid - 1;
                }
            }
            return checkpoints[_min].value;
        }
    }

    /**
     * @dev Allows users to access the number of decimals
     */
    function decimals() external pure returns (uint8) {
        return 18;
    }

    /**
     * @dev Allows users to access the token's name
     */
    function name() external pure returns (string memory) {
        return "Tellor Tributes";
    }

    /**
     * @dev Allows users to access the token's symbol
     */
    function symbol() external pure returns (string memory) {
        return "TRB";
    }

    /**
     * @dev Getter for the total_supply of tokens
     * @return uint256 total supply
     */
    function totalSupply() external view returns (uint256) {
        return uints[_TOTAL_SUPPLY];
    }

    // Internal functions
    /**
     * @dev Helps mint new TRB
     * @param _to is the address to send minted amount to
     * @param _amount is the amount of TRB to mint and send
     */
    function _doMint(address _to, uint256 _amount) internal {
        // Ensure to address and mint amount are valid
        require(_amount != 0, "Tried to mint non-positive amount");
        require(_to != address(0), "Receiver is 0 address");
        uint128 _previousBalance = uint128(balanceOf(_to));
        uint128 _sizedAmount = uint128(_amount);
        // Update total supply and balance of _to address
        uints[_TOTAL_SUPPLY] += _amount;
        _updateBalanceAtNow(_to, _previousBalance + _sizedAmount);
        emit Transfer(address(0), _to, _amount);
    }

    /**
     * @dev Completes transfers by updating the balances at the current block number
     * and ensuring the amount does not contain tokens locked for tellorX disputes
     * @param _from address to transfer from
     * @param _to address to transfer to
     * @param _amount amount of tokens to transfer
     */
    function _doTransfer(
        address _from,
        address _to,
        uint256 _amount
    ) internal {
        if (_amount == 0) {
            return;
        }
        require(
            allowedToTrade(_from, _amount),
            "Should have sufficient balance to trade"
        );
        // Update balance of _from address
        uint128 _previousBalance = uint128(balanceOf(_from));
        uint128 _sizedAmount = uint128(_amount);
        _updateBalanceAtNow(_from, _previousBalance - _sizedAmount);
        // Update balance of _to address
        _previousBalance = uint128(balanceOf(_to));
        _updateBalanceAtNow(_to, _previousBalance + _sizedAmount);
        emit Transfer(_from, _to, _amount);
    }

    /**
     * @dev Updates balance checkpoint _amount for a given _user address at the current block number
     * @param _user is the address whose balance to update
     * @param _value is the new balance
     */
    function _updateBalanceAtNow(address _user, uint128 _value) internal {
        Checkpoint[] storage checkpoints = balances[_user];
        // Checks if no checkpoints exist, or if checkpoint block is not current block
        if (
            checkpoints.length == 0 ||
            checkpoints[checkpoints.length - 1].fromBlock != block.number
        ) {
            // If yes, push a new checkpoint into the array
            checkpoints.push(
                TellorStorage.Checkpoint({
                    fromBlock: uint128(block.number),
                    value: _value
                })
            );
        } else {
            // Else, update old checkpoint
            TellorStorage.Checkpoint storage oldCheckPoint = checkpoints[
                checkpoints.length - 1
            ];
            oldCheckPoint.value = _value;
        }
    }
}
          

Compiler Settings

{"remappings":[],"optimizer":{"runs":300,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"tellor360/contracts/Tellor360.sol":"Tellor360"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_flexAddress","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"_owner","internalType":"address","indexed":true},{"type":"address","name":"_spender","internalType":"address","indexed":true},{"type":"uint256","name":"_value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewOracleAddress","inputs":[{"type":"address","name":"_newOracle","internalType":"address","indexed":false},{"type":"uint256","name":"_timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewProposedOracleAddress","inputs":[{"type":"address","name":"_newProposedOracle","internalType":"address","indexed":false},{"type":"uint256","name":"_timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"address","name":"_to","internalType":"address","indexed":true},{"type":"uint256","name":"_value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_allowances","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"addresses","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"address","name":"_spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowedToTrade","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOfAt","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint128","name":"fromBlock","internalType":"uint128"},{"type":"uint128","name":"value","internalType":"uint128"}],"name":"balances","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"bytesVars","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"value","internalType":"uint256"},{"type":"address","name":"miner","internalType":"address"}],"name":"currentMiners","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"disputeIdByDisputeHash","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"hash","internalType":"bytes32"},{"type":"int256","name":"tally","internalType":"int256"},{"type":"bool","name":"executed","internalType":"bool"},{"type":"bool","name":"disputeVotePassed","internalType":"bool"},{"type":"bool","name":"isPropFork","internalType":"bool"},{"type":"address","name":"reportedMiner","internalType":"address"},{"type":"address","name":"reportingParty","internalType":"address"},{"type":"address","name":"proposedForkAddress","internalType":"address"}],"name":"disputesById","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getAddressVars","inputs":[{"type":"bytes32","name":"_data","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"}],"name":"getLastNewValueById","inputs":[{"type":"uint256","name":"_requestId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"_c","internalType":"bytes32"},{"type":"uint256[5]","name":"_r","internalType":"uint256[5]"},{"type":"uint256","name":"_diff","internalType":"uint256"},{"type":"uint256","name":"_tip","internalType":"uint256"}],"name":"getNewCurrentVariables","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNewValueCountbyRequestId","inputs":[{"type":"uint256","name":"_requestId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTimestampbyRequestIDandIndex","inputs":[{"type":"uint256","name":"_requestId","internalType":"uint256"},{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUintVar","inputs":[{"type":"bytes32","name":"_data","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isMigrated","inputs":[{"type":"address","name":"_addy","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"migrated","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"minersByChallenge","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintToOracle","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintToTeam","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"newValueTimestamps","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"requestIdByQueryHash","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"retrieveData","inputs":[{"type":"uint256","name":"_requestId","internalType":"uint256"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"teamTransferDisputedStake","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"address","name":"_to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOutOfContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"uints","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateOracleAddress","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"verify","inputs":[]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b50604051620033db380380620033db8339810160408190526200003491620000fd565b6001600160a01b0381166200008f5760405162461bcd60e51b815260206004820152601f60248201527f6f7261636c652061646472657373206d757374206265206e6f6e2d7a65726f00604482015260640160405180910390fd5b7fea0a9b0a3c18525c70af5be2a31da2c625de000a36ab05894debe6ed7f6cb2db60005260476020527fcadfd210de49eaaaafa2e6dbdee0b61a512a3fdd454e8b24ffb897d14919a9a880546001600160a01b0319166001600160a01b03929092169190911790556200012d565b6000602082840312156200010f578081fd5b81516001600160a01b038116811462000126578182fd5b9392505050565b61329e806200013d6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c8063612c8f7f1161013b578063a9059cbb116100b8578063db085beb1161007c578063db085beb14610649578063dd62ed3e14610702578063e1c7392a1461073b578063fa45904814610743578063fc735e991461074b5761023d565b8063a9059cbb146105bb578063b59e14d4146105ce578063b67f8cbd146105ee578063cbf1304d146105f6578063d01f4d9e146106295761023d565b806378559db9116100ff57806378559db9146105665780638fd3ab801461056e57806393fa49151461057657806395d89b4114610589578063999cf26c146105a85761023d565b8063612c8f7f146104d757806362dd1d2a146104f7578063699f200f1461051757806370a082311461054057806377fbb663146105535761023d565b8063313ce567116101c957806348b18e541161018d57806348b18e54146104275780634ba0a5ee146104555780634ee2cd7e146104785780635700242c1461048b57806358421ed2146104ab5761023d565b8063313ce567146103b25780633180f8df146103c15780634049f198146103e9578063438c0aa31461040157806346eee1c4146104145761023d565b806312b9f7661161021057806312b9f766146102ec578063133bee5e146102f457806318160ddd1461031f5780631fd223641461036f57806323b872dd1461039f5761023d565b8063024c2ddd1461024257806306fdde0314610280578063095ea7b3146102b45780630c8591b3146102d7575b600080fd5b61026d610250366004612cce565b604a60209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b60408051808201909152600f81526e54656c6c6f7220547269627574657360881b60208201525b6040516102779190612f1c565b6102c76102c2366004612d46565b610753565b6040519015158152602001610277565b6102ea6102e5366004612cce565b610820565b005b6102ea6109b2565b610307610302366004612de0565b610a1c565b6040516001600160a01b039091168152602001610277565b7fe6148e7230ca038d456350e69a91b66968b222bfac9ebfbea6ff0a1fb738016060005260466020527ffffeead1ec15181fd57b4590d95e0c076bccb59e311315e8b38f23c710aa7c3e5461026d565b61038261037d366004612de0565b610a3a565b604080519283526001600160a01b03909116602083015201610277565b6102c76103ad366004612d06565b610a65565b60405160128152602001610277565b6103d46103cf366004612de0565b610b1c565b60408051928352901515602083015201610277565b6103f1610b69565b6040516102779493929190612ed8565b61026d61040f366004612de0565b610c72565b61026d610422366004612de0565b610c93565b6102c7610435366004612df8565b603960209081526000928352604080842090915290825290205460ff1681565b6102c7610463366004612c96565b604b6020526000908152604090205460ff1681565b61026d610486366004612d46565b611067565b61026d610499366004612de0565b60376020526000908152604090205481565b6102c76104b9366004612c96565b6001600160a01b03166000908152604b602052604090205460ff1690565b61026d6104e5366004612de0565b60009081526046602052604090205490565b61026d610505366004612de0565b60486020526000908152604090205481565b610307610525366004612de0565b6047602052600090815260409020546001600160a01b031681565b61026d61054e366004612c96565b6112d2565b61026d610561366004612e6f565b6112de565b6102ea611525565b6102ea6119e3565b61026d610584366004612e6f565b611b22565b6040805180820190915260038152622a292160e91b60208201526102a7565b6102c76105b6366004612d46565b611d8a565b6102c76105c9366004612d46565b611e27565b61026d6105dc366004612de0565b60466020526000908152604090205481565b6102ea611e3d565b610609610604366004612d46565b6120a4565b604080516001600160801b03938416815292909116602083015201610277565b61026d610637366004612de0565b60386020526000908152604090205481565b6106b3610657366004612de0565b603660205260009081526040902080546001820154600283015460038401546004909401549293919260ff808316936101008404821693620100008104909216926001600160a01b036301000000909304831692918216911688565b604080519889526020890197909752941515958701959095529115156060860152151560808501526001600160a01b0390811660a085015291821660c08401521660e082015261010001610277565b61026d610710366004612cce565b6001600160a01b039182166000908152604a6020908152604080832093909416825291909152205490565b6102ea6120e7565b6102ea612492565b61270f61026d565b60006001600160a01b0383166107bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b336000818152604a602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060015b92915050565b7f7a39905194de50bde334d18b76bbb36dddd11641d4d50b470cb837cf3bae5def60005260476020527fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c3546001600160a01b031633146108d25760405162461bcd60e51b815260206004820152602760248201527f6f6e6c79206f776e65722063616e207472616e73666572206469737075746564604482015266081cdd185ad95960ca1b60648201526084016107b2565b6001600160a01b03821660009081526044602052604090205460031461093a5760405162461bcd60e51b815260206004820152601a60248201527f5f66726f6d2061646472657373206e6f7420646973707574656400000000000060448201526064016107b2565b6001600160a01b038216600090815260446020908152604082208290557f5d9fadfc729fd027e395e5157ef1b53ef9fa4a8f053043c5f159307543e7cc97909152604690527f167af83a0768d27540775cfef6d996eb63f8a61fcdfb26e654c18fb50960e3be546109ae9083908390612626565b5050565b7f7a39905194de50bde334d18b76bbb36dddd11641d4d50b470cb837cf3bae5def60005260476020527fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c354610a1a9030906001600160a01b0316610a15826112d2565b612626565b565b6000818152604760205260409020546001600160a01b03165b919050565b603a8160058110610a4a57600080fd5b6002020180546001909101549091506001600160a01b031682565b6001600160a01b0383166000908152604a60209081526040808320338452909152812054821115610acd5760405162461bcd60e51b8152602060048201526012602482015271416c6c6f77616e63652069732077726f6e6760701b60448201526064016107b2565b6001600160a01b0384166000908152604a6020908152604080832033845290915281208054849290610b00908490613172565b90915550610b119050848484612626565b5060015b9392505050565b6000806000610b2a84610c93565b905080610b3e576000809250925050610b64565b6000610b4f85610561600185613172565b9050610b5b8582611b22565b60019350935050505b915091565b6000610b73612be2565b506040805160a0810182526001808252602080830182905282840182905260608301829052608083019190915260008051602061324983398151915260009081526047825260008051602061322983398151915254845163607caea960e11b815294519394919384936001600160a01b039092169263c0f95d52926004808301939192829003018186803b158015610c0a57600080fd5b505afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c429190612e57565b604051602001610c5491815260200190565b60405160208183030381529060405280519060200120935090919293565b60338181548110610c8257600080fd5b600091825260209091200154905081565b600080610c9f83612724565b506000805160206132498339815191526000526047602052600080516020613229833981519152546040516377b03e0d60e01b8152600481018390529192506001600160a01b03169081906377b03e0d9060240160206040518083038186803b158015610d0b57600080fd5b505afa925050508015610d3b575060408051601f3d908101601f19168201909252610d3891810190612e57565b60015b610de857600080516020613249833981519152600052604760205260008051602061322983398151915254604051631af3921960e11b8152600481018690526001600160a01b03909116906335e724329060240160206040518083038186803b158015610da757600080fd5b505afa158015610dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddf9190612e57565b92505050610a35565b80610df95760009350505050610a35565b60006001600160a01b03831663ce5e11bf85610e16600186613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160206040518083038186803b158015610e5257600080fd5b505afa158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190612e57565b90505b6040516344e87f9160e01b815260048101859052602481018290526001600160a01b038416906344e87f919060440160206040518083038186803b158015610ed457600080fd5b505afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190612d71565b8015610f185750600182115b15610fc05781610f27816131b5565b9250506001600160a01b03831663ce5e11bf85610f45600186613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160206040518083038186803b158015610f8157600080fd5b505afa158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb99190612e57565b9050610e8d565b81600114801561104a57506040516344e87f9160e01b815260048101859052602481018290526001600160a01b038416906344e87f919060440160206040518083038186803b15801561101257600080fd5b505afa158015611026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104a9190612d71565b1561105c576000945050505050610a35565b509250610a35915050565b6001600160a01b0382166000908152604960205260408120805415806110c1575082816000815481106110aa57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b0316115b156110d057600091505061081a565b805481906110e090600190613172565b815481106110fe57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b0316831061116c578054819061112990600190613172565b8154811061114757634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600160801b90046001600160801b0316915061081a9050565b8054600090819061117f90600290613172565b90505b8181111561128b57600060026111988484612fdf565b6111a3906001612fdf565b6111ad9190612ff7565b9050858482815481106111d057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b031614156112335783818154811061120b57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600160801b90046001600160801b0316945061081a9350505050565b8584828154811061125457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b0316101561127757809250611285565b611282600182613172565b91505b50611182565b8282815481106112ab57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600160801b90046001600160801b0316935061081a92505050565b600061081a8243611067565b6000806112ea84612724565b5060008051602061324983398151915260005260476020526000805160206132298339815191525460405163ce5e11bf60e01b815260048101839052602481018690529192506001600160a01b03169063ce5e11bf9060440160206040518083038186803b15801561135b57600080fd5b505afa92505050801561138b575060408051601f3d908101601f1916820190925261138891810190612e57565b60015b61143e57600080516020613249833981519152600052604760205260008051602061322983398151915254604051631f0dee2d60e21b815260048101869052602481018590526001600160a01b0390911690637c37b8b49060440160206040518083038186803b1580156113fe57600080fd5b505afa158015611412573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114369190612e57565b91505061081a565b846001148015611458575061145561038442613172565b81115b1561151c576000805160206132498339815191526000526047602052600080516020613229833981519152546001600160a01b031663a792765f8361149f61038442613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160006040518083038186803b1580156114db57600080fd5b505afa1580156114ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115179190810190612d8b565b925050505b915061081a9050565b604080516020808201835260008083529251611542929101612f1c565b60408051601f198184030181529082905261155f91602001612f2f565b60408051601f1981840301815291905280516020918201206000805160206132498339815191526000526047909152600080516020613229833981519152549091506060906001600160a01b031663a792765f836115bf61a8c042613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160006040518083038186803b1580156115fb57600080fd5b505afa15801561160f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116379190810190612d8b565b508051909250600091506116549083016020908101908401612cb2565b7f71624c3affb2c57286d734e92e9314edb7f643f18b6e47505dad591e4b58bb8160005260476020527f98212c724810302abca1f5062b73b2717cefce75b6063cde5b258336e5a9e0b8549091506001600160a01b03808316911614156118c5577fdf20b34d99a246cf29e001ba51275b50b3f5ec1f38bba48142bea2d3107a438960005260466020527fc58c50ce3da014b522d4bee092d4c2929741b77e2165891710ba64cdcf1551d35461170d9062093a80612fdf565b421161176f5760405162461bcd60e51b815260206004820152602b60248201527f6d7573742077616974203720646179732061667465722070726f706f73696e6760448201526a206e6577206f7261636c6560a81b60648201526084016107b2565b60405163ce5e11bf60e01b81527f83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce49926004820181905260006024830181905290916001600160a01b0384169063ce5e11bf9060440160206040518083038186803b1580156117db57600080fd5b505afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118139190612e57565b905061a8c06118228242613172565b10156118405760405162461bcd60e51b81526004016107b290612f6c565b6000805160206132498339815191526000526047602090815260008051602061322983398151915280546001600160a01b0319166001600160a01b0386169081179091556040805191825242928201929092527f31f30a38b53d085dbe09f68f490447e9032b29de8deb5aae4ccd3577a09ff284910160405180910390a150506119de565b6118ce816127d7565b61191a5760405162461bcd60e51b815260206004820152601660248201527f696e76616c6964206f7261636c6520616464726573730000000000000000000060448201526064016107b2565b7f98212c724810302abca1f5062b73b2717cefce75b6063cde5b258336e5a9e0b880546001600160a01b0319166001600160a01b0383169081179091557fdf20b34d99a246cf29e001ba51275b50b3f5ec1f38bba48142bea2d3107a438960005260466020908152427fc58c50ce3da014b522d4bee092d4c2929741b77e2165891710ba64cdcf1551d381905560408051938452918301527f8fe6b09081e9ffdaf91e337aba6769019098771106b34b194f1781b7db1bf42b910160405180910390a15b505050565b336000908152604b602052604090205460ff1615611a365760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b5a59dc985d195960821b60448201526064016107b2565b7f56e0987db9eaec01ed9e0af003a0fd5c062371f9d23722eb4a3ebc74f16ea37160005260476020527fc930326aab6c1874fc004d856083a6ed34e057e064970b7effb48e8e6e8ca127546040516370a0823160e01b81523360048201819052611b069290916001600160a01b03909116906370a082319060240160206040518083038186803b158015611ac957600080fd5b505afa158015611add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b019190612e57565b6128f3565b336000908152604b60205260409020805460ff19166001179055565b6000806000611b3085612724565b600080516020613249833981519152600052604760205260008051602061322983398151915254604051630b2d2b0d60e01b815260048101899052602481018890529294509092506001600160a01b031690630b2d2b0d9060440160006040518083038186803b158015611ba357600080fd5b505afa925050508015611bd857506040513d6000823e601f3d908101601f19168201604052611bd59190810190612e1c565b60015b611d815760608560011415611cab576000805160206132498339815191526000526047602052600080516020613229833981519152546001600160a01b031663a792765f84611c2961038442613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160006040518083038186803b158015611c6557600080fd5b505afa158015611c79573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ca19190810190612d8b565b509150611d599050565b60008051602061324983398151915260005260476020526000805160206132298339815191525460405163c5958af960e01b815260048101859052602481018790526001600160a01b039091169063c5958af99060440160006040518083038186803b158015611d1a57600080fd5b505afa158015611d2e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d569190810190612e1c565b90505b611d6482600a61305d565b611d6d82612a67565b611d779190612ff7565b935050505061081a565b611d7781612a67565b6001600160a01b03821660009081526044602052604081205460031415611e14577f5d9fadfc729fd027e395e5157ef1b53ef9fa4a8f053043c5f159307543e7cc9760005260466020527f167af83a0768d27540775cfef6d996eb63f8a61fcdfb26e654c18fb50960e3be548290611e01856112d2565b611e0b9190613172565b1015905061081a565b81611e1e846112d2565b10159392505050565b6000611e34338484612626565b50600192915050565b7f3196379cecd16ddcc7bf893acd7d6a077e4587a3cc93ab44d27e4e9269e71e7c60005260466020527f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d2954600114611ed15760405162461bcd60e51b81526020600482015260176024820152761d195b1b1bdc8ccd8c081b9bdd081a5b9a5d1a585d1959604a1b60448201526064016107b2565b7ff9fc7fb48c7559e97d53ab4f65d985310377942095551edc1ff9acf706a45a0d600090815260466020527f5975def742d89320ce5e06d2d12f0e1aa78a8affc73e81c651ea1571a11cfaab546201518090611f2d9042613172565b611f40906807f733bf7a7fe6000061312b565b611f4a9190612ff7565b7ff9fc7fb48c7559e97d53ab4f65d985310377942095551edc1ff9acf706a45a0d60009081526046602052427f5975def742d89320ce5e06d2d12f0e1aa78a8affc73e81c651ea1571a11cfaab559091506064611fa883600261312b565b611fb29190612ff7565b600080516020613249833981519152600052604760205260008051602061322983398151915254909150611ff3906001600160a01b0316611b018385613172565b611ffd30826128f3565b306000908152604a6020908152604080832060008051602061322983398151915280546001600160a01b039081168652918452828520869055600080516020613249833981519152909452604790925291549151633671473560e21b81526004810184905291169063d9c51cd490602401600060405180830381600087803b15801561208857600080fd5b505af115801561209c573d6000803e3d6000fd5b505050505050565b604960205281600052604060002081815481106120c057600080fd5b6000918252602090912001546001600160801b038082169350600160801b90910416905082565b7f3196379cecd16ddcc7bf893acd7d6a077e4587a3cc93ab44d27e4e9269e71e7c60005260466020527f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d29541561217f5760405162461bcd60e51b815260206004820152601760248201527f73686f756c64206f6e6c792068617070656e206f6e636500000000000000000060448201526064016107b2565b60017f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d29557f0f1293c916694ac6af4daa2f866f0448d0c2ce8847074a7896d397c961914a08600090815260476020527ffe10c9a395cce5a324df121072934b83aa2f3aa5f594428b2a75cf926b73fae85460405163099df72f60e11b81527fea0a9b0a3c18525c70af5be2a31da2c625de000a36ab05894debe6ed7f6cb2db60048201526001600160a01b039091169190829063133bee5e9060240160206040518083038186803b15801561225357600080fd5b505afa158015612267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228b9190612cb2565b60405163ce5e11bf60e01b81527f83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce49926004820181905260006024830181905292935091906001600160a01b0384169063ce5e11bf9060440160206040518083038186803b1580156122fa57600080fd5b505afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190612e57565b905061a8c06123418242613172565b101561235f5760405162461bcd60e51b81526004016107b290612f6c565b60008051602061322983398151915280546001600160a01b0319166001600160a01b0385161790557f537aa8e156c05c7907e85d980d0e9e6fe192b51129d3d5944a2d9839aaf32ea06000526046602052427f2e59f080571cb6da42aff4d46de3c6a48a297c5038643f313c89546f65e4df188190556123e390626ebe0090613172565b7f5975def742d89320ce5e06d2d12f0e1aa78a8affc73e81c651ea1571a11cfaab5560476020527f7d9ee2aaccfe8f70172569ff913448023f3ddb672f2bd893709418983f3ec22d547fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c3547fefa19baa864049f50491093580c5433e97e8d5e41f8db1a61108b4fa44cacd9360005261248c916001600160a01b039081169116610a15826112d2565b50505050565b7f3196379cecd16ddcc7bf893acd7d6a077e4587a3cc93ab44d27e4e9269e71e7c60005260466020527f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d29546001146125265760405162461bcd60e51b81526020600482015260176024820152761d195b1b1bdc8ccd8c081b9bdd081a5b9a5d1a585d1959604a1b60448201526064016107b2565b7f537aa8e156c05c7907e85d980d0e9e6fe192b51129d3d5944a2d9839aaf32ea0600090815260466020527f2e59f080571cb6da42aff4d46de3c6a48a297c5038643f313c89546f65e4df185462015180906125829042613172565b612595906807f733bf7a7fe6000061312b565b61259f9190612ff7565b427f2e59f080571cb6da42aff4d46de3c6a48a297c5038643f313c89546f65e4df18557f7a39905194de50bde334d18b76bbb36dddd11641d4d50b470cb837cf3bae5def60005260476020527fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c354909150612623906001600160a01b0316826128f3565b50565b80612630576119de565b61263a8382611d8a565b6126965760405162461bcd60e51b815260206004820152602760248201527f53686f756c6420686176652073756666696369656e742062616c616e636520746044820152666f20747261646560c81b60648201526084016107b2565b60006126a1846112d2565b9050816126b7856126b2838561314a565b612ace565b6126c0846112d2565b91506126d0846126b28385612fb4565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161271591815260200190565b60405180910390a35050505050565b600080600080846001141561275e57507f83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce49929050600c6127cd565b84600a141561279257507f0d12ad49193163bbbeff4e6db8294ced23ff8605359fd666799d4e25a3aa0e3a905060006127cd565b84602914156127c657507f612ec1d9cee860bb87deb6370ed0ae43345c9302c085c1dfc4c207cbec2970d7905060006127cd565b5083905060005b9092509050915091565b6000806000836001600160a01b031663fc735e9960405160240161280690602080825260009082015260400190565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161283f9190612ebc565b6000604051808303816000865af19150503d806000811461287c576040519150601f19603f3d011682016040523d82523d6000602084013e612881565b606091505b50915091508180156128a75750612328818060200190518101906128a59190612e57565b115b610b115760405162461bcd60e51b815260206004820152601760248201527f4e657720636f6e747261637420697320696e76616c696400000000000000000060448201526064016107b2565b8061294a5760405162461bcd60e51b815260206004820152602160248201527f547269656420746f206d696e74206e6f6e2d706f73697469766520616d6f756e6044820152601d60fa1b60648201526084016107b2565b6001600160a01b0382166129a05760405162461bcd60e51b815260206004820152601560248201527f526563656976657220697320302061646472657373000000000000000000000060448201526064016107b2565b60006129ab836112d2565b7fe6148e7230ca038d456350e69a91b66968b222bfac9ebfbea6ff0a1fb7380160600090815260466020527ffffeead1ec15181fd57b4590d95e0c076bccb59e311315e8b38f23c710aa7c3e80549293508492839290612a0c908490612fdf565b90915550612a209050846126b28385612fb4565b6040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000805b8251811015612ac857612a808261010061312b565b9150828181518110612aa257634e487b7160e01b600052603260045260246000fd5b0160200151612ab49060f81c83612fdf565b915080612ac0816131cc565b915050612a6b565b50919050565b6001600160a01b038216600090815260496020526040902080541580612b375750805443908290612b0190600190613172565b81548110612b1f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b031614155b15612b8857604080518082019091526001600160801b03438116825283811660208084019182528454600181018655600086815291909120935191518316600160801b0291909216179101556119de565b80546000908290612b9b90600190613172565b81548110612bb957634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160801b03808616600160801b02911617905550505050565b6040518060a001604052806005906020820280368337509192915050565b80518015158114610a3557600080fd5b600082601f830112612c20578081fd5b815167ffffffffffffffff80821115612c3b57612c3b6131fd565b604051601f8301601f19908116603f01168101908282118183101715612c6357612c636131fd565b81604052838152866020858801011115612c7b578485fd5b612c8c846020830160208901613189565b9695505050505050565b600060208284031215612ca7578081fd5b8135610b1581613213565b600060208284031215612cc3578081fd5b8151610b1581613213565b60008060408385031215612ce0578081fd5b8235612ceb81613213565b91506020830135612cfb81613213565b809150509250929050565b600080600060608486031215612d1a578081fd5b8335612d2581613213565b92506020840135612d3581613213565b929592945050506040919091013590565b60008060408385031215612d58578182fd5b8235612d6381613213565b946020939093013593505050565b600060208284031215612d82578081fd5b610b1582612c00565b600080600060608486031215612d9f578283fd5b612da884612c00565b9250602084015167ffffffffffffffff811115612dc3578283fd5b612dcf86828701612c10565b925050604084015190509250925092565b600060208284031215612df1578081fd5b5035919050565b60008060408385031215612e0a578182fd5b823591506020830135612cfb81613213565b600060208284031215612e2d578081fd5b815167ffffffffffffffff811115612e43578182fd5b612e4f84828501612c10565b949350505050565b600060208284031215612e68578081fd5b5051919050565b60008060408385031215612e81578182fd5b50508035926020909101359150565b60008151808452612ea8816020860160208601613189565b601f01601f19169290920160200192915050565b60008251612ece818460208701613189565b9190910192915050565b848152610100810160208083018660005b6005811015612f0657815183529183019190830190600101612ee9565b5050505060c082019390935260e0015292915050565b600060208252610b156020830184612e90565b600060408252601360408301527254656c6c6f724f7261636c654164647265737360681b606083015260806020830152610b156080830184612e90565b60208082526028908201527f636f6e74726163742073686f756c64206265206174206c6561737420313220686040820152671bdd5c9cc81bdb1960c21b606082015260800190565b60006001600160801b03808316818516808303821115612fd657612fd66131e7565b01949350505050565b60008219821115612ff257612ff26131e7565b500190565b60008261301257634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116130295750613054565b81870482111561303b5761303b6131e7565b8086161561304857918102915b9490941c93800261301a565b94509492505050565b6000610b15600019848460008261307657506001610b15565b8161308357506000610b15565b816001811461309957600281146130a3576130d0565b6001915050610b15565b60ff8411156130b4576130b46131e7565b6001841b9150848211156130ca576130ca6131e7565b50610b15565b5060208310610133831016604e8410600b8410161715613103575081810a838111156130fe576130fe6131e7565b610b15565b6131108484846001613017565b808604821115613122576131226131e7565b02949350505050565b6000816000190483118215151615613145576131456131e7565b500290565b60006001600160801b038381169083168181101561316a5761316a6131e7565b039392505050565b600082821015613184576131846131e7565b500390565b60005b838110156131a457818101518382015260200161318c565b8381111561248c5750506000910152565b6000816131c4576131c46131e7565b506000190190565b60006000198214156131e0576131e06131e7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461262357600080fdfeef4ea54b5b61165ffc2ef656b4303b6e25d2ec33cc6bc62f39864cc7b0cfe7b5fa522e460446113e8fd353d7fa015625a68bc0369712213a42e006346440891ea2646970667358221220d98fe8c825e07892dba7ae2e81e777af35c2b72e405f19dd1e4d9710e0293be064736f6c63430008030033000000000000000000000000b3b662644f8d3138df63d2f43068ea621e2981f9

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c8063612c8f7f1161013b578063a9059cbb116100b8578063db085beb1161007c578063db085beb14610649578063dd62ed3e14610702578063e1c7392a1461073b578063fa45904814610743578063fc735e991461074b5761023d565b8063a9059cbb146105bb578063b59e14d4146105ce578063b67f8cbd146105ee578063cbf1304d146105f6578063d01f4d9e146106295761023d565b806378559db9116100ff57806378559db9146105665780638fd3ab801461056e57806393fa49151461057657806395d89b4114610589578063999cf26c146105a85761023d565b8063612c8f7f146104d757806362dd1d2a146104f7578063699f200f1461051757806370a082311461054057806377fbb663146105535761023d565b8063313ce567116101c957806348b18e541161018d57806348b18e54146104275780634ba0a5ee146104555780634ee2cd7e146104785780635700242c1461048b57806358421ed2146104ab5761023d565b8063313ce567146103b25780633180f8df146103c15780634049f198146103e9578063438c0aa31461040157806346eee1c4146104145761023d565b806312b9f7661161021057806312b9f766146102ec578063133bee5e146102f457806318160ddd1461031f5780631fd223641461036f57806323b872dd1461039f5761023d565b8063024c2ddd1461024257806306fdde0314610280578063095ea7b3146102b45780630c8591b3146102d7575b600080fd5b61026d610250366004612cce565b604a60209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b60408051808201909152600f81526e54656c6c6f7220547269627574657360881b60208201525b6040516102779190612f1c565b6102c76102c2366004612d46565b610753565b6040519015158152602001610277565b6102ea6102e5366004612cce565b610820565b005b6102ea6109b2565b610307610302366004612de0565b610a1c565b6040516001600160a01b039091168152602001610277565b7fe6148e7230ca038d456350e69a91b66968b222bfac9ebfbea6ff0a1fb738016060005260466020527ffffeead1ec15181fd57b4590d95e0c076bccb59e311315e8b38f23c710aa7c3e5461026d565b61038261037d366004612de0565b610a3a565b604080519283526001600160a01b03909116602083015201610277565b6102c76103ad366004612d06565b610a65565b60405160128152602001610277565b6103d46103cf366004612de0565b610b1c565b60408051928352901515602083015201610277565b6103f1610b69565b6040516102779493929190612ed8565b61026d61040f366004612de0565b610c72565b61026d610422366004612de0565b610c93565b6102c7610435366004612df8565b603960209081526000928352604080842090915290825290205460ff1681565b6102c7610463366004612c96565b604b6020526000908152604090205460ff1681565b61026d610486366004612d46565b611067565b61026d610499366004612de0565b60376020526000908152604090205481565b6102c76104b9366004612c96565b6001600160a01b03166000908152604b602052604090205460ff1690565b61026d6104e5366004612de0565b60009081526046602052604090205490565b61026d610505366004612de0565b60486020526000908152604090205481565b610307610525366004612de0565b6047602052600090815260409020546001600160a01b031681565b61026d61054e366004612c96565b6112d2565b61026d610561366004612e6f565b6112de565b6102ea611525565b6102ea6119e3565b61026d610584366004612e6f565b611b22565b6040805180820190915260038152622a292160e91b60208201526102a7565b6102c76105b6366004612d46565b611d8a565b6102c76105c9366004612d46565b611e27565b61026d6105dc366004612de0565b60466020526000908152604090205481565b6102ea611e3d565b610609610604366004612d46565b6120a4565b604080516001600160801b03938416815292909116602083015201610277565b61026d610637366004612de0565b60386020526000908152604090205481565b6106b3610657366004612de0565b603660205260009081526040902080546001820154600283015460038401546004909401549293919260ff808316936101008404821693620100008104909216926001600160a01b036301000000909304831692918216911688565b604080519889526020890197909752941515958701959095529115156060860152151560808501526001600160a01b0390811660a085015291821660c08401521660e082015261010001610277565b61026d610710366004612cce565b6001600160a01b039182166000908152604a6020908152604080832093909416825291909152205490565b6102ea6120e7565b6102ea612492565b61270f61026d565b60006001600160a01b0383166107bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b336000818152604a602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060015b92915050565b7f7a39905194de50bde334d18b76bbb36dddd11641d4d50b470cb837cf3bae5def60005260476020527fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c3546001600160a01b031633146108d25760405162461bcd60e51b815260206004820152602760248201527f6f6e6c79206f776e65722063616e207472616e73666572206469737075746564604482015266081cdd185ad95960ca1b60648201526084016107b2565b6001600160a01b03821660009081526044602052604090205460031461093a5760405162461bcd60e51b815260206004820152601a60248201527f5f66726f6d2061646472657373206e6f7420646973707574656400000000000060448201526064016107b2565b6001600160a01b038216600090815260446020908152604082208290557f5d9fadfc729fd027e395e5157ef1b53ef9fa4a8f053043c5f159307543e7cc97909152604690527f167af83a0768d27540775cfef6d996eb63f8a61fcdfb26e654c18fb50960e3be546109ae9083908390612626565b5050565b7f7a39905194de50bde334d18b76bbb36dddd11641d4d50b470cb837cf3bae5def60005260476020527fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c354610a1a9030906001600160a01b0316610a15826112d2565b612626565b565b6000818152604760205260409020546001600160a01b03165b919050565b603a8160058110610a4a57600080fd5b6002020180546001909101549091506001600160a01b031682565b6001600160a01b0383166000908152604a60209081526040808320338452909152812054821115610acd5760405162461bcd60e51b8152602060048201526012602482015271416c6c6f77616e63652069732077726f6e6760701b60448201526064016107b2565b6001600160a01b0384166000908152604a6020908152604080832033845290915281208054849290610b00908490613172565b90915550610b119050848484612626565b5060015b9392505050565b6000806000610b2a84610c93565b905080610b3e576000809250925050610b64565b6000610b4f85610561600185613172565b9050610b5b8582611b22565b60019350935050505b915091565b6000610b73612be2565b506040805160a0810182526001808252602080830182905282840182905260608301829052608083019190915260008051602061324983398151915260009081526047825260008051602061322983398151915254845163607caea960e11b815294519394919384936001600160a01b039092169263c0f95d52926004808301939192829003018186803b158015610c0a57600080fd5b505afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c429190612e57565b604051602001610c5491815260200190565b60405160208183030381529060405280519060200120935090919293565b60338181548110610c8257600080fd5b600091825260209091200154905081565b600080610c9f83612724565b506000805160206132498339815191526000526047602052600080516020613229833981519152546040516377b03e0d60e01b8152600481018390529192506001600160a01b03169081906377b03e0d9060240160206040518083038186803b158015610d0b57600080fd5b505afa925050508015610d3b575060408051601f3d908101601f19168201909252610d3891810190612e57565b60015b610de857600080516020613249833981519152600052604760205260008051602061322983398151915254604051631af3921960e11b8152600481018690526001600160a01b03909116906335e724329060240160206040518083038186803b158015610da757600080fd5b505afa158015610dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddf9190612e57565b92505050610a35565b80610df95760009350505050610a35565b60006001600160a01b03831663ce5e11bf85610e16600186613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160206040518083038186803b158015610e5257600080fd5b505afa158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190612e57565b90505b6040516344e87f9160e01b815260048101859052602481018290526001600160a01b038416906344e87f919060440160206040518083038186803b158015610ed457600080fd5b505afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190612d71565b8015610f185750600182115b15610fc05781610f27816131b5565b9250506001600160a01b03831663ce5e11bf85610f45600186613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160206040518083038186803b158015610f8157600080fd5b505afa158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb99190612e57565b9050610e8d565b81600114801561104a57506040516344e87f9160e01b815260048101859052602481018290526001600160a01b038416906344e87f919060440160206040518083038186803b15801561101257600080fd5b505afa158015611026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104a9190612d71565b1561105c576000945050505050610a35565b509250610a35915050565b6001600160a01b0382166000908152604960205260408120805415806110c1575082816000815481106110aa57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b0316115b156110d057600091505061081a565b805481906110e090600190613172565b815481106110fe57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b0316831061116c578054819061112990600190613172565b8154811061114757634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600160801b90046001600160801b0316915061081a9050565b8054600090819061117f90600290613172565b90505b8181111561128b57600060026111988484612fdf565b6111a3906001612fdf565b6111ad9190612ff7565b9050858482815481106111d057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b031614156112335783818154811061120b57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600160801b90046001600160801b0316945061081a9350505050565b8584828154811061125457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b0316101561127757809250611285565b611282600182613172565b91505b50611182565b8282815481106112ab57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600160801b90046001600160801b0316935061081a92505050565b600061081a8243611067565b6000806112ea84612724565b5060008051602061324983398151915260005260476020526000805160206132298339815191525460405163ce5e11bf60e01b815260048101839052602481018690529192506001600160a01b03169063ce5e11bf9060440160206040518083038186803b15801561135b57600080fd5b505afa92505050801561138b575060408051601f3d908101601f1916820190925261138891810190612e57565b60015b61143e57600080516020613249833981519152600052604760205260008051602061322983398151915254604051631f0dee2d60e21b815260048101869052602481018590526001600160a01b0390911690637c37b8b49060440160206040518083038186803b1580156113fe57600080fd5b505afa158015611412573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114369190612e57565b91505061081a565b846001148015611458575061145561038442613172565b81115b1561151c576000805160206132498339815191526000526047602052600080516020613229833981519152546001600160a01b031663a792765f8361149f61038442613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160006040518083038186803b1580156114db57600080fd5b505afa1580156114ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115179190810190612d8b565b925050505b915061081a9050565b604080516020808201835260008083529251611542929101612f1c565b60408051601f198184030181529082905261155f91602001612f2f565b60408051601f1981840301815291905280516020918201206000805160206132498339815191526000526047909152600080516020613229833981519152549091506060906001600160a01b031663a792765f836115bf61a8c042613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160006040518083038186803b1580156115fb57600080fd5b505afa15801561160f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116379190810190612d8b565b508051909250600091506116549083016020908101908401612cb2565b7f71624c3affb2c57286d734e92e9314edb7f643f18b6e47505dad591e4b58bb8160005260476020527f98212c724810302abca1f5062b73b2717cefce75b6063cde5b258336e5a9e0b8549091506001600160a01b03808316911614156118c5577fdf20b34d99a246cf29e001ba51275b50b3f5ec1f38bba48142bea2d3107a438960005260466020527fc58c50ce3da014b522d4bee092d4c2929741b77e2165891710ba64cdcf1551d35461170d9062093a80612fdf565b421161176f5760405162461bcd60e51b815260206004820152602b60248201527f6d7573742077616974203720646179732061667465722070726f706f73696e6760448201526a206e6577206f7261636c6560a81b60648201526084016107b2565b60405163ce5e11bf60e01b81527f83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce49926004820181905260006024830181905290916001600160a01b0384169063ce5e11bf9060440160206040518083038186803b1580156117db57600080fd5b505afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118139190612e57565b905061a8c06118228242613172565b10156118405760405162461bcd60e51b81526004016107b290612f6c565b6000805160206132498339815191526000526047602090815260008051602061322983398151915280546001600160a01b0319166001600160a01b0386169081179091556040805191825242928201929092527f31f30a38b53d085dbe09f68f490447e9032b29de8deb5aae4ccd3577a09ff284910160405180910390a150506119de565b6118ce816127d7565b61191a5760405162461bcd60e51b815260206004820152601660248201527f696e76616c6964206f7261636c6520616464726573730000000000000000000060448201526064016107b2565b7f98212c724810302abca1f5062b73b2717cefce75b6063cde5b258336e5a9e0b880546001600160a01b0319166001600160a01b0383169081179091557fdf20b34d99a246cf29e001ba51275b50b3f5ec1f38bba48142bea2d3107a438960005260466020908152427fc58c50ce3da014b522d4bee092d4c2929741b77e2165891710ba64cdcf1551d381905560408051938452918301527f8fe6b09081e9ffdaf91e337aba6769019098771106b34b194f1781b7db1bf42b910160405180910390a15b505050565b336000908152604b602052604090205460ff1615611a365760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b5a59dc985d195960821b60448201526064016107b2565b7f56e0987db9eaec01ed9e0af003a0fd5c062371f9d23722eb4a3ebc74f16ea37160005260476020527fc930326aab6c1874fc004d856083a6ed34e057e064970b7effb48e8e6e8ca127546040516370a0823160e01b81523360048201819052611b069290916001600160a01b03909116906370a082319060240160206040518083038186803b158015611ac957600080fd5b505afa158015611add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b019190612e57565b6128f3565b336000908152604b60205260409020805460ff19166001179055565b6000806000611b3085612724565b600080516020613249833981519152600052604760205260008051602061322983398151915254604051630b2d2b0d60e01b815260048101899052602481018890529294509092506001600160a01b031690630b2d2b0d9060440160006040518083038186803b158015611ba357600080fd5b505afa925050508015611bd857506040513d6000823e601f3d908101601f19168201604052611bd59190810190612e1c565b60015b611d815760608560011415611cab576000805160206132498339815191526000526047602052600080516020613229833981519152546001600160a01b031663a792765f84611c2961038442613172565b6040516001600160e01b031960e085901b1681526004810192909252602482015260440160006040518083038186803b158015611c6557600080fd5b505afa158015611c79573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ca19190810190612d8b565b509150611d599050565b60008051602061324983398151915260005260476020526000805160206132298339815191525460405163c5958af960e01b815260048101859052602481018790526001600160a01b039091169063c5958af99060440160006040518083038186803b158015611d1a57600080fd5b505afa158015611d2e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d569190810190612e1c565b90505b611d6482600a61305d565b611d6d82612a67565b611d779190612ff7565b935050505061081a565b611d7781612a67565b6001600160a01b03821660009081526044602052604081205460031415611e14577f5d9fadfc729fd027e395e5157ef1b53ef9fa4a8f053043c5f159307543e7cc9760005260466020527f167af83a0768d27540775cfef6d996eb63f8a61fcdfb26e654c18fb50960e3be548290611e01856112d2565b611e0b9190613172565b1015905061081a565b81611e1e846112d2565b10159392505050565b6000611e34338484612626565b50600192915050565b7f3196379cecd16ddcc7bf893acd7d6a077e4587a3cc93ab44d27e4e9269e71e7c60005260466020527f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d2954600114611ed15760405162461bcd60e51b81526020600482015260176024820152761d195b1b1bdc8ccd8c081b9bdd081a5b9a5d1a585d1959604a1b60448201526064016107b2565b7ff9fc7fb48c7559e97d53ab4f65d985310377942095551edc1ff9acf706a45a0d600090815260466020527f5975def742d89320ce5e06d2d12f0e1aa78a8affc73e81c651ea1571a11cfaab546201518090611f2d9042613172565b611f40906807f733bf7a7fe6000061312b565b611f4a9190612ff7565b7ff9fc7fb48c7559e97d53ab4f65d985310377942095551edc1ff9acf706a45a0d60009081526046602052427f5975def742d89320ce5e06d2d12f0e1aa78a8affc73e81c651ea1571a11cfaab559091506064611fa883600261312b565b611fb29190612ff7565b600080516020613249833981519152600052604760205260008051602061322983398151915254909150611ff3906001600160a01b0316611b018385613172565b611ffd30826128f3565b306000908152604a6020908152604080832060008051602061322983398151915280546001600160a01b039081168652918452828520869055600080516020613249833981519152909452604790925291549151633671473560e21b81526004810184905291169063d9c51cd490602401600060405180830381600087803b15801561208857600080fd5b505af115801561209c573d6000803e3d6000fd5b505050505050565b604960205281600052604060002081815481106120c057600080fd5b6000918252602090912001546001600160801b038082169350600160801b90910416905082565b7f3196379cecd16ddcc7bf893acd7d6a077e4587a3cc93ab44d27e4e9269e71e7c60005260466020527f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d29541561217f5760405162461bcd60e51b815260206004820152601760248201527f73686f756c64206f6e6c792068617070656e206f6e636500000000000000000060448201526064016107b2565b60017f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d29557f0f1293c916694ac6af4daa2f866f0448d0c2ce8847074a7896d397c961914a08600090815260476020527ffe10c9a395cce5a324df121072934b83aa2f3aa5f594428b2a75cf926b73fae85460405163099df72f60e11b81527fea0a9b0a3c18525c70af5be2a31da2c625de000a36ab05894debe6ed7f6cb2db60048201526001600160a01b039091169190829063133bee5e9060240160206040518083038186803b15801561225357600080fd5b505afa158015612267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228b9190612cb2565b60405163ce5e11bf60e01b81527f83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce49926004820181905260006024830181905292935091906001600160a01b0384169063ce5e11bf9060440160206040518083038186803b1580156122fa57600080fd5b505afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190612e57565b905061a8c06123418242613172565b101561235f5760405162461bcd60e51b81526004016107b290612f6c565b60008051602061322983398151915280546001600160a01b0319166001600160a01b0385161790557f537aa8e156c05c7907e85d980d0e9e6fe192b51129d3d5944a2d9839aaf32ea06000526046602052427f2e59f080571cb6da42aff4d46de3c6a48a297c5038643f313c89546f65e4df188190556123e390626ebe0090613172565b7f5975def742d89320ce5e06d2d12f0e1aa78a8affc73e81c651ea1571a11cfaab5560476020527f7d9ee2aaccfe8f70172569ff913448023f3ddb672f2bd893709418983f3ec22d547fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c3547fefa19baa864049f50491093580c5433e97e8d5e41f8db1a61108b4fa44cacd9360005261248c916001600160a01b039081169116610a15826112d2565b50505050565b7f3196379cecd16ddcc7bf893acd7d6a077e4587a3cc93ab44d27e4e9269e71e7c60005260466020527f939f0cb044a3b521a69fc71bfb6e3ab5ea43e579e35cbf805938fa780f789d29546001146125265760405162461bcd60e51b81526020600482015260176024820152761d195b1b1bdc8ccd8c081b9bdd081a5b9a5d1a585d1959604a1b60448201526064016107b2565b7f537aa8e156c05c7907e85d980d0e9e6fe192b51129d3d5944a2d9839aaf32ea0600090815260466020527f2e59f080571cb6da42aff4d46de3c6a48a297c5038643f313c89546f65e4df185462015180906125829042613172565b612595906807f733bf7a7fe6000061312b565b61259f9190612ff7565b427f2e59f080571cb6da42aff4d46de3c6a48a297c5038643f313c89546f65e4df18557f7a39905194de50bde334d18b76bbb36dddd11641d4d50b470cb837cf3bae5def60005260476020527fb5f7e7387e8e977cc9c4c9513388b0d7224264b9a0159cd8e8bdd84a9ed504c354909150612623906001600160a01b0316826128f3565b50565b80612630576119de565b61263a8382611d8a565b6126965760405162461bcd60e51b815260206004820152602760248201527f53686f756c6420686176652073756666696369656e742062616c616e636520746044820152666f20747261646560c81b60648201526084016107b2565b60006126a1846112d2565b9050816126b7856126b2838561314a565b612ace565b6126c0846112d2565b91506126d0846126b28385612fb4565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161271591815260200190565b60405180910390a35050505050565b600080600080846001141561275e57507f83a7f3d48786ac2667503a61e8c415438ed2922eb86a2906e4ee66d9a2ce49929050600c6127cd565b84600a141561279257507f0d12ad49193163bbbeff4e6db8294ced23ff8605359fd666799d4e25a3aa0e3a905060006127cd565b84602914156127c657507f612ec1d9cee860bb87deb6370ed0ae43345c9302c085c1dfc4c207cbec2970d7905060006127cd565b5083905060005b9092509050915091565b6000806000836001600160a01b031663fc735e9960405160240161280690602080825260009082015260400190565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161283f9190612ebc565b6000604051808303816000865af19150503d806000811461287c576040519150601f19603f3d011682016040523d82523d6000602084013e612881565b606091505b50915091508180156128a75750612328818060200190518101906128a59190612e57565b115b610b115760405162461bcd60e51b815260206004820152601760248201527f4e657720636f6e747261637420697320696e76616c696400000000000000000060448201526064016107b2565b8061294a5760405162461bcd60e51b815260206004820152602160248201527f547269656420746f206d696e74206e6f6e2d706f73697469766520616d6f756e6044820152601d60fa1b60648201526084016107b2565b6001600160a01b0382166129a05760405162461bcd60e51b815260206004820152601560248201527f526563656976657220697320302061646472657373000000000000000000000060448201526064016107b2565b60006129ab836112d2565b7fe6148e7230ca038d456350e69a91b66968b222bfac9ebfbea6ff0a1fb7380160600090815260466020527ffffeead1ec15181fd57b4590d95e0c076bccb59e311315e8b38f23c710aa7c3e80549293508492839290612a0c908490612fdf565b90915550612a209050846126b28385612fb4565b6040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000805b8251811015612ac857612a808261010061312b565b9150828181518110612aa257634e487b7160e01b600052603260045260246000fd5b0160200151612ab49060f81c83612fdf565b915080612ac0816131cc565b915050612a6b565b50919050565b6001600160a01b038216600090815260496020526040902080541580612b375750805443908290612b0190600190613172565b81548110612b1f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160801b031614155b15612b8857604080518082019091526001600160801b03438116825283811660208084019182528454600181018655600086815291909120935191518316600160801b0291909216179101556119de565b80546000908290612b9b90600190613172565b81548110612bb957634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160801b03808616600160801b02911617905550505050565b6040518060a001604052806005906020820280368337509192915050565b80518015158114610a3557600080fd5b600082601f830112612c20578081fd5b815167ffffffffffffffff80821115612c3b57612c3b6131fd565b604051601f8301601f19908116603f01168101908282118183101715612c6357612c636131fd565b81604052838152866020858801011115612c7b578485fd5b612c8c846020830160208901613189565b9695505050505050565b600060208284031215612ca7578081fd5b8135610b1581613213565b600060208284031215612cc3578081fd5b8151610b1581613213565b60008060408385031215612ce0578081fd5b8235612ceb81613213565b91506020830135612cfb81613213565b809150509250929050565b600080600060608486031215612d1a578081fd5b8335612d2581613213565b92506020840135612d3581613213565b929592945050506040919091013590565b60008060408385031215612d58578182fd5b8235612d6381613213565b946020939093013593505050565b600060208284031215612d82578081fd5b610b1582612c00565b600080600060608486031215612d9f578283fd5b612da884612c00565b9250602084015167ffffffffffffffff811115612dc3578283fd5b612dcf86828701612c10565b925050604084015190509250925092565b600060208284031215612df1578081fd5b5035919050565b60008060408385031215612e0a578182fd5b823591506020830135612cfb81613213565b600060208284031215612e2d578081fd5b815167ffffffffffffffff811115612e43578182fd5b612e4f84828501612c10565b949350505050565b600060208284031215612e68578081fd5b5051919050565b60008060408385031215612e81578182fd5b50508035926020909101359150565b60008151808452612ea8816020860160208601613189565b601f01601f19169290920160200192915050565b60008251612ece818460208701613189565b9190910192915050565b848152610100810160208083018660005b6005811015612f0657815183529183019190830190600101612ee9565b5050505060c082019390935260e0015292915050565b600060208252610b156020830184612e90565b600060408252601360408301527254656c6c6f724f7261636c654164647265737360681b606083015260806020830152610b156080830184612e90565b60208082526028908201527f636f6e74726163742073686f756c64206265206174206c6561737420313220686040820152671bdd5c9cc81bdb1960c21b606082015260800190565b60006001600160801b03808316818516808303821115612fd657612fd66131e7565b01949350505050565b60008219821115612ff257612ff26131e7565b500190565b60008261301257634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116130295750613054565b81870482111561303b5761303b6131e7565b8086161561304857918102915b9490941c93800261301a565b94509492505050565b6000610b15600019848460008261307657506001610b15565b8161308357506000610b15565b816001811461309957600281146130a3576130d0565b6001915050610b15565b60ff8411156130b4576130b46131e7565b6001841b9150848211156130ca576130ca6131e7565b50610b15565b5060208310610133831016604e8410600b8410161715613103575081810a838111156130fe576130fe6131e7565b610b15565b6131108484846001613017565b808604821115613122576131226131e7565b02949350505050565b6000816000190483118215151615613145576131456131e7565b500290565b60006001600160801b038381169083168181101561316a5761316a6131e7565b039392505050565b600082821015613184576131846131e7565b500390565b60005b838110156131a457818101518382015260200161318c565b8381111561248c5750506000910152565b6000816131c4576131c46131e7565b506000190190565b60006000198214156131e0576131e06131e7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461262357600080fdfeef4ea54b5b61165ffc2ef656b4303b6e25d2ec33cc6bc62f39864cc7b0cfe7b5fa522e460446113e8fd353d7fa015625a68bc0369712213a42e006346440891ea2646970667358221220d98fe8c825e07892dba7ae2e81e777af35c2b72e405f19dd1e4d9710e0293be064736f6c63430008030033