Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12434702 | 1197 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
UNIV2LPOracle
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-14 */ // SPDX-License-Identifier: GPL-3.0-or-later /// UNIV2LPOracle.sol // Copyright (C) 2017-2020 Maker Ecosystem Growth Holdings, INC. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. /////////////////////////////////////////////////////// // // // Methodology for Calculating LP Token Price // // // /////////////////////////////////////////////////////// // A naïve approach to calculate the price of LP tokens, assuming the protocol // fee is zero, is to compute the price of the assets locked in its liquidity // pool, and divide it by the total amount of LP tokens issued: // // (p_0 * r_0 + p_1 * r_1) / LP_supply (1) // // where r_0 and r_1 are the reserves of the two tokens held by the pool, and // p_0 and p_1 are their respective prices in some reference unit of account. // // However, the price of LP tokens (i.e. pool shares) needs to be evaluated // based on reserve values r_0 and r_1 that cannot be arbitraged, i.e. values // that give the two halves of the pool equal economic value: // // r_0 * p_0 = r_1 * p_1 (2) // // Furthermore, two-asset constant product pools, neglecting fees, satisfy // (before and after trades): // // r_0 * r_1 = k (3) // // Using (2) and (3) we can compute R_i, the arbitrage-free reserve values, in a // manner that depends only on k (which can be derived from the current reserve // balances, even if they are far from equilibrium) and market prices p_i // obtained from a trusted source: // // R_0 = sqrt(k * p_1 / p_0) (4) // and // R_1 = sqrt(k * p_0 / p_1) (5) // // The value of an LP token is then, replacing (4) and (5) in (1): // // (p_0 * R_0 + p_1 * R_1) / LP_supply // = 2 * sqrt(k * p_0 * p_1) / LP_supply (6) // // k can be re-expressed in terms of the current pool reserves r_0 and r_1: // // 2 * sqrt((r_0 * p_0) * (r_1 * p_1)) / LP_supply (7) // // The structure of (7) is well-suited for use in fixed-point EVM calculations, as the // terms (r_0 * p_0) and (r_1 * p_1), being the values of the reserves in the reference unit, // should have reasonably-bounded sizes. This reduces the likelihood of overflow due to // tokens with very low prices but large total supplies. pragma solidity =0.6.12; interface ERC20Like { function decimals() external view returns (uint8); function balanceOf(address) external view returns (uint256); function totalSupply() external view returns (uint256); } interface UniswapV2PairLike { function sync() external; function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112,uint112,uint32); // reserve0, reserve1, blockTimestampLast } interface OracleLike { function read() external view returns (uint256); } // Factory for creating Uniswap V2 LP Token Oracle instances contract UNIV2LPOracleFactory { mapping(address => bool) public isOracle; event NewUNIV2LPOracle(address owner, address orcl, bytes32 wat, address indexed tok0, address indexed tok1, address orb0, address orb1); // Create new Uniswap V2 LP Token Oracle instance function build( address _owner, address _src, bytes32 _wat, address _orb0, address _orb1 ) public returns (address orcl) { address tok0 = UniswapV2PairLike(_src).token0(); address tok1 = UniswapV2PairLike(_src).token1(); orcl = address(new UNIV2LPOracle(_src, _wat, _orb0, _orb1)); UNIV2LPOracle(orcl).rely(_owner); UNIV2LPOracle(orcl).deny(address(this)); isOracle[orcl] = true; emit NewUNIV2LPOracle(_owner, orcl, _wat, tok0, tok1, _orb0, _orb1); } } contract UNIV2LPOracle { // --- Auth --- mapping (address => uint256) public wards; // Addresses with admin authority function rely(address _usr) external auth { wards[_usr] = 1; emit Rely(_usr); } // Add admin function deny(address _usr) external auth { wards[_usr] = 0; emit Deny(_usr); } // Remove admin modifier auth { require(wards[msg.sender] == 1, "UNIV2LPOracle/not-authorized"); _; } address public immutable src; // Price source // hop and zph are packed into single slot to reduce SLOADs; // this outweighs the cost from added bitmasking operations. uint8 public stopped; // Stop/start ability to update uint16 public hop = 1 hours; // Minimum time in between price updates uint232 public zph; // Time of last price update plus hop bytes32 public immutable wat; // Label of token whose price is being tracked // --- Whitelisting --- mapping (address => uint256) public bud; modifier toll { require(bud[msg.sender] == 1, "UNIV2LPOracle/contract-not-whitelisted"); _; } struct Feed { uint128 val; // Price uint128 has; // Is price valid } Feed internal cur; // Current price (mem slot 0x3) Feed internal nxt; // Queued price (mem slot 0x4) // --- Data --- uint256 private immutable UNIT_0; // Numerical representation of one token of token0 (10^decimals) uint256 private immutable UNIT_1; // Numerical representation of one token of token1 (10^decimals) address public orb0; // Oracle for token0, ideally a Medianizer address public orb1; // Oracle for token1, ideally a Medianizer // --- Math --- uint256 constant WAD = 10 ** 18; function add(uint256 _x, uint256 _y) internal pure returns (uint256 z) { require((z = _x + _y) >= _x, "UNIV2LPOracle/add-overflow"); } function sub(uint256 _x, uint256 _y) internal pure returns (uint256 z) { require((z = _x - _y) <= _x, "UNIV2LPOracle/sub-underflow"); } function mul(uint256 _x, uint256 _y) internal pure returns (uint256 z) { require(_y == 0 || (z = _x * _y) / _y == _x, "UNIV2LPOracle/mul-overflow"); } // FROM https://github.com/abdk-consulting/abdk-libraries-solidity/blob/16d7e1dd8628dfa2f88d5dadab731df7ada70bdd/ABDKMath64x64.sol#L687 function sqrt (uint256 _x) private pure returns (uint128) { if (_x == 0) return 0; else { uint256 xx = _x; uint256 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 uint256 r1 = _x / r; return uint128 (r < r1 ? r : r1); } } // --- Events --- event Rely(address indexed usr); event Deny(address indexed usr); event Step(uint256 hop); event Stop(); event Start(); event Value(uint128 curVal, uint128 nxtVal); event Link(uint256 id, address orb); event Kiss(address a); event Diss(address a); // --- Init --- constructor (address _src, bytes32 _wat, address _orb0, address _orb1) public { require(_src != address(0), "UNIV2LPOracle/invalid-src-address"); require(_orb0 != address(0) && _orb1 != address(0), "UNIV2LPOracle/invalid-oracle-address"); wards[msg.sender] = 1; emit Rely(msg.sender); src = _src; wat = _wat; uint256 dec0 = uint256(ERC20Like(UniswapV2PairLike(_src).token0()).decimals()); require(dec0 <= 18, "UNIV2LPOracle/token0-dec-gt-18"); UNIT_0 = 10 ** dec0; uint256 dec1 = uint256(ERC20Like(UniswapV2PairLike(_src).token1()).decimals()); require(dec1 <= 18, "UNIV2LPOracle/token1-dec-gt-18"); UNIT_1 = 10 ** dec1; orb0 = _orb0; orb1 = _orb1; } function stop() external auth { stopped = 1; delete cur; delete nxt; zph = 0; emit Stop(); } function start() external auth { stopped = 0; emit Start(); } function step(uint256 _hop) external auth { require(_hop <= uint16(-1), "UNIV2LPOracle/invalid-hop"); hop = uint16(_hop); emit Step(_hop); } function link(uint256 _id, address _orb) external auth { require(_orb != address(0), "UNIV2LPOracle/no-contract-0"); if(_id == 0) { orb0 = _orb; } else if (_id == 1) { orb1 = _orb; } else { revert("UNIV2LPOracle/invalid-id"); } emit Link(_id, _orb); } // For consistency with other oracles. function zzz() external view returns (uint256) { if (zph == 0) return 0; // backwards compatibility return sub(zph, hop); } function pass() external view returns (bool) { return block.timestamp >= zph; } function seek() internal returns (uint128 quote) { // Sync up reserves of uniswap liquidity pool UniswapV2PairLike(src).sync(); // Get reserves of uniswap liquidity pool (uint112 r0, uint112 r1,) = UniswapV2PairLike(src).getReserves(); require(r0 > 0 && r1 > 0, "UNIV2LPOracle/invalid-reserves"); // All Oracle prices are priced with 18 decimals against USD uint256 p0 = OracleLike(orb0).read(); // Query token0 price from oracle (WAD) require(p0 != 0, "UNIV2LPOracle/invalid-oracle-0-price"); uint256 p1 = OracleLike(orb1).read(); // Query token1 price from oracle (WAD) require(p1 != 0, "UNIV2LPOracle/invalid-oracle-1-price"); // Get LP token supply uint256 supply = ERC20Like(src).totalSupply(); // This calculation should be overflow-resistant even for tokens with very high or very // low prices, as the dollar value of each reserve should lie in a fairly controlled range // regardless of the token prices. uint256 value0 = mul(p0, uint256(r0)) / UNIT_0; // WAD uint256 value1 = mul(p1, uint256(r1)) / UNIT_1; // WAD uint256 preq = mul(2 * WAD, sqrt(mul(value0, value1))) / supply; // Will revert if supply == 0 require(preq < 2 ** 128, "UNIV2LPOracle/quote-overflow"); quote = uint128(preq); // WAD } function poke() external { // Ensure a single SLOAD while avoiding solc's excessive bitmasking bureaucracy. uint256 hop_; { // Block-scoping these variables saves some gas. uint256 stopped_; uint256 zph_; assembly { let slot1 := sload(1) stopped_ := and(slot1, 0xff ) hop_ := and(shr(8, slot1), 0xffff) zph_ := shr(24, slot1) } // When stopped, values are set to zero and should remain such; thus, disallow updating in that case. require(stopped_ == 0, "UNIV2LPOracle/is-stopped"); // Equivalent to requiring that pass() returns true. // The logic is repeated instead of calling pass() to save gas // (both by eliminating an internal call here, and allowing pass to be external). require(block.timestamp >= zph_, "UNIV2LPOracle/not-passed"); } uint128 val = seek(); require(val != 0, "UNIV2LPOracle/invalid-price"); Feed memory cur_ = nxt; // This memory value is used to save an SLOAD later. cur = cur_; nxt = Feed(val, 1); // The below is equivalent to: // // zph = block.timestamp + hop // // but ensures no extra SLOADs are performed. // // Even if _hop = (2^16 - 1), the maximum possible value, add(timestamp(), _hop) // will not overflow (even a 232 bit value) for a very long time. // // Also, we know stopped was zero, so there is no need to account for it explicitly here. assembly { sstore( 1, add( // zph value starts 24 bits in shl(24, add(timestamp(), hop_)), // hop value starts 8 bits in shl(8, hop_) ) ) } // Equivalent to emitting Value(cur.val, nxt.val), but averts extra SLOADs. emit Value(cur_.val, val); // Safe to terminate immediately since no postfix modifiers are applied. assembly { stop() } } function peek() external view toll returns (bytes32,bool) { return (bytes32(uint256(cur.val)), cur.has == 1); } function peep() external view toll returns (bytes32,bool) { return (bytes32(uint256(nxt.val)), nxt.has == 1); } function read() external view toll returns (bytes32) { require(cur.has == 1, "UNIV2LPOracle/no-current-value"); return (bytes32(uint256(cur.val))); } function kiss(address _a) external auth { require(_a != address(0), "UNIV2LPOracle/no-contract-0"); bud[_a] = 1; emit Kiss(_a); } function kiss(address[] calldata _a) external auth { for(uint256 i = 0; i < _a.length; i++) { require(_a[i] != address(0), "UNIV2LPOracle/no-contract-0"); bud[_a[i]] = 1; emit Kiss(_a[i]); } } function diss(address _a) external auth { bud[_a] = 0; emit Diss(_a); } function diss(address[] calldata _a) external auth { for(uint256 i = 0; i < _a.length; i++) { bud[_a[i]] = 0; emit Diss(_a[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_src","type":"address"},{"internalType":"bytes32","name":"_wat","type":"bytes32"},{"internalType":"address","name":"_orb0","type":"address"},{"internalType":"address","name":"_orb1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"Diss","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"Kiss","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"orb","type":"address"}],"name":"Link","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[],"name":"Start","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"hop","type":"uint256"}],"name":"Step","type":"event"},{"anonymous":false,"inputs":[],"name":"Stop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"curVal","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"nxtVal","type":"uint128"}],"name":"Value","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bud","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"}],"name":"diss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_a","type":"address"}],"name":"diss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hop","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"}],"name":"kiss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_a","type":"address"}],"name":"kiss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_orb","type":"address"}],"name":"link","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orb0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orb1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peek","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peep","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"read","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"src","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hop","type":"uint256"}],"name":"step","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopped","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wat","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zph","outputs":[{"internalType":"uint232","name":"","type":"uint232"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zzz","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101006040526001805462ffff001916620e10001790553480156200002357600080fd5b5060405162001e6738038062001e67833981810160405260808110156200004957600080fd5b50805160208201516040830151606090930151919290916001600160a01b038416620000a75760405162461bcd60e51b815260040180806020018281038252602181526020018062001e466021913960400191505060405180910390fd5b6001600160a01b03821615801590620000c857506001600160a01b03811615155b620001055760405162461bcd60e51b815260040180806020018281038252602481526020018062001e226024913960400191505060405180910390fd5b3360008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a2836001600160a01b03166080816001600160a01b031660601b815250508260a081815250506000846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200019f57600080fd5b505afa158015620001b4573d6000803e3d6000fd5b505050506040513d6020811015620001cb57600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b1580156200021057600080fd5b505afa15801562000225573d6000803e3d6000fd5b505050506040513d60208110156200023c57600080fd5b505160ff16905060128111156200029a576040805162461bcd60e51b815260206004820152601e60248201527f554e4956324c504f7261636c652f746f6b656e302d6465632d67742d31380000604482015290519081900360640190fd5b80600a0a60c081815250506000856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015620002e157600080fd5b505afa158015620002f6573d6000803e3d6000fd5b505050506040513d60208110156200030d57600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b1580156200035257600080fd5b505afa15801562000367573d6000803e3d6000fd5b505050506040513d60208110156200037e57600080fd5b505160ff1690506012811115620003dc576040805162461bcd60e51b815260206004820152601e60248201527f554e4956324c504f7261636c652f746f6b656e312d6465632d67742d31380000604482015290519081900360640190fd5b600a0a60e05250600580546001600160a01b039384166001600160a01b03199182161790915560068054929093169116179055505060805160601c60a05160c05160e0516119c962000459600039806116035250806115c3525080610b46525080610926528061126152806112d7528061153a52506119c96000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806365c4ce7a116100de578063a7a1ed7211610097578063be9a655511610071578063be9a655514610447578063bf353dbb1461044f578063dca44f6f14610475578063f29c29c41461047d57610173565b8063a7a1ed72146103e8578063a9c52a3914610404578063b0b8579b1461042857610173565b806365c4ce7a1461034857806365fae35e1461036e5780636c2552f91461039457806375f12b211461039c5780639c52a7f1146103ba578063a4dff0a2146103e057610173565b806346d4577d1161013057806346d4577d1461025c5780634ca29923146102cc5780634fce7a2a146102e657806357de26a41461030c57806359e02dd71461031457806365af79091461031c57610173565b806307da68f5146101785780630e5a6c701461018257806318178358146101a35780631b25b65f146101ab5780632e7dc6af1461021b5780633a1cde751461023f575b600080fd5b6101806104a3565b005b61018a61053e565b6040805192835290151560208301528051918290030190f35b6101806105ae565b610180600480360360208110156101c157600080fd5b8101906020810181356401000000008111156101dc57600080fd5b8201836020820111156101ee57600080fd5b8035906020019184602083028401116401000000008311171561021057600080fd5b50909250905061079f565b610223610924565b604080516001600160a01b039092168252519081900360200190f35b6101806004803603602081101561025557600080fd5b5035610948565b6101806004803603602081101561027257600080fd5b81019060208101813564010000000081111561028d57600080fd5b82018360208201111561029f57600080fd5b803590602001918460208302840111640100000000831117156102c157600080fd5b509092509050610a3e565b6102d4610b44565b60408051918252519081900360200190f35b6102d4600480360360208110156102fc57600080fd5b50356001600160a01b0316610b68565b6102d4610b7a565b61018a610c40565b6101806004803603604081101561033257600080fd5b50803590602001356001600160a01b0316610cb0565b6101806004803603602081101561035e57600080fd5b50356001600160a01b0316610e3f565b6101806004803603602081101561038457600080fd5b50356001600160a01b0316610ee4565b610223610f7b565b6103a4610f8a565b6040805160ff9092168252519081900360200190f35b610180600480360360208110156103d057600080fd5b50356001600160a01b0316610f93565b6102d4611029565b6103f0611076565b604080519115158252519081900360200190f35b61040c61108f565b604080516001600160e81b039092168252519081900360200190f35b6104306110a5565b6040805161ffff9092168252519081900360200190f35b6101806110b4565b6102d46004803603602081101561046557600080fd5b50356001600160a01b031661113b565b61022361114d565b6101806004803603602081101561049357600080fd5b50356001600160a01b031661115c565b336000908152602081905260409020546001146104f5576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001805460006003819055600481905560ff19909116821762ffffff169091556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b9190a1565b33600090815260026020526040812054819060011461058e5760405162461bcd60e51b815260040180806020018281038252602681526020018061194a6026913960400191505060405180910390fd5b50506004546001600160801b0380821691600160801b9004166001149091565b600154600881901c61ffff169060ff81169060181c8115610616576040805162461bcd60e51b815260206004820152601860248201527f554e4956324c504f7261636c652f69732d73746f707065640000000000000000604482015290519081900360640190fd5b8042101561066b576040805162461bcd60e51b815260206004820152601860248201527f554e4956324c504f7261636c652f6e6f742d7061737365640000000000000000604482015290519081900360640190fd5b5050600061067761125d565b90506001600160801b0381166106d4576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f696e76616c69642d70726963650000000000604482015290519081900360640190fd5b6106dc6118ee565b50604080518082018252600480546001600160801b03808216808552600160801b80840483166020808801829052600380546fffffffffffffffffffffffffffffffff199081169095178616928402929092179091558751808901895289851680825260019183018290529390951683178416909117909455600888901b42890160181b01909255835185519116815291820152825191927f80a5d0081d7e9a7bdb15ef207c6e0772f0f56d24317693206c0e47408f2d0b7392918290030190a1005b336000908152602081905260409020546001146107f1576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b60005b8181101561091f57600083838381811061080a57fe5b905060200201356001600160a01b03166001600160a01b03161415610876576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f6e6f2d636f6e74726163742d300000000000604482015290519081900360640190fd5b60016002600085858581811061088857fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f6ffc0fabf0709270e42087e84a3bfc36041d3b281266d04ae1962185092fb2448383838181106108e957fe5b905060200201356001600160a01b031660405180826001600160a01b0316815260200191505060405180910390a16001016107f4565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b3360009081526020819052604090205460011461099a576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b61ffff8111156109f1576040805162461bcd60e51b815260206004820152601960248201527f554e4956324c504f7261636c652f696e76616c69642d686f7000000000000000604482015290519081900360640190fd5b6001805462ffff00191661010061ffff8416021790556040805182815290517fd5cae49d972f01d170fb2d3409c5f318698639863c0403e59e4af06e0ce92817916020908290030190a150565b33600090815260208190526040902054600114610a90576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b60005b8181101561091f57600060026000858585818110610aad57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f12fdafd291eb287a54e3416070923d22aa5072f5ee04c4fb8361615e7508a37c838383818110610b0e57fe5b905060200201356001600160a01b031660405180826001600160a01b0316815260200191505060405180910390a1600101610a93565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020526000908152604090205481565b33600090815260026020526040812054600114610bc85760405162461bcd60e51b815260040180806020018281038252602681526020018061194a6026913960400191505060405180910390fd5b600354600160801b90046001600160801b0316600114610c2f576040805162461bcd60e51b815260206004820152601e60248201527f554e4956324c504f7261636c652f6e6f2d63757272656e742d76616c75650000604482015290519081900360640190fd5b506003546001600160801b03165b90565b336000908152600260205260408120548190600114610c905760405162461bcd60e51b815260040180806020018281038252602681526020018061194a6026913960400191505060405180910390fd5b50506003546001600160801b0380821691600160801b9004166001149091565b33600090815260208190526040902054600114610d02576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116610d5d576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f6e6f2d636f6e74726163742d300000000000604482015290519081900360640190fd5b81610d8257600580546001600160a01b0319166001600160a01b038316179055610df8565b8160011415610dab57600680546001600160a01b0319166001600160a01b038316179055610df8565b6040805162461bcd60e51b815260206004820152601860248201527f554e4956324c504f7261636c652f696e76616c69642d69640000000000000000604482015290519081900360640190fd5b604080518381526001600160a01b038316602082015281517f57e1d18531e0ed6c4f60bf6039e5719aa115e43e43847525125856433a69f7a7929181900390910190a15050565b33600090815260208190526040902054600114610e91576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260026020908152604080832092909255815192835290517f12fdafd291eb287a54e3416070923d22aa5072f5ee04c4fb8361615e7508a37c9281900390910190a150565b33600090815260208190526040902054600114610f36576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b6005546001600160a01b031681565b60015460ff1681565b33600090815260208190526040902054600114610fe5576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b600154600090630100000090046001600160e81b031661104b57506000610c3d565b60015461107190630100000081046001600160e81b031690610100900461ffff166116dc565b905090565b600154630100000090046001600160e81b031642101590565b600154630100000090046001600160e81b031681565b600154610100900461ffff1681565b33600090815260208190526040902054600114611106576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001805460ff191690556040517f1b55ba3aa851a46be3b365aee5b5c140edd620d578922f3e8466d2cbd96f954b90600090a1565b60006020819052908152604090205481565b6006546001600160a01b031681565b336000908152602081905260409020546001146111ae576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116611209576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f6e6f2d636f6e74726163742d300000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526002602090815260409182902060019055815192835290517f6ffc0fabf0709270e42087e84a3bfc36041d3b281266d04ae1962185092fb2449281900390910190a150565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b505050506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561132e57600080fd5b505afa158015611342573d6000803e3d6000fd5b505050506040513d606081101561135857600080fd5b50805160209091015190925090506001600160701b0382161580159061138757506000816001600160701b0316115b6113d8576040805162461bcd60e51b815260206004820152601e60248201527f554e4956324c504f7261636c652f696e76616c69642d72657365727665730000604482015290519081900360640190fd5b600554604080516315f789a960e21b815290516000926001600160a01b0316916357de26a4916004808301926020929190829003018186803b15801561141d57600080fd5b505afa158015611431573d6000803e3d6000fd5b505050506040513d602081101561144757600080fd5b50519050806114875760405162461bcd60e51b81526004018080602001828103825260248152602001806119066024913960400191505060405180910390fd5b600654604080516315f789a960e21b815290516000926001600160a01b0316916357de26a4916004808301926020929190829003018186803b1580156114cc57600080fd5b505afa1580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b50519050806115365760405162461bcd60e51b81526004018080602001828103825260248152602001806119706024913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561159157600080fd5b505afa1580156115a5573d6000803e3d6000fd5b505050506040513d60208110156115bb57600080fd5b5051905060007f00000000000000000000000000000000000000000000000000000000000000006115f5856001600160701b03891661173a565b816115fc57fe5b04905060007f000000000000000000000000000000000000000000000000000000000000000061163585886001600160701b031661173a565b8161163c57fe5b04905060008361166e671bc16d674ec8000061166061165b878761173a565b6117a6565b6001600160801b031661173a565b8161167557fe5b049050600160801b81106116d0576040805162461bcd60e51b815260206004820152601c60248201527f554e4956324c504f7261636c652f71756f74652d6f766572666c6f7700000000604482015290519081900360640190fd5b98975050505050505050565b80820382811115611734576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f7375622d756e646572666c6f770000000000604482015290519081900360640190fd5b92915050565b60008115806117555750508082028282828161175257fe5b04145b611734576040805162461bcd60e51b815260206004820152601a60248201527f554e4956324c504f7261636c652f6d756c2d6f766572666c6f77000000000000604482015290519081900360640190fd5b6000816117b5575060006118e9565b816001600160801b82106117ce5760809190911c9060401b5b6801000000000000000082106117e95760409190911c9060201b5b64010000000082106118005760209190911c9060101b5b6201000082106118155760109190911c9060081b5b61010082106118295760089190911c9060041b5b6010821061183c5760049190911c9060021b5b600882106118485760011b5b600181858161185357fe5b048201901c9050600181858161186557fe5b048201901c9050600181858161187757fe5b048201901c9050600181858161188957fe5b048201901c9050600181858161189b57fe5b048201901c905060018185816118ad57fe5b048201901c905060018185816118bf57fe5b048201901c905060008185816118d157fe5b0490508082106118e157806118e3565b815b93505050505b919050565b60408051808201909152600080825260208201529056fe554e4956324c504f7261636c652f696e76616c69642d6f7261636c652d302d7072696365554e4956324c504f7261636c652f6e6f742d617574686f72697a656400000000554e4956324c504f7261636c652f636f6e74726163742d6e6f742d77686974656c6973746564554e4956324c504f7261636c652f696e76616c69642d6f7261636c652d312d7072696365a26469706673582212206c71ea5b4a3564b81590e23af73a03746aee6212e2106a64806d6047deb00c0b64736f6c634300060c0033554e4956324c504f7261636c652f696e76616c69642d6f7261636c652d61646472657373554e4956324c504f7261636c652f696e76616c69642d7372632d61646472657373000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d5554e49563244414955534443000000000000000000000000000000000000000000000000000000000000000047c3dc029825da43be595e21fffd0b66ffcb7f6e00000000000000000000000077b68899b99b686f415d074278a9a16b336085a0
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806365c4ce7a116100de578063a7a1ed7211610097578063be9a655511610071578063be9a655514610447578063bf353dbb1461044f578063dca44f6f14610475578063f29c29c41461047d57610173565b8063a7a1ed72146103e8578063a9c52a3914610404578063b0b8579b1461042857610173565b806365c4ce7a1461034857806365fae35e1461036e5780636c2552f91461039457806375f12b211461039c5780639c52a7f1146103ba578063a4dff0a2146103e057610173565b806346d4577d1161013057806346d4577d1461025c5780634ca29923146102cc5780634fce7a2a146102e657806357de26a41461030c57806359e02dd71461031457806365af79091461031c57610173565b806307da68f5146101785780630e5a6c701461018257806318178358146101a35780631b25b65f146101ab5780632e7dc6af1461021b5780633a1cde751461023f575b600080fd5b6101806104a3565b005b61018a61053e565b6040805192835290151560208301528051918290030190f35b6101806105ae565b610180600480360360208110156101c157600080fd5b8101906020810181356401000000008111156101dc57600080fd5b8201836020820111156101ee57600080fd5b8035906020019184602083028401116401000000008311171561021057600080fd5b50909250905061079f565b610223610924565b604080516001600160a01b039092168252519081900360200190f35b6101806004803603602081101561025557600080fd5b5035610948565b6101806004803603602081101561027257600080fd5b81019060208101813564010000000081111561028d57600080fd5b82018360208201111561029f57600080fd5b803590602001918460208302840111640100000000831117156102c157600080fd5b509092509050610a3e565b6102d4610b44565b60408051918252519081900360200190f35b6102d4600480360360208110156102fc57600080fd5b50356001600160a01b0316610b68565b6102d4610b7a565b61018a610c40565b6101806004803603604081101561033257600080fd5b50803590602001356001600160a01b0316610cb0565b6101806004803603602081101561035e57600080fd5b50356001600160a01b0316610e3f565b6101806004803603602081101561038457600080fd5b50356001600160a01b0316610ee4565b610223610f7b565b6103a4610f8a565b6040805160ff9092168252519081900360200190f35b610180600480360360208110156103d057600080fd5b50356001600160a01b0316610f93565b6102d4611029565b6103f0611076565b604080519115158252519081900360200190f35b61040c61108f565b604080516001600160e81b039092168252519081900360200190f35b6104306110a5565b6040805161ffff9092168252519081900360200190f35b6101806110b4565b6102d46004803603602081101561046557600080fd5b50356001600160a01b031661113b565b61022361114d565b6101806004803603602081101561049357600080fd5b50356001600160a01b031661115c565b336000908152602081905260409020546001146104f5576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001805460006003819055600481905560ff19909116821762ffffff169091556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b9190a1565b33600090815260026020526040812054819060011461058e5760405162461bcd60e51b815260040180806020018281038252602681526020018061194a6026913960400191505060405180910390fd5b50506004546001600160801b0380821691600160801b9004166001149091565b600154600881901c61ffff169060ff81169060181c8115610616576040805162461bcd60e51b815260206004820152601860248201527f554e4956324c504f7261636c652f69732d73746f707065640000000000000000604482015290519081900360640190fd5b8042101561066b576040805162461bcd60e51b815260206004820152601860248201527f554e4956324c504f7261636c652f6e6f742d7061737365640000000000000000604482015290519081900360640190fd5b5050600061067761125d565b90506001600160801b0381166106d4576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f696e76616c69642d70726963650000000000604482015290519081900360640190fd5b6106dc6118ee565b50604080518082018252600480546001600160801b03808216808552600160801b80840483166020808801829052600380546fffffffffffffffffffffffffffffffff199081169095178616928402929092179091558751808901895289851680825260019183018290529390951683178416909117909455600888901b42890160181b01909255835185519116815291820152825191927f80a5d0081d7e9a7bdb15ef207c6e0772f0f56d24317693206c0e47408f2d0b7392918290030190a1005b336000908152602081905260409020546001146107f1576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b60005b8181101561091f57600083838381811061080a57fe5b905060200201356001600160a01b03166001600160a01b03161415610876576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f6e6f2d636f6e74726163742d300000000000604482015290519081900360640190fd5b60016002600085858581811061088857fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f6ffc0fabf0709270e42087e84a3bfc36041d3b281266d04ae1962185092fb2448383838181106108e957fe5b905060200201356001600160a01b031660405180826001600160a01b0316815260200191505060405180910390a16001016107f4565b505050565b7f000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d581565b3360009081526020819052604090205460011461099a576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b61ffff8111156109f1576040805162461bcd60e51b815260206004820152601960248201527f554e4956324c504f7261636c652f696e76616c69642d686f7000000000000000604482015290519081900360640190fd5b6001805462ffff00191661010061ffff8416021790556040805182815290517fd5cae49d972f01d170fb2d3409c5f318698639863c0403e59e4af06e0ce92817916020908290030190a150565b33600090815260208190526040902054600114610a90576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b60005b8181101561091f57600060026000858585818110610aad57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f12fdafd291eb287a54e3416070923d22aa5072f5ee04c4fb8361615e7508a37c838383818110610b0e57fe5b905060200201356001600160a01b031660405180826001600160a01b0316815260200191505060405180910390a1600101610a93565b7f554e49563244414955534443000000000000000000000000000000000000000081565b60026020526000908152604090205481565b33600090815260026020526040812054600114610bc85760405162461bcd60e51b815260040180806020018281038252602681526020018061194a6026913960400191505060405180910390fd5b600354600160801b90046001600160801b0316600114610c2f576040805162461bcd60e51b815260206004820152601e60248201527f554e4956324c504f7261636c652f6e6f2d63757272656e742d76616c75650000604482015290519081900360640190fd5b506003546001600160801b03165b90565b336000908152600260205260408120548190600114610c905760405162461bcd60e51b815260040180806020018281038252602681526020018061194a6026913960400191505060405180910390fd5b50506003546001600160801b0380821691600160801b9004166001149091565b33600090815260208190526040902054600114610d02576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116610d5d576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f6e6f2d636f6e74726163742d300000000000604482015290519081900360640190fd5b81610d8257600580546001600160a01b0319166001600160a01b038316179055610df8565b8160011415610dab57600680546001600160a01b0319166001600160a01b038316179055610df8565b6040805162461bcd60e51b815260206004820152601860248201527f554e4956324c504f7261636c652f696e76616c69642d69640000000000000000604482015290519081900360640190fd5b604080518381526001600160a01b038316602082015281517f57e1d18531e0ed6c4f60bf6039e5719aa115e43e43847525125856433a69f7a7929181900390910190a15050565b33600090815260208190526040902054600114610e91576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260026020908152604080832092909255815192835290517f12fdafd291eb287a54e3416070923d22aa5072f5ee04c4fb8361615e7508a37c9281900390910190a150565b33600090815260208190526040902054600114610f36576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b6005546001600160a01b031681565b60015460ff1681565b33600090815260208190526040902054600114610fe5576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b600154600090630100000090046001600160e81b031661104b57506000610c3d565b60015461107190630100000081046001600160e81b031690610100900461ffff166116dc565b905090565b600154630100000090046001600160e81b031642101590565b600154630100000090046001600160e81b031681565b600154610100900461ffff1681565b33600090815260208190526040902054600114611106576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001805460ff191690556040517f1b55ba3aa851a46be3b365aee5b5c140edd620d578922f3e8466d2cbd96f954b90600090a1565b60006020819052908152604090205481565b6006546001600160a01b031681565b336000908152602081905260409020546001146111ae576040805162461bcd60e51b815260206004820152601c602482015260008051602061192a833981519152604482015290519081900360640190fd5b6001600160a01b038116611209576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f6e6f2d636f6e74726163742d300000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526002602090815260409182902060019055815192835290517f6ffc0fabf0709270e42087e84a3bfc36041d3b281266d04ae1962185092fb2449281900390910190a150565b60007f000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d56001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b505050506000807f000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d56001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561132e57600080fd5b505afa158015611342573d6000803e3d6000fd5b505050506040513d606081101561135857600080fd5b50805160209091015190925090506001600160701b0382161580159061138757506000816001600160701b0316115b6113d8576040805162461bcd60e51b815260206004820152601e60248201527f554e4956324c504f7261636c652f696e76616c69642d72657365727665730000604482015290519081900360640190fd5b600554604080516315f789a960e21b815290516000926001600160a01b0316916357de26a4916004808301926020929190829003018186803b15801561141d57600080fd5b505afa158015611431573d6000803e3d6000fd5b505050506040513d602081101561144757600080fd5b50519050806114875760405162461bcd60e51b81526004018080602001828103825260248152602001806119066024913960400191505060405180910390fd5b600654604080516315f789a960e21b815290516000926001600160a01b0316916357de26a4916004808301926020929190829003018186803b1580156114cc57600080fd5b505afa1580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b50519050806115365760405162461bcd60e51b81526004018080602001828103825260248152602001806119706024913960400191505060405180910390fd5b60007f000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d56001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561159157600080fd5b505afa1580156115a5573d6000803e3d6000fd5b505050506040513d60208110156115bb57600080fd5b5051905060007f0000000000000000000000000000000000000000000000000de0b6b3a76400006115f5856001600160701b03891661173a565b816115fc57fe5b04905060007f00000000000000000000000000000000000000000000000000000000000f424061163585886001600160701b031661173a565b8161163c57fe5b04905060008361166e671bc16d674ec8000061166061165b878761173a565b6117a6565b6001600160801b031661173a565b8161167557fe5b049050600160801b81106116d0576040805162461bcd60e51b815260206004820152601c60248201527f554e4956324c504f7261636c652f71756f74652d6f766572666c6f7700000000604482015290519081900360640190fd5b98975050505050505050565b80820382811115611734576040805162461bcd60e51b815260206004820152601b60248201527f554e4956324c504f7261636c652f7375622d756e646572666c6f770000000000604482015290519081900360640190fd5b92915050565b60008115806117555750508082028282828161175257fe5b04145b611734576040805162461bcd60e51b815260206004820152601a60248201527f554e4956324c504f7261636c652f6d756c2d6f766572666c6f77000000000000604482015290519081900360640190fd5b6000816117b5575060006118e9565b816001600160801b82106117ce5760809190911c9060401b5b6801000000000000000082106117e95760409190911c9060201b5b64010000000082106118005760209190911c9060101b5b6201000082106118155760109190911c9060081b5b61010082106118295760089190911c9060041b5b6010821061183c5760049190911c9060021b5b600882106118485760011b5b600181858161185357fe5b048201901c9050600181858161186557fe5b048201901c9050600181858161187757fe5b048201901c9050600181858161188957fe5b048201901c9050600181858161189b57fe5b048201901c905060018185816118ad57fe5b048201901c905060018185816118bf57fe5b048201901c905060008185816118d157fe5b0490508082106118e157806118e3565b815b93505050505b919050565b60408051808201909152600080825260208201529056fe554e4956324c504f7261636c652f696e76616c69642d6f7261636c652d302d7072696365554e4956324c504f7261636c652f6e6f742d617574686f72697a656400000000554e4956324c504f7261636c652f636f6e74726163742d6e6f742d77686974656c6973746564554e4956324c504f7261636c652f696e76616c69642d6f7261636c652d312d7072696365a26469706673582212206c71ea5b4a3564b81590e23af73a03746aee6212e2106a64806d6047deb00c0b64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d5554e49563244414955534443000000000000000000000000000000000000000000000000000000000000000047c3dc029825da43be595e21fffd0b66ffcb7f6e00000000000000000000000077b68899b99b686f415d074278a9a16b336085a0
-----Decoded View---------------
Arg [0] : _src (address): 0xAE461cA67B15dc8dc81CE7615e0320dA1A9aB8D5
Arg [1] : _wat (bytes32): 0x554e495632444149555344430000000000000000000000000000000000000000
Arg [2] : _orb0 (address): 0x47c3dC029825Da43BE595E21fffD0b66FfcB7F6e
Arg [3] : _orb1 (address): 0x77b68899b99b686F415d074278a9a16b336085A0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ae461ca67b15dc8dc81ce7615e0320da1a9ab8d5
Arg [1] : 554e495632444149555344430000000000000000000000000000000000000000
Arg [2] : 00000000000000000000000047c3dc029825da43be595e21fffd0b66ffcb7f6e
Arg [3] : 00000000000000000000000077b68899b99b686f415d074278a9a16b336085a0
Deployed Bytecode Sourcemap
4651:10552:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9254:142;;;:::i;:::-;;14174:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11748:2285;;;:::i;14656:254::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14656:254:0;;-1:-1:-1;14656:254:0;-1:-1:-1;14656:254:0;:::i;5141:28::-;;;:::i;:::-;;;;-1:-1:-1;;;;;5141:28:0;;;;;;;;;;;;;;9496:172;;;;;;;;;;;;;;;;-1:-1:-1;9496:172:0;;:::i;15020:180::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15020:180:0;;-1:-1:-1;15020:180:0;-1:-1:-1;15020:180:0;:::i;5552:28::-;;;:::i;:::-;;;;;;;;;;;;;;;;5667:39;;;;;;;;;;;;;;;;-1:-1:-1;5667:39:0;-1:-1:-1;;;;;5667:39:0;;:::i;14307:172::-;;;:::i;14041:125::-;;;:::i;9676:349::-;;;;;;;;;;;;;;;;-1:-1:-1;9676:349:0;;;;;;-1:-1:-1;;;;;9676:349:0;;:::i;14918:94::-;;;;;;;;;;;;;;;;-1:-1:-1;14918:94:0;-1:-1:-1;;;;;14918:94:0;;:::i;4824:79::-;;;;;;;;;;;;;;;;-1:-1:-1;4824:79:0;-1:-1:-1;;;;;4824:79:0;;:::i;6274:30::-;;;:::i;5328:22::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4923:79;;;;;;;;;;;;;;;;-1:-1:-1;4923:79:0;-1:-1:-1;;;;;4923:79:0;;:::i;10077:147::-;;;:::i;10232:93::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;5475:18;;;:::i;:::-;;;;-1:-1:-1;;;;;5475:18:0;;;;;;;;;;;;;;5397:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9404:84;;;:::i;4704:41::-;;;;;;;;;;;;;;;;-1:-1:-1;4704:41:0;-1:-1:-1;;;;;4704:41:0;;:::i;6355:30::-;;;:::i;14487:161::-;;;;;;;;;;;;;;;;-1:-1:-1;14487:161:0;-1:-1:-1;;;;;14487:161:0;;:::i;9254:142::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;9305:1:::1;9295:11:::0;;:7:::1;9324:3;9317:10:::0;;;9345:3:::1;9338:10:::0;;;-1:-1:-1;;9295:11:0;;::::1;::::0;::::1;9359:7:::0;::::1;::::0;;;9382:6:::1;::::0;::::1;::::0;9295:7;9382:6:::1;9254:142::o:0;14174:125::-;5741:10;14218:7;5737:15;;;:3;:15;;;;;;14218:7;;5756:1;5737:20;5729:71;;;;-1:-1:-1;;;5729:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14267:3:0::1;:7:::0;-1:-1:-1;;;;;14267:7:0;;::::1;::::0;-1:-1:-1;;;14278:7:0;;::::1;;-1:-1:-1::0;14278:12:0::1;::::0;14174:125::o;11748:2285::-;12083:1;12077:8;12181:1;12177:13;;;12192:6;12173:26;;12135:4;12116:26;;;12234:2;12230:14;12398:13;;12390:50;;;;;-1:-1:-1;;;12390:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12721:4;12702:15;:23;;12694:60;;;;;-1:-1:-1;;;12694:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11748:2285;;12778:11;12792:6;:4;:6::i;:::-;12778:20;-1:-1:-1;;;;;;12817:8:0;;12809:48;;;;;-1:-1:-1;;;12809:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12868:16;;:::i;:::-;-1:-1:-1;12868:22:0;;;;;;;;12887:3;12868:22;;-1:-1:-1;;;;;12868:22:0;;;;;;-1:-1:-1;;;12868:22:0;;;;;;;;;;;;12955:3;:10;;-1:-1:-1;;12955:10:0;;;;;;;;;;;;;;;;;;12982:12;;;;;;;;;;;;;-1:-1:-1;12982:12:0;;;;;;12976:18;;;;;;;;;;;;;;13715:1;13711:12;;;13616:11;13612:22;;13608:2;13604:31;13526:216;13481:276;;;13876:8;;13870:20;;;;;;;;;;;;12868:22;;13870:20;;;;;;;;;14009:6;14656:254;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;14722:9:::1;14718:185;14737:13:::0;;::::1;14718:185;;;14797:1;14780:2:::0;;14783:1;14780:5;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;14780:5:0::1;-1:-1:-1::0;;;;;14780:19:0::1;;;14772:59;;;::::0;;-1:-1:-1;;;14772:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14859:1;14846:3;:10;14850:2;;14853:1;14850:5;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;14850:5:0::1;14846:10:::0;;-1:-1:-1;14846:10:0;::::1;::::0;;;;;;-1:-1:-1;14846:10:0;:14;14880:11:::1;14885:2:::0;;14888:1;14885:5;;::::1;;;;;14880:11;::::0;;14885:5:::1;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;14885:5:0::1;14880:11:::0;;;;;;;;;;-1:-1:-1;14880:11:0::1;14752:3;;14718:185;;;;14656:254:::0;;:::o;5141:28::-;;;:::o;9496:172::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;9557:18:::1;::::0;::::1;;9549:56;;;::::0;;-1:-1:-1;;;9549:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9616:3;:18:::0;;-1:-1:-1;;9616:18:0::1;;;::::0;::::1;;;::::0;;9650:10:::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;9496:172:::0;:::o;15020:180::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;15086:9:::1;15082:111;15101:13:::0;;::::1;15082:111;;;15149:1;15136:3;:10;15140:2;;15143:1;15140:5;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;15140:5:0::1;15136:10:::0;;-1:-1:-1;15136:10:0;::::1;::::0;;;;;;-1:-1:-1;15136:10:0;:14;15170:11:::1;15175:2:::0;;15178:1;15175:5;;::::1;;;;;15170:11;::::0;;15175:5:::1;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;15175:5:0::1;15170:11:::0;;;;;;;;;;-1:-1:-1;15170:11:0::1;15116:3;;15082:111;;5552:28:::0;;;:::o;5667:39::-;;;;;;;;;;;;;:::o;14307:172::-;5741:10;14351:7;5737:15;;;:3;:15;;;;;;5756:1;5737:20;5729:71;;;;-1:-1:-1;;;5729:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14379:3:::1;:7:::0;-1:-1:-1;;;;;;;;14379:7:0;;::::1;;-1:-1:-1::0;14379:12:0::1;14371:55;;;::::0;;-1:-1:-1;;;14371:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;14461:3:0::1;:7:::0;-1:-1:-1;;;;;14461:7:0::1;5802:1;14307:172:::0;:::o;14041:125::-;5741:10;14085:7;5737:15;;;:3;:15;;;;;;14085:7;;5756:1;5737:20;5729:71;;;;-1:-1:-1;;;5729:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14134:3:0::1;:7:::0;-1:-1:-1;;;;;14134:7:0;;::::1;::::0;-1:-1:-1;;;14145:7:0;;::::1;;-1:-1:-1::0;14145:12:0::1;::::0;14041:125::o;9676:349::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9750:18:0;::::1;9742:58;;;::::0;;-1:-1:-1;;;9742:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9814:8:::0;9811:176:::1;;9839:4;:11:::0;;-1:-1:-1;;;;;;9839:11:0::1;-1:-1:-1::0;;;;;9839:11:0;::::1;;::::0;;9811:176:::1;;;9872:3;9879:1;9872:8;9868:119;;;9897:4;:11:::0;;-1:-1:-1;;;;;;9897:11:0::1;-1:-1:-1::0;;;;;9897:11:0;::::1;;::::0;;9868:119:::1;;;9941:34;::::0;;-1:-1:-1;;;9941:34:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;9868:119;10002:15;::::0;;;;;-1:-1:-1;;;;;10002:15:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;9676:349:::0;;:::o;14918:94::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14969:7:0;::::1;14979:1;14969:7:::0;;;:3:::1;:7;::::0;;;;;;;:11;;;;14996:8;;;;;;;::::1;::::0;;;;;;;;::::1;14918:94:::0;:::o;4824:79::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;4868:11:0;::::1;:5;:11:::0;;;::::1;::::0;;;;;;;-1:-1:-1;4868:15:0;;4890:10;::::1;::::0;4868:5;4890:10:::1;4824:79:::0;:::o;6274:30::-;;;-1:-1:-1;;;;;6274:30:0;;:::o;5328:22::-;;;;;;:::o;4923:79::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;4967:11:0;::::1;4981:1;4967:11:::0;;;::::1;::::0;;;;;;;:15;;;4989:10;::::1;::::0;4981:1;4989:10:::1;4923:79:::0;:::o;10077:147::-;10139:3;;10115:7;;10139:3;;;-1:-1:-1;;;;;10139:3:0;10135:22;;-1:-1:-1;10156:1:0;10149:8;;10135:22;10207:3;;10203:13;;10207:3;;;-1:-1:-1;;;;;10207:3:0;;;10212;;;;10203;:13::i;:::-;10196:20;;10077:147;:::o;10232:93::-;10314:3;;;;;-1:-1:-1;;;;;10314:3:0;10295:15;:22;;;10232:93::o;5475:18::-;;;;;;-1:-1:-1;;;;;5475:18:0;;:::o;5397:28::-;;;;;;;;;:::o;9404:84::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;9446:7:::1;:11:::0;;-1:-1:-1;;9446:11:0::1;::::0;;9473:7:::1;::::0;::::1;::::0;-1:-1:-1;;9473:7:0::1;9404:84::o:0;4704:41::-;;;;;;;;;;;;;;:::o;6355:30::-;;;-1:-1:-1;;;;;6355:30:0;;:::o;14487:161::-;5064:10;5058:5;:17;;;;;;;;;;;5079:1;5058:22;5050:63;;;;;-1:-1:-1;;;5050:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5050:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14546:16:0;::::1;14538:56;;;::::0;;-1:-1:-1;;;14538:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;14605:7:0;::::1;;::::0;;;:3:::1;:7;::::0;;;;;;;;-1:-1:-1;14605:11:0;;14632:8;;;;;;;::::1;::::0;;;;;;;;::::1;14487:161:::0;:::o;10333:1407::-;10367:13;10466:3;-1:-1:-1;;;;;10448:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10542:10;10554;10587:3;-1:-1:-1;;;;;10569:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10569:36:0;;;;;;;;;-1:-1:-1;10569:36:0;-1:-1:-1;;;;;;10624:6:0;;;;;;:16;;-1:-1:-1;;;;;;10634:6:0;;;;10624:16;10616:59;;;;;-1:-1:-1;;;10616:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10782:4;;10771:23;;;-1:-1:-1;;;10771:23:0;;;;10758:10;;-1:-1:-1;;;;;10782:4:0;;10771:21;;:23;;;;;;;;;;;;;;10782:4;10771:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10771:23:0;;-1:-1:-1;10854:7:0;10846:56;;;;-1:-1:-1;;;10846:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10937:4;;10926:23;;;-1:-1:-1;;;10926:23:0;;;;10913:10;;-1:-1:-1;;;;;10937:4:0;;10926:21;;:23;;;;;;;;;;;;;;10937:4;10926:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10926:23:0;;-1:-1:-1;11009:7:0;11001:56;;;;-1:-1:-1;;;11001:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11102:14;11129:3;-1:-1:-1;;;;;11119:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11119:28:0;;-1:-1:-1;11401:14:0;11441:6;11418:20;11422:2;-1:-1:-1;;;;;11426:11:0;;11418:3;:20::i;:::-;:29;;;;;;;-1:-1:-1;11466:14:0;11506:6;11483:20;11487:2;-1:-1:-1;;;;;11491:11:0;;11483:3;:20::i;:::-;:29;;;;;;;-1:-1:-1;11531:12:0;11588:6;11546:39;11550:7;11559:25;11564:19;11568:6;11483:29;11564:3;:19::i;:::-;11559:4;:25::i;:::-;-1:-1:-1;;;;;11546:39:0;:3;:39::i;:::-;:48;;;;;;;-1:-1:-1;;;;11644:15:0;;11636:56;;;;;-1:-1:-1;;;11636:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11719:4;10333:1407;-1:-1:-1;;;;;;;;10333:1407:0:o;6653:149::-;6748:7;;;6743:19;;;;6735:59;;;;;-1:-1:-1;;;6735:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6653:149;;;;:::o;6808:164::-;6868:9;6898:7;;;:35;;-1:-1:-1;;6914:7:0;;;6931:2;6925;6914:7;6925:2;6909:18;;;;;:24;6898:35;6890:74;;;;;-1:-1:-1;;;6890:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7121:971;7170:7;7194;7190:895;;-1:-1:-1;7210:1:0;7203:8;;7190:895;7255:2;7284:1;-1:-1:-1;;;7304:41:0;;7300:72;;7356:3;7349:10;;;;;7367:2;7361:8;7300:72;7396:19;7390:2;:25;7386:55;;7426:2;7419:9;;;;;7436:2;7430:8;7386:55;7465:11;7459:2;:17;7455:47;;7487:2;7480:9;;;;;7497:2;7491:8;7455:47;7526:7;7520:2;:13;7516:42;;7544:2;7537:9;;;;;7554:1;7548:7;7516:42;7582:5;7576:2;:11;7572:39;;7598:1;7591:8;;;;;7607:1;7601:7;7572:39;7635:4;7629:2;:10;7625:38;;7650:1;7643:8;;;;;7659:1;7653:7;7625:38;7687:3;7681:2;:9;7677:27;;7700:1;7694:7;7677:27;7738:1;7732;7727:2;:6;;;;;;7723:1;:10;7722:17;;7718:21;;7774:1;7768;7763:2;:6;;;;;;7759:1;:10;7758:17;;7754:21;;7810:1;7804;7799:2;:6;;;;;;7795:1;:10;7794:17;;7790:21;;7846:1;7840;7835:2;:6;;;;;;7831:1;:10;7830:17;;7826:21;;7882:1;7876;7871:2;:6;;;;;;7867:1;:10;7866:17;;7862:21;;7918:1;7912;7907:2;:6;;;;;;7903:1;:10;7902:17;;7898:21;;7954:1;7948;7943:2;:6;;;;;;7939:1;:10;7938:17;;7934:21;;8007:10;8025:1;8020:2;:6;;;;;;8007:19;;8061:2;8057:1;:6;:15;;8070:2;8057:15;;;8066:1;8057:15;8041:32;;;;;7190:895;7121:971;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6c71ea5b4a3564b81590e23af73a03746aee6212e2106a64806d6047deb00c0b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.