Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 705 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Force Update Vad... | 15293931 | 720 days ago | IN | 0 ETH | 0.00018201 | ||||
Force Update Vad... | 15230485 | 730 days ago | IN | 0 ETH | 0.00042469 | ||||
Force Update Vad... | 14999395 | 768 days ago | IN | 0 ETH | 0.00066738 | ||||
Force Update Vad... | 14963144 | 774 days ago | IN | 0 ETH | 0.00206281 | ||||
Force Update Vad... | 14957264 | 775 days ago | IN | 0 ETH | 0.00321556 | ||||
Force Update Vad... | 14955932 | 775 days ago | IN | 0 ETH | 0.00539971 | ||||
Force Update Vad... | 14955725 | 775 days ago | IN | 0 ETH | 0.00612777 | ||||
Force Update Vad... | 14952173 | 776 days ago | IN | 0 ETH | 0.0018808 | ||||
Force Update Vad... | 14951567 | 776 days ago | IN | 0 ETH | 0.00200214 | ||||
Force Update Vad... | 14951473 | 776 days ago | IN | 0 ETH | 0.00133476 | ||||
Force Update Vad... | 14951373 | 776 days ago | IN | 0 ETH | 0.0018808 | ||||
Force Update Vad... | 14951309 | 776 days ago | IN | 0 ETH | 0.00224482 | ||||
Force Update Vad... | 14951211 | 776 days ago | IN | 0 ETH | 0.00321556 | ||||
Force Update Vad... | 14951141 | 776 days ago | IN | 0 ETH | 0.00285153 | ||||
Force Update Vad... | 14950868 | 776 days ago | IN | 0 ETH | 0.00364026 | ||||
Force Update Vad... | 14950790 | 776 days ago | IN | 0 ETH | 0.00442898 | ||||
Force Update Vad... | 14949868 | 776 days ago | IN | 0 ETH | 0.00151677 | ||||
Force Update Vad... | 14949630 | 776 days ago | IN | 0 ETH | 0.00133476 | ||||
Force Update Vad... | 14949569 | 776 days ago | IN | 0 ETH | 0.00121342 | ||||
Force Update Vad... | 14945246 | 777 days ago | IN | 0 ETH | 0.00388294 | ||||
Force Update Vad... | 14945189 | 777 days ago | IN | 0 ETH | 0.0019077 | ||||
Force Update Vad... | 14945123 | 777 days ago | IN | 0 ETH | 0.0056424 | ||||
Force Update Vad... | 14944045 | 777 days ago | IN | 0 ETH | 0.00230549 | ||||
Force Update Vad... | 14943981 | 777 days ago | IN | 0 ETH | 0.00129336 | ||||
Force Update Vad... | 14943931 | 777 days ago | IN | 0 ETH | 0.00182013 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
16003751 | 616 days ago | 0 ETH | |||||
16003751 | 616 days ago | 0 ETH | |||||
16003751 | 616 days ago | 0 ETH | |||||
16003751 | 616 days ago | 0 ETH | |||||
16003751 | 616 days ago | 0 ETH | |||||
16003294 | 616 days ago | 0 ETH | |||||
16003294 | 616 days ago | 0 ETH | |||||
16003294 | 616 days ago | 0 ETH | |||||
16003294 | 616 days ago | 0 ETH | |||||
16003294 | 616 days ago | 0 ETH | |||||
15293931 | 720 days ago | 0 ETH | |||||
15293931 | 720 days ago | 0 ETH | |||||
15293931 | 720 days ago | 0 ETH | |||||
15247119 | 728 days ago | 0 ETH | |||||
15247119 | 728 days ago | 0 ETH | |||||
15247119 | 728 days ago | 0 ETH | |||||
15247119 | 728 days ago | 0 ETH | |||||
15247119 | 728 days ago | 0 ETH | |||||
15247119 | 728 days ago | 0 ETH | |||||
15240479 | 729 days ago | 0 ETH | |||||
15240479 | 729 days ago | 0 ETH | |||||
15240479 | 729 days ago | 0 ETH | |||||
15240479 | 729 days ago | 0 ETH | |||||
15240479 | 729 days ago | 0 ETH | |||||
15240479 | 729 days ago | 0 ETH |
Loading...
Loading
Contract Name:
UniswapTwap
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-14 */ // hevm: flattened sources of src/UniswapTwap.sol // SPDX-License-Identifier: MIT AND GPL-3.0-or-later AND CC-BY-4.0 pragma solidity 0.8.9; ////// node_modules/@openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /* pragma solidity ^0.8.0; */ /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } ////// node_modules/@openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /* pragma solidity ^0.8.0; */ /* import "../utils/Context.sol"; */ /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } ////// src/interfaces/IUniswapTWAP.sol /* pragma solidity 0.8.9; */ interface IUniswapTWAP { function maxUpdateWindow() external view returns (uint); function getVaderPrice() external returns (uint); function syncVaderPrice() external; } ////// src/interfaces/chainlink/IAggregatorV3.sol /* pragma solidity 0.8.9; */ interface IAggregatorV3 { function decimals() external view returns (uint8); function latestRoundData() external view returns ( uint80 roundId, int answer, uint startedAt, uint updatedAt, uint80 answeredInRound ); } ////// src/interfaces/uniswap/IUniswapV2Pair.sol /* pragma solidity 0.8.9; */ interface IUniswapV2Pair { function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); } ////// src/libraries/Babylonian.sol /* pragma solidity 0.8.9; */ // computes square roots using the babylonian method // https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method library Babylonian { // credit for this implementation goes to // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687 function sqrt(uint x) internal pure returns (uint) { if (x == 0) return 0; // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2); // however that code costs significantly more gas uint xx = x; uint r = 1; if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; } if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; } if (xx >= 0x100000000) { xx >>= 32; r <<= 16; } if (xx >= 0x10000) { xx >>= 16; r <<= 8; } if (xx >= 0x100) { xx >>= 8; r <<= 4; } if (xx >= 0x10) { xx >>= 4; r <<= 2; } if (xx >= 0x8) { r <<= 1; } r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; // Seven iterations should be enough uint r1 = x / r; return (r < r1 ? r : r1); } } ////// src/libraries/BitMath.sol /* pragma solidity 0.8.9; */ library BitMath { // returns the 0 indexed position of the most significant bit of the input x // s.t. x >= 2**msb and x < 2**(msb+1) function mostSignificantBit(uint x) internal pure returns (uint8 r) { require(x > 0, "BitMath::mostSignificantBit: zero"); if (x >= 0x100000000000000000000000000000000) { x >>= 128; r += 128; } if (x >= 0x10000000000000000) { x >>= 64; r += 64; } if (x >= 0x100000000) { x >>= 32; r += 32; } if (x >= 0x10000) { x >>= 16; r += 16; } if (x >= 0x100) { x >>= 8; r += 8; } if (x >= 0x10) { x >>= 4; r += 4; } if (x >= 0x4) { x >>= 2; r += 2; } if (x >= 0x2) r += 1; } // returns the 0 indexed position of the least significant bit of the input x // s.t. (x & 2**lsb) != 0 and (x & (2**(lsb) - 1)) == 0) // i.e. the bit at the index is set and the mask of all lower bits is 0 function leastSignificantBit(uint x) internal pure returns (uint8 r) { require(x > 0, "BitMath::leastSignificantBit: zero"); r = 255; if (x & type(uint128).max > 0) { r -= 128; } else { x >>= 128; } if (x & type(uint64).max > 0) { r -= 64; } else { x >>= 64; } if (x & type(uint32).max > 0) { r -= 32; } else { x >>= 32; } if (x & type(uint16).max > 0) { r -= 16; } else { x >>= 16; } if (x & type(uint8).max > 0) { r -= 8; } else { x >>= 8; } if (x & 0xf > 0) { r -= 4; } else { x >>= 4; } if (x & 0x3 > 0) { r -= 2; } else { x >>= 2; } if (x & 0x1 > 0) r -= 1; } } ////// src/libraries/FullMath.sol /* pragma solidity 0.8.9; */ // taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1 // license is CC-BY-4.0 library FullMath { function fullMul(uint x, uint y) internal pure returns (uint l, uint h) { uint mm = mulmod(x, y, type(uint).max); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint l, uint h, uint d ) private pure returns (uint) { uint pow2 = d & uint(-int(d)); d /= pow2; l /= pow2; l += h * (uint(-int(pow2)) / pow2 + 1); uint r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint x, uint y, uint d ) internal pure returns (uint) { (uint l, uint h) = fullMul(x, y); uint mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; if (h == 0) return l / d; require(h < d, "FullMath: FULLDIV_OVERFLOW"); return fullDiv(l, h, d); } } ////// src/libraries/FixedPoint.sol /* pragma solidity 0.8.9; */ /* import "./FullMath.sol"; */ /* import "./Babylonian.sol"; */ /* import "./BitMath.sol"; */ // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // range: [0, 2**144 - 1] // resolution: 1 / 2**112 struct uq144x112 { uint _x; } uint8 public constant RESOLUTION = 112; uint public constant Q112 = 0x10000000000000000000000000000; // 2**112 uint private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; // 2**224 uint private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) // encode a uint112 as a UQ112x112 function encode(uint112 x) internal pure returns (uq112x112 memory) { return uq112x112(uint224(x) << RESOLUTION); } // encodes a uint144 as a UQ144x112 function encode144(uint144 x) internal pure returns (uq144x112 memory) { return uq144x112(uint(x) << RESOLUTION); } // decode a UQ112x112 into a uint112 by truncating after the radix point function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } // decode a UQ144x112 into a uint144 by truncating after the radix point function decode144(uq144x112 memory self) internal pure returns (uint144) { return uint144(self._x >> RESOLUTION); } // multiply a UQ112x112 by a uint, returning a UQ144x112 // reverts on overflow function mul(uq112x112 memory self, uint y) internal pure returns (uq144x112 memory) { uint z = 0; require( y == 0 || (z = self._x * y) / y == self._x, "FixedPoint::mul: overflow" ); return uq144x112(z); } // multiply a UQ112x112 by an int and decode, returning an int // reverts on overflow function muli(uq112x112 memory self, int y) internal pure returns (int) { uint z = FullMath.mulDiv(self._x, uint(y < 0 ? -y : y), Q112); require(z < 2**255, "FixedPoint::muli: overflow"); return y < 0 ? -int(z) : int(z); } // multiply a UQ112x112 by a UQ112x112, returning a UQ112x112 // lossy function muluq(uq112x112 memory self, uq112x112 memory other) internal pure returns (uq112x112 memory) { if (self._x == 0 || other._x == 0) { return uq112x112(0); } uint112 upper_self = uint112(self._x >> RESOLUTION); // * 2^0 uint112 lower_self = uint112(self._x & LOWER_MASK); // * 2^-112 uint112 upper_other = uint112(other._x >> RESOLUTION); // * 2^0 uint112 lower_other = uint112(other._x & LOWER_MASK); // * 2^-112 // partial products uint224 upper = uint224(upper_self) * upper_other; // * 2^0 uint224 lower = uint224(lower_self) * lower_other; // * 2^-224 uint224 uppers_lowero = uint224(upper_self) * lower_other; // * 2^-112 uint224 uppero_lowers = uint224(upper_other) * lower_self; // * 2^-112 // so the bit shift does not overflow require( upper <= type(uint112).max, "FixedPoint::muluq: upper overflow" ); // this cannot exceed 256 bits, all values are 224 bits uint sum = uint(upper << RESOLUTION) + uppers_lowero + uppero_lowers + (lower >> RESOLUTION); // so the cast does not overflow require(sum <= type(uint224).max, "FixedPoint::muluq: sum overflow"); return uq112x112(uint224(sum)); } // divide a UQ112x112 by a UQ112x112, returning a UQ112x112 function divuq(uq112x112 memory self, uq112x112 memory other) internal pure returns (uq112x112 memory) { require(other._x > 0, "FixedPoint::divuq: division by zero"); if (self._x == other._x) { return uq112x112(uint224(Q112)); } if (self._x <= type(uint144).max) { uint value = (uint(self._x) << RESOLUTION) / other._x; require(value <= type(uint224).max, "FixedPoint::divuq: overflow"); return uq112x112(uint224(value)); } uint result = FullMath.mulDiv(Q112, self._x, other._x); require(result <= type(uint224).max, "FixedPoint::divuq: overflow"); return uq112x112(uint224(result)); } // returns a UQ112x112 which represents the ratio of the numerator to the denominator // can be lossy function fraction(uint numerator, uint denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint::fraction: division by zero"); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= type(uint144).max) { uint result = (numerator << RESOLUTION) / denominator; require( result <= type(uint224).max, "FixedPoint::fraction: overflow" ); return uq112x112(uint224(result)); } else { uint result = FullMath.mulDiv(numerator, Q112, denominator); require( result <= type(uint224).max, "FixedPoint::fraction: overflow" ); return uq112x112(uint224(result)); } } // take the reciprocal of a UQ112x112 // reverts on overflow // lossy function reciprocal(uq112x112 memory self) internal pure returns (uq112x112 memory) { require(self._x != 0, "FixedPoint::reciprocal: reciprocal of zero"); require(self._x != 1, "FixedPoint::reciprocal: overflow"); return uq112x112(uint224(Q224 / self._x)); } // square root of a UQ112x112 // lossy between 0/1 and 40 bits function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) { if (self._x <= type(uint144).max) { return uq112x112(uint224(Babylonian.sqrt(uint(self._x) << 112))); } uint8 safeShiftBits = 255 - BitMath.mostSignificantBit(self._x); safeShiftBits -= safeShiftBits % 2; return uq112x112( uint224( Babylonian.sqrt(uint(self._x) << safeShiftBits) << ((112 - safeShiftBits) / 2) ) ); } } ////// src/libraries/UniswapV2OracleLibrary.sol /* pragma solidity 0.8.9; */ /* import "../interfaces/uniswap/IUniswapV2Pair.sol"; */ /* import "./FixedPoint.sol"; */ // library with helper methods for oracles that are concerned with computing average prices library UniswapV2OracleLibrary { using FixedPoint for *; // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1] function currentBlockTimestamp() internal view returns (uint32) { return uint32(block.timestamp % 2**32); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices(address pair) internal view returns ( uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp ) { blockTimestamp = currentBlockTimestamp(); price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast(); price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast(); // if time has elapsed since the last update on the pair, mock the accumulated price values ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ) = IUniswapV2Pair(pair).getReserves(); if (blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint32 timeElapsed = blockTimestamp - blockTimestampLast; // addition overflow is desired // counterfactual price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed; // counterfactual price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed; } } } ////// src/UniswapTwap.sol /* pragma solidity 0.8.9; */ /* import "@openzeppelin/contracts/access/Ownable.sol"; */ /* import "./interfaces/chainlink/IAggregatorV3.sol"; */ /* import "./interfaces/uniswap/IUniswapV2Pair.sol"; */ /* import "./interfaces/IUniswapTWAP.sol"; */ /* import "./libraries/UniswapV2OracleLibrary.sol"; */ /* import "./libraries/FixedPoint.sol"; */ /** * @notice Return absolute value of |x - y| */ function abs(uint x, uint y) pure returns (uint) { if (x >= y) { return x - y; } return y - x; } contract UniswapTwap is IUniswapTWAP, Ownable { using FixedPoint for FixedPoint.uq112x112; using FixedPoint for FixedPoint.uq144x112; struct ExchangePair { uint nativeTokenPriceCumulative; FixedPoint.uq112x112 nativeTokenPriceAverage; uint lastMeasurement; uint updatePeriod; // true if token0 = vader bool isFirst; } event SetOracle(address oracle); // 1 Vader = 1e18 uint private constant ONE_VADER = 1e18; // Denominator to calculate difference in Vader / ETH TWAP and spot price. uint private constant MAX_PRICE_DIFF_DENOMINATOR = 1e5; // max for maxUpdateWindow uint private constant MAX_UPDATE_WINDOW = 30 days; /* ========== STATE VARIABLES ========== */ address public immutable vader; // Vader ETH pair IUniswapV2Pair public immutable pair; // Set to pairData.updatePeriod. // maxUpdateWindow is called by other contracts. uint public maxUpdateWindow; ExchangePair public pairData; IAggregatorV3 public oracle; // Numberator to calculate max allowed difference between Vader / ETH TWAP // and spot price. // maxPriceDiff must be initialized to MAX_PRICE_DIFF_DENOMINATOR and kept // until TWAP price is close to spot price for _updateVaderPrice to not fail. uint public maxPriceDiff = MAX_PRICE_DIFF_DENOMINATOR; address public keeper; modifier onlyAuthorized() { require( msg.sender == owner() || msg.sender == keeper, "not authorized" ); _; } constructor( address _vader, IUniswapV2Pair _pair, IAggregatorV3 _oracle, uint _updatePeriod ) { require(_vader != address(0), "vader = 0 address"); vader = _vader; require(_oracle.decimals() == 8, "oracle decimals != 8"); oracle = _oracle; pair = _pair; _addVaderPair(_vader, _pair, _updatePeriod); } /* ========== VIEWS ========== */ /** * @notice Get Vader USD price calculated from Vader / ETH price from * last update. **/ function getStaleVaderPrice() external view returns (uint) { return _calculateVaderPrice(); } /** * @notice Get ETH / USD price from Chainlink. 1 USD = 1e8. **/ function getChainlinkPrice() public view returns (uint) { (uint80 roundID, int price, , , uint80 answeredInRound) = oracle .latestRoundData(); require(answeredInRound >= roundID, "stale Chainlink price"); require(price > 0, "chainlink price = 0"); return uint(price); } /** * @notice Helper function to decode and return Vader / ETH TWAP price **/ function getVaderEthPriceAverage() public view returns (uint) { return pairData.nativeTokenPriceAverage.mul(ONE_VADER).decode144(); } /** * @notice Helper function to decode and return Vader / ETH spot price **/ function getVaderEthSpotPrice() public view returns (uint) { (uint reserve0, uint reserve1, ) = pair.getReserves(); (uint vaderReserve, uint ethReserve) = pairData.isFirst ? (reserve0, reserve1) : (reserve1, reserve0); return FixedPoint .fraction(ethReserve, vaderReserve) .mul(ONE_VADER) .decode144(); } /* ========== MUTATIVE FUNCTIONS ========== */ /** * @notice Update Vader / ETH price and return Vader / USD price. This function will need to be executed at least twice to return sensible Vader / USD price. **/ // NOTE: Fails until _updateVaderPrice is called atlease twice for // nativeTokenPriceAverage to be > 0 function getVaderPrice() external returns (uint) { _updateVaderPrice(); return _calculateVaderPrice(); } /** * @notice Update Vader / ETH price. **/ function syncVaderPrice() external { _updateVaderPrice(); } /** * @notice Update Vader / ETH price. **/ function _updateVaderPrice() private { uint timeElapsed = block.timestamp - pairData.lastMeasurement; // NOTE: save gas and re-entrancy protection. if (timeElapsed < pairData.updatePeriod) return; bool isFirst = pairData.isFirst; ( uint price0Cumulative, uint price1Cumulative, uint currentMeasurement ) = UniswapV2OracleLibrary.currentCumulativePrices(address(pair)); uint priceCumulativeEnd = isFirst ? price0Cumulative : price1Cumulative; uint priceCumulativeStart = pairData.nativeTokenPriceCumulative; // NOTE: Overflow is desired // Difference between 2 cumulative prices will be correct even if the // latest price cumulative overflowed. unchecked { pairData.nativeTokenPriceAverage = FixedPoint.uq112x112( uint224( (priceCumulativeEnd - priceCumulativeStart) / timeElapsed ) ); } pairData.nativeTokenPriceCumulative = priceCumulativeEnd; pairData.lastMeasurement = currentMeasurement; // check TWAP and spot price difference is not too big if (maxPriceDiff < MAX_PRICE_DIFF_DENOMINATOR) { // p = TWAP price // s = spot price // d = max price diff // D = MAX_PRICE_DIFF_DENOMINATOR // |p - s| / p <= d / D uint twapPrice = getVaderEthPriceAverage(); uint spotPrice = getVaderEthSpotPrice(); require(twapPrice > 0, "TWAP = 0"); require(spotPrice > 0, "spot price = 0"); // NOTE: if maxPriceDiff = 0, then this check will most likely fail require( (abs(twapPrice, spotPrice) * MAX_PRICE_DIFF_DENOMINATOR) / twapPrice <= maxPriceDiff, "price diff > max" ); } } /** * @notice Calculates Vader price in USD, 1 USD = 1e18. **/ function _calculateVaderPrice() private view returns (uint vaderUsdPrice) { // USD / ETH, 8 decimals uint usdPerEth = getChainlinkPrice(); // ETH / Vader, 18 decimals uint ethPerVader = pairData .nativeTokenPriceAverage .mul(ONE_VADER) .decode144(); // divide by 1e8 from Chainlink price vaderUsdPrice = (usdPerEth * ethPerVader) / 1e8; require(vaderUsdPrice > 0, "vader usd price = 0"); } /** * @notice Initialize pairData. * @param _vader Address of Vader. * @param _pair Address of Vader / ETH Uniswap V2 pair. * @param _updatePeriod Amout of time that has to elapse before Vader / ETH * TWAP can be updated. **/ function _addVaderPair( address _vader, IUniswapV2Pair _pair, uint _updatePeriod ) private { require(_updatePeriod != 0, "update period = 0"); bool isFirst = _pair.token0() == _vader; address nativeAsset = isFirst ? _pair.token0() : _pair.token1(); require(nativeAsset == _vader, "unsupported pair"); pairData.isFirst = isFirst; pairData.lastMeasurement = block.timestamp; _setUpdatePeriod(_updatePeriod); pairData.nativeTokenPriceCumulative = isFirst ? _pair.price0CumulativeLast() : _pair.price1CumulativeLast(); // NOTE: pairData.nativeTokenPriceAverage = 0 } /** * @notice Set keeper address. * @param _keeper Address of keeper. */ function setKeeper(address _keeper) external onlyOwner { // NOTE: allow _keeper to be 0 address keeper = _keeper; } /** * @notice Set Chainlink oracle. * @param _oracle Address of Chainlink price oracle. **/ function setOracle(IAggregatorV3 _oracle) external onlyOwner { require(_oracle.decimals() == 8, "oracle decimals != 8"); oracle = _oracle; emit SetOracle(address(_oracle)); } /** * @notice Set updatePeriod. * @param _updatePeriod New update period for Vader / ETH TWAP **/ function _setUpdatePeriod(uint _updatePeriod) private { require(_updatePeriod <= MAX_UPDATE_WINDOW, "update period > max"); pairData.updatePeriod = _updatePeriod; maxUpdateWindow = _updatePeriod; } function setUpdatePeriod(uint _updatePeriod) external onlyOwner { _setUpdatePeriod(_updatePeriod); } /** * @notice Set maxPriceDiff. * @param _maxPriceDiff Numberator to calculate max allowed difference * between Vader / ETH TWAP and spot price. **/ function _setMaxPriceDiff(uint _maxPriceDiff) private { require( _maxPriceDiff <= MAX_PRICE_DIFF_DENOMINATOR, "price diff > max" ); maxPriceDiff = _maxPriceDiff; } function setMaxPriceDiff(uint _maxPriceDiff) external onlyOwner { _setMaxPriceDiff(_maxPriceDiff); } /** * @notice Force update Vader TWAP price even if has deviated significantly * from Vader / ETH spot price. */ function forceUpdateVaderPrice() external onlyAuthorized { uint _maxPriceDiff = maxPriceDiff; _setMaxPriceDiff(MAX_PRICE_DIFF_DENOMINATOR); _updateVaderPrice(); _setMaxPriceDiff(_maxPriceDiff); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vader","type":"address"},{"internalType":"contract IUniswapV2Pair","name":"_pair","type":"address"},{"internalType":"contract IAggregatorV3","name":"_oracle","type":"address"},{"internalType":"uint256","name":"_updatePeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"SetOracle","type":"event"},{"inputs":[],"name":"forceUpdateVaderPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainlinkPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStaleVaderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaderEthPriceAverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaderEthSpotPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriceDiff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUpdateWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IAggregatorV3","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairData","outputs":[{"internalType":"uint256","name":"nativeTokenPriceCumulative","type":"uint256"},{"components":[{"internalType":"uint224","name":"_x","type":"uint224"}],"internalType":"struct FixedPoint.uq112x112","name":"nativeTokenPriceAverage","type":"tuple"},{"internalType":"uint256","name":"lastMeasurement","type":"uint256"},{"internalType":"uint256","name":"updatePeriod","type":"uint256"},{"internalType":"bool","name":"isFirst","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPriceDiff","type":"uint256"}],"name":"setMaxPriceDiff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAggregatorV3","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_updatePeriod","type":"uint256"}],"name":"setUpdatePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncVaderPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c0604052620186a06008553480156200001857600080fd5b5060405162001c6a38038062001c6a8339810160408190526200003b91620005ba565b6200004633620001b5565b6001600160a01b038416620000965760405162461bcd60e51b81526020600482015260116024820152707661646572203d2030206164647265737360781b60448201526064015b60405180910390fd5b836001600160a01b03166080816001600160a01b031681525050816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620000ea57600080fd5b505afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000614565b60ff16600814620001795760405162461bcd60e51b815260206004820152601460248201527f6f7261636c6520646563696d616c7320213d203800000000000000000000000060448201526064016200008d565b600780546001600160a01b0319166001600160a01b0384811691909117909155831660a052620001ab84848362000205565b505050506200067a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80620002485760405162461bcd60e51b8152602060048201526011602482015270075706461746520706572696f64203d203607c1b60448201526064016200008d565b6000836001600160a01b0316836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028e57600080fd5b505afa158015620002a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c9919062000640565b6001600160a01b03161490506000816200035857836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031757600080fd5b505afa1580156200032c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000352919062000640565b620003cd565b836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200039257600080fd5b505afa158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000640565b9050846001600160a01b0316816001600160a01b031614620004255760405162461bcd60e51b815260206004820152601060248201526f3ab739bab83837b93a32b2103830b4b960811b60448201526064016200008d565b6006805460ff191683151517905542600455620004428362000542565b81620004c357836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156200048257600080fd5b505afa15801562000497573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004bd919062000660565b62000538565b836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015620004fd57600080fd5b505afa15801562000512573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000538919062000660565b6002555050505050565b62278d00811115620005975760405162461bcd60e51b815260206004820152601360248201527f75706461746520706572696f64203e206d61780000000000000000000000000060448201526064016200008d565b6005819055600155565b6001600160a01b0381168114620005b757600080fd5b50565b60008060008060808587031215620005d157600080fd5b8451620005de81620005a1565b6020860151909450620005f181620005a1565b60408601519093506200060481620005a1565b6060959095015193969295505050565b6000602082840312156200062757600080fd5b815160ff811681146200063957600080fd5b9392505050565b6000602082840312156200065357600080fd5b81516200063981620005a1565b6000602082840312156200067357600080fd5b5051919050565b60805160a0516115bc620006ae60003960008181610220015281816104ff0152610a0d0152600061016501526115bc6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637adbf973116100b8578063ad16059c1161007c578063ad16059c14610255578063dcf206661461025d578063e55fae77146102c2578063e5aa25bf146102d5578063f2fde38b146102de578063fea4c541146102f157600080fd5b80637adbf973146101e45780637dc0d1d0146101f75780638da5cb5b1461020a578063a8aa1b311461021b578063aced16611461024257600080fd5b806347680bdb116100ff57806347680bdb146101b15780635e870ef8146101b957806361d3b4c0146101c1578063715018a6146101c9578063748747e6146101d157600080fd5b806305c552d81461013c5780631524551b146101585780631f494b641461016057806323b5f41a1461019f5780633aeef3d3146101a9575b600080fd5b61014560085481565b6040519081526020015b60405180910390f35b610145610304565b6101877f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014f565b6101a7610313565b005b61014561039b565b6101456104dc565b6101a76104ee565b6101456104f8565b6101a76105f5565b6101a76101df366004611325565b610629565b6101a76101f2366004611325565b610675565b600754610187906001600160a01b031681565b6000546001600160a01b0316610187565b6101877f000000000000000000000000000000000000000000000000000000000000000081565b600954610187906001600160a01b031681565b6101456107ad565b60025460408051602081019091526003546001600160e01b03168152600454600554600654610290949392919060ff1685565b6040805195865293516001600160e01b031660208601529284019190915260608301521515608082015260a00161014f565b6101a76102d0366004611342565b6107ed565b61014560015481565b6101a76102ec366004611325565b610820565b6101a76102ff366004611342565b6108b8565b600061030e6108e2565b905090565b6000546001600160a01b031633148061033657506009546001600160a01b031633145b6103785760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b600854610387620186a0610993565b61038f6109de565b61039881610993565b50565b600080600080600760009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156103ef57600080fd5b505afa158015610403573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610427919061137a565b94505050925092508269ffffffffffffffffffff168169ffffffffffffffffffff16101561048f5760405162461bcd60e51b81526020600482015260156024820152747374616c6520436861696e6c696e6b20707269636560581b604482015260640161036f565b600082136104d55760405162461bcd60e51b81526020600482015260136024820152720636861696e6c696e6b207072696365203d203606c1b604482015260640161036f565b5092915050565b60006104e66109de565b61030e6108e2565b6104f66109de565b565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561055657600080fd5b505afa15801561056a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058e91906113e1565b506006546001600160701b03928316945091169150600090819060ff166105b65782846105b9565b83835b915091506105e36105dc670de0b6b3a76400006105d68486610bb4565b90610cea565b5160701c90565b6001600160901b031694505050505090565b6000546001600160a01b0316331461061f5760405162461bcd60e51b815260040161036f90611431565b6104f66000610d88565b6000546001600160a01b031633146106535760405162461bcd60e51b815260040161036f90611431565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461069f5760405162461bcd60e51b815260040161036f90611431565b806001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d857600080fd5b505afa1580156106ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107109190611466565b60ff166008146107595760405162461bcd60e51b81526020600482015260146024820152730dee4c2c6d8ca40c8cac6d2dac2d8e640427a40760631b604482015260640161036f565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319060200160405180910390a150565b60408051602081019091526003546001600160e01b031681526000906107df906105dc90670de0b6b3a7640000610cea565b6001600160901b0316905090565b6000546001600160a01b031633146108175760405162461bcd60e51b815260040161036f90611431565b61039881610dd8565b6000546001600160a01b0316331461084a5760405162461bcd60e51b815260040161036f90611431565b6001600160a01b0381166108af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161036f565b61039881610d88565b6000546001600160a01b0316331461038f5760405162461bcd60e51b815260040161036f90611431565b6000806108ed61039b565b60408051602081019091526003546001600160e01b03168152909150600090610922906105dc90670de0b6b3a7640000610cea565b6001600160901b031690506305f5e10061093c828461149f565b61094691906114d4565b92506000831161098e5760405162461bcd60e51b81526020600482015260136024820152720766164657220757364207072696365203d203606c1b604482015260640161036f565b505090565b620186a08111156109d95760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b600855565b6004546000906109ee90426114e8565b6005549091508110156109fe5750565b60065460ff1660008080610a317f0000000000000000000000000000000000000000000000000000000000000000610e2b565b63ffffffff16925092509250600084610a4a5782610a4c565b835b600254604080516020810190915291925090808883850381610a7057610a706114be565b046001600160e01b039081169091529051600380546001600160e01b0319169190921617905560028290556004839055600854620186a01115610bab576000610ab76107ad565b90506000610ac36104f8565b905060008211610b005760405162461bcd60e51b8152602060048201526008602482015267054574150203d20360c41b604482015260640161036f565b60008111610b415760405162461bcd60e51b815260206004820152600e60248201526d073706f74207072696365203d20360941b604482015260640161036f565b60085482620186a0610b53858561104f565b610b5d919061149f565b610b6791906114d4565b1115610ba85760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b50505b50505050505050565b60408051602081019091526000815260008211610c225760405162461bcd60e51b815260206004820152602660248201527f4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206260448201526579207a65726f60d01b606482015260840161036f565b82610c3c5750604080516020810190915260008152610ce4565b6001600160901b038311610cd3576000610c5a83607086901b6114d4565b90506001600160e01b03811115610cb35760405162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015260640161036f565b6040518060200160405280826001600160e01b0316815250915050610ce4565b6000610c5a84600160701b8561107a565b92915050565b6040805160208101909152600081526000821580610d27575083516001600160e01b031683610d19818361149f565b9250610d2590836114d4565b145b610d735760405162461bcd60e51b815260206004820152601960248201527f4669786564506f696e743a3a6d756c3a206f766572666c6f7700000000000000604482015260640161036f565b60408051602081019091529081529392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62278d00811115610e215760405162461bcd60e51b81526020600482015260136024820152720eae0c8c2e8ca40e0cae4d2dec8407c40dac2f606b1b604482015260640161036f565b6005819055600155565b6000806000610e38611142565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7357600080fd5b505afa158015610e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eab91906114ff565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee657600080fd5b505afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1e91906114ff565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9691906113e1565b9250925092508363ffffffff168163ffffffff1614611045576000610fbb8286611518565b90508063ffffffff16610fe0846001600160701b0316866001600160701b0316610bb4565b51610ff491906001600160e01b031661149f565b610ffe908861153d565b96508063ffffffff16611023856001600160701b0316856001600160701b0316610bb4565b5161103791906001600160e01b031661149f565b611041908761153d565b9550505b5050509193909250565b60008183106110695761106282846114e8565b9050610ce4565b61107383836114e8565b9392505050565b60008060006110898686611153565b915091506000848061109d5761109d6114be565b8688099050828111156110b8576110b56001836114e8565b91505b6110c281846114e8565b9250816110dd576110d385846114d4565b9350505050611073565b84821061112c5760405162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f57000000000000604482015260640161036f565b611137838387611195565b979650505050505050565b600061030e64010000000042611555565b600080806000198486099050611169848661149f565b925061117583826114e8565b91508281101561118d5761118a6001836114e8565b91505b509250929050565b6000806111a183611569565b831690506111af81846114d4565b92506111bb81866114d4565b9450806111c781611569565b6111d191906114d4565b6111dc90600161153d565b6111e6908561149f565b6111f0908661153d565b945060016111fe818561149f565b6112099060026114e8565b611213908261149f565b905061121f818561149f565b61122a9060026114e8565b611234908261149f565b9050611240818561149f565b61124b9060026114e8565b611255908261149f565b9050611261818561149f565b61126c9060026114e8565b611276908261149f565b9050611282818561149f565b61128d9060026114e8565b611297908261149f565b90506112a3818561149f565b6112ae9060026114e8565b6112b8908261149f565b90506112c4818561149f565b6112cf9060026114e8565b6112d9908261149f565b90506112e5818561149f565b6112f09060026114e8565b6112fa908261149f565b9050611306818761149f565b9695505050505050565b6001600160a01b038116811461039857600080fd5b60006020828403121561133757600080fd5b813561107381611310565b60006020828403121561135457600080fd5b5035919050565b805169ffffffffffffffffffff8116811461137557600080fd5b919050565b600080600080600060a0868803121561139257600080fd5b61139b8661135b565b94506020860151935060408601519250606086015191506113be6080870161135b565b90509295509295909350565b80516001600160701b038116811461137557600080fd5b6000806000606084860312156113f657600080fd5b6113ff846113ca565b925061140d602085016113ca565b9150604084015163ffffffff8116811461142657600080fd5b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561147857600080fd5b815160ff8116811461107357600080fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156114b9576114b9611489565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826114e3576114e36114be565b500490565b6000828210156114fa576114fa611489565b500390565b60006020828403121561151157600080fd5b5051919050565b600063ffffffff8381169083168181101561153557611535611489565b039392505050565b6000821982111561155057611550611489565b500190565b600082611564576115646114be565b500690565b6000600160ff1b82141561157f5761157f611489565b506000039056fea264697066735822122095ea915ba1a77a4de8d25a0cbf7afa3b9a4fce90bfc630f660f44a5e8625720b64736f6c634300080900330000000000000000000000002602278ee1882889b946eb11dc0e810075650983000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637adbf973116100b8578063ad16059c1161007c578063ad16059c14610255578063dcf206661461025d578063e55fae77146102c2578063e5aa25bf146102d5578063f2fde38b146102de578063fea4c541146102f157600080fd5b80637adbf973146101e45780637dc0d1d0146101f75780638da5cb5b1461020a578063a8aa1b311461021b578063aced16611461024257600080fd5b806347680bdb116100ff57806347680bdb146101b15780635e870ef8146101b957806361d3b4c0146101c1578063715018a6146101c9578063748747e6146101d157600080fd5b806305c552d81461013c5780631524551b146101585780631f494b641461016057806323b5f41a1461019f5780633aeef3d3146101a9575b600080fd5b61014560085481565b6040519081526020015b60405180910390f35b610145610304565b6101877f0000000000000000000000002602278ee1882889b946eb11dc0e81007565098381565b6040516001600160a01b03909116815260200161014f565b6101a7610313565b005b61014561039b565b6101456104dc565b6101a76104ee565b6101456104f8565b6101a76105f5565b6101a76101df366004611325565b610629565b6101a76101f2366004611325565b610675565b600754610187906001600160a01b031681565b6000546001600160a01b0316610187565b6101877f000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa81565b600954610187906001600160a01b031681565b6101456107ad565b60025460408051602081019091526003546001600160e01b03168152600454600554600654610290949392919060ff1685565b6040805195865293516001600160e01b031660208601529284019190915260608301521515608082015260a00161014f565b6101a76102d0366004611342565b6107ed565b61014560015481565b6101a76102ec366004611325565b610820565b6101a76102ff366004611342565b6108b8565b600061030e6108e2565b905090565b6000546001600160a01b031633148061033657506009546001600160a01b031633145b6103785760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b600854610387620186a0610993565b61038f6109de565b61039881610993565b50565b600080600080600760009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156103ef57600080fd5b505afa158015610403573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610427919061137a565b94505050925092508269ffffffffffffffffffff168169ffffffffffffffffffff16101561048f5760405162461bcd60e51b81526020600482015260156024820152747374616c6520436861696e6c696e6b20707269636560581b604482015260640161036f565b600082136104d55760405162461bcd60e51b81526020600482015260136024820152720636861696e6c696e6b207072696365203d203606c1b604482015260640161036f565b5092915050565b60006104e66109de565b61030e6108e2565b6104f66109de565b565b60008060007f000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561055657600080fd5b505afa15801561056a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058e91906113e1565b506006546001600160701b03928316945091169150600090819060ff166105b65782846105b9565b83835b915091506105e36105dc670de0b6b3a76400006105d68486610bb4565b90610cea565b5160701c90565b6001600160901b031694505050505090565b6000546001600160a01b0316331461061f5760405162461bcd60e51b815260040161036f90611431565b6104f66000610d88565b6000546001600160a01b031633146106535760405162461bcd60e51b815260040161036f90611431565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461069f5760405162461bcd60e51b815260040161036f90611431565b806001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d857600080fd5b505afa1580156106ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107109190611466565b60ff166008146107595760405162461bcd60e51b81526020600482015260146024820152730dee4c2c6d8ca40c8cac6d2dac2d8e640427a40760631b604482015260640161036f565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319060200160405180910390a150565b60408051602081019091526003546001600160e01b031681526000906107df906105dc90670de0b6b3a7640000610cea565b6001600160901b0316905090565b6000546001600160a01b031633146108175760405162461bcd60e51b815260040161036f90611431565b61039881610dd8565b6000546001600160a01b0316331461084a5760405162461bcd60e51b815260040161036f90611431565b6001600160a01b0381166108af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161036f565b61039881610d88565b6000546001600160a01b0316331461038f5760405162461bcd60e51b815260040161036f90611431565b6000806108ed61039b565b60408051602081019091526003546001600160e01b03168152909150600090610922906105dc90670de0b6b3a7640000610cea565b6001600160901b031690506305f5e10061093c828461149f565b61094691906114d4565b92506000831161098e5760405162461bcd60e51b81526020600482015260136024820152720766164657220757364207072696365203d203606c1b604482015260640161036f565b505090565b620186a08111156109d95760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b600855565b6004546000906109ee90426114e8565b6005549091508110156109fe5750565b60065460ff1660008080610a317f000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa610e2b565b63ffffffff16925092509250600084610a4a5782610a4c565b835b600254604080516020810190915291925090808883850381610a7057610a706114be565b046001600160e01b039081169091529051600380546001600160e01b0319169190921617905560028290556004839055600854620186a01115610bab576000610ab76107ad565b90506000610ac36104f8565b905060008211610b005760405162461bcd60e51b8152602060048201526008602482015267054574150203d20360c41b604482015260640161036f565b60008111610b415760405162461bcd60e51b815260206004820152600e60248201526d073706f74207072696365203d20360941b604482015260640161036f565b60085482620186a0610b53858561104f565b610b5d919061149f565b610b6791906114d4565b1115610ba85760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b50505b50505050505050565b60408051602081019091526000815260008211610c225760405162461bcd60e51b815260206004820152602660248201527f4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206260448201526579207a65726f60d01b606482015260840161036f565b82610c3c5750604080516020810190915260008152610ce4565b6001600160901b038311610cd3576000610c5a83607086901b6114d4565b90506001600160e01b03811115610cb35760405162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015260640161036f565b6040518060200160405280826001600160e01b0316815250915050610ce4565b6000610c5a84600160701b8561107a565b92915050565b6040805160208101909152600081526000821580610d27575083516001600160e01b031683610d19818361149f565b9250610d2590836114d4565b145b610d735760405162461bcd60e51b815260206004820152601960248201527f4669786564506f696e743a3a6d756c3a206f766572666c6f7700000000000000604482015260640161036f565b60408051602081019091529081529392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62278d00811115610e215760405162461bcd60e51b81526020600482015260136024820152720eae0c8c2e8ca40e0cae4d2dec8407c40dac2f606b1b604482015260640161036f565b6005819055600155565b6000806000610e38611142565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7357600080fd5b505afa158015610e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eab91906114ff565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee657600080fd5b505afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1e91906114ff565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9691906113e1565b9250925092508363ffffffff168163ffffffff1614611045576000610fbb8286611518565b90508063ffffffff16610fe0846001600160701b0316866001600160701b0316610bb4565b51610ff491906001600160e01b031661149f565b610ffe908861153d565b96508063ffffffff16611023856001600160701b0316856001600160701b0316610bb4565b5161103791906001600160e01b031661149f565b611041908761153d565b9550505b5050509193909250565b60008183106110695761106282846114e8565b9050610ce4565b61107383836114e8565b9392505050565b60008060006110898686611153565b915091506000848061109d5761109d6114be565b8688099050828111156110b8576110b56001836114e8565b91505b6110c281846114e8565b9250816110dd576110d385846114d4565b9350505050611073565b84821061112c5760405162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f57000000000000604482015260640161036f565b611137838387611195565b979650505050505050565b600061030e64010000000042611555565b600080806000198486099050611169848661149f565b925061117583826114e8565b91508281101561118d5761118a6001836114e8565b91505b509250929050565b6000806111a183611569565b831690506111af81846114d4565b92506111bb81866114d4565b9450806111c781611569565b6111d191906114d4565b6111dc90600161153d565b6111e6908561149f565b6111f0908661153d565b945060016111fe818561149f565b6112099060026114e8565b611213908261149f565b905061121f818561149f565b61122a9060026114e8565b611234908261149f565b9050611240818561149f565b61124b9060026114e8565b611255908261149f565b9050611261818561149f565b61126c9060026114e8565b611276908261149f565b9050611282818561149f565b61128d9060026114e8565b611297908261149f565b90506112a3818561149f565b6112ae9060026114e8565b6112b8908261149f565b90506112c4818561149f565b6112cf9060026114e8565b6112d9908261149f565b90506112e5818561149f565b6112f09060026114e8565b6112fa908261149f565b9050611306818761149f565b9695505050505050565b6001600160a01b038116811461039857600080fd5b60006020828403121561133757600080fd5b813561107381611310565b60006020828403121561135457600080fd5b5035919050565b805169ffffffffffffffffffff8116811461137557600080fd5b919050565b600080600080600060a0868803121561139257600080fd5b61139b8661135b565b94506020860151935060408601519250606086015191506113be6080870161135b565b90509295509295909350565b80516001600160701b038116811461137557600080fd5b6000806000606084860312156113f657600080fd5b6113ff846113ca565b925061140d602085016113ca565b9150604084015163ffffffff8116811461142657600080fd5b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561147857600080fd5b815160ff8116811461107357600080fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156114b9576114b9611489565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826114e3576114e36114be565b500490565b6000828210156114fa576114fa611489565b500390565b60006020828403121561151157600080fd5b5051919050565b600063ffffffff8381169083168181101561153557611535611489565b039392505050565b6000821982111561155057611550611489565b500190565b600082611564576115646114be565b500690565b6000600160ff1b82141561157f5761157f611489565b506000039056fea264697066735822122095ea915ba1a77a4de8d25a0cbf7afa3b9a4fce90bfc630f660f44a5e8625720b64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002602278ee1882889b946eb11dc0e810075650983000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _vader (address): 0x2602278EE1882889B946eb11DC0E810075650983
Arg [1] : _pair (address): 0x452c60e1E3Ae0965Cd27dB1c7b3A525d197Ca0Aa
Arg [2] : _oracle (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [3] : _updatePeriod (uint256): 1
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000002602278ee1882889b946eb11dc0e810075650983
Arg [1] : 000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa
Arg [2] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
19299:9748:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20653:53;;;;;;;;;160:25:1;;;148:2;133:18;20653:53:0;;;;;;;;21490:107;;;:::i;20088:30::-;;;;;;;;-1:-1:-1;;;;;360:32:1;;;342:51;;330:2;315:18;20088:30:0;196:203:1;28808:236:0;;;:::i;:::-;;21689:323;;;:::i;23175:127::-;;;:::i;23371:73::-;;;:::i;22365:426::-;;;:::i;2815:103::-;;;:::i;27173:138::-;;;;;;:::i;:::-;;:::i;27434:206::-;;;;;;:::i;:::-;;:::i;20352:27::-;;;;;-1:-1:-1;;;;;20352:27:0;;;2164:87;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;2164:87;;20148:36;;;;;20715:21;;;;;-1:-1:-1;;;;;20715:21:0;;;22115:147;;;:::i;20317:28::-;;;;;;;;;;;;;;-1:-1:-1;;;;;20317:28:0;;;;;;;;;;;;;;;;;;;;;;;1829:25:1;;;1894:13;;-1:-1:-1;;;;;1890:39:1;1885:2;1870:18;;1863:67;1946:18;;;1939:34;;;;2004:2;1989:18;;1982:34;2060:14;2053:22;2047:3;2032:19;;2025:51;1816:3;1801:19;20317:28:0;1524:558:1;28006:114:0;;;;;;:::i;:::-;;:::i;20283:27::-;;;;;;3073:201;;;;;;:::i;:::-;;:::i;28542:114::-;;;;;;:::i;:::-;;:::i;21490:107::-;21543:4;21567:22;:20;:22::i;:::-;21560:29;;21490:107;:::o;28808:236::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;20804:10;:21;;:45;;-1:-1:-1;20843:6:0;;-1:-1:-1;;;;;20843:6:0;20829:10;:20;20804:45;20782:109;;;;-1:-1:-1;;;20782:109:0;;2474:2:1;20782:109:0;;;2456:21:1;2513:2;2493:18;;;2486:30;-1:-1:-1;;;2532:18:1;;;2525:44;2586:18;;20782:109:0;;;;;;;;;28897:12:::1;::::0;28920:44:::1;19939:3;28920:16;:44::i;:::-;28975:19;:17;:19::i;:::-;29005:31;29022:13;29005:16;:31::i;:::-;28865:179;28808:236::o:0;21689:323::-;21739:4;21757:14;21773:9;21788:22;21814:6;;;;;;;;;-1:-1:-1;;;;;21814:6:0;-1:-1:-1;;;;;21814:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21756:96;;;;;;;;21890:7;21871:26;;:15;:26;;;;21863:60;;;;-1:-1:-1;;;21863:60:0;;3479:2:1;21863:60:0;;;3461:21:1;3518:2;3498:18;;;3491:30;-1:-1:-1;;;3537:18:1;;;3530:51;3598:18;;21863:60:0;3277:345:1;21863:60:0;21950:1;21942:5;:9;21934:41;;;;-1:-1:-1;;;21934:41:0;;3829:2:1;21934:41:0;;;3811:21:1;3868:2;3848:18;;;3841:30;-1:-1:-1;;;3887:18:1;;;3880:49;3946:18;;21934:41:0;3627:343:1;21934:41:0;-1:-1:-1;21998:5:0;21689:323;-1:-1:-1;;21689:323:0:o;23175:127::-;23218:4;23235:19;:17;:19::i;:::-;23272:22;:20;:22::i;23371:73::-;23417:19;:17;:19::i;:::-;23371:73::o;22365:426::-;22418:4;22436:13;22451;22470:4;-1:-1:-1;;;;;22470:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;22538:16:0;;-1:-1:-1;;;;;22435:53:0;;;;-1:-1:-1;22435:53:0;;;-1:-1:-1;22500:17:0;;;;22538:16;;:88;;22607:8;22617;22538:88;;;22571:8;22581;22538:88;22499:127;;;;22657:126;:96;19797:4;22657:63;22695:10;22707:12;22657:37;:63::i;:::-;:85;;:96::i;:::-;11627:7;10568:3;11627:21;;11527:130;22657:126;-1:-1:-1;;;;;22637:146:0;;;;;;;22365:426;:::o;2815:103::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;2880:30:::1;2907:1;2880:18;:30::i;27173:138::-:0;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;27287:6:::1;:16:::0;;-1:-1:-1;;;;;;27287:16:0::1;-1:-1:-1::0;;;;;27287:16:0;;;::::1;::::0;;;::::1;::::0;;27173:138::o;27434:206::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;27514:7:::1;-1:-1:-1::0;;;;;27514:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:23;;27536:1;27514:23;27506:56;;;::::0;-1:-1:-1;;;27506:56:0;;5464:2:1;27506:56:0::1;::::0;::::1;5446:21:1::0;5503:2;5483:18;;;5476:30;-1:-1:-1;;;5522:18:1;;;5515:50;5582:18;;27506:56:0::1;5262:344:1::0;27506:56:0::1;27573:6;:16:::0;;-1:-1:-1;;;;;;27573:16:0::1;-1:-1:-1::0;;;;;27573:16:0;::::1;::::0;;::::1;::::0;;;27605:27:::1;::::0;342:51:1;;;27605:27:0::1;::::0;330:2:1;315:18;27605:27:0::1;;;;;;;27434:206:::0;:::o;22115:147::-;22195:36;;;;;;;;;:32;:36;-1:-1:-1;;;;;22195:36:0;;;22171:4;;22195:59;;:47;;19797:4;22195:36;:47::i;:59::-;-1:-1:-1;;;;;22188:66:0;;;22115:147;:::o;28006:114::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;28081:31:::1;28098:13;28081:16;:31::i;3073:201::-:0;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3162:22:0;::::1;3154:73;;;::::0;-1:-1:-1;;;3154:73:0;;5813:2:1;3154:73:0::1;::::0;::::1;5795:21:1::0;5852:2;5832:18;;;5825:30;5891:34;5871:18;;;5864:62;-1:-1:-1;;;5942:18:1;;;5935:36;5988:19;;3154:73:0::1;5611:402:1::0;3154:73:0::1;3238:28;3257:8;3238:18;:28::i;28542:114::-:0;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;25586:496::-;25640:18;25705:14;25722:19;:17;:19::i;:::-;25808:64;;;;;;;;;:46;:64;-1:-1:-1;;;;;25808:64:0;;;25705:36;;-1:-1:-1;25789:16:0;;25808:101;;:75;;19797:4;25808:64;:75::i;:101::-;-1:-1:-1;;;;;25789:120:0;;-1:-1:-1;26011:3:0;25984:23;25789:120;25984:9;:23;:::i;:::-;25983:31;;;;:::i;:::-;25967:47;;26049:1;26033:13;:17;26025:49;;;;-1:-1:-1;;;26025:49:0;;6782:2:1;26025:49:0;;;6764:21:1;6821:2;6801:18;;;6794:30;-1:-1:-1;;;6840:18:1;;;6833:49;6899:18;;26025:49:0;6580:343:1;26025:49:0;25660:422;;25586:496;:::o;28313:221::-;19939:3;28400:13;:43;;28378:109;;;;-1:-1:-1;;;28378:109:0;;7130:2:1;28378:109:0;;;7112:21:1;7169:2;7149:18;;;7142:30;-1:-1:-1;;;7188:18:1;;;7181:46;7244:18;;28378:109:0;6928:340:1;28378:109:0;28498:12;:28;28313:221::o;23513:1985::-;23598:24;;23561:16;;23580:42;;:15;:42;:::i;:::-;23706:21;;23561:61;;-1:-1:-1;23692:35:0;;23688:48;;;23729:7;23513:1985::o;23688:48::-;23761:16;;;;23746:12;;;23912:61;23967:4;23912:46;:61::i;:::-;23788:185;;;;;;;;23984:23;24010:7;:45;;24039:16;24010:45;;;24020:16;24010:45;24094:8;:35;24365:160;;;;;;;;;23984:71;;-1:-1:-1;24094:35:0;24365:160;24480:11;24435:41;;;24480:11;24434:57;;;;:::i;:::-;;-1:-1:-1;;;;;24365:160:0;;;;;;24330:195;;:32;:195;;-1:-1:-1;;;;;;24330:195:0;;;;;;;;:8;24547:56;;;24614:24;:45;;;24740:12;;19939:3;-1:-1:-1;24736:755:0;;;24979:14;24996:25;:23;:25::i;:::-;24979:42;;25036:14;25053:22;:20;:22::i;:::-;25036:39;;25110:1;25098:9;:13;25090:34;;;;-1:-1:-1;;;25090:34:0;;7605:2:1;25090:34:0;;;7587:21:1;7644:1;7624:18;;;7617:29;-1:-1:-1;;;7662:18:1;;;7655:38;7710:18;;25090:34:0;7403:331:1;25090:34:0;25159:1;25147:9;:13;25139:40;;;;-1:-1:-1;;;25139:40:0;;7941:2:1;25139:40:0;;;7923:21:1;7980:2;7960:18;;;7953:30;-1:-1:-1;;;7999:18:1;;;7992:44;8053:18;;25139:40:0;7739:338:1;25139:40:0;25415:12;;25381:9;19939:3;25302:25;25306:9;25317;25302:3;:25::i;:::-;:54;;;;:::i;:::-;25301:89;;;;:::i;:::-;:126;;25275:204;;;;-1:-1:-1;;;25275:204:0;;7130:2:1;25275:204:0;;;7112:21:1;7169:2;7149:18;;;7142:30;-1:-1:-1;;;7188:18:1;;;7181:46;7244:18;;25275:204:0;6928:340:1;25275:204:0;24783:708;;24736:755;23550:1948;;;;;;;23513:1985::o;14849:855::-;-1:-1:-1;;;;;;;;;;;;15007:1:0;14993:11;:15;14985:66;;;;-1:-1:-1;;;14985:66:0;;8284:2:1;14985:66:0;;;8266:21:1;8323:2;8303:18;;;8296:30;8362:34;8342:18;;;8335:62;-1:-1:-1;;;8413:18:1;;;8406:36;8459:19;;14985:66:0;8082:402:1;14985:66:0;15066:14;15062:50;;-1:-1:-1;15089:23:0;;;;;;;;;-1:-1:-1;15089:23:0;;15082:30;;15062:50;-1:-1:-1;;;;;15129:30:0;;15125:572;;15176:11;15190:39;15218:11;10568:3;15191:23;;;15190:39;:::i;:::-;15176:53;-1:-1:-1;;;;;;15270:27:0;;;15244:119;;;;-1:-1:-1;;;15244:119:0;;8691:2:1;15244:119:0;;;8673:21:1;8730:2;8710:18;;;8703:30;8769:32;8749:18;;;8742:60;8819:18;;15244:119:0;8489:354:1;15244:119:0;15385:26;;;;;;;;15403:6;-1:-1:-1;;;;;15385:26:0;;;;15378:33;;;;;15125:572;15444:11;15458:45;15474:9;-1:-1:-1;;;15491:11:0;15458:15;:45::i;15125:572::-;14849:855;;;;:::o;11755:304::-;-1:-1:-1;;;;;;;;;;;;11883:6:0;11926;;;:42;;-1:-1:-1;11961:7:0;;-1:-1:-1;;;;;11936:32:0;11956:1;11941:11;11956:1;11936:32;11941:11;:::i;:::-;11937:15;-1:-1:-1;11936:21:0;;11937:15;11936:21;:::i;:::-;:32;11926:42;11904:117;;;;-1:-1:-1;;;11904:117:0;;9050:2:1;11904:117:0;;;9032:21:1;9089:2;9069:18;;;9062:30;9128:27;9108:18;;;9101:55;9173:18;;11904:117:0;8848:349:1;11904:117:0;12039:12;;;;;;;;;;;;;11755:304;-1:-1:-1;;;11755:304:0:o;3434:191::-;3508:16;3527:6;;-1:-1:-1;;;;;3544:17:0;;;-1:-1:-1;;;;;;3544:17:0;;;;;;3577:40;;3527:6;;;;;;;3577:40;;3508:16;3577:40;3497:128;3434:191;:::o;27769:229::-;20023:7;27842:13;:34;;27834:66;;;;-1:-1:-1;;;27834:66:0;;9404:2:1;27834:66:0;;;9386:21:1;9443:2;9423:18;;;9416:30;-1:-1:-1;;;9462:18:1;;;9455:49;9521:18;;27834:66:0;9202:343:1;27834:66:0;27911:21;:37;;;27959:15;:31;27769:229::o;17484:1242::-;17595:21;17631;17667;17733:23;:21;:23::i;:::-;17716:40;;17801:4;-1:-1:-1;;;;;17786:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17767:62;;17874:4;-1:-1:-1;;;;;17859:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17840:62;;18031:16;18062;18093:25;18147:4;-1:-1:-1;;;;;18132:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18016:150;;;;;;18203:14;18181:36;;:18;:36;;;18177:542;;18282:18;18303:35;18320:18;18303:14;:35;:::i;:::-;18282:56;;18534:11;18466:79;;18471:39;18491:8;-1:-1:-1;;;;;18471:39:0;18501:8;-1:-1:-1;;;;;18471:39:0;:19;:39::i;:::-;:42;18466:79;;;-1:-1:-1;;;;;18466:48:0;:79;:::i;:::-;18429:116;;;;:::i;:::-;;;18696:11;18628:79;;18633:39;18653:8;-1:-1:-1;;;;;18633:39:0;18663:8;-1:-1:-1;;;;;18633:39:0;:19;:39::i;:::-;:42;18628:79;;;-1:-1:-1;;;;;18628:48:0;:79;:::i;:::-;18591:116;;;;:::i;:::-;;;18219:500;18177:542;17705:1021;;;17484:1242;;;;;:::o;19174:121::-;19217:4;19239:1;19234;:6;19230:43;;19260:5;19264:1;19260;:5;:::i;:::-;19253:12;;;;19230:43;19286:5;19290:1;19286;:5;:::i;:::-;19279:12;19174:121;-1:-1:-1;;;19174:121:0:o;9632:367::-;9729:4;9747:6;9755;9765:13;9773:1;9776;9765:7;:13::i;:::-;9746:32;;;;9791:7;9814:1;9801:15;;;;;:::i;:::-;9811:1;9808;9801:15;9791:25;;9836:1;9831:2;:6;9827:18;;;9839:6;9844:1;9839:6;;:::i;:::-;;;9827:18;9856:7;9861:2;9856:7;;:::i;:::-;;-1:-1:-1;9880:6:0;9876:24;;9895:5;9899:1;9895;:5;:::i;:::-;9888:12;;;;;;;9876:24;9925:1;9921;:5;9913:44;;;;-1:-1:-1;;;9913:44:0;;10300:2:1;9913:44:0;;;10282:21:1;10339:2;10319:18;;;10312:30;10378:28;10358:18;;;10351:56;10424:18;;9913:44:0;10098:350:1;9913:44:0;9975:16;9983:1;9986;9989;9975:7;:16::i;:::-;9968:23;9632:367;-1:-1:-1;;;;;;;9632:367:0:o;17257:121::-;17313:6;17346:23;17364:5;17346:15;:23;:::i;8933:199::-;8989:6;;;-1:-1:-1;;9036:1:0;9033;9026:28;9016:38;-1:-1:-1;9069:5:0;9073:1;9069;:5;:::i;:::-;9065:9;-1:-1:-1;9089:6:0;9065:9;9089:2;:6;:::i;:::-;9085:10;;9115:1;9110:2;:6;9106:18;;;9118:6;9123:1;9118:6;;:::i;:::-;;;9106:18;9005:127;8933:199;;;;;:::o;9140:484::-;9237:4;;9275:7;9280:1;9275:7;:::i;:::-;9266:17;;;-1:-1:-1;9294:9:0;9266:17;:1;9294:9;:::i;:::-;;-1:-1:-1;9314:9:0;9319:4;9314:9;;:::i;:::-;;-1:-1:-1;9363:4:0;9349:10;9363:4;9349:10;:::i;:::-;9344:23;;;;:::i;:::-;:27;;9370:1;9344:27;:::i;:::-;9339:33;;:1;:33;:::i;:::-;9334:38;;;;:::i;:::-;;-1:-1:-1;9392:1:0;9413:5;9392:1;9413;:5;:::i;:::-;9409:9;;:1;:9;:::i;:::-;9404:14;;;;:::i;:::-;;-1:-1:-1;9438:5:0;9404:14;9438:1;:5;:::i;:::-;9434:9;;:1;:9;:::i;:::-;9429:14;;;;:::i;:::-;;-1:-1:-1;9463:5:0;9429:14;9463:1;:5;:::i;:::-;9459:9;;:1;:9;:::i;:::-;9454:14;;;;:::i;:::-;;-1:-1:-1;9488:5:0;9454:14;9488:1;:5;:::i;:::-;9484:9;;:1;:9;:::i;:::-;9479:14;;;;:::i;:::-;;-1:-1:-1;9513:5:0;9479:14;9513:1;:5;:::i;:::-;9509:9;;:1;:9;:::i;:::-;9504:14;;;;:::i;:::-;;-1:-1:-1;9538:5:0;9504:14;9538:1;:5;:::i;:::-;9534:9;;:1;:9;:::i;:::-;9529:14;;;;:::i;:::-;;-1:-1:-1;9563:5:0;9529:14;9563:1;:5;:::i;:::-;9559:9;;:1;:9;:::i;:::-;9554:14;;;;:::i;:::-;;-1:-1:-1;9588:5:0;9554:14;9588:1;:5;:::i;:::-;9584:9;;:1;:9;:::i;:::-;9579:14;;;;:::i;:::-;;-1:-1:-1;9611:5:0;9579:14;9611:1;:5;:::i;:::-;9604:12;9140:484;-1:-1:-1;;;;;;9140:484:0:o;404:131:1:-;-1:-1:-1;;;;;479:31:1;;469:42;;459:70;;525:1;522;515:12;540:247;599:6;652:2;640:9;631:7;627:23;623:32;620:52;;;668:1;665;658:12;620:52;707:9;694:23;726:31;751:5;726:31;:::i;2087:180::-;2146:6;2199:2;2187:9;2178:7;2174:23;2170:32;2167:52;;;2215:1;2212;2205:12;2167:52;-1:-1:-1;2238:23:1;;2087:180;-1:-1:-1;2087:180:1:o;2615:179::-;2693:13;;2746:22;2735:34;;2725:45;;2715:73;;2784:1;2781;2774:12;2715:73;2615:179;;;:::o;2799:473::-;2902:6;2910;2918;2926;2934;2987:3;2975:9;2966:7;2962:23;2958:33;2955:53;;;3004:1;3001;2994:12;2955:53;3027:39;3056:9;3027:39;:::i;:::-;3017:49;;3106:2;3095:9;3091:18;3085:25;3075:35;;3150:2;3139:9;3135:18;3129:25;3119:35;;3194:2;3183:9;3179:18;3173:25;3163:35;;3217:49;3261:3;3250:9;3246:19;3217:49;:::i;:::-;3207:59;;2799:473;;;;;;;;:::o;3975:188::-;4054:13;;-1:-1:-1;;;;;4096:42:1;;4086:53;;4076:81;;4153:1;4150;4143:12;4168:450;4255:6;4263;4271;4324:2;4312:9;4303:7;4299:23;4295:32;4292:52;;;4340:1;4337;4330:12;4292:52;4363:40;4393:9;4363:40;:::i;:::-;4353:50;;4422:49;4467:2;4456:9;4452:18;4422:49;:::i;:::-;4412:59;;4514:2;4503:9;4499:18;4493:25;4558:10;4551:5;4547:22;4540:5;4537:33;4527:61;;4584:1;4581;4574:12;4527:61;4607:5;4597:15;;;4168:450;;;;;:::o;4623:356::-;4825:2;4807:21;;;4844:18;;;4837:30;4903:34;4898:2;4883:18;;4876:62;4970:2;4955:18;;4623:356::o;4984:273::-;5052:6;5105:2;5093:9;5084:7;5080:23;5076:32;5073:52;;;5121:1;5118;5111:12;5073:52;5153:9;5147:16;5203:4;5196:5;5192:16;5185:5;5182:27;5172:55;;5223:1;5220;5213:12;6018:127;6079:10;6074:3;6070:20;6067:1;6060:31;6110:4;6107:1;6100:15;6134:4;6131:1;6124:15;6150:168;6190:7;6256:1;6252;6248:6;6244:14;6241:1;6238:21;6233:1;6226:9;6219:17;6215:45;6212:71;;;6263:18;;:::i;:::-;-1:-1:-1;6303:9:1;;6150:168::o;6323:127::-;6384:10;6379:3;6375:20;6372:1;6365:31;6415:4;6412:1;6405:15;6439:4;6436:1;6429:15;6455:120;6495:1;6521;6511:35;;6526:18;;:::i;:::-;-1:-1:-1;6560:9:1;;6455:120::o;7273:125::-;7313:4;7341:1;7338;7335:8;7332:34;;;7346:18;;:::i;:::-;-1:-1:-1;7383:9:1;;7273:125::o;9550:184::-;9620:6;9673:2;9661:9;9652:7;9648:23;9644:32;9641:52;;;9689:1;9686;9679:12;9641:52;-1:-1:-1;9712:16:1;;9550:184;-1:-1:-1;9550:184:1:o;9739:221::-;9778:4;9807:10;9867;;;;9837;;9889:12;;;9886:38;;;9904:18;;:::i;:::-;9941:13;;9739:221;-1:-1:-1;;;9739:221:1:o;9965:128::-;10005:3;10036:1;10032:6;10029:1;10026:13;10023:39;;;10042:18;;:::i;:::-;-1:-1:-1;10078:9:1;;9965:128::o;10453:112::-;10485:1;10511;10501:35;;10516:18;;:::i;:::-;-1:-1:-1;10550:9:1;;10453:112::o;10570:136::-;10605:3;-1:-1:-1;;;10626:22:1;;10623:48;;;10651:18;;:::i;:::-;-1:-1:-1;10691:1:1;10687:13;;10570:136::o
Swarm Source
ipfs://95ea915ba1a77a4de8d25a0cbf7afa3b9a4fce90bfc630f660f44a5e8625720b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.