Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 500 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Poke | 12181432 | 1318 days ago | IN | 0 ETH | 0.01158845 | ||||
Poke | 12174923 | 1319 days ago | IN | 0 ETH | 0.00734348 | ||||
Poke | 12168546 | 1320 days ago | IN | 0 ETH | 0.00614204 | ||||
Poke | 12168517 | 1320 days ago | IN | 0 ETH | 0.00653348 | ||||
Poke | 12168517 | 1320 days ago | IN | 0 ETH | 0.0111104 | ||||
Poke | 12161965 | 1321 days ago | IN | 0 ETH | 0.01425702 | ||||
Poke | 12155349 | 1322 days ago | IN | 0 ETH | 0.01600658 | ||||
Poke | 12148915 | 1323 days ago | IN | 0 ETH | 0.01622236 | ||||
Poke | 12142380 | 1324 days ago | IN | 0 ETH | 0.0123342 | ||||
Poke | 12135915 | 1325 days ago | IN | 0 ETH | 0.01550117 | ||||
Poke | 12129506 | 1326 days ago | IN | 0 ETH | 0.01184939 | ||||
Poke | 12122873 | 1327 days ago | IN | 0 ETH | 0.00780136 | ||||
Poke | 12116421 | 1328 days ago | IN | 0 ETH | 0.01204694 | ||||
Poke | 12109856 | 1329 days ago | IN | 0 ETH | 0.01340364 | ||||
Poke | 12103345 | 1330 days ago | IN | 0 ETH | 0.0142592 | ||||
Poke | 12096904 | 1331 days ago | IN | 0 ETH | 0.01401551 | ||||
Poke | 12090397 | 1332 days ago | IN | 0 ETH | 0.01856432 | ||||
Poke | 12083928 | 1333 days ago | IN | 0 ETH | 0.01278123 | ||||
Poke | 12077460 | 1334 days ago | IN | 0 ETH | 0.01026038 | ||||
Poke | 12071001 | 1335 days ago | IN | 0 ETH | 0.01157847 | ||||
Poke | 12064457 | 1336 days ago | IN | 0 ETH | 0.01217859 | ||||
Poke | 12057949 | 1337 days ago | IN | 0 ETH | 0.02267612 | ||||
Poke | 12051431 | 1338 days ago | IN | 0 ETH | 0.01437327 | ||||
Poke | 12044943 | 1339 days ago | IN | 0 ETH | 0.01298402 | ||||
Poke | 12038543 | 1340 days ago | IN | 0 ETH | 0.00506365 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TwoAssetLinearizedTimeSeriesFeed
Compiler Version
v0.5.7+commit.6da8b019
Contract Source Code (Solidity)
/** *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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.