Source Code
Overview
S Balance
More Info
ContractCreator
Loading...
Loading
Contract Name:
Oracle
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 20 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } pragma solidity 0.6.12; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom( address from, address to, uint value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit( address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap(address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); 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); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap( uint amount0Out, uint amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } pragma solidity 0.6.12; library Babylonian { function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } } pragma solidity 0.6.12; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint a, uint b) internal pure returns (uint) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b <= a, errorMessage); uint c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint a, uint b) internal pure returns (uint) { // 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-contracts/pull/522 if (a == 0) { return 0; } uint c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint a, uint b) internal pure returns (uint) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b > 0, errorMessage); uint c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint a, uint b) internal pure returns (uint) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b != 0, errorMessage); return a % b; } } pragma solidity 0.6.12; // 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 private constant RESOLUTION = 112; uint private constant Q112 = uint(1) << RESOLUTION; uint private constant Q224 = Q112 << RESOLUTION; // 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); } // divide a UQ112x112 by a uint112, returning a UQ112x112 function div(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) { require(x != 0, "FixedPoint: DIV_BY_ZERO"); return uq112x112(self._x / uint224(x)); } // 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; require(y == 0 || (z = uint(self._x) * y) / y == uint(self._x), "FixedPoint: MULTIPLICATION_OVERFLOW"); return uq144x112(z); } // returns a UQ112x112 which represents the ratio of the numerator to the denominator // equivalent to encode(numerator).div(denominator) function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint: DIV_BY_ZERO"); return uq112x112((uint224(numerator) << RESOLUTION) / denominator); } // 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); } // take the reciprocal of a UQ112x112 function reciprocal(uq112x112 memory self) internal pure returns (uq112x112 memory) { require(self._x != 0, "FixedPoint: ZERO_RECIPROCAL"); return uq112x112(uint224(Q224 / self._x)); } // square root of a UQ112x112 function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) { return uq112x112(uint224(Babylonian.sqrt(uint(self._x)) << 56)); } } pragma solidity >=0.5.0; // 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; } } } pragma solidity 0.6.12; library UniswapV2Library { using SafeMath for uint; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "UniswapV2Library: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "UniswapV2Library: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" // init code hash ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint reserveA, uint reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1, ) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint amountA, uint reserveA, uint reserveB ) internal pure returns (uint amountB) { require(amountA > 0, "UniswapV2Library: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY"); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) internal pure returns (uint amountOut) { require(amountIn > 0, "UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY"); uint amountInWithFee = amountIn.mul(997); uint numerator = amountInWithFee.mul(reserveOut); uint denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) internal pure returns (uint amountIn) { require(amountOut > 0, "UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY"); uint numerator = reserveIn.mul(amountOut).mul(1000); uint denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint amountIn, address[] memory path ) internal view returns (uint[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint[](path.length); amounts[0] = amountIn; for (uint i; i < path.length - 1; i++) { (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint amountOut, address[] memory path ) internal view returns (uint[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint[](path.length); amounts[amounts.length - 1] = amountOut; for (uint i = path.length - 1; i > 0; i--) { (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // fixed window oracle that recomputes the average price for the entire period once every period // note that the price average is only guaranteed to be over at least 1 period, but may be over a longer period contract Oracle { using FixedPoint for *; using SafeMath for uint; address immutable dev_address; uint public PERIOD = 1 hours; struct tokenInfo { IUniswapV2Pair pair; address token0; address token1; uint price0CumulativeLast; uint price1CumulativeLast; uint32 blockTimestampLast; FixedPoint.uq112x112 price0Average; FixedPoint.uq112x112 price1Average; } mapping(address => tokenInfo) public tokenInfoList; FixedPoint.uq112x112 public price0Average; FixedPoint.uq112x112 public price1Average; address public factory = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f; constructor() public { dev_address = msg.sender; } function setNewTokensInfo(address[] memory tokensA, address[] memory tokensB) external onlyOwner{ require(tokensA.length == tokensB.length,"ERR_LENGTH_NOT_MATCH"); for(uint i;i < tokensA.length; i++){ setNewTokenInfo(tokensA[i],tokensB[i]); } } function setNewTokenInfo(address tokena, address tokenb) public onlyOwner { IUniswapV2Pair _pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, tokena, tokenb)); //find tokena price tokenInfo storage info = tokenInfoList[tokena]; require(address(info.pair) == address(0), "ERR_TOKEN_IS_EXIT"); info.pair = _pair; info.token0 = _pair.token0(); info.token1 = _pair.token1(); info.price0CumulativeLast = _pair.price0CumulativeLast(); info.price1CumulativeLast = _pair.price1CumulativeLast(); uint112 reserve0; uint112 reserve1; (reserve0, reserve1, info.blockTimestampLast) = _pair.getReserves(); require(reserve0 != 0 && reserve1 != 0, "ExampleOracleSimple: NO_RESERVES"); } modifier onlyOwner() { require(dev_address == msg.sender, "Ownable: caller is not the ererer"); _; } function update(address token) external { tokenInfo storage info = tokenInfoList[token]; require(address(info.pair) != address(0), "token is not init success"); (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) = UniswapV2OracleLibrary.currentCumulativePrices(address(info.pair)); uint32 timeElapsed = blockTimestamp - info.blockTimestampLast; // overflow is desired // ensure that at least one full period has passed since the last update require(timeElapsed >= PERIOD, "ExampleOracleSimple: PERIOD_NOT_ELAPSED"); // overflow is desired, casting never truncates // cumulative price is in (uq112x112 price * seconds) units so we simply wrap it after division by time elapsed info.price0Average = FixedPoint.uq112x112(uint224((price0Cumulative - info.price0CumulativeLast) / timeElapsed)); info.price1Average = FixedPoint.uq112x112(uint224((price1Cumulative - info.price1CumulativeLast) / timeElapsed)); info.price0CumulativeLast = price0Cumulative; info.price1CumulativeLast = price1Cumulative; info.blockTimestampLast = blockTimestamp; } // note this will always return 0 before update has been called successfully for the first time. function consult(address token, uint amountIn) external view returns (uint amountOut) { tokenInfo memory info = tokenInfoList[token]; require(address(info.pair) != address(0), "token is not init success"); uint priceDecimal; if (token == info.token0) { amountOut = info.price0Average.mul(amountIn).decode144(); priceDecimal = IUniswapV2Pair(info.token1).decimals(); } else { require(token == info.token1, "ExampleOracleSimple: INVALID_TOKEN"); amountOut = info.price1Average.mul(amountIn).decode144(); priceDecimal = IUniswapV2Pair(info.token0).decimals(); } uint decimalDelta = uint(18).sub(priceDecimal); if (decimalDelta > 0) { amountOut = amountOut.mul(10**decimalDelta); } } function setPERIOD(uint amount) external onlyOwner { PERIOD = (1 hours) * (amount); } }
{ "optimizer": { "enabled": true, "runs": 20 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"consult","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price0Average","outputs":[{"internalType":"uint224","name":"_x","type":"uint224"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1Average","outputs":[{"internalType":"uint224","name":"_x","type":"uint224"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokena","type":"address"},{"internalType":"address","name":"tokenb","type":"address"}],"name":"setNewTokenInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokensA","type":"address[]"},{"internalType":"address[]","name":"tokensB","type":"address[]"}],"name":"setNewTokensInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPERIOD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenInfoList","outputs":[{"internalType":"contract IUniswapV2Pair","name":"pair","type":"address"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"price0CumulativeLast","type":"uint256"},{"internalType":"uint256","name":"price1CumulativeLast","type":"uint256"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"},{"components":[{"internalType":"uint224","name":"_x","type":"uint224"}],"internalType":"struct FixedPoint.uq112x112","name":"price0Average","type":"tuple"},{"components":[{"internalType":"uint224","name":"_x","type":"uint224"}],"internalType":"struct FixedPoint.uq112x112","name":"price1Average","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052610e10600055600480546001600160a01b031916735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f17905534801561003c57600080fd5b5033606081901b6080526116626100676000398061016d528061098f5280610a6552506116626000f3fe608060405234801561001057600080fd5b506004361061008e5760003560e01c80630173d100146100935780630a109ec3146100a85780631c1b8772146100d85780633ddac953146100eb5780635e6aaf2c1461010b5780636ca94aac14610120578063a6bb453914610133578063b4d1d7951461013b578063c45a015514610143578063fa4277a814610158575b600080fd5b6100a66100a136600461108b565b61016b565b005b6100bb6100b6366004611053565b610528565b6040516100cf98979695949392919061127a565b60405180910390f35b6100a66100e6366004611053565b6105a3565b6100fe6100f93660046110c3565b6106f4565b6040516100cf91906115f6565b61011361097e565b6040516100cf91906115e2565b6100a661012e3660046110ee565b61098d565b610113610a3f565b6100fe610a4e565b61014b610a54565b6040516100cf9190611266565b6100a66101663660046111a2565b610a63565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146101bc5760405162461bcd60e51b81526004016101b3906113cb565b60405180910390fd5b6004546000906101d6906001600160a01b03168484610ab4565b6001600160a01b03808516600090815260016020526040902080549293509116156102135760405162461bcd60e51b81526004016101b390611326565b80546001600160a01b0319166001600160a01b038316908117825560408051630dfe168160e01b81529051630dfe168191600480820192602092909190829003018186803b15801561026457600080fd5b505afa158015610278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029c919061106f565b8160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156102fd57600080fd5b505afa158015610311573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610335919061106f565b8160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561039657600080fd5b505afa1580156103aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ce91906111ba565b8160030181905550816001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b15801561040f57600080fd5b505afa158015610423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044791906111ba565b8160040181905550600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561048b57600080fd5b505afa15801561049f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c3919061114e565b60058601805463ffffffff191663ffffffff9290921691909117905590925090506001600160701b0382161580159061050457506001600160701b03811615155b6105205760405162461bcd60e51b81526004016101b390611396565b505050505050565b600160208181526000928352604092839020805492810154600282015460038301546004840154600585015488518088018a5260068701546001600160e01b0390811682528a51988901909a5260079096015490981686526001600160a01b039687169793871696909216949093919263ffffffff16919088565b6001600160a01b03808216600090815260016020526040902080549091166105dd5760405162461bcd60e51b81526004016101b390611547565b8054600090819081906105f8906001600160a01b0316610b24565b6005870154600054939650919450925063ffffffff90811683039190821610156106345760405162461bcd60e51b81526004016101b39061148f565b60405180602001604052808263ffffffff16876003015487038161065457fe5b046001600160e01b0390811690915290516006870180546001600160e01b0319169190921617905560408051602081019091526004860154819063ffffffff84169086038161069f57fe5b046001600160e01b0390811690915290516007870180546001600160e01b0319169190921617905550600384019290925560048301556005909101805463ffffffff191663ffffffff90921691909117905550565b60006106fe610f18565b506001600160a01b038084166000908152600160208181526040928390208351610100810185528154861681529281015485168383015260028101548516838501526003810154606084015260048101546080840152600581015463ffffffff1660a08401528351808301855260068201546001600160e01b03908116825260c0850191909152845192830190945260070154909216825260e081019190915280519091166107bf5760405162461bcd60e51b81526004016101b390611547565b600081602001516001600160a01b0316856001600160a01b031614156108815760c08201516107f7906107f29086610cf9565b610d5a565b6001600160901b0316925081604001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561083f57600080fd5b505afa158015610853573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087791906111d2565b60ff16905061094f565b81604001516001600160a01b0316856001600160a01b0316146108b65760405162461bcd60e51b81526004016101b39061140c565b60e08201516108c9906107f29086610cf9565b6001600160901b0316925081602001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094991906111d2565b60ff1690505b600061095c601283610d61565b905080156109755761097284600a83900a610daa565b93505b50505092915050565b6003546001600160e01b031681565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146109d55760405162461bcd60e51b81526004016101b3906113cb565b80518251146109f65760405162461bcd60e51b81526004016101b3906114d6565b60005b8251811015610a3a57610a32838281518110610a1157fe5b6020026020010151838381518110610a2557fe5b602002602001015161016b565b6001016109f9565b505050565b6002546001600160e01b031681565b60005481565b6004546001600160a01b031681565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610aab5760405162461bcd60e51b81526004016101b3906113cb565b610e1002600055565b6000806000610ac38585610de4565b91509150858282604051602001610adb9291906111f3565b60405160208183030381529060405280519060200120604051602001610b02929190611215565b60408051601f1981840301815291905280516020909101209695505050505050565b6000806000610b31610e6e565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6c57600080fd5b505afa158015610b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba491906111ba565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015610bdf57600080fd5b505afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906111ba565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610c5757600080fd5b505afa158015610c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8f919061114e565b9250925092508363ffffffff168163ffffffff1614610cef5780840363ffffffff8116610cbc8486610e78565b516001600160e01b031602969096019563ffffffff8116610cdd8585610e78565b516001600160e01b0316029590950194505b5050509193909250565b610d01610f89565b6000821580610d2757505082516001600160e01b031682810290838281610d2457fe5b04145b610d435760405162461bcd60e51b81526004016101b390611504565b604080516020810190915290815290505b92915050565b5160701c90565b6000610da383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610eec565b9392505050565b600082610db957506000610d54565b82820282848281610dc657fe5b0414610da35760405162461bcd60e51b81526004016101b39061144e565b600080826001600160a01b0316846001600160a01b03161415610e195760405162461bcd60e51b81526004016101b390611351565b826001600160a01b0316846001600160a01b031610610e39578284610e3c565b83835b90925090506001600160a01b038216610e675760405162461bcd60e51b81526004016101b39061157a565b9250929050565b63ffffffff421690565b610e80610f9c565b6000826001600160701b031611610ea95760405162461bcd60e51b81526004016101b3906115b1565b6040805160208101909152806001600160701b038416600160701b600160e01b03607087901b1681610ed757fe5b046001600160e01b0316815250905092915050565b60008184841115610f105760405162461bcd60e51b81526004016101b391906112d3565b505050900390565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600063ffffffff168152602001610f77610f9c565b8152602001610f84610f9c565b905290565b6040518060200160405280600081525090565b60408051602081019091526000815290565b8035610d54816115ff565b600082601f830112610fc9578081fd5b81356001600160401b0380821115610fdf578283fd5b602080830260405182828201018181108582111715610ffc578687fd5b60405284815294508185019250858201818701830188101561101d57600080fd5b600091505b84821015611048576110348882610fae565b845292820192600191909101908201611022565b505050505092915050565b600060208284031215611064578081fd5b8135610da3816115ff565b600060208284031215611080578081fd5b8151610da3816115ff565b6000806040838503121561109d578081fd5b82356110a8816115ff565b915060208301356110b8816115ff565b809150509250929050565b600080604083850312156110d5578182fd5b82356110e0816115ff565b946020939093013593505050565b60008060408385031215611100578182fd5b82356001600160401b0380821115611116578384fd5b61112286838701610fb9565b93506020850135915080821115611137578283fd5b5061114485828601610fb9565b9150509250929050565b600080600060608486031215611162578081fd5b835161116d81611617565b602085015190935061117e81611617565b604085015190925063ffffffff81168114611197578182fd5b809150509250925092565b6000602082840312156111b3578081fd5b5035919050565b6000602082840312156111cb578081fd5b5051919050565b6000602082840312156111e3578081fd5b815160ff81168114610da3578182fd5b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296881660208801529490961660408601526060850192909252608084015263ffffffff1660a083015291516001600160e01b0390811660c0830152915190911660e08201526101000190565b6000602080835283518082850152825b818110156112ff578581018301518582016040015282016112e3565b818111156113105783604083870101525b50601f01601f1916929092016040019392505050565b60208082526011908201527011549497d513d2d15397d254d7d1561255607a1b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b6020808252818101527f4578616d706c654f7261636c6553696d706c653a204e4f5f5245534552564553604082015260600190565b60208082526021908201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652065726572656040820152603960f91b606082015260800190565b60208082526022908201527f4578616d706c654f7261636c6553696d706c653a20494e56414c49445f544f4b60408201526122a760f11b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526027908201527f4578616d706c654f7261636c6553696d706c653a20504552494f445f4e4f545f6040820152661153105414d15160ca1b606082015260800190565b60208082526014908201527308aa4a4be988a9c8ea890be9c9ea8be9a82a886960631b604082015260600190565b60208082526023908201527f4669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552466040820152624c4f5760e81b606082015260800190565b602080825260199082015278746f6b656e206973206e6f7420696e6974207375636365737360381b604082015260600190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b6020808252601790820152764669786564506f696e743a204449565f42595f5a45524f60481b604082015260600190565b6001600160e01b0391909116815260200190565b90815260200190565b6001600160a01b038116811461161457600080fd5b50565b6001600160701b038116811461161457600080fdfea2646970667358221220f7394aa0f46e5a8e741b1a7430ec3a68d23a33bc7e8fbe22099a8cbcb025457264736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061008e5760003560e01c80630173d100146100935780630a109ec3146100a85780631c1b8772146100d85780633ddac953146100eb5780635e6aaf2c1461010b5780636ca94aac14610120578063a6bb453914610133578063b4d1d7951461013b578063c45a015514610143578063fa4277a814610158575b600080fd5b6100a66100a136600461108b565b61016b565b005b6100bb6100b6366004611053565b610528565b6040516100cf98979695949392919061127a565b60405180910390f35b6100a66100e6366004611053565b6105a3565b6100fe6100f93660046110c3565b6106f4565b6040516100cf91906115f6565b61011361097e565b6040516100cf91906115e2565b6100a661012e3660046110ee565b61098d565b610113610a3f565b6100fe610a4e565b61014b610a54565b6040516100cf9190611266565b6100a66101663660046111a2565b610a63565b7f0000000000000000000000006ed4a6af4e2f316063a805c6089f8052d31a72746001600160a01b031633146101bc5760405162461bcd60e51b81526004016101b3906113cb565b60405180910390fd5b6004546000906101d6906001600160a01b03168484610ab4565b6001600160a01b03808516600090815260016020526040902080549293509116156102135760405162461bcd60e51b81526004016101b390611326565b80546001600160a01b0319166001600160a01b038316908117825560408051630dfe168160e01b81529051630dfe168191600480820192602092909190829003018186803b15801561026457600080fd5b505afa158015610278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029c919061106f565b8160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156102fd57600080fd5b505afa158015610311573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610335919061106f565b8160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561039657600080fd5b505afa1580156103aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ce91906111ba565b8160030181905550816001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b15801561040f57600080fd5b505afa158015610423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044791906111ba565b8160040181905550600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561048b57600080fd5b505afa15801561049f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c3919061114e565b60058601805463ffffffff191663ffffffff9290921691909117905590925090506001600160701b0382161580159061050457506001600160701b03811615155b6105205760405162461bcd60e51b81526004016101b390611396565b505050505050565b600160208181526000928352604092839020805492810154600282015460038301546004840154600585015488518088018a5260068701546001600160e01b0390811682528a51988901909a5260079096015490981686526001600160a01b039687169793871696909216949093919263ffffffff16919088565b6001600160a01b03808216600090815260016020526040902080549091166105dd5760405162461bcd60e51b81526004016101b390611547565b8054600090819081906105f8906001600160a01b0316610b24565b6005870154600054939650919450925063ffffffff90811683039190821610156106345760405162461bcd60e51b81526004016101b39061148f565b60405180602001604052808263ffffffff16876003015487038161065457fe5b046001600160e01b0390811690915290516006870180546001600160e01b0319169190921617905560408051602081019091526004860154819063ffffffff84169086038161069f57fe5b046001600160e01b0390811690915290516007870180546001600160e01b0319169190921617905550600384019290925560048301556005909101805463ffffffff191663ffffffff90921691909117905550565b60006106fe610f18565b506001600160a01b038084166000908152600160208181526040928390208351610100810185528154861681529281015485168383015260028101548516838501526003810154606084015260048101546080840152600581015463ffffffff1660a08401528351808301855260068201546001600160e01b03908116825260c0850191909152845192830190945260070154909216825260e081019190915280519091166107bf5760405162461bcd60e51b81526004016101b390611547565b600081602001516001600160a01b0316856001600160a01b031614156108815760c08201516107f7906107f29086610cf9565b610d5a565b6001600160901b0316925081604001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561083f57600080fd5b505afa158015610853573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087791906111d2565b60ff16905061094f565b81604001516001600160a01b0316856001600160a01b0316146108b65760405162461bcd60e51b81526004016101b39061140c565b60e08201516108c9906107f29086610cf9565b6001600160901b0316925081602001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094991906111d2565b60ff1690505b600061095c601283610d61565b905080156109755761097284600a83900a610daa565b93505b50505092915050565b6003546001600160e01b031681565b7f0000000000000000000000006ed4a6af4e2f316063a805c6089f8052d31a72746001600160a01b031633146109d55760405162461bcd60e51b81526004016101b3906113cb565b80518251146109f65760405162461bcd60e51b81526004016101b3906114d6565b60005b8251811015610a3a57610a32838281518110610a1157fe5b6020026020010151838381518110610a2557fe5b602002602001015161016b565b6001016109f9565b505050565b6002546001600160e01b031681565b60005481565b6004546001600160a01b031681565b7f0000000000000000000000006ed4a6af4e2f316063a805c6089f8052d31a72746001600160a01b03163314610aab5760405162461bcd60e51b81526004016101b3906113cb565b610e1002600055565b6000806000610ac38585610de4565b91509150858282604051602001610adb9291906111f3565b60405160208183030381529060405280519060200120604051602001610b02929190611215565b60408051601f1981840301815291905280516020909101209695505050505050565b6000806000610b31610e6e565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6c57600080fd5b505afa158015610b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba491906111ba565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015610bdf57600080fd5b505afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906111ba565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610c5757600080fd5b505afa158015610c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8f919061114e565b9250925092508363ffffffff168163ffffffff1614610cef5780840363ffffffff8116610cbc8486610e78565b516001600160e01b031602969096019563ffffffff8116610cdd8585610e78565b516001600160e01b0316029590950194505b5050509193909250565b610d01610f89565b6000821580610d2757505082516001600160e01b031682810290838281610d2457fe5b04145b610d435760405162461bcd60e51b81526004016101b390611504565b604080516020810190915290815290505b92915050565b5160701c90565b6000610da383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610eec565b9392505050565b600082610db957506000610d54565b82820282848281610dc657fe5b0414610da35760405162461bcd60e51b81526004016101b39061144e565b600080826001600160a01b0316846001600160a01b03161415610e195760405162461bcd60e51b81526004016101b390611351565b826001600160a01b0316846001600160a01b031610610e39578284610e3c565b83835b90925090506001600160a01b038216610e675760405162461bcd60e51b81526004016101b39061157a565b9250929050565b63ffffffff421690565b610e80610f9c565b6000826001600160701b031611610ea95760405162461bcd60e51b81526004016101b3906115b1565b6040805160208101909152806001600160701b038416600160701b600160e01b03607087901b1681610ed757fe5b046001600160e01b0316815250905092915050565b60008184841115610f105760405162461bcd60e51b81526004016101b391906112d3565b505050900390565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600063ffffffff168152602001610f77610f9c565b8152602001610f84610f9c565b905290565b6040518060200160405280600081525090565b60408051602081019091526000815290565b8035610d54816115ff565b600082601f830112610fc9578081fd5b81356001600160401b0380821115610fdf578283fd5b602080830260405182828201018181108582111715610ffc578687fd5b60405284815294508185019250858201818701830188101561101d57600080fd5b600091505b84821015611048576110348882610fae565b845292820192600191909101908201611022565b505050505092915050565b600060208284031215611064578081fd5b8135610da3816115ff565b600060208284031215611080578081fd5b8151610da3816115ff565b6000806040838503121561109d578081fd5b82356110a8816115ff565b915060208301356110b8816115ff565b809150509250929050565b600080604083850312156110d5578182fd5b82356110e0816115ff565b946020939093013593505050565b60008060408385031215611100578182fd5b82356001600160401b0380821115611116578384fd5b61112286838701610fb9565b93506020850135915080821115611137578283fd5b5061114485828601610fb9565b9150509250929050565b600080600060608486031215611162578081fd5b835161116d81611617565b602085015190935061117e81611617565b604085015190925063ffffffff81168114611197578182fd5b809150509250925092565b6000602082840312156111b3578081fd5b5035919050565b6000602082840312156111cb578081fd5b5051919050565b6000602082840312156111e3578081fd5b815160ff81168114610da3578182fd5b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296881660208801529490961660408601526060850192909252608084015263ffffffff1660a083015291516001600160e01b0390811660c0830152915190911660e08201526101000190565b6000602080835283518082850152825b818110156112ff578581018301518582016040015282016112e3565b818111156113105783604083870101525b50601f01601f1916929092016040019392505050565b60208082526011908201527011549497d513d2d15397d254d7d1561255607a1b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b6020808252818101527f4578616d706c654f7261636c6553696d706c653a204e4f5f5245534552564553604082015260600190565b60208082526021908201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652065726572656040820152603960f91b606082015260800190565b60208082526022908201527f4578616d706c654f7261636c6553696d706c653a20494e56414c49445f544f4b60408201526122a760f11b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526027908201527f4578616d706c654f7261636c6553696d706c653a20504552494f445f4e4f545f6040820152661153105414d15160ca1b606082015260800190565b60208082526014908201527308aa4a4be988a9c8ea890be9c9ea8be9a82a886960631b604082015260600190565b60208082526023908201527f4669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552466040820152624c4f5760e81b606082015260800190565b602080825260199082015278746f6b656e206973206e6f7420696e6974207375636365737360381b604082015260600190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b6020808252601790820152764669786564506f696e743a204449565f42595f5a45524f60481b604082015260600190565b6001600160e01b0391909116815260200190565b90815260200190565b6001600160a01b038116811461161457600080fd5b50565b6001600160701b038116811461161457600080fdfea2646970667358221220f7394aa0f46e5a8e741b1a7430ec3a68d23a33bc7e8fbe22099a8cbcb025457264736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.