ETH Price: $3,135.42 (-4.25%)

Contract

0xe77Ca3837d689FbCe13f029E032ED8F9BD9B413c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Poke121814322021-04-05 19:01:331318 days ago1617649293IN
0xe77Ca383...9BD9B413c
0 ETH0.01158845162.54000067
Poke121749232021-04-04 19:00:551319 days ago1617562855IN
0xe77Ca383...9BD9B413c
0 ETH0.00734348103
Poke121685462021-04-03 19:36:051320 days ago1617478565IN
0xe77Ca383...9BD9B413c
0 ETH0.00614204217.34824083
Poke121685172021-04-03 19:30:471320 days ago1617478247IN
0xe77Ca383...9BD9B413c
0 ETH0.00653348231.2
Poke121685172021-04-03 19:30:471320 days ago1617478247IN
0xe77Ca383...9BD9B413c
0 ETH0.0111104155.83488
Poke121619652021-04-02 19:20:031321 days ago1617391203IN
0xe77Ca383...9BD9B413c
0 ETH0.01425702199.96950548
Poke121553492021-04-01 19:01:361322 days ago1617303696IN
0xe77Ca383...9BD9B413c
0 ETH0.01600658224.50894074
Poke121489152021-03-31 19:01:181323 days ago1617217278IN
0xe77Ca383...9BD9B413c
0 ETH0.01622236227.53538461
Poke121423802021-03-30 19:01:211324 days ago1617130881IN
0xe77Ca383...9BD9B413c
0 ETH0.0123342173
Poke121359152021-03-29 19:01:381325 days ago1617044498IN
0xe77Ca383...9BD9B413c
0 ETH0.01550117217.42
Poke121295062021-03-28 19:16:311326 days ago1616958991IN
0xe77Ca383...9BD9B413c
0 ETH0.01184939166.2
Poke121228732021-03-27 19:01:041327 days ago1616871664IN
0xe77Ca383...9BD9B413c
0 ETH0.00780136109.42217142
Poke121164212021-03-26 19:01:141328 days ago1616785274IN
0xe77Ca383...9BD9B413c
0 ETH0.01204694168.97090909
Poke121098562021-03-25 19:01:361329 days ago1616698896IN
0xe77Ca383...9BD9B413c
0 ETH0.01340364188.0000009
Poke121033452021-03-24 19:01:181330 days ago1616612478IN
0xe77Ca383...9BD9B413c
0 ETH0.0142592200
Poke120969042021-03-23 19:03:361331 days ago1616526216IN
0xe77Ca383...9BD9B413c
0 ETH0.01401551196.58203047
Poke120903972021-03-22 19:03:311332 days ago1616439811IN
0xe77Ca383...9BD9B413c
0 ETH0.01856432260.38386167
Poke120839282021-03-21 19:03:131333 days ago1616353393IN
0xe77Ca383...9BD9B413c
0 ETH0.01278123179.27
Poke120774602021-03-20 19:01:191334 days ago1616266879IN
0xe77Ca383...9BD9B413c
0 ETH0.01026038143.91250049
Poke120710012021-03-19 19:03:201335 days ago1616180600IN
0xe77Ca383...9BD9B413c
0 ETH0.01157847162.4
Poke120644572021-03-18 19:02:441336 days ago1616094164IN
0xe77Ca383...9BD9B413c
0 ETH0.01217859170.81743641
Poke120579492021-03-17 19:02:091337 days ago1616007729IN
0xe77Ca383...9BD9B413c
0 ETH0.02267612318.056
Poke120514312021-03-16 19:01:111338 days ago1615921271IN
0xe77Ca383...9BD9B413c
0 ETH0.01437327201.6
Poke120449432021-03-15 19:01:121339 days ago1615834872IN
0xe77Ca383...9BD9B413c
0 ETH0.01298402182.11428571
Poke120385432021-03-14 19:22:311340 days ago1615749751IN
0xe77Ca383...9BD9B413c
0 ETH0.00506365179.1875
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TwoAssetLinearizedTimeSeriesFeed

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2019-12-09
*/

pragma solidity ^0.5.2;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @return the address of the owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     * @notice Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: set-protocol-contracts/contracts/lib/TimeLockUpgradeV2.sol

/*
    Copyright 2018 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

pragma solidity 0.5.7;




/**
 * @title TimeLockUpgradeV2
 * @author Set Protocol
 *
 * The TimeLockUpgradeV2 contract contains a modifier for handling minimum time period updates
 *
 * CHANGELOG:
 * - Requires that the caller is the owner
 * - New function to allow deletion of existing timelocks
 * - Added upgradeData to UpgradeRegistered event
 */
contract TimeLockUpgradeV2 is
    Ownable
{
    using SafeMath for uint256;

    /* ============ State Variables ============ */

    // Timelock Upgrade Period in seconds
    uint256 public timeLockPeriod;

    // Mapping of maps hash of registered upgrade to its registration timestam
    mapping(bytes32 => uint256) public timeLockedUpgrades;

    /* ============ Events ============ */

    event UpgradeRegistered(
        bytes32 indexed _upgradeHash,
        uint256 _timestamp,
        bytes _upgradeData
    );

    event RemoveRegisteredUpgrade(
        bytes32 indexed _upgradeHash
    );

    /* ============ Modifiers ============ */

    modifier timeLockUpgrade() {
        require(
            isOwner(),
            "TimeLockUpgradeV2: The caller must be the owner"
        );

        // If the time lock period is 0, then allow non-timebound upgrades.
        // This is useful for initialization of the protocol and for testing.
        if (timeLockPeriod > 0) {
            // The upgrade hash is defined by the hash of the transaction call data,
            // which uniquely identifies the function as well as the passed in arguments.
            bytes32 upgradeHash = keccak256(
                abi.encodePacked(
                    msg.data
                )
            );

            uint256 registrationTime = timeLockedUpgrades[upgradeHash];

            // If the upgrade hasn't been registered, register with the current time.
            if (registrationTime == 0) {
                timeLockedUpgrades[upgradeHash] = block.timestamp;

                emit UpgradeRegistered(
                    upgradeHash,
                    block.timestamp,
                    msg.data
                );

                return;
            }

            require(
                block.timestamp >= registrationTime.add(timeLockPeriod),
                "TimeLockUpgradeV2: Time lock period must have elapsed."
            );

            // Reset the timestamp to 0
            timeLockedUpgrades[upgradeHash] = 0;

        }

        // Run the rest of the upgrades
        _;
    }

    /* ============ Function ============ */

    /**
     * Removes an existing upgrade.
     *
     * @param  _upgradeHash    Keccack256 hash that uniquely identifies function called and arguments
     */
    function removeRegisteredUpgrade(
        bytes32 _upgradeHash
    )
        external
        onlyOwner
    {
        require(
            timeLockedUpgrades[_upgradeHash] != 0,
            "TimeLockUpgradeV2.removeRegisteredUpgrade: Upgrade hash must be registered"
        );

        // Reset the timestamp to 0
        timeLockedUpgrades[_upgradeHash] = 0;

        emit RemoveRegisteredUpgrade(
            _upgradeHash
        );
    }

    /**
     * Change timeLockPeriod period. Generally called after initially settings have been set up.
     *
     * @param  _timeLockPeriod   Time in seconds that upgrades need to be evaluated before execution
     */
    function setTimeLockPeriod(
        uint256 _timeLockPeriod
    )
        external
        onlyOwner
    {
        // Only allow setting of the timeLockPeriod if the period is greater than the existing
        require(
            _timeLockPeriod > timeLockPeriod,
            "TimeLockUpgradeV2: New period must be greater than existing"
        );

        timeLockPeriod = _timeLockPeriod;
    }
}

// File: contracts/meta-oracles/lib/DataSourceLinearInterpolationLibrary.sol

/*
    Copyright 2019 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

pragma solidity 0.5.7;



/**
 * @title LinearInterpolationLibrary
 * @author Set Protocol
 *
 * Library used to determine linearly interpolated value for DataSource contracts when TimeSeriesFeed
 * is updated after interpolationThreshold has passed.
 */
library DataSourceLinearInterpolationLibrary {
    using SafeMath for uint256;

    /* ============ External ============ */

    /*
     * When the update time has surpassed the currentTime + interpolationThreshold, linearly interpolate the
     * price between the current time and price and the last updated time and price to reduce potential error. This
     * is done with the following series of equations, modified in this instance to deal unsigned integers:
     *
     * price = (currentPrice * updateInterval + previousLoggedPrice * timeFromExpectedUpdate) / timeFromLastUpdate
     *
     * Where updateTimeFraction represents the fraction of time passed between the last update and now spent in
     * the previous update window. It's worth noting that because we consider updates to occur on their update
     * timestamp we can make the assumption that the amount of time spent in the previous update window is equal
     * to the update frequency.
     *
     * By way of example, assume updateInterval of 24 hours and a interpolationThreshold of 1 hour. At time 1 the
     * update is missed by one day and when the oracle is finally called the price is 150, the price feed
     * then interpolates this price to imply a price at t1 equal to 125. Time 2 the update is 10 minutes late but
     * since it's within the interpolationThreshold the value isn't interpolated. At time 3 everything
     * falls back in line.
     *
     * +----------------------+------+-------+-------+-------+
     * |                      | 0    | 1     | 2     | 3     |
     * +----------------------+------+-------+-------+-------+
     * | Expected Update Time | 0:00 | 24:00 | 48:00 | 72:00 |
     * +----------------------+------+-------+-------+-------+
     * | Actual Update Time   | 0:00 | 48:00 | 48:10 | 72:00 |
     * +----------------------+------+-------+-------+-------+
     * | Logged Px            | 100  | 125   | 151   | 130   |
     * +----------------------+------+-------+-------+-------+
     * | Received Oracle Px   | 100  | 150   | 151   | 130   |
     * +----------------------+------+-------+-------+-------+
     * | Actual Price         | 100  | 110   | 151   | 130   |
     * +------------------------------------------------------
     *
     * @param  _currentPrice                Current price returned by oracle
     * @param  _updateInterval              Update interval of TimeSeriesFeed
     * @param  _timeFromExpectedUpdate      Time passed from expected update
     * @param  _previousLoggedDataPoint     Previously logged price from TimeSeriesFeed
     * @returns                             Interpolated price value
     */
    function interpolateDelayedPriceUpdate(
        uint256 _currentPrice,
        uint256 _updateInterval,
        uint256 _timeFromExpectedUpdate,
        uint256 _previousLoggedDataPoint
    )
        internal
        pure
        returns (uint256)
    {
        // Calculate how much time has passed from timestamp corresponding to last update
        uint256 timeFromLastUpdate = _timeFromExpectedUpdate.add(_updateInterval);

        // Linearly interpolate between last updated price (with corresponding timestamp) and current price (with
        // current timestamp) to imply price at the timestamp we are updating
        return _currentPrice.mul(_updateInterval)
            .add(_previousLoggedDataPoint.mul(_timeFromExpectedUpdate))
            .div(timeFromLastUpdate);
    }
}

// File: contracts/meta-oracles/interfaces/IOracle.sol

/*
    Copyright 2019 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

pragma solidity 0.5.7;


/**
 * @title IOracle
 * @author Set Protocol
 *
 * Interface for operating with any external Oracle that returns uint256 or
 * an adapting contract that converts oracle output to uint256
 */
interface IOracle {

    /**
     * Returns the queried data from an oracle returning uint256
     *
     * @return  Current price of asset represented in uint256
     */
    function read()
        external
        view
        returns (uint256);
}

// File: contracts/meta-oracles/lib/LinkedListLibraryV3.sol

/*
    Copyright 2019 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

pragma solidity 0.5.7;
pragma experimental "ABIEncoderV2";



/**
 * @title LinkedListLibraryV3
 * @author Set Protocol
 *
 * Library for creating and altering uni-directional circularly linked lists, optimized for sequential updating
 * Version two of this contract is a library vs. a contract.
 *
 *
 * CHANGELOG
 * - LinkedListLibraryV3's readList function does not load LinkedList into memory
 * - readListMemory is removed
 */
library LinkedListLibraryV3 {

    using SafeMath for uint256;

    /* ============ Structs ============ */

    struct LinkedList{
        uint256 dataSizeLimit;
        uint256 lastUpdatedIndex;
        uint256[] dataArray;
    }

    /*
     * Initialize LinkedList by setting limit on amount of nodes and initial value of node 0
     *
     * @param  _self                        LinkedList to operate on
     * @param  _dataSizeLimit               Max amount of nodes allowed in LinkedList
     * @param  _initialValue                Initial value of node 0 in LinkedList
     */
    function initialize(
        LinkedList storage _self,
        uint256 _dataSizeLimit,
        uint256 _initialValue
    )
        internal
    {
        // Check dataArray is empty
        require(
            _self.dataArray.length == 0,
            "LinkedListLibrary.initialize: Initialized LinkedList must be empty"
        );

        // Check that LinkedList is intialized to be greater than 0 size
        require(
            _dataSizeLimit > 0,
            "LinkedListLibrary.initialize: dataSizeLimit must be greater than 0."
        );

        // Initialize Linked list by defining upper limit of data points in the list and setting
        // initial value
        _self.dataSizeLimit = _dataSizeLimit;
        _self.dataArray.push(_initialValue);
        _self.lastUpdatedIndex = 0;
    }

    /*
     * Add new value to list by either creating new node if node limit not reached or updating
     * existing node value
     *
     * @param  _self                        LinkedList to operate on
     * @param  _addedValue                  Value to add to list
     */
    function editList(
        LinkedList storage _self,
        uint256 _addedValue
    )
        internal
    {
        // Add node if data hasn't reached size limit, otherwise update next node
        _self.dataArray.length < _self.dataSizeLimit ? addNode(_self, _addedValue)
            : updateNode(_self, _addedValue);
    }

    /*
     * Add new value to list by either creating new node. Node limit must not be reached.
     *
     * @param  _self                        LinkedList to operate on
     * @param  _addedValue                  Value to add to list
     */
    function addNode(
        LinkedList storage _self,
        uint256 _addedValue
    )
        internal
    {
        uint256 newNodeIndex = _self.lastUpdatedIndex.add(1);

        require(
            newNodeIndex == _self.dataArray.length,
            "LinkedListLibrary: Node must be added at next expected index in list"
        );

        require(
            newNodeIndex < _self.dataSizeLimit,
            "LinkedListLibrary: Attempting to add node that exceeds data size limit"
        );

        // Add node value
        _self.dataArray.push(_addedValue);

        // Update lastUpdatedIndex value
        _self.lastUpdatedIndex = newNodeIndex;
    }

    /*
     * Add new value to list by updating existing node. Updates only happen if node limit has been
     * reached.
     *
     * @param  _self                        LinkedList to operate on
     * @param  _addedValue                  Value to add to list
     */
    function updateNode(
        LinkedList storage _self,
        uint256 _addedValue
    )
        internal
    {
        // Determine the next node in list to be updated
        uint256 updateNodeIndex = _self.lastUpdatedIndex.add(1) % _self.dataSizeLimit;

        // Require that updated node has been previously added
        require(
            updateNodeIndex < _self.dataArray.length,
            "LinkedListLibrary: Attempting to update non-existent node"
        );

        // Update node value and last updated index
        _self.dataArray[updateNodeIndex] = _addedValue;
        _self.lastUpdatedIndex = updateNodeIndex;
    }

    /*
     * Read list from the lastUpdatedIndex back the passed amount of data points.
     *
     * @param  _self                        LinkedList to operate on
     * @param  _dataPoints                  Number of data points to return
     * @return                              Array of length dataPoints containing most recent values
     */
    function readList(
        LinkedList storage _self,
        uint256 _dataPoints
    )
        internal
        view
        returns (uint256[] memory)
    {
        // Make sure query isn't for more data than collected
        require(
            _dataPoints <= _self.dataArray.length,
            "LinkedListLibrary: Querying more data than available"
        );

        // Instantiate output array in memory
        uint256[] memory outputArray = new uint256[](_dataPoints);

        // Find head of list
        uint256 linkedListIndex = _self.lastUpdatedIndex;
        for (uint256 i = 0; i < _dataPoints; i++) {
            // Get value at index in linkedList
            outputArray[i] = _self.dataArray[linkedListIndex];

            // Find next linked index
            linkedListIndex = linkedListIndex == 0 ? _self.dataSizeLimit.sub(1) : linkedListIndex.sub(1);
        }

        return outputArray;
    }

    /*
     * Get latest value from LinkedList.
     *
     * @param  _self                        LinkedList to operate on
     * @return                              Latest logged value in LinkedList
     */
    function getLatestValue(
        LinkedList storage _self
    )
        internal
        view
        returns (uint256)
    {
        return _self.dataArray[_self.lastUpdatedIndex];
    }
}

// File: openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.2;

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter);
    }
}

// File: contracts/meta-oracles/lib/TimeSeriesFeedV2.sol

/*
    Copyright 2019 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

pragma solidity 0.5.7;





/**
 * @title TimeSeriesFeedV2
 * @author Set Protocol
 *
 * Contract used to track time-series data. This is meant to be inherited, as the calculateNextValue
 * function is unimplemented. New data is appended by calling the poke function, which retrieves the
 * latest value using the calculateNextValue function.
 *
 * CHANGELOG
 * - Built to be inherited by contract that implements new calculateNextValue function
 * - Uses LinkedListLibraryV3
 * - nextEarliestUpdate is passed into constructor
 */
contract TimeSeriesFeedV2 is
    ReentrancyGuard
{
    using SafeMath for uint256;
    using LinkedListLibraryV3 for LinkedListLibraryV3.LinkedList;

    /* ============ State Variables ============ */
    uint256 public updateInterval;
    uint256 public maxDataPoints;
    // Unix Timestamp in seconds of next earliest update time
    uint256 public nextEarliestUpdate;

    LinkedListLibraryV3.LinkedList internal timeSeriesData;

    /* ============ Constructor ============ */

    /*
     * Stores time-series values in a LinkedList and updated using data from a specific data source.
     * Updates must be triggered off chain to be stored in this smart contract.
     *
     * @param  _updateInterval            Cadence at which data is optimally logged. Optimal schedule is based
                                          off deployment timestamp. A certain data point can't be logged before
                                          it's expected timestamp but can be logged after
     * @param  _nextEarliestUpdate        Time the first on-chain price update becomes available
     * @param  _maxDataPoints             The maximum amount of data points the linkedList will hold
     * @param  _seededValues              Array of previous timeseries values to seed initial values in list.
     *                                    The last value should contain the most current piece of data
     */
    constructor(
        uint256 _updateInterval,
        uint256 _nextEarliestUpdate,
        uint256 _maxDataPoints,
        uint256[] memory _seededValues
    )
        public
    {

        // Check that nextEarliestUpdate is greater than current block timestamp
        require(
            _nextEarliestUpdate > block.timestamp,
            "TimeSeriesFeed.constructor: nextEarliestUpdate must be greater than current timestamp."
        );

        // Check that at least one seeded value is passed in
        require(
            _seededValues.length > 0,
            "TimeSeriesFeed.constructor: Must include at least one seeded value."
        );

        // Check that maxDataPoints greater than 0
        require(
            _maxDataPoints > 0,
            "TimeSeriesFeed.constructor: Max data points must be greater than 0."
        );

        // Check that updateInterval greater than 0
        require(
            _updateInterval > 0,
            "TimeSeriesFeed.constructor: Update interval must be greater than 0."
        );

        // Set updateInterval and maxDataPoints
        updateInterval = _updateInterval;
        maxDataPoints = _maxDataPoints;

        // Define upper data size limit for linked list and input initial value
        timeSeriesData.initialize(_maxDataPoints, _seededValues[0]);

        // Cycle through input values array (skipping first value used to initialize LinkedList)
        // and add to timeSeriesData
        for (uint256 i = 1; i < _seededValues.length; i++) {
            timeSeriesData.editList(_seededValues[i]);
        }

        // Set nextEarliestUpdate
        nextEarliestUpdate = _nextEarliestUpdate;
    }

    /* ============ External ============ */

    /*
     * Updates linked list with newest data point by calling the implemented calculateNextValue function
     */
    function poke()
        external
        nonReentrant
    {
        // Make sure block timestamp exceeds nextEarliestUpdate
        require(
            block.timestamp >= nextEarliestUpdate,
            "TimeSeriesFeed.poke: Not enough time elapsed since last update"
        );

        // Get the most current data point
        uint256 newValue = calculateNextValue();

        // Update the nextEarliestUpdate to previous nextEarliestUpdate plus updateInterval
        nextEarliestUpdate = nextEarliestUpdate.add(updateInterval);

        // Update linkedList with new price
        timeSeriesData.editList(newValue);
    }

    /*
     * Query linked list for specified days of data. Will revert if number of days
     * passed exceeds amount of days collected. Will revert if not enough days of
     * data logged.
     *
     * @param  _numDataPoints  Number of datapoints to query
     * @returns                Array of datapoints of length _numDataPoints from most recent to oldest
     */
    function read(
        uint256 _numDataPoints
    )
        external
        view
        returns (uint256[] memory)
    {
        return timeSeriesData.readList(_numDataPoints);
    }


    /* ============ Internal ============ */

    function calculateNextValue()
        internal
        returns (uint256);

}

// File: contracts/meta-oracles/feeds/TwoAssetLinearizedTimeSeriesFeed.sol

/*
    Copyright 2019 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

pragma solidity 0.5.7;








/**
 * @title TwoAssetLinearizedTimeSeriesFeed
 * @author Set Protocol
 *
 * This TimeSeriesFeed calculates the ratio of base to quote asset and stores it using the
 * inherited TimeSeriesFeedV2 contract. On calculation, if the interpolationThreshold
 * is reached, then it returns a linearly interpolated value.
 */
contract TwoAssetLinearizedTimeSeriesFeed is
    TimeSeriesFeedV2,
    TimeLockUpgradeV2
{
    using SafeMath for uint256;
    using LinkedListLibraryV3 for LinkedListLibraryV3.LinkedList;

    /* ============ State Variables ============ */

    // Amount of time after which read interpolates price result, in seconds
    uint256 public interpolationThreshold;
    string public dataDescription;
    IOracle public baseOracleInstance;
    IOracle public quoteOracleInstance;


    /* ============ Events ============ */

    event LogOracleUpdated(
        address indexed newOracleAddress
    );

    /* ============ Constructor ============ */

    /*
     * Set interpolationThreshold, data description, quote oracle and base oracle and instantiate oracle
     *
     * @param  _updateInterval            Cadence at which data is optimally logged. Optimal schedule is based
                                          off deployment timestamp. A certain data point can't be logged before
                                          it's expected timestamp but can be logged after (for TimeSeriesFeed)
     * @param  _nextEarliestUpdate        Time the first on-chain price update becomes available (for TimeSeriesFeed)
     * @param  _maxDataPoints             The maximum amount of data points the linkedList will hold (for TimeSeriesFeed)
     * @param  _seededValues              Array of previous timeseries values to seed initial values in list.
     *                                    The last value should contain the most current piece of data (for TimeSeriesFeed)
     * @param  _interpolationThreshold    The minimum time in seconds where interpolation is enabled
     * @param  _baseOracleAddress         The address of the base oracle to read current data from
     * @param  _quoteOracleAddress        The address of the quote oracle to read current data from
     * @param  _dataDescription           Description of contract for Etherscan / other applications
     */
    constructor(
        uint256 _updateInterval,
        uint256 _nextEarliestUpdate,
        uint256 _maxDataPoints,
        uint256[] memory _seededValues,
        uint256 _interpolationThreshold,
        IOracle _baseOracleAddress,
        IOracle _quoteOracleAddress,
        string memory _dataDescription
    )
        public
        TimeSeriesFeedV2(
            _updateInterval,
            _nextEarliestUpdate,
            _maxDataPoints,
            _seededValues
        )
    {
        interpolationThreshold = _interpolationThreshold;
        baseOracleInstance = _baseOracleAddress;
        quoteOracleInstance = _quoteOracleAddress;
        dataDescription = _dataDescription;
    }

    /* ============ External ============ */

    /*
     * Change base asset oracle in case current one fails or is deprecated. Only contract
     * owner is allowed to change.
     *
     * @param  _newBaseOracleAddress       Address of new oracle to pull data from
     */
    function changeBaseOracle(
        IOracle _newBaseOracleAddress
    )
        external
        timeLockUpgrade
    {
        // Check to make sure new base oracle address is passed
        require(
            address(_newBaseOracleAddress) != address(baseOracleInstance),
            "TwoAssetLinearizedTimeSeriesFeed.changeBaseOracle: Must give new base oracle address."
        );

        baseOracleInstance = _newBaseOracleAddress;

        emit LogOracleUpdated(address(_newBaseOracleAddress));
    }

    /*
     * Change quote asset oracle in case current one fails or is deprecated. Only contract
     * owner is allowed to change.
     *
     * @param  _newQuoteOracleAddress       Address of new oracle to pull data from
     */
    function changeQuoteOracle(
        IOracle _newQuoteOracleAddress
    )
        external
        timeLockUpgrade
    {
        // Check to make sure new quote oracle address is passed
        require(
            address(_newQuoteOracleAddress) != address(quoteOracleInstance),
            "TwoAssetLinearizedTimeSeriesFeed.changeQuoteOracle: Must give new quote oracle address."
        );

        quoteOracleInstance = _newQuoteOracleAddress;

        emit LogOracleUpdated(address(_newQuoteOracleAddress));
    }

    /* ============ Internal ============ */

    /*
     * Returns the data from the oracle contract. If the current timestamp has surpassed
     * the interpolationThreshold, then the current price is retrieved and interpolated based on
     * the previous value and the time that has elapsed since the intended update value.
     *
     * Returns with newest data point by querying oracle. Is eligible to be
     * called after nextAvailableUpdate timestamp has passed. Because the nextAvailableUpdate occurs
     * on a predetermined cadence based on the time of deployment, delays in calling poke do not propogate
     * throughout the whole dataset and the drift caused by previous poke transactions not being mined
     * exactly on nextAvailableUpdate do not compound as they would if it was required that poke is called
     * an updateInterval amount of time after the last poke.
     *
     * @returns                         Returns the datapoint from the oracle contract
     */
    function calculateNextValue()
        internal
        returns (uint256)
    {
        // Get current base oracle value
        uint256 baseOracleValue = baseOracleInstance.read();

        // Get current quote oracle value
        uint256 quoteOracleValue = quoteOracleInstance.read();

        // Calculate the current base / quote asset ratio with 10 ** 18 precision
        uint256 currentRatioValue = baseOracleValue.mul(10 ** 18).div(quoteOracleValue);

        // Calculate how much time has passed from last expected update
        uint256 timeFromExpectedUpdate = block.timestamp.sub(nextEarliestUpdate);

        // If block timeFromExpectedUpdate is greater than interpolationThreshold we linearize
        // the current price to try to reduce error
        if (timeFromExpectedUpdate < interpolationThreshold) {
            return currentRatioValue;
        } else {
            // Get the previous value
            uint256 previousRatioValue = timeSeriesData.getLatestValue();

            return DataSourceLinearInterpolationLibrary.interpolateDelayedPriceUpdate(
                currentRatioValue,
                updateInterval,
                timeFromExpectedUpdate,
                previousRatioValue
            );
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"timeLockedUpgrades","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"poke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newBaseOracleAddress","type":"address"}],"name":"changeBaseOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"interpolationThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseOracleInstance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dataDescription","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newQuoteOracleAddress","type":"address"}],"name":"changeQuoteOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nextEarliestUpdate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"timeLockPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"quoteOracleInstance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_timeLockPeriod","type":"uint256"}],"name":"setTimeLockPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_upgradeHash","type":"bytes32"}],"name":"removeRegisteredUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxDataPoints","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_numDataPoints","type":"uint256"}],"name":"read","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"updateInterval","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_updateInterval","type":"uint256"},{"name":"_nextEarliestUpdate","type":"uint256"},{"name":"_maxDataPoints","type":"uint256"},{"name":"_seededValues","type":"uint256[]"},{"name":"_interpolationThreshold","type":"uint256"},{"name":"_baseOracleAddress","type":"address"},{"name":"_quoteOracleAddress","type":"address"},{"name":"_dataDescription","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newOracleAddress","type":"address"}],"name":"LogOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_upgradeHash","type":"bytes32"},{"indexed":false,"name":"_timestamp","type":"uint256"},{"indexed":false,"name":"_upgradeData","type":"bytes"}],"name":"UpgradeRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_upgradeHash","type":"bytes32"}],"name":"RemoveRegisteredUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040523480156200001157600080fd5b50604051620025163803806200251683398101806040526200003791908101906200067c565b60016000558787878742831162000085576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000c56565b60405180910390fd5b6000815111620000c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000bfc565b6000821162000100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000c20565b600084116200013d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000c44565b83600181905550816002819055506200018682826000815181106200015e57fe5b602002602001015160046200028064010000000002620015b717909291906401000000009004565b60015b8151811015620001d457620001cb828281518110620001a457fe5b60200260200101516004620003216401000000000262000a0b179091906401000000009004565b60010162000189565b5050506003555060078054600160a060020a031916331790819055604051600160a060020a0391909116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600a849055600c8054600160a060020a03808616600160a060020a031992831617909255600d80549285169290911691909117905580516200027190600b906020840190620004dc565b50505050505050505062000d5e565b600283015415620002bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000be4565b60008211620002fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000c32565b9082556002820180546001818101835560009283526020832090910192909255910155565b8154600283015410620003495762000343828264010000000062000362810204565b6200035e565b6200035e8282640100000000620003fe810204565b5050565b815460018084015460009291620003889190640100000000620009f2620004c282021704565b816200039057fe5b600285015491900691508110620003d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000c68565b81836002018281548110620003e657fe5b60009182526020909120015560019092019190915550565b600182810154600091620004219190640100000000620009f2620004c282021704565b6002840154909150811462000464576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000c7a565b82548110620004a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007c9062000c0e565b60028301805460018181018355600092835260209092200192909255910155565b600082820183811015620004d557600080fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200051f57805160ff19168380011785556200054f565b828001600101855582156200054f579182015b828111156200054f57825182559160200191906001019062000532565b506200055d92915062000561565b5090565b6200057e91905b808211156200055d576000815560010162000568565b90565b600082601f8301126200059357600080fd5b8151620005aa620005a48262000cb3565b62000c8c565b91508181835260208401935060208101905083856020840282011115620005d057600080fd5b60005b83811015620006005781620005e988826200066e565b8452506020928301929190910190600101620005d3565b5050505092915050565b6000620004d5825162000d12565b600082601f8301126200062a57600080fd5b81516200063b620005a48262000cd4565b915080825260208301602083018583830111156200065857600080fd5b6200066583828462000d2b565b50505092915050565b6000620004d582516200057e565b600080600080600080600080610100898b0312156200069a57600080fd5b6000620006a88b8b6200066e565b9850506020620006bb8b828c016200066e565b9750506040620006ce8b828c016200066e565b96505060608901516001604060020a03811115620006eb57600080fd5b620006f98b828c0162000581565b95505060806200070c8b828c016200066e565b94505060a06200071f8b828c016200060a565b93505060c0620007328b828c016200060a565b92505060e08901516001604060020a038111156200074f57600080fd5b6200075d8b828c0162000618565b9150509295985092959890939650565b60006200077c60428362000cfc565b7f4c696e6b65644c6973744c6962726172792e696e697469616c697a653a20496e81527f697469616c697a6564204c696e6b65644c697374206d75737420626520656d7060208201527f7479000000000000000000000000000000000000000000000000000000000000604082015260600192915050565b60006200080360438362000cfc565b7f54696d65536572696573466565642e636f6e7374727563746f723a204d75737481527f20696e636c756465206174206c65617374206f6e65207365656465642076616c60208201527f75652e0000000000000000000000000000000000000000000000000000000000604082015260600192915050565b60006200088a60468362000cfc565b600080516020620024f683398151915281527f20616464206e6f64652074686174206578636565647320646174612073697a6560208201527f206c696d69740000000000000000000000000000000000000000000000000000604082015260600192915050565b60006200090060438362000cfc565b7f54696d65536572696573466565642e636f6e7374727563746f723a204d61782081527f6461746120706f696e7473206d7573742062652067726561746572207468616e60208201527f20302e0000000000000000000000000000000000000000000000000000000000604082015260600192915050565b60006200098760438362000cfc565b7f4c696e6b65644c6973744c6962726172792e696e697469616c697a653a20646181527f746153697a654c696d6974206d7573742062652067726561746572207468616e60208201527f20302e0000000000000000000000000000000000000000000000000000000000604082015260600192915050565b600062000a0e60438362000cfc565b7f54696d65536572696573466565642e636f6e7374727563746f723a205570646181527f746520696e74657276616c206d7573742062652067726561746572207468616e60208201527f20302e0000000000000000000000000000000000000000000000000000000000604082015260600192915050565b600062000a9560568362000cfc565b7f54696d65536572696573466565642e636f6e7374727563746f723a206e65787481527f4561726c69657374557064617465206d7573742062652067726561746572207460208201527f68616e2063757272656e742074696d657374616d702e00000000000000000000604082015260600192915050565b600062000b1c60398362000cfc565b600080516020620024f683398151915281527f20757064617465206e6f6e2d6578697374656e74206e6f646500000000000000602082015260400192915050565b600062000b6c60448362000cfc565b7f4c696e6b65644c6973744c6962726172793a204e6f6465206d7573742062652081527f6164646564206174206e65787420657870656374656420696e64657820696e2060208201527f6c69737400000000000000000000000000000000000000000000000000000000604082015260600192915050565b6020808252810162000bf6816200076d565b92915050565b6020808252810162000bf681620007f4565b6020808252810162000bf6816200087b565b6020808252810162000bf681620008f1565b6020808252810162000bf68162000978565b6020808252810162000bf681620009ff565b6020808252810162000bf68162000a86565b6020808252810162000bf68162000b0d565b6020808252810162000bf68162000b5d565b6040518181016001604060020a038111828210171562000cab57600080fd5b604052919050565b60006001604060020a0382111562000cca57600080fd5b5060209081020190565b60006001604060020a0382111562000ceb57600080fd5b506020601f91909101601f19160190565b90815260200190565b600062000bf68262000d1f565b600062000bf68262000d05565b600160a060020a031690565b60005b8381101562000d4857818101518382015260200162000d2e565b8381111562000d58576000848401525b50505050565b6117888062000d6e6000396000f3fe608060405234801561001057600080fd5b50600436106101255760003560e060020a9004806378446bc1116100b1578063cc75c9b011610075578063cc75c9b014610212578063d6a4c06e14610225578063ed2e5a971461022d578063f2fde38b1461024d578063fd2c80ae1461026057610125565b806378446bc1146101c55780638a981966146101cd5780638da5cb5b146101d55780638f32d59b146101ea5780639303b16f146101ff57610125565b806355d23465116100f857806355d234651461017857806358d656291461018d578063610613d6146101a257806370716971146101b5578063715018a6146101bd57610125565b80631766486d1461012a578063181783581461015357806336e1a0761461015d578063445d6def14610170575b600080fd5b61013d610138366004610db8565b610268565b60405161014a91906114fa565b60405180910390f35b61015b61027a565b005b61015b61016b366004610dd6565b6102fc565b61013d610493565b610180610499565b60405161014a919061142b565b6101956104a8565b60405161014a9190611439565b61015b6101b0366004610dd6565b610536565b61013d6106be565b61015b6106c4565b61013d61072c565b610180610732565b6101dd610741565b60405161014a91906113fe565b6101f2610751565b60405161014a919061141d565b61015b61020d366004610db8565b610762565b61015b610220366004610db8565b61079c565b61013d610816565b61024061023b366004610db8565b61081c565b60405161014a919061140c565b61015b61025b366004610d92565b610835565b61013d61084f565b60096020526000908152604090205481565b60008054600101908190556003544210156102b35760405160e560020a62461bcd0281526004016102aa9061146a565b60405180910390fd5b60006102bd610855565b90506102d66001546003546109f290919063ffffffff16565b6003556102ea60048263ffffffff610a0b16565b5060005481146102f957600080fd5b50565b610304610751565b6103235760405160e560020a62461bcd0281526004016102aa906114ba565b6008541561040b57600080366040516020016103409291906113f1565b60408051601f19818403018152918152815160209283012060008181526009909352912054909150806103c4576000828152600960205260408082204290819055905184927fe44f46be6285c6d0bb89d91e4b554c2fd26cf7c68fc1379279b8e97a2d712b6a926103b5929091903690611508565b60405180910390a250506102f9565b6008546103d890829063ffffffff6109f216565b4210156103fa5760405160e560020a62461bcd0281526004016102aa9061149a565b506000908152600960205260408120555b600c54600160a060020a038281169116141561043c5760405160e560020a62461bcd0281526004016102aa906114aa565b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517f774f106b53df9aeb99ae8deb7a53fc985d6f1ee93f98275b04b02d01b549a7d990600090a250565b600a5481565b600c54600160a060020a031681565b600b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561052e5780601f106105035761010080835404028352916020019161052e565b820191906000526020600020905b81548152906001019060200180831161051157829003601f168201915b505050505081565b61053e610751565b61055d5760405160e560020a62461bcd0281526004016102aa906114ba565b60085415610636576000803660405160200161057a9291906113f1565b60408051601f19818403018152918152815160209283012060008181526009909352912054909150806105ef576000828152600960205260408082204290819055905184927fe44f46be6285c6d0bb89d91e4b554c2fd26cf7c68fc1379279b8e97a2d712b6a926103b5929091903690611508565b60085461060390829063ffffffff6109f216565b4210156106255760405160e560020a62461bcd0281526004016102aa9061149a565b506000908152600960205260408120555b600d54600160a060020a03828116911614156106675760405160e560020a62461bcd0281526004016102aa9061144a565b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517f774f106b53df9aeb99ae8deb7a53fc985d6f1ee93f98275b04b02d01b549a7d990600090a250565b60035481565b6106cc610751565b6106d557600080fd5b600754604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36007805473ffffffffffffffffffffffffffffffffffffffff19169055565b60085481565b600d54600160a060020a031681565b600754600160a060020a03165b90565b600754600160a060020a0316331490565b61076a610751565b61077357600080fd5b60085481116107975760405160e560020a62461bcd0281526004016102aa9061147a565b600855565b6107a4610751565b6107ad57600080fd5b6000818152600960205260409020546107db5760405160e560020a62461bcd0281526004016102aa9061148a565b6000818152600960205260408082208290555182917f068cc8f97648f23db94d0e1a707a54447d07effeb11c1c297168aa67321dc4ec91a250565b60025481565b606061082f60048363ffffffff610a3416565b92915050565b61083d610751565b61084657600080fd5b6102f981610b12565b60015481565b600080600c60009054906101000a9004600160a060020a0316600160a060020a03166357de26a46040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156108a957600080fd5b505afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108e19190810190610df4565b90506000600d60009054906101000a9004600160a060020a0316600160a060020a03166357de26a46040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061096e9190810190610df4565b9050600061099a8261098e85670de0b6b3a764000063ffffffff610b8e16565b9063ffffffff610bb516565b905060006109b360035442610bd790919063ffffffff16565b9050600a548110156109ca5750925061074e915050565b60006109d66004610bec565b90506109e6836001548484610c13565b9550505050505061074e565b600082820183811015610a0457600080fd5b9392505050565b8154600283015410610a2657610a218282610c65565b610a30565b610a308282610cdb565b5050565b6002820154606090821115610a5e5760405160e560020a62461bcd0281526004016102aa906114ea565b606082604051908082528060200260200182016040528015610a8a578160200160208202803883390190505b50600185015490915060005b84811015610b0857856002018281548110610aad57fe5b9060005260206000200154838281518110610ac457fe5b60209081029190910101528115610aeb57610ae682600163ffffffff610bd716565b610afe565b8554610afe90600163ffffffff610bd716565b9150600101610a96565b5090949350505050565b600160a060020a038116610b2557600080fd5b600754604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600082610b9d5750600061082f565b82820282848281610baa57fe5b0414610a0457600080fd5b6000808211610bc357600080fd5b6000828481610bce57fe5b04949350505050565b600082821115610be657600080fd5b50900390565b600081600201826001015481548110610c0157fe5b90600052602060002001549050919050565b600080610c26848663ffffffff6109f216565b9050610c5b8161098e610c3f868863ffffffff610b8e16565b610c4f8a8a63ffffffff610b8e16565b9063ffffffff6109f216565b9695505050505050565b815460018084015460009291610c81919063ffffffff6109f216565b81610c8857fe5b600285015491900691508110610cb35760405160e560020a62461bcd0281526004016102aa906114ca565b81836002018281548110610cc357fe5b60009182526020909120015560019092019190915550565b6000610cf5600184600101546109f290919063ffffffff16565b60028401549091508114610d1e5760405160e560020a62461bcd0281526004016102aa906114da565b82548110610d415760405160e560020a62461bcd0281526004016102aa9061145a565b60028301805460018181018355600092835260209092200192909255910155565b6000610a04823561154a565b6000610a04823561074e565b6000610a048235611566565b6000610a04825161074e565b600060208284031215610da457600080fd5b6000610db08484610d62565b949350505050565b600060208284031215610dca57600080fd5b6000610db08484610d6e565b600060208284031215610de857600080fd5b6000610db08484610d7a565b600060208284031215610e0657600080fd5b6000610db08484610d86565b6000610e1e83836113e8565b505060200190565b610e2f8161154a565b82525050565b6000610e4082611538565b610e4a818561153c565b9350610e5583611532565b60005b82811015610e8057610e6b868351610e12565b9550610e7682611532565b9150600101610e58565b5093949350505050565b610e2f81611555565b6000610e9f838561153c565b9350610eac838584611571565b610eb5836115ad565b9093019392505050565b6000610ecb8385611545565b9350610ed8838584611571565b50500190565b610e2f81611566565b6000610ef282611538565b610efc818561153c565b9350610f0c81856020860161157d565b610eb5816115ad565b6000610f2260578361153c565b7f54776f41737365744c696e656172697a656454696d655365726965734665656481527f2e6368616e676551756f74654f7261636c653a204d7573742067697665206e6560208201527f772071756f7465206f7261636c6520616464726573732e000000000000000000604082015260600192915050565b6000610fa760468361153c565b7f4c696e6b65644c6973744c6962726172793a20417474656d7074696e6720746f81527f20616464206e6f64652074686174206578636565647320646174612073697a6560208201527f206c696d69740000000000000000000000000000000000000000000000000000604082015260600192915050565b600061102c603e8361153c565b7f54696d65536572696573466565642e706f6b653a204e6f7420656e6f7567682081527f74696d6520656c61707365642073696e6365206c617374207570646174650000602082015260400192915050565b600061108b603b8361153c565b7f54696d654c6f636b5570677261646556323a204e657720706572696f64206d7581527f73742062652067726561746572207468616e206578697374696e670000000000602082015260400192915050565b60006110ea604a8361153c565b7f54696d654c6f636b5570677261646556322e72656d6f7665526567697374657281527f6564557067726164653a20557067726164652068617368206d7573742062652060208201527f7265676973746572656400000000000000000000000000000000000000000000604082015260600192915050565b600061116f60368361153c565b7f54696d654c6f636b5570677261646556323a2054696d65206c6f636b2070657281527f696f64206d757374206861766520656c61707365642e00000000000000000000602082015260400192915050565b60006111ce60558361153c565b7f54776f41737365744c696e656172697a656454696d655365726965734665656481527f2e6368616e6765426173654f7261636c653a204d7573742067697665206e657760208201527f2062617365206f7261636c6520616464726573732e0000000000000000000000604082015260600192915050565b6000611253602f8361153c565b7f54696d654c6f636b5570677261646556323a205468652063616c6c6572206d7581527f737420626520746865206f776e65720000000000000000000000000000000000602082015260400192915050565b60006112b260398361153c565b7f4c696e6b65644c6973744c6962726172793a20417474656d7074696e6720746f81527f20757064617465206e6f6e2d6578697374656e74206e6f646500000000000000602082015260400192915050565b600061131160448361153c565b7f4c696e6b65644c6973744c6962726172793a204e6f6465206d7573742062652081527f6164646564206174206e65787420657870656374656420696e64657820696e2060208201527f6c69737400000000000000000000000000000000000000000000000000000000604082015260600192915050565b600061139660348361153c565b7f4c696e6b65644c6973744c6962726172793a205175657279696e67206d6f726581527f2064617461207468616e20617661696c61626c65000000000000000000000000602082015260400192915050565b610e2f8161074e565b6000610db0828486610ebf565b6020810161082f8284610e26565b60208082528101610a048184610e35565b6020810161082f8284610e8a565b6020810161082f8284610ede565b60208082528101610a048184610ee7565b6020808252810161082f81610f15565b6020808252810161082f81610f9a565b6020808252810161082f8161101f565b6020808252810161082f8161107e565b6020808252810161082f816110dd565b6020808252810161082f81611162565b6020808252810161082f816111c1565b6020808252810161082f81611246565b6020808252810161082f816112a5565b6020808252810161082f81611304565b6020808252810161082f81611389565b6020810161082f82846113e8565b6040810161151682866113e8565b8181036020830152611529818486610e93565b95945050505050565b60200190565b5190565b90815260200190565b919050565b600061082f8261155a565b151590565b600160a060020a031690565b600061082f8261154a565b82818337506000910152565b60005b83811015611598578181015183820152602001611580565b838111156115a7576000848401525b50505050565b601f01601f191690565b6002830154156115dc5760405160e560020a62461bcd0281526004016102aa9061172e565b600082116115ff5760405160e560020a62461bcd0281526004016102aa9061173e565b9082556002820180546001818101835560009283526020832090910192909255910155565b600061163160428361153c565b7f4c696e6b65644c6973744c6962726172792e696e697469616c697a653a20496e81527f697469616c697a6564204c696e6b65644c697374206d75737420626520656d7060208201527f7479000000000000000000000000000000000000000000000000000000000000604082015260600192915050565b60006116b660438361153c565b7f4c696e6b65644c6973744c6962726172792e696e697469616c697a653a20646181527f746153697a654c696d6974206d7573742062652067726561746572207468616e60208201527f20302e0000000000000000000000000000000000000000000000000000000000604082015260600192915050565b6020808252810161082f81611624565b6020808252810161082f816116a956fea265627a7a72305820d1523155eb146437ca67b1b306e68c789f8edda489bb319965284811b3db86576c6578706572696d656e74616cf500374c696e6b65644c6973744c6962726172793a20417474656d7074696e6720746f0000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000005de953b000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000097c3e595e8f80169266b5534e4d7a1bb58bb45ab000000000000000000000000bf63446ecf3341e04c6569b226a57860b188edbc00000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000004cc73eed1cd780000000000000000000000000000000000000000000000000004c9f1874f11d00000000000000000000000000000000000000000000000000004b0516a04b2d80000000000000000000000000000000000000000000000000004948683867c0000000000000000000000000000000000000000000000000000049d231db0a65800000000000000000000000000000000000000000000000000048115ddb2da6800000000000000000000000000000000000000000000000000048e0caf1eca28000000000000000000000000000000000000000000000000000493e194a35760000000000000000000000000000000000000000000000000000483d310a612e00000000000000000000000000000000000000000000000000004839b32b3526800000000000000000000000000000000000000000000000000046b8ab5d1017800000000000000000000000000000000000000000000000000047641f2725a9800000000000000000000000000000000000000000000000000048c6ab2f64a70000000000000000000000000000000000000000000000000000487fb7dd32bd800000000000000000000000000000000000000000000000000047c7d1d5789b800000000000000000000000000000000000000000000000000047106ad99d50800000000000000000000000000000000000000000000000000000000000000018455448204254432054696d652053657269657320466565640000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101255760003560e060020a9004806378446bc1116100b1578063cc75c9b011610075578063cc75c9b014610212578063d6a4c06e14610225578063ed2e5a971461022d578063f2fde38b1461024d578063fd2c80ae1461026057610125565b806378446bc1146101c55780638a981966146101cd5780638da5cb5b146101d55780638f32d59b146101ea5780639303b16f146101ff57610125565b806355d23465116100f857806355d234651461017857806358d656291461018d578063610613d6146101a257806370716971146101b5578063715018a6146101bd57610125565b80631766486d1461012a578063181783581461015357806336e1a0761461015d578063445d6def14610170575b600080fd5b61013d610138366004610db8565b610268565b60405161014a91906114fa565b60405180910390f35b61015b61027a565b005b61015b61016b366004610dd6565b6102fc565b61013d610493565b610180610499565b60405161014a919061142b565b6101956104a8565b60405161014a9190611439565b61015b6101b0366004610dd6565b610536565b61013d6106be565b61015b6106c4565b61013d61072c565b610180610732565b6101dd610741565b60405161014a91906113fe565b6101f2610751565b60405161014a919061141d565b61015b61020d366004610db8565b610762565b61015b610220366004610db8565b61079c565b61013d610816565b61024061023b366004610db8565b61081c565b60405161014a919061140c565b61015b61025b366004610d92565b610835565b61013d61084f565b60096020526000908152604090205481565b60008054600101908190556003544210156102b35760405160e560020a62461bcd0281526004016102aa9061146a565b60405180910390fd5b60006102bd610855565b90506102d66001546003546109f290919063ffffffff16565b6003556102ea60048263ffffffff610a0b16565b5060005481146102f957600080fd5b50565b610304610751565b6103235760405160e560020a62461bcd0281526004016102aa906114ba565b6008541561040b57600080366040516020016103409291906113f1565b60408051601f19818403018152918152815160209283012060008181526009909352912054909150806103c4576000828152600960205260408082204290819055905184927fe44f46be6285c6d0bb89d91e4b554c2fd26cf7c68fc1379279b8e97a2d712b6a926103b5929091903690611508565b60405180910390a250506102f9565b6008546103d890829063ffffffff6109f216565b4210156103fa5760405160e560020a62461bcd0281526004016102aa9061149a565b506000908152600960205260408120555b600c54600160a060020a038281169116141561043c5760405160e560020a62461bcd0281526004016102aa906114aa565b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517f774f106b53df9aeb99ae8deb7a53fc985d6f1ee93f98275b04b02d01b549a7d990600090a250565b600a5481565b600c54600160a060020a031681565b600b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561052e5780601f106105035761010080835404028352916020019161052e565b820191906000526020600020905b81548152906001019060200180831161051157829003601f168201915b505050505081565b61053e610751565b61055d5760405160e560020a62461bcd0281526004016102aa906114ba565b60085415610636576000803660405160200161057a9291906113f1565b60408051601f19818403018152918152815160209283012060008181526009909352912054909150806105ef576000828152600960205260408082204290819055905184927fe44f46be6285c6d0bb89d91e4b554c2fd26cf7c68fc1379279b8e97a2d712b6a926103b5929091903690611508565b60085461060390829063ffffffff6109f216565b4210156106255760405160e560020a62461bcd0281526004016102aa9061149a565b506000908152600960205260408120555b600d54600160a060020a03828116911614156106675760405160e560020a62461bcd0281526004016102aa9061144a565b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517f774f106b53df9aeb99ae8deb7a53fc985d6f1ee93f98275b04b02d01b549a7d990600090a250565b60035481565b6106cc610751565b6106d557600080fd5b600754604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36007805473ffffffffffffffffffffffffffffffffffffffff19169055565b60085481565b600d54600160a060020a031681565b600754600160a060020a03165b90565b600754600160a060020a0316331490565b61076a610751565b61077357600080fd5b60085481116107975760405160e560020a62461bcd0281526004016102aa9061147a565b600855565b6107a4610751565b6107ad57600080fd5b6000818152600960205260409020546107db5760405160e560020a62461bcd0281526004016102aa9061148a565b6000818152600960205260408082208290555182917f068cc8f97648f23db94d0e1a707a54447d07effeb11c1c297168aa67321dc4ec91a250565b60025481565b606061082f60048363ffffffff610a3416565b92915050565b61083d610751565b61084657600080fd5b6102f981610b12565b60015481565b600080600c60009054906101000a9004600160a060020a0316600160a060020a03166357de26a46040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156108a957600080fd5b505afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108e19190810190610df4565b90506000600d60009054906101000a9004600160a060020a0316600160a060020a03166357de26a46040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061096e9190810190610df4565b9050600061099a8261098e85670de0b6b3a764000063ffffffff610b8e16565b9063ffffffff610bb516565b905060006109b360035442610bd790919063ffffffff16565b9050600a548110156109ca5750925061074e915050565b60006109d66004610bec565b90506109e6836001548484610c13565b9550505050505061074e565b600082820183811015610a0457600080fd5b9392505050565b8154600283015410610a2657610a218282610c65565b610a30565b610a308282610cdb565b5050565b6002820154606090821115610a5e5760405160e560020a62461bcd0281526004016102aa906114ea565b606082604051908082528060200260200182016040528015610a8a578160200160208202803883390190505b50600185015490915060005b84811015610b0857856002018281548110610aad57fe5b9060005260206000200154838281518110610ac457fe5b60209081029190910101528115610aeb57610ae682600163ffffffff610bd716565b610afe565b8554610afe90600163ffffffff610bd716565b9150600101610a96565b5090949350505050565b600160a060020a038116610b2557600080fd5b600754604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600082610b9d5750600061082f565b82820282848281610baa57fe5b0414610a0457600080fd5b6000808211610bc357600080fd5b6000828481610bce57fe5b04949350505050565b600082821115610be657600080fd5b50900390565b600081600201826001015481548110610c0157fe5b90600052602060002001549050919050565b600080610c26848663ffffffff6109f216565b9050610c5b8161098e610c3f868863ffffffff610b8e16565b610c4f8a8a63ffffffff610b8e16565b9063ffffffff6109f216565b9695505050505050565b815460018084015460009291610c81919063ffffffff6109f216565b81610c8857fe5b600285015491900691508110610cb35760405160e560020a62461bcd0281526004016102aa906114ca565b81836002018281548110610cc357fe5b60009182526020909120015560019092019190915550565b6000610cf5600184600101546109f290919063ffffffff16565b60028401549091508114610d1e5760405160e560020a62461bcd0281526004016102aa906114da565b82548110610d415760405160e560020a62461bcd0281526004016102aa9061145a565b60028301805460018181018355600092835260209092200192909255910155565b6000610a04823561154a565b6000610a04823561074e565b6000610a048235611566565b6000610a04825161074e565b600060208284031215610da457600080fd5b6000610db08484610d62565b949350505050565b600060208284031215610dca57600080fd5b6000610db08484610d6e565b600060208284031215610de857600080fd5b6000610db08484610d7a565b600060208284031215610e0657600080fd5b6000610db08484610d86565b6000610e1e83836113e8565b505060200190565b610e2f8161154a565b82525050565b6000610e4082611538565b610e4a818561153c565b9350610e5583611532565b60005b82811015610e8057610e6b868351610e12565b9550610e7682611532565b9150600101610e58565b5093949350505050565b610e2f81611555565b6000610e9f838561153c565b9350610eac838584611571565b610eb5836115ad565b9093019392505050565b6000610ecb8385611545565b9350610ed8838584611571565b50500190565b610e2f81611566565b6000610ef282611538565b610efc818561153c565b9350610f0c81856020860161157d565b610eb5816115ad565b6000610f2260578361153c565b7f54776f41737365744c696e656172697a656454696d655365726965734665656481527f2e6368616e676551756f74654f7261636c653a204d7573742067697665206e6560208201527f772071756f7465206f7261636c6520616464726573732e000000000000000000604082015260600192915050565b6000610fa760468361153c565b7f4c696e6b65644c6973744c6962726172793a20417474656d7074696e6720746f81527f20616464206e6f64652074686174206578636565647320646174612073697a6560208201527f206c696d69740000000000000000000000000000000000000000000000000000604082015260600192915050565b600061102c603e8361153c565b7f54696d65536572696573466565642e706f6b653a204e6f7420656e6f7567682081527f74696d6520656c61707365642073696e6365206c617374207570646174650000602082015260400192915050565b600061108b603b8361153c565b7f54696d654c6f636b5570677261646556323a204e657720706572696f64206d7581527f73742062652067726561746572207468616e206578697374696e670000000000602082015260400192915050565b60006110ea604a8361153c565b7f54696d654c6f636b5570677261646556322e72656d6f7665526567697374657281527f6564557067726164653a20557067726164652068617368206d7573742062652060208201527f7265676973746572656400000000000000000000000000000000000000000000604082015260600192915050565b600061116f60368361153c565b7f54696d654c6f636b5570677261646556323a2054696d65206c6f636b2070657281527f696f64206d757374206861766520656c61707365642e00000000000000000000602082015260400192915050565b60006111ce60558361153c565b7f54776f41737365744c696e656172697a656454696d655365726965734665656481527f2e6368616e6765426173654f7261636c653a204d7573742067697665206e657760208201527f2062617365206f7261636c6520616464726573732e0000000000000000000000604082015260600192915050565b6000611253602f8361153c565b7f54696d654c6f636b5570677261646556323a205468652063616c6c6572206d7581527f737420626520746865206f776e65720000000000000000000000000000000000602082015260400192915050565b60006112b260398361153c565b7f4c696e6b65644c6973744c6962726172793a20417474656d7074696e6720746f81527f20757064617465206e6f6e2d6578697374656e74206e6f646500000000000000602082015260400192915050565b600061131160448361153c565b7f4c696e6b65644c6973744c6962726172793a204e6f6465206d7573742062652081527f6164646564206174206e65787420657870656374656420696e64657820696e2060208201527f6c69737400000000000000000000000000000000000000000000000000000000604082015260600192915050565b600061139660348361153c565b7f4c696e6b65644c6973744c6962726172793a205175657279696e67206d6f726581527f2064617461207468616e20617661696c61626c65000000000000000000000000602082015260400192915050565b610e2f8161074e565b6000610db0828486610ebf565b6020810161082f8284610e26565b60208082528101610a048184610e35565b6020810161082f8284610e8a565b6020810161082f8284610ede565b60208082528101610a048184610ee7565b6020808252810161082f81610f15565b6020808252810161082f81610f9a565b6020808252810161082f8161101f565b6020808252810161082f8161107e565b6020808252810161082f816110dd565b6020808252810161082f81611162565b6020808252810161082f816111c1565b6020808252810161082f81611246565b6020808252810161082f816112a5565b6020808252810161082f81611304565b6020808252810161082f81611389565b6020810161082f82846113e8565b6040810161151682866113e8565b8181036020830152611529818486610e93565b95945050505050565b60200190565b5190565b90815260200190565b919050565b600061082f8261155a565b151590565b600160a060020a031690565b600061082f8261154a565b82818337506000910152565b60005b83811015611598578181015183820152602001611580565b838111156115a7576000848401525b50505050565b601f01601f191690565b6002830154156115dc5760405160e560020a62461bcd0281526004016102aa9061172e565b600082116115ff5760405160e560020a62461bcd0281526004016102aa9061173e565b9082556002820180546001818101835560009283526020832090910192909255910155565b600061163160428361153c565b7f4c696e6b65644c6973744c6962726172792e696e697469616c697a653a20496e81527f697469616c697a6564204c696e6b65644c697374206d75737420626520656d7060208201527f7479000000000000000000000000000000000000000000000000000000000000604082015260600192915050565b60006116b660438361153c565b7f4c696e6b65644c6973744c6962726172792e696e697469616c697a653a20646181527f746153697a654c696d6974206d7573742062652067726561746572207468616e60208201527f20302e0000000000000000000000000000000000000000000000000000000000604082015260600192915050565b6020808252810161082f81611624565b6020808252810161082f816116a956fea265627a7a72305820d1523155eb146437ca67b1b306e68c789f8edda489bb319965284811b3db86576c6578706572696d656e74616cf50037

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000005de953b000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000097c3e595e8f80169266b5534e4d7a1bb58bb45ab000000000000000000000000bf63446ecf3341e04c6569b226a57860b188edbc00000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000004cc73eed1cd780000000000000000000000000000000000000000000000000004c9f1874f11d00000000000000000000000000000000000000000000000000004b0516a04b2d80000000000000000000000000000000000000000000000000004948683867c0000000000000000000000000000000000000000000000000000049d231db0a65800000000000000000000000000000000000000000000000000048115ddb2da6800000000000000000000000000000000000000000000000000048e0caf1eca28000000000000000000000000000000000000000000000000000493e194a35760000000000000000000000000000000000000000000000000000483d310a612e00000000000000000000000000000000000000000000000000004839b32b3526800000000000000000000000000000000000000000000000000046b8ab5d1017800000000000000000000000000000000000000000000000000047641f2725a9800000000000000000000000000000000000000000000000000048c6ab2f64a70000000000000000000000000000000000000000000000000000487fb7dd32bd800000000000000000000000000000000000000000000000000047c7d1d5789b800000000000000000000000000000000000000000000000000047106ad99d50800000000000000000000000000000000000000000000000000000000000000018455448204254432054696d652053657269657320466565640000000000000000

-----Decoded View---------------
Arg [0] : _updateInterval (uint256): 86400
Arg [1] : _nextEarliestUpdate (uint256): 1575572400
Arg [2] : _maxDataPoints (uint256): 200
Arg [3] : _seededValues (uint256[]): 21611171310000000,21567025620000000,21116217990000000,20627285760000000,20778784870000000,20285293130000000,20513360570000000,20615951640000000,20333479160000000,20329640010000000,19906294510000000,20094808310000000,20484636860000000,20406625990000000,20204427390000000,20002774450000000
Arg [4] : _interpolationThreshold (uint256): 10800
Arg [5] : _baseOracleAddress (address): 0x97C3e595e8f80169266B5534e4d7A1bB58BB45ab
Arg [6] : _quoteOracleAddress (address): 0xbf63446ecF3341e04c6569b226a57860B188edBc
Arg [7] : _dataDescription (string): ETH BTC Time Series Feed

-----Encoded View---------------
27 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [1] : 000000000000000000000000000000000000000000000000000000005de953b0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002a30
Arg [5] : 00000000000000000000000097c3e595e8f80169266b5534e4d7a1bb58bb45ab
Arg [6] : 000000000000000000000000bf63446ecf3341e04c6569b226a57860b188edbc
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [9] : 000000000000000000000000000000000000000000000000004cc73eed1cd780
Arg [10] : 000000000000000000000000000000000000000000000000004c9f1874f11d00
Arg [11] : 000000000000000000000000000000000000000000000000004b0516a04b2d80
Arg [12] : 000000000000000000000000000000000000000000000000004948683867c000
Arg [13] : 0000000000000000000000000000000000000000000000000049d231db0a6580
Arg [14] : 0000000000000000000000000000000000000000000000000048115ddb2da680
Arg [15] : 0000000000000000000000000000000000000000000000000048e0caf1eca280
Arg [16] : 00000000000000000000000000000000000000000000000000493e194a357600
Arg [17] : 00000000000000000000000000000000000000000000000000483d310a612e00
Arg [18] : 000000000000000000000000000000000000000000000000004839b32b352680
Arg [19] : 0000000000000000000000000000000000000000000000000046b8ab5d101780
Arg [20] : 0000000000000000000000000000000000000000000000000047641f2725a980
Arg [21] : 0000000000000000000000000000000000000000000000000048c6ab2f64a700
Arg [22] : 00000000000000000000000000000000000000000000000000487fb7dd32bd80
Arg [23] : 0000000000000000000000000000000000000000000000000047c7d1d5789b80
Arg [24] : 0000000000000000000000000000000000000000000000000047106ad99d5080
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [26] : 455448204254432054696d652053657269657320466565640000000000000000


Deployed Bytecode Sourcemap

29476:6638:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29476:6638:0;;;;;;;;-1:-1:-1;;;29476:6638:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5594:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27053:646;;;:::i;:::-;;32512:522;;;;;;;;;:::i;29810:37::-;;;:::i;29890:33::-;;;:::i;:::-;;;;;;;;29854:29;;;:::i;:::-;;;;;;;;33280:532;;;;;;;;;:::i;24056:33::-;;;:::i;3469:140::-;;;:::i;5476:29::-;;;:::i;29930:34::-;;;:::i;2679:79::-;;;:::i;:::-;;;;;;;;3014:92;;;:::i;:::-;;;;;;;;8383:411;;;;;;;;;:::i;7691:458::-;;;;;;;;;:::i;23958:28::-;;;:::i;28086:192::-;;;;;;;;;:::i;:::-;;;;;;;;3786:109;;;;;;;;;:::i;23922:29::-;;;:::i;5594:53::-;;;;;;;;;;;;;:::o;27053:646::-;22345:13;:18;;22362:1;22345:18;;;;;27231;;27212:15;:37;;27190:149;;;;-1:-1:-1;;;;;27190:149:0;;;;;;;;;;;;;;;;;27396:16;27415:20;:18;:20::i;:::-;27396:39;;27562:38;27585:14;;27562:18;;:22;;:38;;;;:::i;:::-;27541:18;:59;27658:33;:14;27682:8;27658:33;:23;:33;:::i;:::-;22421:1;22457:13;;22441:12;:29;22433:38;;;;;;27053:646;:::o;32512:522::-;6031:9;:7;:9::i;:::-;6009:106;;;;-1:-1:-1;;;;;6009:106:0;;;;;;;;;6288:14;;:18;6284:1123;;6500:19;6589:8;;6550:66;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;6550:66:0;;;6522:109;;49:4:-1;6522:109:0;;;;6648:24;6675:31;;;:18;:31;;;;;;6522:109;;-1:-1:-1;6814:21:0;6810:303;;6856:31;;;;:18;:31;;;;;;6890:15;6856:49;;;;6931:139;;6875:11;;6931:139;;;;6890:15;;6856:31;7043:8;;6931:139;;;;;;;;;;7091:7;;;;6810:303;7195:14;;7174:36;;:16;;:36;:20;:36;:::i;:::-;7155:15;:55;;7129:171;;;;-1:-1:-1;;;;;7129:171:0;;;;;;;;;-1:-1:-1;7392:1:0;7358:31;;;:18;:31;;;;;:35;6284:1123;32773:18;;-1:-1:-1;;;;;32731:61:0;;;32773:18;;32731:61;;32709:196;;;;-1:-1:-1;;;;;32709:196:0;;;;;;;;;32918:18;:42;;-1:-1:-1;;32918:42:0;-1:-1:-1;;;;;32918:42:0;;;;;;;;32978:48;;;;-1:-1:-1;;32978:48:0;32512:522;:::o;29810:37::-;;;;:::o;29890:33::-;;;-1:-1:-1;;;;;29890:33:0;;:::o;29854:29::-;;;;;;;;;;;;;;;-1:-1:-1;;29854:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33280:532::-;6031:9;:7;:9::i;:::-;6009:106;;;;-1:-1:-1;;;;;6009:106:0;;;;;;;;;6288:14;;:18;6284:1123;;6500:19;6589:8;;6550:66;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;6550:66:0;;;6522:109;;49:4:-1;6522:109:0;;;;6648:24;6675:31;;;:18;:31;;;;;;6522:109;;-1:-1:-1;6814:21:0;6810:303;;6856:31;;;;:18;:31;;;;;;6890:15;6856:49;;;;6931:139;;6875:11;;6931:139;;;;6890:15;;6856:31;7043:8;;6931:139;;6810:303;7195:14;;7174:36;;:16;;:36;:20;:36;:::i;:::-;7155:15;:55;;7129:171;;;;-1:-1:-1;;;;;7129:171:0;;;;;;;;;-1:-1:-1;7392:1:0;7358:31;;;:18;:31;;;;;:35;6284:1123;33545:19;;-1:-1:-1;;;;;33502:63:0;;;33545:19;;33502:63;;33480:200;;;;-1:-1:-1;;;;;33480:200:0;;;;;;;;;33693:19;:44;;-1:-1:-1;;33693:44:0;-1:-1:-1;;;;;33693:44:0;;;;;;;;33755:49;;;;-1:-1:-1;;33755:49:0;33280:532;:::o;24056:33::-;;;;:::o;3469:140::-;2891:9;:7;:9::i;:::-;2883:18;;;;;;3552:6;;3531:40;;3568:1;;-1:-1:-1;;;;;3552:6:0;;3531:40;;3568:1;;3531:40;3582:6;:19;;-1:-1:-1;;3582:19:0;;;3469:140::o;5476:29::-;;;;:::o;29930:34::-;;;-1:-1:-1;;;;;29930:34:0;;:::o;2679:79::-;2744:6;;-1:-1:-1;;;;;2744:6:0;2679:79;;:::o;3014:92::-;3092:6;;-1:-1:-1;;;;;3092:6:0;3078:10;:20;;3014:92::o;8383:411::-;2891:9;:7;:9::i;:::-;2883:18;;;;;;8640:14;;8622:15;:32;8600:141;;;;-1:-1:-1;;;;;8600:141:0;;;;;;;;;8754:14;:32;8383:411::o;7691:458::-;2891:9;:7;:9::i;:::-;2883:18;;;;;;7837:32;;;;:18;:32;;;;;;7815:161;;;;-1:-1:-1;;;;;7815:161:0;;;;;;;;;8061:1;8026:32;;;:18;:32;;;;;;:36;;;8080:61;8045:12;;8080:61;;;7691:458;:::o;23958:28::-;;;;:::o;28086:192::-;28190:16;28231:39;:14;28255;28231:39;:23;:39;:::i;:::-;28224:46;28086:192;-1:-1:-1;;28086:192:0:o;3786:109::-;2891:9;:7;:9::i;:::-;2883:18;;;;;;3859:28;3878:8;3859:18;:28::i;23922:29::-;;;;:::o;34828:1283::-;34894:7;34961:23;34987:18;;;;;;;;;-1:-1:-1;;;;;34987:18:0;-1:-1:-1;;;;;34987:23:0;;:25;;;;;-1:-1:-1;;;34987:25:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34987:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34987:25:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34987:25:0;;;;;;;;;34961:51;;35068:24;35095:19;;;;;;;;;-1:-1:-1;;;;;35095:19:0;-1:-1:-1;;;;;35095:24:0;;:26;;;;;-1:-1:-1;;;35095:26:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35095:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35095:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35095:26:0;;;;;;;;;35068:53;-1:-1:-1;35217:25:0;35245:51;35068:53;35245:29;:15;35265:8;35245:29;:19;:29;:::i;:::-;:33;:51;:33;:51;:::i;:::-;35217:79;;35382:30;35415:39;35435:18;;35415:15;:19;;:39;;;;:::i;:::-;35382:72;;35645:22;;35620;:47;35616:488;;;-1:-1:-1;35691:17:0;-1:-1:-1;35684:24:0;;-1:-1:-1;;35684:24:0;35616:488;35780:26;35809:31;:14;:29;:31::i;:::-;35780:60;;35864:228;35949:17;35985:14;;36018:22;36059:18;35864:66;:228::i;:::-;35857:235;;;;;;;;;1488:150;1546:7;1578:5;;;1602:6;;;;1594:15;;;;;;1629:1;1488:150;-1:-1:-1;;;1488:150:0:o;17296:335::-;17528:19;;17503:15;;;:22;:44;:120;;17593:30;17604:5;17611:11;17593:10;:30::i;:::-;17503:120;;;17550:27;17558:5;17565:11;17550:7;:27::i;:::-;17296:335;;:::o;19882:948::-;20156:15;;;:22;20022:16;;20141:37;;;20119:139;;;;-1:-1:-1;;;;;20119:139:0;;;;;;;;;20318:28;20363:11;20349:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;20349:26:0;-1:-1:-1;20444:22:0;;;;20318:57;;-1:-1:-1;20418:23:0;20477:315;20501:11;20497:1;:15;20477:315;;;20600:5;:15;;20616;20600:32;;;;;;;;;;;;;;;;20583:11;20595:1;20583:14;;;;;;;;;;;;;;;;;:49;20706:20;;:74;;20758:22;:15;20778:1;20758:22;:19;:22;:::i;:::-;20706:74;;;20729:19;;:26;;20753:1;20729:26;:23;:26;:::i;:::-;20688:92;-1:-1:-1;20514:3:0;;20477:315;;;-1:-1:-1;20811:11:0;;19882:948;-1:-1:-1;;;;19882:948:0:o;4045:187::-;-1:-1:-1;;;;;4119:22:0;;4111:31;;;;;;4179:6;;4158:38;;-1:-1:-1;;;;;4158:38:0;;;;4179:6;;4158:38;;4179:6;;4158:38;4207:6;:17;;-1:-1:-1;;4207:17:0;-1:-1:-1;;;;;4207:17:0;;;;;;;;;;4045:187::o;241:433::-;299:7;543:6;539:47;;-1:-1:-1;573:1:0;566:8;;539:47;610:5;;;614:1;610;:5;:1;634:5;;;;;:10;626:19;;;;;809:303;867:7;966:1;962;:5;954:14;;;;;;979:9;995:1;991;:5;;;;;;;809:303;-1:-1:-1;;;;809:303:0:o;1250:150::-;1308:7;1341:1;1336;:6;;1328:15;;;;;;-1:-1:-1;1366:5:0;;;1250:150::o;21054:195::-;21170:7;21202:5;:15;;21218:5;:22;;;21202:39;;;;;;;;;;;;;;;;21195:46;;21054:195;;;:::o;12471:803::-;12718:7;;12863:44;:23;12891:15;12863:44;:27;:44;:::i;:::-;12834:73;-1:-1:-1;13121:145:0;12834:73;13121:107;13174:53;:24;13203:23;13174:53;:28;:53;:::i;:::-;13121:34;:13;13139:15;13121:34;:17;:34;:::i;:::-;:52;:107;:52;:107;:::i;:145::-;13114:152;12471:803;-1:-1:-1;;;;;;12471:803:0:o;18861:656::-;19103:19;;19098:1;19071:22;;;;19045:23;;19103:19;19071:29;;:22;:29;:26;:29;:::i;:::-;:51;;;;;19239:15;;;:22;19071:51;;;;-1:-1:-1;19221:40:0;;19199:147;;;;-1:-1:-1;;;;;19199:147:0;;;;;;;;;19447:11;19412:5;:15;;19428;19412:32;;;;;;;;;;;;;;;;;:46;19469:22;;;;:40;;;;-1:-1:-1;18861:656:0:o;17891:684::-;18014:20;18037:29;18064:1;18037:5;:22;;;:26;;:29;;;;:::i;:::-;18117:15;;;:22;18014:52;;-1:-1:-1;18101:38:0;;18079:156;;;;-1:-1:-1;;;;;18079:156:0;;;;;;;;;18285:19;;18270:34;;18248:154;;;;-1:-1:-1;;;;;18248:154:0;;;;;;;;;18442:15;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;18442:33:0;;;;;;;;;;;;18530:22;;:37;17891:684::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:118;;197:46;235:6;222:20;197:46;;255:148;;337:61;390:6;377:20;337:61;;535:122;;613:39;644:6;638:13;613:39;;664:241;;768:2;756:9;747:7;743:23;739:32;736:2;;;784:1;781;774:12;736:2;819:1;836:53;881:7;861:9;836:53;;;826:63;730:175;-1:-1;;;;730:175;912:241;;1016:2;1004:9;995:7;991:23;987:32;984:2;;;1032:1;1029;1022:12;984:2;1067:1;1084:53;1129:7;1109:9;1084:53;;1160:271;;1279:2;1267:9;1258:7;1254:23;1250:32;1247:2;;;1295:1;1292;1285:12;1247:2;1330:1;1347:68;1407:7;1387:9;1347:68;;1686:263;;1801:2;1789:9;1780:7;1776:23;1772:32;1769:2;;;1817:1;1814;1807:12;1769:2;1852:1;1869:64;1925:7;1905:9;1869:64;;1957:173;;2044:46;2086:3;2078:6;2044:46;;;-1:-1;;2119:4;2110:14;;2037:93;2138:120;2221:31;2246:5;2221:31;;;2216:3;2209:44;2203:55;;;2296:621;;2441:54;2489:5;2441:54;;;2508:86;2587:6;2582:3;2508:86;;;2501:93;;2614:56;2664:5;2614:56;;;2691:1;2676:219;2701:6;2698:1;2695:13;2676:219;;;2748:63;2807:3;2798:6;2792:13;2748:63;;;2741:70;;2828:60;2881:6;2828:60;;;2818:70;-1:-1;2723:1;2716:9;2676:219;;;-1:-1;2908:3;;2420:497;-1:-1;;;;2420:497;2925:111;3002:28;3024:5;3002:28;;3064:287;;3177:70;3240:6;3235:3;3177:70;;;3170:77;;3252:43;3288:6;3283:3;3276:5;3252:43;;;3316:29;3338:6;3316:29;;;3307:39;;;;3164:187;-1:-1;;;3164:187;3379:300;;3510:88;3591:6;3586:3;3510:88;;;3503:95;;3603:43;3639:6;3634:3;3627:5;3603:43;;;-1:-1;;3658:16;;3497:182;3686:156;3784:52;3830:5;3784:52;;3849:339;;3957:35;3986:5;3957:35;;;4004:71;4068:6;4063:3;4004:71;;;3997:78;;4080:52;4125:6;4120:3;4113:4;4106:5;4102:16;4080:52;;;4153:29;4175:6;4153:29;;4196:566;;4356:67;4420:2;4415:3;4356:67;;;4456:66;4436:87;;4557:66;4552:2;4543:12;;4536:88;4658:66;4653:2;4644:12;;4637:88;4753:2;4744:12;;4342:420;-1:-1;;4342:420;4771:566;;4931:67;4995:2;4990:3;4931:67;;;5031:66;5011:87;;5132:66;5127:2;5118:12;;5111:88;5233:66;5228:2;5219:12;;5212:88;5328:2;5319:12;;4917:420;-1:-1;;4917:420;5346:465;;5506:67;5570:2;5565:3;5506:67;;;5606:66;5586:87;;5707:66;5702:2;5693:12;;5686:88;5802:2;5793:12;;5492:319;-1:-1;;5492:319;5820:465;;5980:67;6044:2;6039:3;5980:67;;;6080:66;6060:87;;6181:66;6176:2;6167:12;;6160:88;6276:2;6267:12;;5966:319;-1:-1;;5966:319;6294:566;;6454:67;6518:2;6513:3;6454:67;;;6554:66;6534:87;;6655:66;6650:2;6641:12;;6634:88;6756:66;6751:2;6742:12;;6735:88;6851:2;6842:12;;6440:420;-1:-1;;6440:420;6869:465;;7029:67;7093:2;7088:3;7029:67;;;7129:66;7109:87;;7230:66;7225:2;7216:12;;7209:88;7325:2;7316:12;;7015:319;-1:-1;;7015:319;7343:566;;7503:67;7567:2;7562:3;7503:67;;;7603:66;7583:87;;7704:66;7699:2;7690:12;;7683:88;7805:66;7800:2;7791:12;;7784:88;7900:2;7891:12;;7489:420;-1:-1;;7489:420;7918:465;;8078:67;8142:2;8137:3;8078:67;;;8178:66;8158:87;;8279:66;8274:2;8265:12;;8258:88;8374:2;8365:12;;8064:319;-1:-1;;8064:319;8392:465;;8552:67;8616:2;8611:3;8552:67;;;8652:66;8632:87;;8753:66;8748:2;8739:12;;8732:88;8848:2;8839:12;;8538:319;-1:-1;;8538:319;8866:566;;9026:67;9090:2;9085:3;9026:67;;;9126:66;9106:87;;9227:66;9222:2;9213:12;;9206:88;9328:66;9323:2;9314:12;;9307:88;9423:2;9414:12;;9012:420;-1:-1;;9012:420;9441:465;;9601:67;9665:2;9660:3;9601:67;;;9701:66;9681:87;;9802:66;9797:2;9788:12;;9781:88;9897:2;9888:12;;9587:319;-1:-1;;9587:319;9914:110;9987:31;10012:5;9987:31;;10158:282;;10312:103;10411:3;10402:6;10394;10312:103;;10447:213;10565:2;10550:18;;10579:71;10554:9;10623:6;10579:71;;10667:361;10835:2;10849:47;;;10820:18;;10910:108;10820:18;11004:6;10910:108;;11035:201;11147:2;11132:18;;11161:65;11136:9;11199:6;11161:65;;11243:243;11376:2;11361:18;;11390:86;11365:9;11449:6;11390:86;;11493:293;11627:2;11641:47;;;11612:18;;11702:74;11612:18;11762:6;11702:74;;11793:407;11984:2;11998:47;;;11969:18;;12059:131;11969:18;12059:131;;12207:407;12398:2;12412:47;;;12383:18;;12473:131;12383:18;12473:131;;12621:407;12812:2;12826:47;;;12797:18;;12887:131;12797:18;12887:131;;13035:407;13226:2;13240:47;;;13211:18;;13301:131;13211:18;13301:131;;13449:407;13640:2;13654:47;;;13625:18;;13715:131;13625:18;13715:131;;13863:407;14054:2;14068:47;;;14039:18;;14129:131;14039:18;14129:131;;14277:407;14468:2;14482:47;;;14453:18;;14543:131;14453:18;14543:131;;14691:407;14882:2;14896:47;;;14867:18;;14957:131;14867:18;14957:131;;15105:407;15296:2;15310:47;;;15281:18;;15371:131;15281:18;15371:131;;15519:407;15710:2;15724:47;;;15695:18;;15785:131;15695:18;15785:131;;15933:407;16124:2;16138:47;;;16109:18;;16199:131;16109:18;16199:131;;16347:213;16465:2;16450:18;;16479:71;16454:9;16523:6;16479:71;;16567:428;16741:2;16726:18;;16755:71;16730:9;16799:6;16755:71;;;16874:9;16868:4;16864:20;16859:2;16848:9;16844:18;16837:48;16899:86;16980:4;16971:6;16963;16899:86;;;16891:94;16712:283;-1:-1;;;;;16712:283;17004:121;17113:4;17101:17;;17082:43;17134:107;17224:12;;17208:33;17475:178;17593:19;;;17642:4;17633:14;;17586:67;17833:144;17968:3;17946:31;-1:-1;17946:31;18157:105;;18226:31;18251:5;18226:31;;18269:92;18342:13;18335:21;;18318:43;18368:128;-1:-1;;;;;18437:54;;18420:76;18787:120;;18871:31;18896:5;18871:31;;19431:145;19512:6;19507:3;19502;19489:30;-1:-1;19568:1;19550:16;;19543:27;19482:94;19585:268;19650:1;19657:101;19671:6;19668:1;19665:13;19657:101;;;19738:11;;;19732:18;19719:11;;;19712:39;19693:2;19686:10;19657:101;;;19773:6;19770:1;19767:13;19764:2;;;19838:1;19829:6;19824:3;19820:16;19813:27;19764:2;19634:219;;;;;19861:97;19949:2;19929:14;-1:-1;;19925:28;;19909:49;;16396:15:0;;;:22;:27;16374:143;;;;-1:-1:-1;;;;;16374:143:0;;;;;;;;;16643:1;16626:14;:18;16604:135;;;;-1:-1:-1;;;;;16604:135:0;;;;;;;;;16876:36;;;16923:15;;;27:10:-1;;39:1;23:18;;;45:23;;16876:19:0;16923:35;;;;;;;;;;;;;16969:22;;:26;16176:827::o;6:566:-1:-;;166:67;230:2;225:3;166:67;;;266:66;246:87;;367:66;362:2;353:12;;346:88;468:66;463:2;454:12;;447:88;563:2;554:12;;152:420;-1:-1;;152:420;581:566;;741:67;805:2;800:3;741:67;;;841:66;821:87;;942:66;937:2;928:12;;921:88;1043:66;1038:2;1029:12;;1022:88;1138:2;1129:12;;727:420;-1:-1;;727:420;1155:407;1346:2;1360:47;;;1331:18;;1421:131;1331:18;1421:131;;1569:407;1760:2;1774:47;;;1745:18;;1835:131;1745:18;1835:131;

Swarm Source

bzzr://d1523155eb146437ca67b1b306e68c789f8edda489bb319965284811b3db8657

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.