20M+ users trust MoonPay worldwide. Checkout with your preferred payment method.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
100s of games, generous bonuses, 20+ years of trusted gaming. Join CryptoWins & start winning today!
Overview
ETH Balance
Eth Value
$115.40 (@ $3,318.03/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (87)200 PKGPKG Token (PKG)$0.00@0.000 SANSAN (SAN)$0.00@0.11250 ABYSSAbyss (ABYSS)$0.00@0.00620 APPCAppCoins (APPC)$0.00@0.00050 ABTArcBlock (ABT)$0.00@1.360 BANDBandToken (BAND)$0.00@1.350 BLZBluzelle (BLZ)$0.00@0.11910 ETHBNTBNT Smart To... (ETHBNT)0 BTUBTU Protocol (BTU)$0.00@0.3953272.03538915 LINKChainLink To... (LINK)$4,366.17@16.050 CNDCindicator (CND)$0.00@0.00020 GENDAOstack (GEN)$0.00@0.000 DATDatum (DAT)0 MANADecentraland (MANA)$0.00@0.44890 EKGEkon Gold (EKG)0 ELFELF (ELF)$0.00@0.41760 ENJEnjinCoin (ENJ)$0.00@0.2060 LENDEthLend (LEND)$0.00@0.03841 ISLAInsula (ISLA)$0.03@0.0290 KNCKyberNetwork (KNC)$0.00@0.56780 LOOMLoom (LOOM)$0.00@0.06580 LRCLoopringCoin... (LRC)$0.00@0.18440 MLNMelon Token (MLN)$0.00@15.74050 OMGOMG Network (OMG)$0.00@0.3180 OGNOriginToken (OGN)$0.00@0.10880 PLRPILLAR (PLR)$0.00@0.00440 PNKPinakion (PNK)$0.00@0.0160 PNTpNetwork Tok... (PNT)$0.00@0.00470 POLYPolymath (POLY)$0.00@0.03440 eQUADQuadrantProt... (eQUAD)$0.00@0.00470 QNTQuant (QNT)$0.00@90.400 QKCQuarkChain T... (QKC)$0.00@0.00970 RAERAE Token (RAE)$0.00@0.85570 RENRepublic (REN)$0.00@0.04440 REQRequest (REQ)$0.00@0.10345 STTScatter.cx (STT)$0.00@0.000 KEYSelfKey (KEY)$0.00@0.00330 UPPSENTINEL PRO... (UPP)$0.00@0.07310 STSimple Token (ST)$0.00@0.00020 MFGSmart MFG (MFG)$0.00@0.0010 sUSDSynth sUSD (sUSD)$0.00@1.0050 SNXSynthetix Ne... (SNX)$0.00@1.85400 UNIUniswap (UNI)$3,816.00@9.540 WaBiWaBi (WaBi)$0.00@0.00070 ZRXZRX (ZRX)$0.00@0.44550 BNTBancor (BNT)$0.00@0.66670 BATBAT (BAT)$0.00@0.22820 BUSDBUSD (BUSD)$0.00@0.96220 CDTCoinDash Tok... (CDT)$0.00@0.22740.00000305 COMPCompound (COMP)$0.00@57.090 DAIDai Stableco... (DAI)$0.00@0.99970 GNOGnosis (GNO)$0.00@263.150 USDPPax Dollar (USDP)$0.00@1.0010 RDNRaiden (RDN)$0.00@0.00530 SAISai Stableco... (SAI)$0.00@17.380 SNTStatusNetwor... (SNT)$0.00@0.03930 PAYTenXPay (PAY)$0.00@0.00750 TUSDTrueUSD (TUSD)$0.00@1.001 USDCUSDC (USDC)$1.00@1.000 ANTAragon0 BAMBamboo (BAM)450 CAPCCap Coin0 EKOEchoLink0 EDOEidoo1.2555 ERMERam (ERM)1.98 ERC20ERC200 FXCFlexacoin0 GDCGlobal Digital Content$0.00@0.000 GHTGlobal Human Trust0 METMetronome32,000 MNEMinereum32,000 MNEMinereum0 NEXXONexxo Tokens200 PRQParsiq Token500,000 PNTPenta Networ... (PNT)0 REPReputation$0.00@0.61730 RSVReserve0 RSRReserve Rights0 STORMStorm0 SNXSynthetix Network Token0 2KEYTwoKeyEconomy0 DTAData0 MYBMyBit$0.00@0.00020 sUSDSynth sUSD1.4 TokenERC-20 TOKEN*[Suspicious]132.84 TokenERC-20 TOKEN*[Spam]245.44 TokenERC-20 TOKEN*[Spam]NFT Tokens (14)claim rewards on apylink.comapylink.comERC-1155Moonbirdpunk LimitedMoonbirdpunk LimitedERC-1155claim rewards qntnetwork.orgqntnetwork.orgERC-1155claim rewards on snxtoken.comsnxtoken.comERC-1155claim rewards on univ4labs.orguniv4labs.orgERC-1155ERC-1155 TOKEN*[Suspicious]
More Info
Private Name Tags
ContractCreator
Multichain Info
1 address found via- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 289 transactions
Transaction Hash MethodBlockFromToTransfer 13804220 2021-12-14 15:52:42 1074 days ago 1639497162 IN 0.00115997 ETH$3.85 0.00174772 77.52171715 Transfer 10837968 2020-09-11 2:55:41 1533 days ago 1599792941 IN 0 ETH$0.00 0.00318749 131 List Pair For Re... 10386661 2020-07-03 13:19:37 1603 days ago 1593782377 IN 0 ETH$0.00 0.00728254 54 List Pair For Re... 10359686 2020-06-29 8:25:58 1607 days ago 1593419158 IN 0 ETH$0.00 0.00135471 33 List Pair For Re... 10359675 2020-06-29 8:23:13 1607 days ago 1593418993 IN 0 ETH$0.00 0.00134085 33 List Pair For Re... 10359667 2020-06-29 8:21:29 1607 days ago 1593418889 IN 0 ETH$0.00 0.00136616 33 List Pair For Re... 10359648 2020-06-29 8:17:28 1607 days ago 1593418648 IN 0 ETH$0.00 0.00134963 33 List Pair For Re... 10312611 2020-06-22 1:20:19 1614 days ago 1592788819 IN 0 ETH$0.00 0.00233235 18 List Pair For Re... 10312514 2020-06-22 1:02:07 1614 days ago 1592787727 IN 0 ETH$0.00 0.00083407 17.2 List Pair For Re... 10312455 2020-06-22 0:50:18 1614 days ago 1592787018 IN 0 ETH$0.00 0.00088726 17.2 List Pair For Re... 10282924 2020-06-17 11:15:36 1619 days ago 1592392536 IN 0 ETH$0.00 0.00155636 38 List Pair For Re... 10230946 2020-06-09 10:26:53 1627 days ago 1591698413 IN 0 ETH$0.00 0.0013788 34 List Pair For Re... 10230946 2020-06-09 10:26:53 1627 days ago 1591698413 IN 0 ETH$0.00 0.00139151 34 List Pair For Re... 10230941 2020-06-09 10:25:12 1627 days ago 1591698312 IN 0 ETH$0.00 0.00139403 34 List Pair For Re... 10230937 2020-06-09 10:24:46 1627 days ago 1591698286 IN 0 ETH$0.00 0.00137774 34 List Pair For Re... 10230930 2020-06-09 10:23:50 1627 days ago 1591698230 IN 0 ETH$0.00 0.00143465 35 Transfer 10175961 2020-05-31 21:17:01 1636 days ago 1590959821 IN 0 ETH$0.00 0.00038326 17 List Pair For Re... 9960071 2020-04-28 9:10:55 1669 days ago 1588065055 IN 0 ETH$0.00 0.00050881 11 List Pair For Re... 9960068 2020-04-28 9:10:14 1669 days ago 1588065014 IN 0 ETH$0.00 0.00049479 11 List Pair For Re... 9960067 2020-04-28 9:09:52 1669 days ago 1588064992 IN 0 ETH$0.00 0.0004457 11 List Pair For Re... 9960066 2020-04-28 9:09:43 1669 days ago 1588064983 IN 0 ETH$0.00 0.00045141 11 List Pair For Re... 9960047 2020-04-28 9:06:49 1669 days ago 1588064809 IN 0 ETH$0.00 0.00040534 10 List Pair For Re... 9960031 2020-04-28 9:03:42 1669 days ago 1588064622 IN 0 ETH$0.00 0.00040521 10 List Pair For Re... 9946369 2020-04-26 5:55:53 1671 days ago 1587880553 IN 0 ETH$0.00 0.0009864 8 List Pair For Re... 9946367 2020-04-26 5:55:34 1671 days ago 1587880534 IN 0 ETH$0.00 0.00134006 8 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block From To 10410604 2020-07-07 6:17:36 1599 days ago 1594102656 3.08774066 ETH$10,245.22 10410604 2020-07-07 6:17:36 1599 days ago 1594102656 3.08774066 ETH$10,245.22 10410601 2020-07-07 6:17:15 1599 days ago 1594102635 1.50187894 ETH$4,983.28 10410601 2020-07-07 6:17:15 1599 days ago 1594102635 1.50187894 ETH$4,983.28 10410599 2020-07-07 6:16:41 1599 days ago 1594102601 0.1 ETH$331.80 10410599 2020-07-07 6:16:41 1599 days ago 1594102601 0.1 ETH$331.80 10410598 2020-07-07 6:16:35 1599 days ago 1594102595 0.62754245 ETH$2,082.21 10410598 2020-07-07 6:16:35 1599 days ago 1594102595 0.62754245 ETH$2,082.21 10410598 2020-07-07 6:16:35 1599 days ago 1594102595 3 ETH$9,954.09 10410598 2020-07-07 6:16:35 1599 days ago 1594102595 3 ETH$9,954.09 10410597 2020-07-07 6:16:27 1599 days ago 1594102587 0.1 ETH$331.80 10410597 2020-07-07 6:16:27 1599 days ago 1594102587 0.1 ETH$331.80 10410595 2020-07-07 6:16:11 1599 days ago 1594102571 0.00849119 ETH$28.17 10410595 2020-07-07 6:16:11 1599 days ago 1594102571 0.00849119 ETH$28.17 10410588 2020-07-07 6:14:49 1599 days ago 1594102489 2.49625 ETH$8,282.63 10410588 2020-07-07 6:14:49 1599 days ago 1594102489 2.49625 ETH$8,282.63 10410582 2020-07-07 6:12:33 1599 days ago 1594102353 0.6491 ETH$2,153.73 10410582 2020-07-07 6:12:33 1599 days ago 1594102353 0.6491 ETH$2,153.73 10410579 2020-07-07 6:11:12 1599 days ago 1594102272 2.9955 ETH$9,939.16 10410579 2020-07-07 6:11:12 1599 days ago 1594102272 2.9955 ETH$9,939.16 10410579 2020-07-07 6:11:12 1599 days ago 1594102272 2.55722026 ETH$8,484.94 10410579 2020-07-07 6:11:12 1599 days ago 1594102272 2.55722026 ETH$8,484.94 10410577 2020-07-07 6:11:03 1599 days ago 1594102263 0.8709 ETH$2,889.67 10410577 2020-07-07 6:11:03 1599 days ago 1594102263 0.8709 ETH$2,889.67 10410575 2020-07-07 6:10:50 1599 days ago 1594102250 0.03983299 ETH$132.17 Loading...LoadingSimilar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xafBf0D08...c8CeF5077The constructor portion of the code might be different and could alter the actual behaviour of the contractContract Name:KyberNetwork
Compiler Versionv0.4.18+commit.9cf6e910
Contract Source Code (Solidity Multiple files format)
pragma solidity 0.4.18; import "./ERC20Interface.sol"; import "./KyberReserveInterface.sol"; import "./KyberNetworkInterface.sol"; import "./Withdrawable.sol"; import "./Utils3.sol"; import "./WhiteListInterface.sol"; import "./ExpectedRateInterface.sol"; import "./FeeBurnerInterface.sol"; /** * @title Helps contracts guard against reentrancy attacks. */ contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private guardCounter = 1; /** * @dev Prevents a function from calling itself, directly or indirectly. * Calling one `nonReentrant` function from * another is not supported. Instead, you can implement a * `private` function doing the actual work, and an `external` * wrapper marked as `nonReentrant`. */ modifier nonReentrant() { guardCounter += 1; uint256 localCounter = guardCounter; _; require(localCounter == guardCounter); } } //////////////////////////////////////////////////////////////////////////////////////////////////////// /// @title Kyber Network main contract contract KyberNetwork is Withdrawable, Utils3, KyberNetworkInterface, ReentrancyGuard { bytes public constant PERM_HINT = "PERM"; uint public constant PERM_HINT_GET_RATE = 1 << 255; // for get rate. bit mask hint. uint public negligibleRateDiff = 10; // basic rate steps will be in 0.01% KyberReserveInterface[] public reserves; mapping(address=>ReserveType) public reserveType; WhiteListInterface public whiteListContract; ExpectedRateInterface public expectedRateContract; FeeBurnerInterface public feeBurnerContract; address public kyberNetworkProxyContract; uint public maxGasPriceValue = 50 * 1000 * 1000 * 1000; // 50 gwei bool public isEnabled = false; // network is enabled mapping(bytes32=>uint) public infoFields; // this is only a UI field for external app. mapping(address=>address[]) public reservesPerTokenSrc; //reserves supporting token to eth mapping(address=>address[]) public reservesPerTokenDest;//reserves support eth to token enum ReserveType {NONE, PERMISSIONED, PERMISSIONLESS} bytes internal constant EMPTY_HINT = ""; function KyberNetwork(address _admin) public { require(_admin != address(0)); admin = _admin; } event EtherReceival(address indexed sender, uint amount); /* solhint-disable no-complex-fallback */ function() public payable { EtherReceival(msg.sender, msg.value); } /* solhint-enable no-complex-fallback */ struct TradeInput { address trader; ERC20 src; uint srcAmount; ERC20 dest; address destAddress; uint maxDestAmount; uint minConversionRate; address walletId; bytes hint; } function tradeWithHint( address trader, ERC20 src, uint srcAmount, ERC20 dest, address destAddress, uint maxDestAmount, uint minConversionRate, address walletId, bytes hint ) public nonReentrant payable returns(uint) { require(msg.sender == kyberNetworkProxyContract); require((hint.length == 0) || (hint.length == 4)); TradeInput memory tradeInput; tradeInput.trader = trader; tradeInput.src = src; tradeInput.srcAmount = srcAmount; tradeInput.dest = dest; tradeInput.destAddress = destAddress; tradeInput.maxDestAmount = maxDestAmount; tradeInput.minConversionRate = minConversionRate; tradeInput.walletId = walletId; tradeInput.hint = hint; return trade(tradeInput); } event AddReserveToNetwork(KyberReserveInterface indexed reserve, bool add, bool isPermissionless); /// @notice can be called only by operator /// @dev add or deletes a reserve to/from the network. /// @param reserve The reserve address. /// @param isPermissionless is the new reserve from permissionless type. function addReserve(KyberReserveInterface reserve, bool isPermissionless) public onlyOperator returns(bool) { require(reserveType[reserve] == ReserveType.NONE); reserves.push(reserve); reserveType[reserve] = isPermissionless ? ReserveType.PERMISSIONLESS : ReserveType.PERMISSIONED; AddReserveToNetwork(reserve, true, isPermissionless); return true; } event RemoveReserveFromNetwork(KyberReserveInterface reserve); /// @notice can be called only by operator /// @dev removes a reserve from Kyber network. /// @param reserve The reserve address. /// @param index in reserve array. function removeReserve(KyberReserveInterface reserve, uint index) public onlyOperator returns(bool) { require(reserveType[reserve] != ReserveType.NONE); require(reserves[index] == reserve); reserveType[reserve] = ReserveType.NONE; reserves[index] = reserves[reserves.length - 1]; reserves.length--; RemoveReserveFromNetwork(reserve); return true; } event ListReservePairs(address indexed reserve, ERC20 src, ERC20 dest, bool add); /// @notice can be called only by operator /// @dev allow or prevent a specific reserve to trade a pair of tokens /// @param reserve The reserve address. /// @param token token address /// @param ethToToken will it support ether to token trade /// @param tokenToEth will it support token to ether trade /// @param add If true then list this pair, otherwise unlist it. function listPairForReserve(address reserve, ERC20 token, bool ethToToken, bool tokenToEth, bool add) public onlyOperator returns(bool) { require(reserveType[reserve] != ReserveType.NONE); if (ethToToken) { listPairs(reserve, token, false, add); ListReservePairs(reserve, ETH_TOKEN_ADDRESS, token, add); } if (tokenToEth) { listPairs(reserve, token, true, add); if (add) { require(token.approve(reserve, 2**255)); // approve infinity } else { require(token.approve(reserve, 0)); } ListReservePairs(reserve, token, ETH_TOKEN_ADDRESS, add); } setDecimals(token); return true; } event WhiteListContractSet(WhiteListInterface newContract, WhiteListInterface currentContract); ///@param whiteList can be empty function setWhiteList(WhiteListInterface whiteList) public onlyAdmin { WhiteListContractSet(whiteList, whiteListContract); whiteListContract = whiteList; } event ExpectedRateContractSet(ExpectedRateInterface newContract, ExpectedRateInterface currentContract); function setExpectedRate(ExpectedRateInterface expectedRate) public onlyAdmin { require(expectedRate != address(0)); ExpectedRateContractSet(expectedRate, expectedRateContract); expectedRateContract = expectedRate; } event FeeBurnerContractSet(FeeBurnerInterface newContract, FeeBurnerInterface currentContract); function setFeeBurner(FeeBurnerInterface feeBurner) public onlyAdmin { require(feeBurner != address(0)); FeeBurnerContractSet(feeBurner, feeBurnerContract); feeBurnerContract = feeBurner; } event KyberNetwrokParamsSet(uint maxGasPrice, uint negligibleRateDiff); function setParams( uint _maxGasPrice, uint _negligibleRateDiff ) public onlyAdmin { require(_negligibleRateDiff <= 100 * 100); // at most 100% maxGasPriceValue = _maxGasPrice; negligibleRateDiff = _negligibleRateDiff; KyberNetwrokParamsSet(maxGasPriceValue, negligibleRateDiff); } event KyberNetworkSetEnable(bool isEnabled); function setEnable(bool _enable) public onlyAdmin { if (_enable) { require(feeBurnerContract != address(0)); require(expectedRateContract != address(0)); require(kyberNetworkProxyContract != address(0)); } isEnabled = _enable; KyberNetworkSetEnable(isEnabled); } function setInfo(bytes32 field, uint value) public onlyOperator { infoFields[field] = value; } event KyberProxySet(address proxy, address sender); function setKyberProxy(address networkProxy) public onlyAdmin { require(networkProxy != address(0)); kyberNetworkProxyContract = networkProxy; KyberProxySet(kyberNetworkProxyContract, msg.sender); } /// @dev returns number of reserves /// @return number of reserves function getNumReserves() public view returns(uint) { return reserves.length; } /// @notice should be called off chain /// @dev get an array of all reserves /// @return An array of all reserves function getReserves() public view returns(KyberReserveInterface[]) { return reserves; } function maxGasPrice() public view returns(uint) { return maxGasPriceValue; } function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty) public view returns(uint expectedRate, uint slippageRate) { require(expectedRateContract != address(0)); if (src == dest) return (0,0); bool includePermissionless = true; if (srcQty & PERM_HINT_GET_RATE > 0) { includePermissionless = false; srcQty = srcQty & ~PERM_HINT_GET_RATE; } return expectedRateContract.getExpectedRate(src, dest, srcQty, includePermissionless); } function getExpectedRateOnlyPermission(ERC20 src, ERC20 dest, uint srcQty) public view returns(uint expectedRate, uint slippageRate) { require(expectedRateContract != address(0)); if (src == dest) return (0,0); return expectedRateContract.getExpectedRate(src, dest, srcQty, false); } function getUserCapInWei(address user) public view returns(uint) { if (whiteListContract == address(0)) return (2 ** 255); return whiteListContract.getUserCapInWei(user); } function getUserCapInTokenWei(address user, ERC20 token) public view returns(uint) { //future feature user; token; require(false); } struct BestRateResult { uint rate; address reserve1; address reserve2; uint weiAmount; uint rateSrcToEth; uint rateEthToDest; uint destAmount; } /// @notice use token address ETH_TOKEN_ADDRESS for ether /// @dev best conversion rate for a pair of tokens, if number of reserves have small differences. randomize /// @param src Src token /// @param dest Destination token /// @return obsolete - used to return best reserve index. not relevant anymore for this API. function findBestRate(ERC20 src, ERC20 dest, uint srcAmount) public view returns(uint obsolete, uint rate) { BestRateResult memory result = findBestRateTokenToToken(src, dest, srcAmount, EMPTY_HINT); return(0, result.rate); } function findBestRateOnlyPermission(ERC20 src, ERC20 dest, uint srcAmount) public view returns(uint obsolete, uint rate) { BestRateResult memory result = findBestRateTokenToToken(src, dest, srcAmount, PERM_HINT); return(0, result.rate); } function enabled() public view returns(bool) { return isEnabled; } function info(bytes32 field) public view returns(uint) { return infoFields[field]; } /* solhint-disable code-complexity */ // Regarding complexity. Below code follows the required algorithm for choosing a reserve. // It has been tested, reviewed and found to be clear enough. //@dev this function always src or dest are ether. can't do token to token function searchBestRate(ERC20 src, ERC20 dest, uint srcAmount, bool usePermissionless) public view returns(address, uint) { uint bestRate = 0; uint bestReserve = 0; uint numRelevantReserves = 0; //return 1 for ether to ether if (src == dest) return (reserves[bestReserve], PRECISION); address[] memory reserveArr; reserveArr = src == ETH_TOKEN_ADDRESS ? reservesPerTokenDest[dest] : reservesPerTokenSrc[src]; if (reserveArr.length == 0) return (reserves[bestReserve], bestRate); uint[] memory rates = new uint[](reserveArr.length); uint[] memory reserveCandidates = new uint[](reserveArr.length); for (uint i = 0; i < reserveArr.length; i++) { //list all reserves that have this token. if (!usePermissionless && reserveType[reserveArr[i]] == ReserveType.PERMISSIONLESS) { continue; } rates[i] = (KyberReserveInterface(reserveArr[i])).getConversionRate(src, dest, srcAmount, block.number); if (rates[i] > bestRate) { //best rate is highest rate bestRate = rates[i]; } } if (bestRate > 0) { uint smallestRelevantRate = (bestRate * 10000) / (10000 + negligibleRateDiff); for (i = 0; i < reserveArr.length; i++) { if (rates[i] >= smallestRelevantRate) { reserveCandidates[numRelevantReserves++] = i; } } if (numRelevantReserves > 1) { //when encountering small rate diff from bestRate. draw from relevant reserves bestReserve = reserveCandidates[uint(block.blockhash(block.number-1)) % numRelevantReserves]; } else { bestReserve = reserveCandidates[0]; } bestRate = rates[bestReserve]; } return (reserveArr[bestReserve], bestRate); } /* solhint-enable code-complexity */ function getReservesRates(ERC20 token, uint optionalAmount) public view returns(address[] buyReserves, uint[] buyRates, address[] sellReserves, uint[] sellRates) { uint amount = optionalAmount > 0 ? optionalAmount : 1000; ERC20 ETH = ETH_TOKEN_ADDRESS; buyReserves = reservesPerTokenDest[token]; buyRates = new uint[](buyReserves.length); for (uint i = 0; i < buyReserves.length; i++) { buyRates[i] = (KyberReserveInterface(buyReserves[i])).getConversionRate(ETH, token, amount, block.number); } sellReserves = reservesPerTokenSrc[token]; sellRates = new uint[](sellReserves.length); for (i = 0; i < sellReserves.length; i++) { sellRates[i] = (KyberReserveInterface(sellReserves[i])).getConversionRate(token, ETH, amount, block.number); } } function findBestRateTokenToToken(ERC20 src, ERC20 dest, uint srcAmount, bytes hint) internal view returns(BestRateResult result) { //by default we use permission less reserves bool usePermissionless = true; // if hint in first 4 bytes == 'PERM' only permissioned reserves will be used. if ((hint.length >= 4) && (keccak256(hint[0], hint[1], hint[2], hint[3]) == keccak256(PERM_HINT))) { usePermissionless = false; } uint srcDecimals = getDecimals(src); uint destDecimals = getDecimals(dest); (result.reserve1, result.rateSrcToEth) = searchBestRate(src, ETH_TOKEN_ADDRESS, srcAmount, usePermissionless); result.weiAmount = calcDestAmountWithDecimals(srcDecimals, ETH_DECIMALS, srcAmount, result.rateSrcToEth); //if weiAmount is zero, return zero rate to avoid revert in ETH -> token call if (result.weiAmount == 0) { result.rate = 0; return; } (result.reserve2, result.rateEthToDest) = searchBestRate(ETH_TOKEN_ADDRESS, dest, result.weiAmount, usePermissionless); result.destAmount = calcDestAmountWithDecimals(ETH_DECIMALS, destDecimals, result.weiAmount, result.rateEthToDest); result.rate = calcRateFromQty(srcAmount, result.destAmount, srcDecimals, destDecimals); } function listPairs(address reserve, ERC20 token, bool isTokenToEth, bool add) internal { uint i; address[] storage reserveArr = reservesPerTokenDest[token]; if (isTokenToEth) { reserveArr = reservesPerTokenSrc[token]; } for (i = 0; i < reserveArr.length; i++) { if (reserve == reserveArr[i]) { if (add) { break; //already added } else { //remove reserveArr[i] = reserveArr[reserveArr.length - 1]; reserveArr.length--; break; } } } if (add && i == reserveArr.length) { //if reserve wasn't found add it reserveArr.push(reserve); } } event KyberTrade(address indexed trader, ERC20 src, ERC20 dest, uint srcAmount, uint dstAmount, address destAddress, uint ethWeiValue, address reserve1, address reserve2, bytes hint); /* solhint-disable function-max-lines */ // Most of the lines here are functions calls spread over multiple lines. We find this function readable enough /// @notice use token address ETH_TOKEN_ADDRESS for ether /// @dev trade api for kyber network. /// @param tradeInput structure of trade inputs function trade(TradeInput tradeInput) internal returns(uint) { require(isEnabled); require(tx.gasprice <= maxGasPriceValue); require(validateTradeInput(tradeInput.src, tradeInput.srcAmount, tradeInput.dest, tradeInput.destAddress)); BestRateResult memory rateResult = findBestRateTokenToToken(tradeInput.src, tradeInput.dest, tradeInput.srcAmount, tradeInput.hint); require(rateResult.rate > 0); require(rateResult.rate < MAX_RATE); require(rateResult.rate >= tradeInput.minConversionRate); uint actualDestAmount; uint weiAmount; uint actualSrcAmount; (actualSrcAmount, weiAmount, actualDestAmount) = calcActualAmounts(tradeInput.src, tradeInput.dest, tradeInput.srcAmount, tradeInput.maxDestAmount, rateResult); require(getUserCapInWei(tradeInput.trader) >= weiAmount); require(handleChange(tradeInput.src, tradeInput.srcAmount, actualSrcAmount, tradeInput.trader)); require(doReserveTrade( //src to ETH tradeInput.src, actualSrcAmount, ETH_TOKEN_ADDRESS, this, weiAmount, KyberReserveInterface(rateResult.reserve1), rateResult.rateSrcToEth, true)); require(doReserveTrade( //Eth to dest ETH_TOKEN_ADDRESS, weiAmount, tradeInput.dest, tradeInput.destAddress, actualDestAmount, KyberReserveInterface(rateResult.reserve2), rateResult.rateEthToDest, true)); if (tradeInput.src != ETH_TOKEN_ADDRESS) //"fake" trade. (ether to ether) - don't burn. require(feeBurnerContract.handleFees(weiAmount, rateResult.reserve1, tradeInput.walletId)); if (tradeInput.dest != ETH_TOKEN_ADDRESS) //"fake" trade. (ether to ether) - don't burn. require(feeBurnerContract.handleFees(weiAmount, rateResult.reserve2, tradeInput.walletId)); KyberTrade({ trader: tradeInput.trader, src: tradeInput.src, dest: tradeInput.dest, srcAmount: actualSrcAmount, dstAmount: actualDestAmount, destAddress: tradeInput.destAddress, ethWeiValue: weiAmount, reserve1: (tradeInput.src == ETH_TOKEN_ADDRESS) ? address(0) : rateResult.reserve1, reserve2: (tradeInput.dest == ETH_TOKEN_ADDRESS) ? address(0) : rateResult.reserve2, hint: tradeInput.hint }); return actualDestAmount; } /* solhint-enable function-max-lines */ function calcActualAmounts (ERC20 src, ERC20 dest, uint srcAmount, uint maxDestAmount, BestRateResult rateResult) internal view returns(uint actualSrcAmount, uint weiAmount, uint actualDestAmount) { if (rateResult.destAmount > maxDestAmount) { actualDestAmount = maxDestAmount; weiAmount = calcSrcAmount(ETH_TOKEN_ADDRESS, dest, actualDestAmount, rateResult.rateEthToDest); actualSrcAmount = calcSrcAmount(src, ETH_TOKEN_ADDRESS, weiAmount, rateResult.rateSrcToEth); require(actualSrcAmount <= srcAmount); } else { actualDestAmount = rateResult.destAmount; actualSrcAmount = srcAmount; weiAmount = rateResult.weiAmount; } } /// @notice use token address ETH_TOKEN_ADDRESS for ether /// @dev do one trade with a reserve /// @param src Src token /// @param amount amount of src tokens /// @param dest Destination token /// @param destAddress Address to send tokens to /// @param reserve Reserve to use /// @param validate If true, additional validations are applicable /// @return true if trade is successful function doReserveTrade( ERC20 src, uint amount, ERC20 dest, address destAddress, uint expectedDestAmount, KyberReserveInterface reserve, uint conversionRate, bool validate ) internal returns(bool) { uint callValue = 0; if (src == dest) { //this is for a "fake" trade when both src and dest are ethers. if (destAddress != (address(this))) destAddress.transfer(amount); return true; } if (src == ETH_TOKEN_ADDRESS) { callValue = amount; } // reserve sends tokens/eth to network. network sends it to destination require(reserve.trade.value(callValue)(src, amount, dest, this, conversionRate, validate)); if (destAddress != address(this)) { //for token to token dest address is network. and Ether / token already here... if (dest == ETH_TOKEN_ADDRESS) { destAddress.transfer(expectedDestAmount); } else { require(dest.transfer(destAddress, expectedDestAmount)); } } return true; } /// when user sets max dest amount we could have too many source tokens == change. so we send it back to user. function handleChange (ERC20 src, uint srcAmount, uint requiredSrcAmount, address trader) internal returns (bool) { if (requiredSrcAmount < srcAmount) { //if there is "change" send back to trader if (src == ETH_TOKEN_ADDRESS) { trader.transfer(srcAmount - requiredSrcAmount); } else { require(src.transfer(trader, (srcAmount - requiredSrcAmount))); } } return true; } /// @notice use token address ETH_TOKEN_ADDRESS for ether /// @dev checks that user sent ether/tokens to contract before trade /// @param src Src token /// @param srcAmount amount of src tokens /// @return true if tradeInput is valid function validateTradeInput(ERC20 src, uint srcAmount, ERC20 dest, address destAddress) internal view returns(bool) { require(srcAmount <= MAX_QTY); require(srcAmount != 0); require(destAddress != address(0)); require(src != dest); if (src == ETH_TOKEN_ADDRESS) { require(msg.value == srcAmount); } else { require(msg.value == 0); //funds should have been moved to this contract already. require(src.balanceOf(this) >= srcAmount); } return true; } }
pragma solidity 0.4.18; // https://github.com/ethereum/EIPs/issues/20 interface ERC20 { function totalSupply() public view returns (uint supply); function balanceOf(address _owner) public view returns (uint balance); function transfer(address _to, uint _value) public returns (bool success); function transferFrom(address _from, address _to, uint _value) public returns (bool success); function approve(address _spender, uint _value) public returns (bool success); function allowance(address _owner, address _spender) public view returns (uint remaining); function decimals() public view returns(uint digits); event Approval(address indexed _owner, address indexed _spender, uint _value); }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; interface ExpectedRateInterface { function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty, bool usePermissionless) public view returns (uint expectedRate, uint slippageRate); }
pragma solidity 0.4.18; interface FeeBurnerInterface { function handleFees (uint tradeWeiAmount, address reserve, address wallet) public returns(bool); function setReserveData(address reserve, uint feesInBps, address kncWallet) public; }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; /// @title Kyber Network interface interface KyberNetworkInterface { function maxGasPrice() public view returns(uint); function getUserCapInWei(address user) public view returns(uint); function getUserCapInTokenWei(address user, ERC20 token) public view returns(uint); function enabled() public view returns(bool); function info(bytes32 id) public view returns(uint); function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty) public view returns (uint expectedRate, uint slippageRate); function tradeWithHint(address trader, ERC20 src, uint srcAmount, ERC20 dest, address destAddress, uint maxDestAmount, uint minConversionRate, address walletId, bytes hint) public payable returns(uint); }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; /// @title Kyber Reserve contract interface KyberReserveInterface { function trade( ERC20 srcToken, uint srcAmount, ERC20 destToken, address destAddress, uint conversionRate, bool validate ) public payable returns(bool); function getConversionRate(ERC20 src, ERC20 dest, uint srcQty, uint blockNumber) public view returns(uint); }
pragma solidity 0.4.18; contract PermissionGroups { address public admin; address public pendingAdmin; mapping(address=>bool) internal operators; mapping(address=>bool) internal alerters; address[] internal operatorsGroup; address[] internal alertersGroup; uint constant internal MAX_GROUP_SIZE = 50; function PermissionGroups() public { admin = msg.sender; } modifier onlyAdmin() { require(msg.sender == admin); _; } modifier onlyOperator() { require(operators[msg.sender]); _; } modifier onlyAlerter() { require(alerters[msg.sender]); _; } function getOperators () external view returns(address[]) { return operatorsGroup; } function getAlerters () external view returns(address[]) { return alertersGroup; } event TransferAdminPending(address pendingAdmin); /** * @dev Allows the current admin to set the pendingAdmin address. * @param newAdmin The address to transfer ownership to. */ function transferAdmin(address newAdmin) public onlyAdmin { require(newAdmin != address(0)); TransferAdminPending(pendingAdmin); pendingAdmin = newAdmin; } /** * @dev Allows the current admin to set the admin in one tx. Useful initial deployment. * @param newAdmin The address to transfer ownership to. */ function transferAdminQuickly(address newAdmin) public onlyAdmin { require(newAdmin != address(0)); TransferAdminPending(newAdmin); AdminClaimed(newAdmin, admin); admin = newAdmin; } event AdminClaimed( address newAdmin, address previousAdmin); /** * @dev Allows the pendingAdmin address to finalize the change admin process. */ function claimAdmin() public { require(pendingAdmin == msg.sender); AdminClaimed(pendingAdmin, admin); admin = pendingAdmin; pendingAdmin = address(0); } event AlerterAdded (address newAlerter, bool isAdd); function addAlerter(address newAlerter) public onlyAdmin { require(!alerters[newAlerter]); // prevent duplicates. require(alertersGroup.length < MAX_GROUP_SIZE); AlerterAdded(newAlerter, true); alerters[newAlerter] = true; alertersGroup.push(newAlerter); } function removeAlerter (address alerter) public onlyAdmin { require(alerters[alerter]); alerters[alerter] = false; for (uint i = 0; i < alertersGroup.length; ++i) { if (alertersGroup[i] == alerter) { alertersGroup[i] = alertersGroup[alertersGroup.length - 1]; alertersGroup.length--; AlerterAdded(alerter, false); break; } } } event OperatorAdded(address newOperator, bool isAdd); function addOperator(address newOperator) public onlyAdmin { require(!operators[newOperator]); // prevent duplicates. require(operatorsGroup.length < MAX_GROUP_SIZE); OperatorAdded(newOperator, true); operators[newOperator] = true; operatorsGroup.push(newOperator); } function removeOperator (address operator) public onlyAdmin { require(operators[operator]); operators[operator] = false; for (uint i = 0; i < operatorsGroup.length; ++i) { if (operatorsGroup[i] == operator) { operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1]; operatorsGroup.length -= 1; OperatorAdded(operator, false); break; } } } }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; /// @title Kyber constants contract contract Utils { ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee); uint constant internal PRECISION = (10**18); uint constant internal MAX_QTY = (10**28); // 10B tokens uint constant internal MAX_RATE = (PRECISION * 10**6); // up to 1M tokens per ETH uint constant internal MAX_DECIMALS = 18; uint constant internal ETH_DECIMALS = 18; mapping(address=>uint) internal decimals; function setDecimals(ERC20 token) internal { if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS; else decimals[token] = token.decimals(); } function getDecimals(ERC20 token) internal view returns(uint) { if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access uint tokenDecimals = decimals[token]; // technically, there might be token with decimals 0 // moreover, very possible that old tokens have decimals 0 // these tokens will just have higher gas fees. if(tokenDecimals == 0) return token.decimals(); return tokenDecimals; } function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) { require(srcQty <= MAX_QTY); require(rate <= MAX_RATE); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS); return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION; } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS); return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals))); } } function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) { require(dstQty <= MAX_QTY); require(rate <= MAX_RATE); //source quantity is rounded up. to avoid dest quantity being too low. uint numerator; uint denominator; if (srcDecimals >= dstDecimals) { require((srcDecimals - dstDecimals) <= MAX_DECIMALS); numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals))); denominator = rate; } else { require((dstDecimals - srcDecimals) <= MAX_DECIMALS); numerator = (PRECISION * dstQty); denominator = (rate * (10**(dstDecimals - srcDecimals))); } return (numerator + denominator - 1) / denominator; //avoid rounding down errors } }
pragma solidity 0.4.18; import "./Utils.sol"; contract Utils2 is Utils { /// @dev get the balance of a user. /// @param token The token type /// @return The balance function getBalance(ERC20 token, address user) public view returns(uint) { if (token == ETH_TOKEN_ADDRESS) return user.balance; else return token.balanceOf(user); } function getDecimalsSafe(ERC20 token) internal returns(uint) { if (decimals[token] == 0) { setDecimals(token); } return decimals[token]; } function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal view returns(uint) { return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate); } function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal view returns(uint) { return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate); } function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals) internal pure returns(uint) { require(srcAmount <= MAX_QTY); require(destAmount <= MAX_QTY); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS); return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount)); } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS); return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount); } } }
pragma solidity 0.4.18; import "./Utils2.sol"; contract Utils3 is Utils2 { function calcDestAmountWithDecimals(uint srcDecimals, uint destDecimals, uint srcAmount, uint rate) internal pure returns(uint) { return calcDstQty(srcAmount, srcDecimals, destDecimals, rate); } }
pragma solidity 0.4.18; contract WhiteListInterface { function getUserCapInWei(address user) external view returns (uint userCapWei); }
pragma solidity 0.4.18; import "./ERC20Interface.sol"; import "./PermissionGroups.sol"; /** * @title Contracts that should be able to recover tokens or ethers * @author Ilan Doron * @dev This allows to recover any tokens or Ethers received in a contract. * This will prevent any accidental loss of tokens. */ contract Withdrawable is PermissionGroups { event TokenWithdraw(ERC20 token, uint amount, address sendTo); /** * @dev Withdraw all ERC20 compatible tokens * @param token ERC20 The address of the token contract */ function withdrawToken(ERC20 token, uint amount, address sendTo) external onlyAdmin { require(token.transfer(sendTo, amount)); TokenWithdraw(token, amount, sendTo); } event EtherWithdraw(uint amount, address sendTo); /** * @dev Withdraw Ethers */ function withdrawEther(uint amount, address sendTo) external onlyAdmin { sendTo.transfer(amount); EtherWithdraw(amount, sendTo); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"constant":false,"inputs":[{"name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"trader","type":"address"},{"name":"src","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"dest","type":"address"},{"name":"destAddress","type":"address"},{"name":"maxDestAmount","type":"uint256"},{"name":"minConversionRate","type":"uint256"},{"name":"walletId","type":"address"},{"name":"hint","type":"bytes"}],"name":"tradeWithHint","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"usePermissionless","type":"bool"}],"name":"searchBestRate","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"infoFields","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"feeBurner","type":"address"}],"name":"setFeeBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcAmount","type":"uint256"}],"name":"findBestRateOnlyPermission","outputs":[{"name":"obsolete","type":"uint256"},{"name":"rate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"enabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"},{"name":"index","type":"uint256"}],"name":"removeReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"reservesPerTokenSrc","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"whiteList","type":"address"}],"name":"setWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"negligibleRateDiff","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeBurnerContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"expectedRate","type":"address"}],"name":"setExpectedRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"expectedRateContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whiteListContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"field","type":"bytes32"},{"name":"value","type":"uint256"}],"name":"setInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"getUserCapInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"reserveType","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enable","type":"bool"}],"name":"setEnable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetworkProxyContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAlerters","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcQty","type":"uint256"}],"name":"getExpectedRate","outputs":[{"name":"expectedRate","type":"uint256"},{"name":"slippageRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"reserves","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcQty","type":"uint256"}],"name":"getExpectedRateOnlyPermission","outputs":[{"name":"expectedRate","type":"uint256"},{"name":"slippageRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERM_HINT","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"},{"name":"token","type":"address"}],"name":"getUserCapInTokenWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"reservesPerTokenDest","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"},{"name":"isPermissionless","type":"bool"}],"name":"addReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxGasPriceValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"field","type":"bytes32"}],"name":"info","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcAmount","type":"uint256"}],"name":"findBestRate","outputs":[{"name":"obsolete","type":"uint256"},{"name":"rate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxGasPrice","type":"uint256"},{"name":"_negligibleRateDiff","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PERM_HINT_GET_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"networkProxy","type":"address"}],"name":"setKyberProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumReserves","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"},{"name":"token","type":"address"},{"name":"ethToToken","type":"bool"},{"name":"tokenToEth","type":"bool"},{"name":"add","type":"bool"}],"name":"listPairForReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"optionalAmount","type":"uint256"}],"name":"getReservesRates","outputs":[{"name":"buyReserves","type":"address[]"},{"name":"buyRates","type":"uint256[]"},{"name":"sellReserves","type":"address[]"},{"name":"sellRates","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_admin","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"EtherReceival","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reserve","type":"address"},{"indexed":false,"name":"add","type":"bool"},{"indexed":false,"name":"isPermissionless","type":"bool"}],"name":"AddReserveToNetwork","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"reserve","type":"address"}],"name":"RemoveReserveFromNetwork","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reserve","type":"address"},{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"dest","type":"address"},{"indexed":false,"name":"add","type":"bool"}],"name":"ListReservePairs","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"},{"indexed":false,"name":"currentContract","type":"address"}],"name":"WhiteListContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"},{"indexed":false,"name":"currentContract","type":"address"}],"name":"ExpectedRateContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"},{"indexed":false,"name":"currentContract","type":"address"}],"name":"FeeBurnerContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maxGasPrice","type":"uint256"},{"indexed":false,"name":"negligibleRateDiff","type":"uint256"}],"name":"KyberNetwrokParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"isEnabled","type":"bool"}],"name":"KyberNetworkSetEnable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proxy","type":"address"},{"indexed":false,"name":"sender","type":"address"}],"name":"KyberProxySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"trader","type":"address"},{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"dest","type":"address"},{"indexed":false,"name":"srcAmount","type":"uint256"},{"indexed":false,"name":"dstAmount","type":"uint256"},{"indexed":false,"name":"destAddress","type":"address"},{"indexed":false,"name":"ethWeiValue","type":"uint256"},{"indexed":false,"name":"reserve1","type":"address"},{"indexed":false,"name":"reserve2","type":"address"},{"indexed":false,"name":"hint","type":"bytes"}],"name":"KyberTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"},{"indexed":false,"name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAlerter","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]
Deployed Bytecode
0x6060604052600436106102585763ffffffff60e060020a60003504166301a12fd38114610297578063088322ef146102b85780630902f1ac146103485780630c235d96146103ae5780631610b59b146103fd5780631a79464e146104135780631dc1f78d14610432578063238dafe014610472578063249715b31461049957806326782247146104bb57806327a099d8146104ea5780632ab8fc2d146104fd57806339e899ee1461051f5780633ccdbb281461053e5780633de39c1114610567578063408ee7fe1461057a5780634cef5a5c14610599578063579425b7146105ac5780635d270cdc146105bf5780635dada964146105de5780635ed5ea28146105f15780635f65d703146106045780636432679f1461061d5780636aa633b61461063c578063749f95bf1461064f57806375829def146106925780637726bed3146106b157806377f50f97146106c9578063785250da146106dc5780637acc8678146106ef5780637c423f541461070e578063809a9e55146107215780638334278d1461074957806385dc0c561461075f5780638b98a2c5146107875780638eaaeecf14610811578063937e909b146108365780639870d7fe14610858578063a0d7bb1b14610877578063ac8a584a1461089b578063b2d111f6146108ba578063b64a097e146108cd578063b8388aca146108e3578063c0324c771461090b578063c0919ac614610924578063c6c3f3f914610937578063ce56c45414610956578063cfff25bb14610978578063d4fac45d1461098b578063e02584bf146109b0578063f7d7a428146109e4578063f851a44014610b29575b33600160a060020a03167f75f33ed68675112c77094e7c5b073890598be1d23e27cd7f6907b4a7d98ac6193460405190815260200160405180910390a2005b34156102a257600080fd5b6102b6600160a060020a0360043516610b3c565b005b610336600160a060020a0360048035821691602480358216926044359260643581169260843582169260a4359260c4359260e4359091169190610124906101043590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610cac95505050505050565b60405190815260200160405180910390f35b341561035357600080fd5b61035b610d67565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039a578082015183820152602001610382565b505050509050019250505060405180910390f35b34156103b957600080fd5b6103db600160a060020a03600435811690602435166044356064351515610dd0565b604051600160a060020a03909216825260208201526040908101905180910390f35b341561040857600080fd5b6103366004356111e0565b341561041e57600080fd5b6102b6600160a060020a03600435166111f2565b341561043d57600080fd5b61045a600160a060020a0360043581169060243516604435611297565b60405191825260208201526040908101905180910390f35b341561047d57600080fd5b6104856112f6565b604051901515815260200160405180910390f35b34156104a457600080fd5b610485600160a060020a03600435166024356112ff565b34156104c657600080fd5b6104ce61146c565b604051600160a060020a03909116815260200160405180910390f35b34156104f557600080fd5b61035b61147b565b341561050857600080fd5b6104ce600160a060020a03600435166024356114e1565b341561052a57600080fd5b6102b6600160a060020a0360043516611518565b341561054957600080fd5b6102b6600160a060020a0360043581169060243590604435166115a8565b341561057257600080fd5b61033661169f565b341561058557600080fd5b6102b6600160a060020a03600435166116a5565b34156105a457600080fd5b6103366117a1565b34156105b757600080fd5b6104ce6117a7565b34156105ca57600080fd5b6102b6600160a060020a03600435166117b6565b34156105e957600080fd5b6104ce61185b565b34156105fc57600080fd5b6104ce61186a565b341561060f57600080fd5b6102b6600435602435611879565b341561062857600080fd5b610336600160a060020a03600435166118b2565b341561064757600080fd5b61048561194d565b341561065a57600080fd5b61066e600160a060020a0360043516611956565b6040518082600281111561067e57fe5b60ff16815260200191505060405180910390f35b341561069d57600080fd5b6102b6600160a060020a036004351661196b565b34156106bc57600080fd5b6102b66004351515611a06565b34156106d457600080fd5b6102b6611ab7565b34156106e757600080fd5b6104ce611b51565b34156106fa57600080fd5b6102b6600160a060020a0360043516611b60565b341561071957600080fd5b61035b611c42565b341561072c57600080fd5b61045a600160a060020a0360043581169060243516604435611ca8565b341561075457600080fd5b6104ce600435611dc7565b341561076a57600080fd5b61045a600160a060020a0360043581169060243516604435611def565b341561079257600080fd5b61079a611ecf565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156107d65780820151838201526020016107be565b50505050905090810190601f1680156108035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561081c57600080fd5b610336600160a060020a0360043581169060243516611f06565b341561084157600080fd5b6104ce600160a060020a0360043516602435611f0c565b341561086357600080fd5b6102b6600160a060020a0360043516611f27565b341561088257600080fd5b610485600160a060020a03600435166024351515611ff7565b34156108a657600080fd5b6102b6600160a060020a0360043516612118565b34156108c557600080fd5b610336612284565b34156108d857600080fd5b61033660043561228a565b34156108ee57600080fd5b61045a600160a060020a036004358116906024351660443561229c565b341561091657600080fd5b6102b66004356024356122c1565b341561092f57600080fd5b610336612333565b341561094257600080fd5b6102b6600160a060020a036004351661233b565b341561096157600080fd5b6102b6600435600160a060020a03602435166123d6565b341561098357600080fd5b610336612469565b341561099657600080fd5b610336600160a060020a036004358116906024351661246f565b34156109bb57600080fd5b610485600160a060020a036004358116906024351660443515156064351515608435151561251a565b34156109ef57600080fd5b610a06600160a060020a036004351660243561279f565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610a52578082015183820152602001610a3a565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610a91578082015183820152602001610a79565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610ad0578082015183820152602001610ab8565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610b0f578082015183820152602001610af7565b505050509050019850505050505050505060405180910390f35b3415610b3457600080fd5b6104ce612ad0565b6000805433600160a060020a03908116911614610b5857600080fd5b600160a060020a03821660009081526003602052604090205460ff161515610b7f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b600554811015610ca85781600160a060020a0316600582815481101515610bc457fe5b600091825260209091200154600160a060020a03161415610ca057600580546000198101908110610bf157fe5b60009182526020909120015460058054600160a060020a039092169183908110610c1757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610c53906000198301613b26565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610ca8565b600101610ba1565b5050565b6000610cb6613b4f565b6007805460010190819055600e5433600160a060020a03908116911614610cdc57600080fd5b83511580610ceb575083516004145b1515610cf657600080fd5b600160a060020a03808d1683528b81166020840152604083018b90528981166060840152888116608084015260a0830188905260c08301879052851660e08301526101008201849052610d4882612adf565b92506007548114610d5857600080fd5b50509998505050505050505050565b610d6f613ba2565b6009805480602002602001604051908101604052809291908181526020018280548015610dc557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610da7575b505050505090505b90565b6000806000806000610de0613ba2565b610de8613ba2565b610df0613ba2565b6000806000975060009650600095508c600160a060020a03168e600160a060020a03161415610e4e576009805488908110610e2757fe5b600091825260209091200154600160a060020a03169950670de0b6b3a764000098506111cf565b600160a060020a038e16600080516020613c2383398151915214610e8957600160a060020a038e166000908152601260205260409020610ea2565b600160a060020a038d1660009081526013602052604090205b805480602002602001604051908101604052809291908181526020018280548015610ef657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610ed8575b5050505050945084511515610f34576009805488908110610f1357fe5b600091825260209091200154600160a060020a0316995096975087966111cf565b8451604051805910610f435750595b908082528060200260200182016040525093508451604051805910610f655750595b90808252806020026020018201604052509250600091505b84518210156110d6578a158015610fd557506002600a6000878581518110610fa157fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205460ff166002811115610fd357fe5b145b15610fdf576110cb565b848281518110610feb57fe5b90602001906020020151600160a060020a0316637cd442728f8f8f4360006040516020015260405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401602060405180830381600087803b151561106457600080fd5b6102c65a03f1151561107557600080fd5b5050506040518051905084838151811061108b57fe5b60209081029091010152878483815181106110a257fe5b9060200190602002015111156110cb578382815181106110be57fe5b9060200190602002015197505b600190910190610f7d565b60008811156111b3576008546127100188612710028115156110f457fe5b049050600091505b845182101561114a578084838151811061111257fe5b906020019060200201511061113f578183878060010198508151811061113457fe5b602090810290910101525b6001909101906110fc565b600186111561118057828660001943014081151561116457fe5b068151811061116f57fe5b90602001906020020151965061119a565b8260008151811061118d57fe5b9060200190602002015196505b8387815181106111a657fe5b9060200190602002015197505b8487815181106111bf57fe5b9060200190602002015188995099505b505050505050505094509492505050565b60116020526000908152604090205481565b60005433600160a060020a0390811691161461120d57600080fd5b600160a060020a038116151561122257600080fd5b600d547f91251c8b04e3ed4b921776c3aced2ad433c3701257fc5666cb35239ec4df5411908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a1600d8054600160a060020a031916600160a060020a0392909216919091179055565b6000806112a2613bb4565b6112e186868660408051908101604052600481527f5045524d000000000000000000000000000000000000000000000000000000006020820152612f41565b90506000815190935091505b50935093915050565b60105460ff1690565b600160a060020a03331660009081526002602052604081205460ff16151561132657600080fd5b600160a060020a0383166000908152600a602052604081205460ff16600281111561134d57fe5b141561135857600080fd5b82600160a060020a031660098381548110151561137157fe5b600091825260209091200154600160a060020a03161461139057600080fd5b600160a060020a0383166000908152600a60205260409020805460ff191690556009805460001981019081106113c257fe5b60009182526020909120015460098054600160a060020a0390921691849081106113e857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556009805490611424906000198301613b26565b507f861f07ab6bad95b71c362ed240dc0082c3d9bbfe75e7830be646ef0d61da311783604051600160a060020a03909116815260200160405180910390a15060015b92915050565b600154600160a060020a031681565b611483613ba2565b6004805480602002602001604051908101604052809291908181526020018280548015610dc557602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610da7575050505050905090565b6012602052816000526040600020818154811015156114fc57fe5b600091825260209091200154600160a060020a03169150829050565b60005433600160a060020a0390811691161461153357600080fd5b600b547f1eae61fde1a37f65af69f00b4269aa5fda423f684194d303865cba6c650b2366908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a1600b8054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146115c357600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561162057600080fd5b6102c65a03f1151561163157600080fd5b50505060405180519050151561164657600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b600f5490565b60005433600160a060020a039081169116146116c057600080fd5b600160a060020a03811660009081526003602052604090205460ff16156116e657600080fd5b600554603290106116f657600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff1916600190811790915560058054909181016117758382613b26565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b60085481565b600d54600160a060020a031681565b60005433600160a060020a039081169116146117d157600080fd5b600160a060020a03811615156117e657600080fd5b600c547fa2446ac1a8b17e6d40c1cafcbf076b945fdc5f897c970e6e19915760def475ad908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a1600c8054600160a060020a031916600160a060020a0392909216919091179055565b600c54600160a060020a031681565b600b54600160a060020a031681565b600160a060020a03331660009081526002602052604090205460ff1615156118a057600080fd5b60009182526011602052604090912055565b600b54600090600160a060020a031615156118d2575060ff60020a611948565b600b54600160a060020a0316636432679f8360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561192b57600080fd5b6102c65a03f1151561193c57600080fd5b50505060405180519150505b919050565b60105460ff1681565b600a6020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461198657600080fd5b600160a060020a038116151561199b57600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614611a2157600080fd5b8015611a6c57600d54600160a060020a03161515611a3e57600080fd5b600c54600160a060020a03161515611a5557600080fd5b600e54600160a060020a03161515611a6c57600080fd5b6010805460ff191682151517908190557f8a846a525e22497042ee2f99423a8ff8bbb831d3ae5384692bf6040f591c1eba9060ff16604051901515815260200160405180910390a150565b60015433600160a060020a03908116911614611ad257600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b600e54600160a060020a031681565b60005433600160a060020a03908116911614611b7b57600080fd5b600160a060020a0381161515611b9057600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b611c4a613ba2565b6005805480602002602001604051908101604052809291908181526020018280548015610dc557602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610da7575050505050905090565b600c5460009081908190600160a060020a03161515611cc657600080fd5b84600160a060020a031686600160a060020a03161415611cec57600092508291506112ed565b506001600060ff60020a85161115611d2857507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169160005b600c54600160a060020a031663d38d2bea8787878560006040516040015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152929093166024830152604482015290151560648201526084016040805180830381600087803b1515611d9957600080fd5b6102c65a03f11515611daa57600080fd5b505050604051805190602001805190509250925050935093915050565b6009805482908110611dd557fe5b600091825260209091200154600160a060020a0316905081565b600c546000908190600160a060020a03161515611e0b57600080fd5b83600160a060020a031685600160a060020a03161415611e3057506000905080611ec7565b600c54600160a060020a031663d38d2bea8686866000806040516040015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152929093166024830152604482015290151560648201526084016040805180830381600087803b1515611ea157600080fd5b6102c65a03f11515611eb257600080fd5b50505060405180519060200180519050915091505b935093915050565b60408051908101604052600481527f5045524d00000000000000000000000000000000000000000000000000000000602082015281565b60008080fd5b6013602052816000526040600020818154811015156114fc57fe5b60005433600160a060020a03908116911614611f4257600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611f6857600080fd5b60045460329010611f7857600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff1916600190811790915560048054909181016117758382613b26565b600160a060020a03331660009081526002602052604081205460ff16151561201e57600080fd5b600160a060020a0383166000908152600a602052604081205460ff16600281111561204557fe5b1461204f57600080fd5b60098054600181016120618382613b26565b5060009182526020909120018054600160a060020a031916600160a060020a03851617905581612092576001612095565b60025b600160a060020a0384166000908152600a60205260409020805460ff191660018360028111156120c157fe5b021790555082600160a060020a03167f4d99ce7cd99dfb1a7692e50c2e9b8d84c1b420f1d439ca8c4de0171acac119076001846040519115158252151560208201526040908101905180910390a250600192915050565b6000805433600160a060020a0390811691161461213457600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561215b57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b600454811015610ca85781600160a060020a03166004828154811015156121a057fe5b600091825260209091200154600160a060020a0316141561227c576004805460001981019081106121cd57fe5b60009182526020909120015460048054600160a060020a0390921691839081106121f357fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560048054600019019061222f9082613b26565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610ca8565b60010161217d565b600f5481565b60009081526011602052604090205490565b6000806122a7613bb4565b6112e1868686602060405190810160405260008152612f41565b60005433600160a060020a039081169116146122dc57600080fd5b6127108111156122eb57600080fd5b600f82905560088190557fc1bdc2503431144078ba3cb975f03be0f6c1d365cf490875e7534b4ca70c863e828260405191825260208201526040908101905180910390a15050565b60ff60020a81565b60005433600160a060020a0390811691161461235657600080fd5b600160a060020a038116151561236b57600080fd5b600e8054600160a060020a031916600160a060020a0383811691909117918290557ffdd305502f7797ff3390aa08825f7f6aec92c27a94e103bfaf45452b4cf1d4f4911633604051600160a060020a039283168152911660208201526040908101905180910390a150565b60005433600160a060020a039081169116146123f157600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f19350505050151561242257600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b60095490565b6000600160a060020a038316600080516020613c2383398151915214156124a15750600160a060020a03811631611466565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156124f857600080fd5b6102c65a03f1151561250957600080fd5b505050604051805190509050611466565b600160a060020a03331660009081526002602052604081205460ff16151561254157600080fd5b600160a060020a0386166000908152600a602052604081205460ff16600281111561256857fe5b141561257357600080fd5b83156125f4576125868686600085613198565b85600160a060020a03167fadb5a4f14d89b3a5ffb3900ac1ea4574d991f93887f6199fabaf25393644e01c600080516020613c238339815191528785604051600160a060020a0393841681529190921660208201529015156040808301919091526060909101905180910390a25b821561278a576126078686600185613198565b81156126995784600160a060020a031663095ea7b38760ff60020a60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561266e57600080fd5b6102c65a03f1151561267f57600080fd5b50505060405180519050151561269457600080fd5b61271c565b84600160a060020a031663095ea7b3876000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156126f657600080fd5b6102c65a03f1151561270757600080fd5b50505060405180519050151561271c57600080fd5b85600160a060020a03167fadb5a4f14d89b3a5ffb3900ac1ea4574d991f93887f6199fabaf25393644e01c86600080516020613c2383398151915285604051600160a060020a0393841681529190921660208201529015156040808301919091526060909101905180910390a25b612793856132ea565b50600195945050505050565b6127a7613ba2565b6127af613ba2565b6127b7613ba2565b6127bf613ba2565b60008060008088116127d3576103e86127d5565b875b9250600080516020613c238339815191529150601360008a600160a060020a0316600160a060020a0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561286157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311612843575b5050505050965086516040518059106128775750595b90808252806020026020018201604052509550600090505b8651811015612956578681815181106128a457fe5b90602001906020020151600160a060020a0316637cd44272838b864360006040516020015260405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401602060405180830381600087803b151561291d57600080fd5b6102c65a03f1151561292e57600080fd5b5050506040518051905086828151811061294457fe5b6020908102909101015260010161288f565b601260008a600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156129cf57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116129b1575b5050505050945084516040518059106129e55750595b90808252806020026020018201604052509350600090505b8451811015612ac457848181518110612a1257fe5b90602001906020020151600160a060020a0316637cd442728a84864360006040516020015260405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401602060405180830381600087803b1515612a8b57600080fd5b6102c65a03f11515612a9c57600080fd5b50505060405180519050848281518110612ab257fe5b602090810290910101526001016129fd565b50505092959194509250565b600054600160a060020a031681565b6000612ae9613bb4565b6010546000908190819060ff161515612b0157600080fd5b600f543a1115612b1057600080fd5b612b2c86602001518760400151886060015189608001516133a7565b1515612b3757600080fd5b612b54866020015187606001518860400151896101000151612f41565b93506000845111612b6457600080fd5b69d3c21bcecceda1000000845110612b7b57600080fd5b8560c0015184511015612b8d57600080fd5b612baa8660200151876060015188604001518960a00151886134c3565b94509250905081612bbb87516118b2565b1015612bc657600080fd5b612bdb86602001518760400151838951613545565b1515612be657600080fd5b612c11866020015182600080516020613c23833981519152308689602001518a608001516001613627565b1515612c1c57600080fd5b612c4b600080516020613c2383398151915283886060015189608001518789604001518a60a001516001613627565b1515612c5657600080fd5b600080516020613c238339815191526020870151600160a060020a031614612d0f57600d54600160a060020a031663fd062d3b8360208701518960e0015160006040516020015260405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b1515612ce957600080fd5b6102c65a03f11515612cfa57600080fd5b505050604051805190501515612d0f57600080fd5b600080516020613c238339815191526060870151600160a060020a031614612dc857600d54600160a060020a031663fd062d3b8360408701518960e0015160006040516020015260405160e060020a63ffffffff86160281526004810193909352600160a060020a039182166024840152166044820152606401602060405180830381600087803b1515612da257600080fd5b6102c65a03f11515612db357600080fd5b505050604051805190501515612dc857600080fd5b8551600160a060020a03167fd30ca399cb43507ecec6a629a35cf45eb98cda550c27696dcb0d8c4a3873ce6c8760200151886060015184878b6080015188600080516020613c2383398151915260208f0151600160a060020a031614612e32578b60200151612e35565b60005b600080516020613c23833981519152600160a060020a03168f60600151600160a060020a031614612e6a578c60400151612e6d565b60005b8f6101000151604051600160a060020a03808b16825289811660208301526040820189905260608201889052868116608083015260a0820186905284811660c0830152831660e0820152610120610100820181815290820183818151815260200191508051906020019080838360005b83811015612ef5578082015183820152602001612edd565b50505050905090810190601f168015612f225780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390a25090949350505050565b612f49613bb4565b600160008060048551101580156130b65750604080519081016040908152600482527f5045524d000000000000000000000000000000000000000000000000000000006020830152518082805190602001908083835b60208310612fbe5780518252601f199092019160209182019101612f9f565b6001836020036101000a038019825116818451161790925250505091909101925060409150505190819003902085600081518110612ff857fe5b016020015160f860020a900460f860020a028660018151811061301757fe5b016020015160f860020a900460f860020a028760028151811061303657fe5b016020015160f860020a900460f860020a028860038151811061305557fe5b016020015160f860020a900460f860020a026040517fff000000000000000000000000000000000000000000000000000000000000009485168152928416600184015290831660028301529091166003820152600401604051908190039020145b156130c057600092505b6130c988613864565b91506130d487613864565b90506130f088600080516020613c238339815191528886610dd0565b60808601908152600160a060020a039091166020860152613118908390601290899051613922565b6060850190815251151561312f576000845261318d565b61314d600080516020613c2383398151915288866060015186610dd0565b60a0860152600160a060020a0316604085015261317560128260608701518760a00151613922565b60c0850190815261318a908790518484613939565b84525b505050949350505050565b600160a060020a038316600090815260136020526040812083156131d05750600160a060020a03841660009081526012602052604090205b600091505b80548210156132985780828154811015156131ec57fe5b600091825260209091200154600160a060020a038781169116141561328d57821561321657613298565b80548190600019810190811061322857fe5b6000918252602090912001548154600160a060020a039091169082908490811061324e57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790558054613287826000198301613b26565b50613298565b6001909101906131d5565b8280156132a55750805482145b156132e25780548190600181016132bc8382613b26565b5060009182526020909120018054600160a060020a031916600160a060020a0388161790555b505050505050565b600160a060020a038116600080516020613c23833981519152141561332a57600160a060020a0381166000908152600660205260409020601290556133a4565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561337057600080fd5b6102c65a03f1151561338157600080fd5b5050506040518051600160a060020a038316600090815260066020526040902055505b50565b60006b204fce5e3e250261100000008411156133c257600080fd5b8315156133ce57600080fd5b600160a060020a03821615156133e357600080fd5b600160a060020a0385811690841614156133fc57600080fd5b600160a060020a038516600080516020613c23833981519152141561342c5734841461342757600080fd5b6134b7565b341561343757600080fd5b8385600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561348f57600080fd5b6102c65a03f115156134a057600080fd5b50505060405180519050101515156134b757600080fd5b5060015b949350505050565b6000806000848460c0015111156135285750836134f4600080516020613c23833981519152888360a08801516139d4565b915061351488600080516020613c238339815191528487608001516139d4565b92508583111561352357600080fd5b61353a565b8360c001519050859250836060015191505b955095509592505050565b6000838310156134b757600160a060020a038516600080516020613c2383398151915214156135a257600160a060020a03821683850380156108fc0290604051600060405180830381858888f19350505050151561342757600080fd5b84600160a060020a031663a9059cbb8385870360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561360157600080fd5b6102c65a03f1151561361257600080fd5b5050506040518051905015156134b757600080fd5b600080600160a060020a038a811690891614156136935730600160a060020a031687600160a060020a031614151561368a57600160a060020a03871689156108fc028a604051600060405180830381858888f19350505050151561368a57600080fd5b60019150613857565b600160a060020a038a16600080516020613c2383398151915214156136b55750875b84600160a060020a0316636cf69811828c8c8c308a8a60006040516020015260405160e060020a63ffffffff8a16028152600160a060020a0396871660048201526024810195909552928516604485015293166064830152608482019290925290151560a482015260c4016020604051808303818588803b151561373857600080fd5b6125ee5a03f1151561374957600080fd5b5050505060405180519050151561375f57600080fd5b30600160a060020a031687600160a060020a031614151561385257600160a060020a038816600080516020613c2383398151915214156137cf57600160a060020a03871686156108fc0287604051600060405180830381858888f1935050505015156137ca57600080fd5b613852565b87600160a060020a031663a9059cbb888860006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561382c57600080fd5b6102c65a03f1151561383d57600080fd5b50505060405180519050151561385257600080fd5b600191505b5098975050505050505050565b600080600160a060020a038316600080516020613c23833981519152141561388f576012915061391c565b50600160a060020a0382166000908152600660205260409020548015156139185782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156138f657600080fd5b6102c65a03f1151561390757600080fd5b50505060405180519050915061391c565b8091505b50919050565b6000613930838686856139f2565b95945050505050565b60006b204fce5e3e2502611000000085111561395457600080fd5b6b204fce5e3e2502611000000084111561396d57600080fd5b8282106139a8576012838303111561398457600080fd5b84838303600a0a02670de0b6b3a764000085028115156139a057fe5b0490506134bb565b601282840311156139b857600080fd5b84828403600a0a670de0b6b3a76400008602028115156139a057fe5b6000613930836139e387613864565b6139ec87613864565b85613a7f565b60006b204fce5e3e25026110000000851115613a0d57600080fd5b69d3c21bcecceda1000000821115613a2457600080fd5b838310613a535760128484031115613a3b57600080fd5b670de0b6b3a7640000858302858503600a0a026139a0565b60128385031115613a6357600080fd5b828403600a0a670de0b6b3a7640000028286028115156139a057fe5b600080806b204fce5e3e25026110000000871115613a9c57600080fd5b69d3c21bcecceda1000000841115613ab357600080fd5b848610613ae45760128587031115613aca57600080fd5b5050828403600a0a8502670de0b6b3a76400000282613b0a565b60128686031115613af457600080fd5b5050670de0b6b3a76400008502848403600a0a83025b80600182840103811515613b1a57fe5b04979650505050505050565b815481835581811511613b4a57600083815260209020613b4a918101908301613c04565b505050565b6101206040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e08201526101008101613b9d613ba2565b905290565b60206040519081016040526000815290565b60e060405190810160405280600081526020016000600160a060020a031681526020016000600160a060020a03168152602001600081526020016000815260200160008152602001600081525090565b610dcd91905b80821115613c1e5760008155600101613c0a565b50905600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a723058200f970f05bb18f66eba80f09dd1f88bd42267981f9b6a7b666f30d306bdc040e40029
Deployed Bytecode Sourcemap
1127:23145:3:-;;;;;;;;;-1:-1:-1;;;1127:23145:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2575:10;-1:-1:-1;;;;;2561:36:3;;2587:9;2561:36;;;;;;;;;;;;;;1127:23145;2381:451:6;;;;;;;;;;-1:-1:-1;;;;;2381:451:6;;;;;;;2908:894:3;;-1:-1:-1;;;;;2908:894:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2908:894:3;;-1:-1:-1;2908:894:3;;-1:-1:-1;;;;;;2908:894:3;;;;;;;;;;;;;;;;9078:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;12083:1998:3;;;;;;;;;;-1:-1:-1;;;;;12083:1998:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12083:1998:3;;;;;;;;;;;;;;;;;;;;1911:40;;;;;;;;;;;;;;7289:218;;;;;;;;;;-1:-1:-1;;;;;7289:218:3;;;;;11322:286;;;;;;;;;;-1:-1:-1;;;;;11322:286:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11614:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4803:424;;;;;;;;;;-1:-1:-1;;;;;4803:424:3;;;;;;;85:27:6;;;;;;;;;;;;;;;-1:-1:-1;;;;;85:27:6;;;;;;;;;;;;;;670:96;;;;;;;;;;;;2003:54:3;;;;;;;;;;-1:-1:-1;;;;;2003:54:3;;;;;;;6646:175;;;;;;;;;;-1:-1:-1;;;;;6646:175:3;;;;;560:186:11;;;;;;;;;;-1:-1:-1;;;;;560:186:11;;;;;;;;;;;;;9184:89:3;;;;;;;;;;;;2074:301:6;;;;;;;;;;-1:-1:-1;;;;;2074:301:6;;;;;1356:35:3;;;;;;;;;;;;1637:46;;;;;;;;;;;;6937:245;;;;;;;;;;-1:-1:-1;;;;;6937:245:3;;;;;1582:49;;;;;;;;;;;;1533:43;;;;;;;;;;;;8379:106;;;;;;;;;;;;;;;;10151:192;;;;;;;;;;-1:-1:-1;;;;;10151:192:3;;;;;1837:46;;;;;;;;;;;;1479:48;;;;;;;;;;-1:-1:-1;;;;;1479:48:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1074:183:6;;;;;;;;;;-1:-1:-1;;;;;1074:183:6;;;;;8038:335:3;;;;;;;;;;;;;;;;1821:189:6;;;;;;;;;;;;1689:54:3;;;;;;;;;;;;1432:218:6;;;;;;;;;;-1:-1:-1;;;;;1432:218:6;;;;;772:94;;;;;;;;;;;;9279:529:3;;;;;;;;;;-1:-1:-1;;;;;9279:529:3;;;;;;;;;;;;1434:39;;;;;;;;;;;;;;9814:331;;;;;;;;;;-1:-1:-1;;;;;9814:331:3;;;;;;;;;;;;1220:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10349:168:3;;;;;;;;;;-1:-1:-1;;;;;10349:168:3;;;;;;;;;;2098:55;;;;;;;;;;-1:-1:-1;;;;;2098:55:3;;;;;;;2897:312:6;;;;;;;;;;-1:-1:-1;;;;;2897:312:6;;;;;4139:409:3;;;;;;;;;;-1:-1:-1;;;;;4139:409:3;;;;;;;;;3215:469:6;;;;;;;;;;-1:-1:-1;;;;;3215:469:6;;;;;1749:71:3;;;;;;;;;;;;11698:96;;;;;;;;;;;;;;11071:245;;;;;;;;;;-1:-1:-1;;;;;11071:245:3;;;;;;;;;;;;7590:392;;;;;;;;;;;;;;;;1266:51;;;;;;;;;;;;8548:226;;;;;;;;;;-1:-1:-1;;;;;8548:226:3;;;;;851:150:11;;;;;;;;;;;;-1:-1:-1;;;;;851:150:11;;;;;8855:91:3;;;;;;;;;;;;186:208:8;;;;;;;;;;-1:-1:-1;;;;;186:208:8;;;;;;;;;;5716:786:3;;;;;;;;;;-1:-1:-1;;;;;5716:786:3;;;;;;;;;;;;;;;;;;;;;;14128:864;;;;;;;;;;-1:-1:-1;;;;;14128:864:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;59:20:6;;;;;;;;;;;;2381:451;2526:6;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2457:17:6;;;;;;:8;:17;;;;;;;;2449:26;;;;;;;;-1:-1:-1;;;;;;2485:17:6;;2505:5;2485:17;;;:8;:17;;;;;:25;;-1:-1:-1;;2485:25:6;;;2521:305;2542:13;:20;2538:24;;2521:305;;;2607:7;-1:-1:-1;;;;;2587:27:6;:13;2601:1;2587:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2587:16:6;:27;2583:233;;;2653:13;2667:20;;-1:-1:-1;;2667:24:6;;;2653:39;;;;;;;;;;;;;;;;2634:13;:16;;-1:-1:-1;;;;;2653:39:6;;;;2648:1;;2634:16;;;;;;;;;;;;;;;:58;;-1:-1:-1;;;;;;2634:58:6;-1:-1:-1;;;;;2634:58:6;;;;;;;;;;2710:13;:22;;;;;-1:-1:-1;;2710:22:6;;;:::i;:::-;;2750:28;2763:7;2772:5;2750:28;;-1:-1:-1;;;;;2750:28:6;;;;;;;;;;;;;;;;;;;;;;2796:5;;2583:233;2564:3;;2521:305;;;2381:451;;:::o;2908:894:3:-;3227:4;3365:28;;:::i;:::-;851:12;:17;;867:1;851:17;;;;;3269:25;;3255:10;-1:-1:-1;;;;;3255:39:3;;;3269:25;;3255:39;3247:48;;;;;;3314:4;:11;:16;;3313:40;;;3336:4;:11;3351:1;3336:16;3313:40;3305:49;;;;;;;;-1:-1:-1;;;;;3404:26:3;;;;;3440:20;;;:14;;;:20;3470;;;:32;;;3512:22;;;:15;;;:22;3544:36;;;:22;;;:36;3590:24;;;:40;;;3640:28;;;:48;;;3698:30;;:19;;;:30;3738:15;;;:22;;;3778:17;3404:10;3778:5;:17::i;:::-;3771:24;;958:12;;942:28;;934:37;;;;;;2908:894;;;;;;;;;;;;;:::o;9078:100::-;9121:23;;:::i;:::-;9163:8;9156:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9156:15:3;;;;;;;;;;;;;;;;;;;;;;;9078:100;;:::o;12083:1998::-;12214:7;12223:4;12243:13;12270:16;12300:24;12446:27;;:::i;:::-;12667:19;;:::i;:::-;12728:31;;:::i;:::-;12807:6;13345:25;12259:1;12243:17;;12289:1;12270:20;;12327:1;12300:28;;12388:4;-1:-1:-1;;;;;12381:11:3;:3;-1:-1:-1;;;;;12381:11:3;;12377:58;;;12402:8;:21;;12411:11;;12402:21;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12402:21:3;;-1:-1:-1;255:6:7;;-1:-1:-1;12394:41:3;;12377:58;-1:-1:-1;;;;;12497:24:3;;-1:-1:-1;;;;;;;;;;;12497:24:3;:80;;-1:-1:-1;;;;;12553:24:3;;;;;;:19;:24;;;;;12497:80;;;-1:-1:-1;;;;;12524:26:3;;;;;;:20;:26;;;;;12497:80;12484:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12484:93:3;;;;;;;;;;;;;;;;;;;;;;;12592:10;:17;:22;12588:68;;;12624:8;:21;;12633:11;;12624:21;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12624:21:3;;-1:-1:-1;12647:8:3;;-1:-1:-1;12647:8:3;;12616:40;;12588:68;12700:10;:17;12689:29;;;;;;;;;;;;;;;;;;;;;;;;12667:51;;12773:10;:17;12762:29;;;;;;;;;;;;;;;;;;;;;;;;12728:63;;12816:1;12807:10;;12802:501;12823:10;:17;12819:1;:21;12802:501;;;12920:17;12919:18;:78;;;;-1:-1:-1;12971:26:3;12941:11;:26;12953:10;12964:1;12953:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12941:26:3;;;;;;;;;;;;-1:-1:-1;12941:26:3;;;;:56;;;;;;;;;12919:78;12915:125;;;13017:8;;12915:125;13088:10;13099:1;13088:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13065:56:3;;13122:3;13127:4;13133:9;13144:12;13065:92;;;;;;;;-1:-1:-1;;;13065:92:3;;;;;;-1:-1:-1;;;;;13065:92:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13054:5;13060:1;13054:8;;;;;;;;;;;;;;;;:103;13187:8;13176:5;13182:1;13176:5;:8;;;;;;;;;;;;;;;:19;13172:121;;;13270:5;13276:1;13270:8;;;;;;;;;;;;;;;;13259:19;;13172:121;12842:3;;;;;12802:501;;;13328:1;13317:8;:12;13313:709;;;13403:18;;13395:5;:26;13374:8;13385:5;13374:16;13373:49;;;;;;;;13345:77;;13446:1;13442:5;;13437:195;13453:10;:17;13449:1;:21;13437:195;;;13511:20;13499:5;13505:1;13499:8;;;;;;;;;;;;;;;;:32;13495:123;;13598:1;13555:17;13573:21;;;;;;13555:40;;;;;;;;;;;;;;;;:44;13495:123;13472:3;;;;;13437:195;;;13672:1;13650:19;:23;13646:322;;;13802:17;13860:19;-1:-1:-1;;13841:12:3;:14;13825:31;13820:59;;;;;;;;13802:78;;;;;;;;;;;;;;;;13788:92;;13646:322;;;13933:17;13951:1;13933:20;;;;;;;;;;;;;;;;13919:34;;13646:322;13993:5;13999:11;13993:18;;;;;;;;;;;;;;;;13982:29;;13313:709;14040:10;14051:11;14040:23;;;;;;;;;;;;;;;;14065:8;14032:42;;;;12083:1998;;;;;;;;;;;;;;;;:::o;1911:40::-;;;;;;;;;;;;;:::o;7289:218::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;7376:23:3;;;;7368:32;;;;;;7443:17;;7411:50;;7432:9;;-1:-1:-1;;;;;7443:17:3;7411:50;;-1:-1:-1;;;;;7411:50:3;;;;;;;;;;;;;;;;;;;;;;7471:17;:29;;-1:-1:-1;;;;;;7471:29:3;-1:-1:-1;;;;;7471:29:3;;;;;;;;;;7289:218::o;11322:286::-;11441:13;11456:9;11481:28;;:::i;:::-;11512:57;11537:3;11542:4;11548:9;11559;;;;;;;;;;;;;;;;11512:24;:57::i;:::-;11481:88;-1:-1:-1;11586:1:3;11481:88;11589:11;11579:22;;-1:-1:-1;11579:22:3;-1:-1:-1;11322:286:3;;;;;;;;:::o;11614:78::-;11676:9;;;;11614:78;:::o;4803:424::-;-1:-1:-1;;;;;548:10:6;538:21;4905:4:3;538:21:6;;;:9;:21;;;;;;;;530:30;;;;;;;;-1:-1:-1;;;;;4934:20:3;;4958:16;4934:20;;;:11;:20;;;;;;;;:40;;;;;;;;;;4926:49;;;;;;5012:7;-1:-1:-1;;;;;4993:26:3;:8;5002:5;4993:15;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4993:15:3;:26;4985:35;;;;;;-1:-1:-1;;;;;5031:20:3;;5054:16;5031:20;;;:11;:20;;;;;:39;;-1:-1:-1;;5031:39:3;;;5098:8;5107:15;;-1:-1:-1;;5107:19:3;;;5098:29;;;;;;;;;;;;;;;;5080:8;:15;;-1:-1:-1;;;;;5098:29:3;;;;5089:5;;5080:15;;;;;;;;;;;;;;;:47;;-1:-1:-1;;;;;;5080:47:3;-1:-1:-1;;;;;5080:47:3;;;;;;;;;;5137:8;:17;;;;;-1:-1:-1;;5137:17:3;;;:::i;:::-;;5165:33;5190:7;5165:33;;-1:-1:-1;;;;;5165:33:3;;;;;;;;;;;;;;-1:-1:-1;5216:4:3;570:1:6;4803:424:3;;;;:::o;85:27:6:-;;;-1:-1:-1;;;;;85:27:6;;:::o;670:96::-;717:9;;:::i;:::-;745:14;738:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;738:21:6;;;;;;;;;;;;;;;;;;;;;;670:96;:::o;2003:54:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2003:54:3;;-1:-1:-1;2003:54:3;;-1:-1:-1;2003:54:3:o;6646:175::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;6757:17:3;;6725:50;;6746:9;;-1:-1:-1;;;;;6757:17:3;6725:50;;-1:-1:-1;;;;;6725:50:3;;;;;;;;;;;;;;;;;;;;;;6785:17;:29;;-1:-1:-1;;;;;;6785:29:3;-1:-1:-1;;;;;6785:29:3;;;;;;;;;;6646:175::o;560:186:11:-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;662:5:11;-1:-1:-1;;;;;662:14:11;;677:6;685;662:30;;;;;;;;-1:-1:-1;;;662:30:11;;;;;;-1:-1:-1;;;;;662:30:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;654:39;;;;;;;;703:36;717:5;724:6;732;703:36;;-1:-1:-1;;;;;703:36:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;560:186;;;:::o;9184:89:3:-;9250:16;;9184:89;:::o;2074:301:6:-;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2150:20:6;;;;;;:8;:20;;;;;;;;2149:21;2141:30;;;;;;2212:13;:20;328:2;2212:37;;2204:46;;;;;;2261:30;2274:10;2286:4;2261:30;;-1:-1:-1;;;;;2261:30:6;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2301:20:6;;;;;;:8;:20;;;;;:27;;-1:-1:-1;;2301:27:6;2324:4;2301:27;;;;;;2338:13;:30;;:13;;:30;;;:13;:30;;:::i;:::-;-1:-1:-1;2338:30:6;;;;;;;;;;;-1:-1:-1;;;;;;2338:30:6;-1:-1:-1;;;;;2338:30:6;;;;;;;;;;2074:301::o;1356:35:3:-;;;;:::o;1637:46::-;;;-1:-1:-1;;;;;1637:46:3;;:::o;6937:245::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;7033:26:3;;;;7025:35;;;;;;7109:20;;7071:59;;7095:12;;-1:-1:-1;;;;;7109:20:3;7071:59;;-1:-1:-1;;;;;7071:59:3;;;;;;;;;;;;;;;;;;;;;;7140:20;:35;;-1:-1:-1;;;;;;7140:35:3;-1:-1:-1;;;;;7140:35:3;;;;;;;;;;6937:245::o;1582:49::-;;;-1:-1:-1;;;;;1582:49:3;;:::o;1533:43::-;;;-1:-1:-1;;;;;1533:43:3;;:::o;8379:106::-;-1:-1:-1;;;;;548:10:6;538:21;;;;;:9;:21;;;;;;;;530:30;;;;;;;;8453:17:3;;;;:10;:17;;;;;;:25;8379:106::o;10151:192::-;10230:17;;10210:4;;-1:-1:-1;;;;;10230:17:3;:31;10226:54;;;-1:-1:-1;;;;10263:17:3;;10226:54;10297:17;;-1:-1:-1;;;;;10297:17:3;:33;10331:4;10297:17;:39;;;;;;;-1:-1:-1;;;10297:39:3;;;;;;-1:-1:-1;;;;;10297:39:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10151:192:3;;;;:::o;1837:46::-;;;;;;:::o;1479:48::-;;;;;;;;;;;;;;;:::o;1074:183:6:-;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1150:22:6;;;;1142:31;;;;;;1204:12;;1183:34;;-1:-1:-1;;;;;1204:12:6;1183:34;;-1:-1:-1;;;;;1183:34:6;;;;;;;;;;;;;;1227:12;:23;;-1:-1:-1;;;;;;1227:23:6;-1:-1:-1;;;;;1227:23:6;;;;;;;;;;1074:183::o;8038:335:3:-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;8102:7:3;8098:197;;;8133:17;;-1:-1:-1;;;;;8133:17:3;:31;;8125:40;;;;;;8187:20;;-1:-1:-1;;;;;8187:20:3;:34;;8179:43;;;;;;8244:25;;-1:-1:-1;;;;;8244:25:3;:39;;8236:48;;;;;;8304:9;:19;;-1:-1:-1;;8304:19:3;;;;;;;;;8334:32;;8304:19;8356:9;8334:32;;;;;;;;;;;;;;;;8038:335;:::o;1821:189:6:-;1868:12;;1884:10;-1:-1:-1;;;;;1868:26:6;;;:12;;:26;1860:35;;;;;;1918:12;;;1932:5;1905:33;;-1:-1:-1;;;;;1918:12:6;;;;1932:5;1905:33;;-1:-1:-1;;;;;1905:33:6;;;;;;;;;;;;;;;;;;;;;;1956:12;;;;1948:20;;-1:-1:-1;;;;;;1948:20:6;;;-1:-1:-1;;;;;1956:12:6;;1948:20;;;;1978:25;;;1821:189::o;1689:54:3:-;;;-1:-1:-1;;;;;1689:54:3;;:::o;1432:218:6:-;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1515:22:6;;;;1507:31;;;;;;1548:30;1569:8;1548:30;;-1:-1:-1;;;;;1548:30:6;;;;;;;;;;;;;;1611:5;;1588:29;;1601:8;;-1:-1:-1;;;;;1611:5:6;1588:29;;-1:-1:-1;;;;;1588:29:6;;;;;;;;;;;;;;;;;;;;;;1627:5;:16;;-1:-1:-1;;;;;;1627:16:6;-1:-1:-1;;;;;1627:16:6;;;;;;;;;;1432:218::o;772:94::-;818:9;;:::i;:::-;846:13;839:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;839:20:6;;;;;;;;;;;;;;;;;;;;;;772:94;:::o;9279:529:3:-;9436:20;;9376:17;;;;;;-1:-1:-1;;;;;9436:20:3;:34;;9428:43;;;;;;9492:4;-1:-1:-1;;;;;9485:11:3;:3;-1:-1:-1;;;;;9485:11:3;;9481:29;;;9506:1;;-1:-1:-1;9506:1:3;;-1:-1:-1;9498:12:3;;9481:29;-1:-1:-1;9549:4:3;9598:1;-1:-1:-1;;;9568:27:3;;:31;9564:142;;;-1:-1:-1;9676:19:3;9667:28;;;;;9639:5;9564:142;9723:20;;-1:-1:-1;;;;;9723:20:3;:36;9760:3;9765:4;9771:6;9779:21;9723:20;:78;;;;;;;-1:-1:-1;;;9723:78:3;;;;;;-1:-1:-1;;;;;9723:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9716:85;;;;9279:529;;;;;;;:::o;1434:39::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1434:39:3;;-1:-1:-1;1434:39:3;:::o;9814:331::-;9985:20;;9925:17;;;;-1:-1:-1;;;;;9985:20:3;:34;;9977:43;;;;;;10041:4;-1:-1:-1;;;;;10034:11:3;:3;-1:-1:-1;;;;;10034:11:3;;10030:29;;;-1:-1:-1;10055:1:3;;-1:-1:-1;10055:1:3;10047:12;;10030:29;10076:20;;-1:-1:-1;;;;;10076:20:3;:36;10113:3;10118:4;10124:6;10076:20;;:62;;;;;;;-1:-1:-1;;;10076:62:3;;;;;;-1:-1:-1;;;;;10076:62:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10069:69;;;;9814:331;;;;;;;:::o;1220:40::-;;;;;;;;;;;;;;;;;;:::o;10349:168::-;10426:4;10496:14;;;2098:55;;;;;;;;;;;;;;;;;;;;2897:312:6;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2975:22:6;;;;;;:9;:22;;;;;;;;2974:23;2966:32;;;;;;3039:14;:21;328:2;3039:38;;3031:47;;;;;;3089:32;3103:11;3116:4;3089:32;;-1:-1:-1;;;;;3089:32:6;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3131:22:6;;;;;;:9;:22;;;;;:29;;-1:-1:-1;;3131:29:6;3156:4;3131:29;;;;;;3170:14;:32;;:14;;:32;;;:14;:32;;:::i;4139:409:3:-;-1:-1:-1;;;;;548:10:6;538:21;4249:4:3;538:21:6;;;:9;:21;;;;;;;;530:30;;;;;;;;-1:-1:-1;;;;;4277:20:3;;4301:16;4277:20;;;:11;:20;;;;;;;;:40;;;;;;;;;4269:49;;;;;;4328:8;:22;;;;;;:8;:22;;:::i;:::-;-1:-1:-1;4328:22:3;;;;;;;;;;;-1:-1:-1;;;;;;4328:22:3;-1:-1:-1;;;;;4328:22:3;;;;;4384:16;:72;;4432:24;4384:72;;;4403:26;4384:72;-1:-1:-1;;;;;4361:20:3;;;;;;:11;:20;;;;;:95;;-1:-1:-1;;4361:95:3;;;;;;;;;;;;;;;;4487:7;-1:-1:-1;;;;;4467:52:3;;4496:4;4502:16;4467:52;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4537:4:3;4139:409;;;;:::o;3215:469:6:-;3366:6;466:5;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;3293:19:6;;;;;;:9;:19;;;;;;;;3285:28;;;;;;;;-1:-1:-1;;;;;;3323:19:6;;3345:5;3323:19;;;:9;:19;;;;;:27;;-1:-1:-1;;3323:27:6;;;3361:317;3382:14;:21;3378:25;;3361:317;;;3449:8;-1:-1:-1;;;;;3428:29:6;:14;3443:1;3428:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3428:17:6;:29;3424:244;;;3497:14;3512:21;;-1:-1:-1;;3512:25:6;;;3497:41;;;;;;;;;;;;;;;;3477:14;:17;;-1:-1:-1;;;;;3497:41:6;;;;3492:1;;3477:17;;;;;;;;;;;;;;;:61;;-1:-1:-1;;;;;;3477:61:6;-1:-1:-1;;;;;3477:61:6;;;;;;;;;;3556:14;:26;;-1:-1:-1;;3556:26:6;;;;;;:::i;:::-;;3600:30;3614:8;3624:5;3600:30;;-1:-1:-1;;;;;3600:30:6;;;;;;;;;;;;;;;;;;;;;;3648:5;;3424:244;3405:3;;3361:317;;1749:71:3;;;;:::o;11698:96::-;11747:4;11770:17;;;:10;:17;;;;;;;11698:96::o;11071:245::-;11152:13;11167:9;11188:28;;:::i;:::-;11219:58;11244:3;11249:4;11255:9;11266:10;;;;;;;;;;;11219:24;:58::i;7590:392::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;7788:9:3;7765:32;;;7757:41;;;;;;7825:16;:31;;;7866:18;:40;;;7916:59;7844:12;7887:19;7916:59;;;;;;;;;;;;;;;;;;;;7590:392;;:::o;1266:51::-;-1:-1:-1;;;1266:51:3;:::o;8548:226::-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;8628:26:3;;;;8620:35;;;;;;8665:25;:40;;-1:-1:-1;;;;;;8665:40:3;-1:-1:-1;;;;;8665:40:3;;;;;;;;;;;8715:52;;8729:25;8756:10;8715:52;;-1:-1:-1;;;;;8715:52:3;;;;;;;;;;;;;;;;;;;;;;8548:226;:::o;851:150:11:-;466:5:6;;452:10;-1:-1:-1;;;;;452:19:6;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;932:15:11;;:23;;;;948:6;932:23;;;;;;;;;;;;;;;;;;;;;;;;;;965:29;979:6;987;965:29;;;;;-1:-1:-1;;;;;965:29:11;;;;;;;;;;;;;;;;851:150;;:::o;8855:91:3:-;8924:8;:15;8855:91;:::o;186:208:8:-;253:4;-1:-1:-1;;;;;273:26:8;;-1:-1:-1;;;;;;;;;;;273:26:8;269:118;;;-1:-1:-1;;;;;;320:12:8;;;313:19;;269:118;366:5;-1:-1:-1;;;;;366:15:8;;382:4;366:21;;;;;;;;-1:-1:-1;;;366:21:8;;;;;;-1:-1:-1;;;;;366:21:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;359:28;;;;5716:786:3;-1:-1:-1;;;;;548:10:6;538:21;5870:4:3;538:21:6;;;:9;:21;;;;;;;;530:30;;;;;;;;-1:-1:-1;;;;;5898:20:3;;5922:16;5898:20;;;:11;:20;;;;;;;;:40;;;;;;;;;;5890:49;;;;;;5954:10;5950:149;;;5980:37;5990:7;5999:5;6006;6013:3;5980:9;:37::i;:::-;6049:7;-1:-1:-1;;;;;6032:56:3;;-1:-1:-1;;;;;;;;;;;6077:5:3;6084:3;6032:56;;-1:-1:-1;;;;;6032:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5950:149;6113:10;6109:336;;;6139:36;6149:7;6158:5;6165:4;6171:3;6139:9;:36::i;:::-;6194:3;6190:174;;;6225:5;-1:-1:-1;;;;;6225:13:3;;6239:7;-1:-1:-1;;;6225:30:3;;;;;;;;-1:-1:-1;;;6225:30:3;;;;;;-1:-1:-1;;;;;6225:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6217:39;;;;;;;;6190:174;;;6323:5;-1:-1:-1;;;;;6323:13:3;;6337:7;6346:1;6323:25;;;;;;;;-1:-1:-1;;;6323:25:3;;;;;;-1:-1:-1;;;;;6323:25:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6315:34;;;;;;;;6395:7;-1:-1:-1;;;;;6378:56:3;;6404:5;-1:-1:-1;;;;;;;;;;;6430:3:3;6378:56;;-1:-1:-1;;;;;6378:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6109:336;6455:18;6467:5;6455:11;:18::i;:::-;-1:-1:-1;6491:4:3;5716:786;;;;;;;:::o;14128:864::-;14216:21;;:::i;:::-;14239:15;;:::i;:::-;14256:22;;:::i;:::-;14280:16;;:::i;:::-;14312:11;14378:9;14526:6;14343:1;14326:14;:18;:42;;14364:4;14326:42;;;14347:14;14326:42;14312:56;;-1:-1:-1;;;;;;;;;;;14378:29:3;;14432:20;:27;14453:5;-1:-1:-1;;;;;14432:27:3;-1:-1:-1;;;;;14432:27:3;;;;;;;;;;;;14418:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14418:41:3;;;;;;;;;;;;;;;;;;;;;;;14491:11;:18;14480:30;;;;;;;;;;;;;;;;;;;;;;;;14469:41;;14535:1;14526:10;;14521:176;14542:11;:18;14538:1;:22;14521:176;;;14618:11;14630:1;14618:14;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14595:57:3;;14653:3;14658:5;14665:6;14673:12;14595:91;;;;;;;;-1:-1:-1;;;14595:91:3;;;;;;-1:-1:-1;;;;;14595:91:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14581:8;14590:1;14581:11;;;;;;;;;;;;;;;;:105;14562:3;;14521:176;;;14722:19;:26;14742:5;-1:-1:-1;;;;;14722:26:3;-1:-1:-1;;;;;14722:26:3;;;;;;;;;;;;14707:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14707:41:3;;;;;;;;;;;;;;;;;;;;;;;14781:12;:19;14770:31;;;;;;;;;;;;;;;;;;;;;;;;14758:43;;14821:1;14817:5;;14812:174;14828:12;:19;14824:1;:23;14812:174;;;14906:12;14919:1;14906:15;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14883:58:3;;14942:5;14949:3;14954:6;14962:12;14883:92;;;;;;;;-1:-1:-1;;;14883:92:3;;;;;;-1:-1:-1;;;;;14883:92:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14868:9;14878:1;14868:12;;;;;;;;;;;;;;;;:107;14849:3;;14812:174;;;14128:864;;;;;;;;;;:::o;59:20:6:-;;;-1:-1:-1;;;;;59:20:6;;:::o;17714:2683:3:-;17769:4;17980:32;;:::i;:::-;17793:9;;18284:21;;;;;;17793:9;;17785:18;;;;;;;;17836:16;;17821:11;:31;;17813:40;;;;;;17871:97;17890:10;:14;;;17906:10;:20;;;17928:10;:15;;;17945:10;:22;;;17871:18;:97::i;:::-;17863:106;;;;;;;;18027:96;18052:10;:14;;;18068:10;:15;;;18085:10;:20;;;18107:10;:15;;;18027:24;:96::i;:::-;17980:143;-1:-1:-1;18160:1:3;17980:143;18142:15;:19;18134:28;;;;;;369:17:7;18180:10:3;:15;:26;18172:35;;;;;;18244:10;:28;;;18225:10;:15;:47;;18217:56;;;;;;18419:158;18437:10;:14;;;18465:10;:15;;;18494:10;:20;;;18528:10;:24;;;18566:10;18419:17;:158::i;:::-;18370:207;-1:-1:-1;18370:207:3;-1:-1:-1;18370:207:3;-1:-1:-1;18370:207:3;18596:34;18612:10;:17;18596:15;:34::i;:::-;:47;;18588:56;;;;;;18662:86;18675:10;:14;;;18691:10;:20;;;18713:15;18730:10;:17;18662:12;:86::i;:::-;18654:95;;;;;;;;18768:304;18817:10;:14;;;18849:15;-1:-1:-1;;;;;;;;;;;18917:4:3;18939:9;18988:10;:19;;;19026:10;:23;;;19067:4;18768:14;:304::i;:::-;18760:313;;;;;;;;19092:326;-1:-1:-1;;;;;;;;;;;19177:9:3;19204:10;:15;;;19237:10;:22;;;19277:16;19333:10;:19;;;19371:10;:24;;;19413:4;19092:14;:326::i;:::-;19084:335;;;;;;;;-1:-1:-1;;;;;;;;;;;19434:14:3;;;;-1:-1:-1;;;;;19434:35:3;;19430:190;;19538:17;;-1:-1:-1;;;;;19538:17:3;:28;19567:9;19578:19;;;;19599:10;:19;;;19538:81;;;;;;;;-1:-1:-1;;;19538:81:3;;;;;;;;;;;;;-1:-1:-1;;;;;19538:81:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19530:90;;;;;;;;-1:-1:-1;;;;;;;;;;;19634:15:3;;;;-1:-1:-1;;;;;19634:36:3;;19630:191;;19739:17;;-1:-1:-1;;;;;19739:17:3;:28;19768:9;19779:19;;;;19800:10;:19;;;19739:81;;;;;;;;-1:-1:-1;;;19739:81:3;;;;;;;;;;;;;-1:-1:-1;;;;;19739:81:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19731:90;;;;;;;;19865:10;:17;-1:-1:-1;;;;;19832:524:3;;19901:10;:14;;;19935:10;:15;;;19975;20015:16;20058:10;:22;;;20107:9;-1:-1:-1;;;;;;;;;;;20141:14:3;;;;-1:-1:-1;;;;;20141:35:3;;20140:72;;20193:10;:19;;;20140:72;;;20188:1;20140:72;-1:-1:-1;;;;;;;;;;;;;;;;20238:36:3;:10;:15;;;-1:-1:-1;;;;;20238:36:3;;20237:73;;20291:10;:19;;;20237:73;;;20286:1;20237:73;20330:10;:15;;;19832:524;;-1:-1:-1;;;;;19832:524:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1;20374:16:3;;17714:2683;-1:-1:-1;;;;17714:2683:3:o;14998:1380::-;15113:21;;:::i;:::-;15228:4;15203:22;;15350:1;15335:4;:11;:16;;15334:93;;;;;15416:9;;;;;;;;;;;;;;;;;;15406:20;;;;;;;;;;;;36:153:-1;66:2;58;;36:153;;182:3;176:5;164:6;;-1:-1;;139:3;;;;98:2;89:3;;;;114;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;377:2;365:6;;;-1:-1;;;3:399;;;;;-1:-1;3:399;;-1:-1;;3:399;;;;;;;15367:4:3;15357:69;15367:4;:7;;;;;;;;;;;-1:-1:-1;;;15367:7:3;;-1:-1:-1;;;15367:7:3;15376:4;15381:1;15376:7;;;;;;;;;;;;-1:-1:-1;;;15376:7:3;;-1:-1:-1;;;15376:7:3;15385:4;15390:1;15385:7;;;;;;;;;;;;-1:-1:-1;;;15385:7:3;;-1:-1:-1;;;15385:7:3;15394:4;15399:1;15394:7;;;;;;;;;;;;-1:-1:-1;;;15394:7:3;;-1:-1:-1;;;15394:7:3;15357:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:69;15334:93;15330:149;;;15463:5;15443:25;;15330:149;15508:16;15520:3;15508:11;:16::i;:::-;15489:35;;15554:17;15566:4;15554:11;:17::i;:::-;15534:37;;15635:68;15650:3;-1:-1:-1;;;;;;;;;;;15674:9:3;15685:17;15635:14;:68::i;:::-;15600:19;;;15582:121;;;-1:-1:-1;;;;;15582:121:3;;;15583:15;;;15582:121;15733:85;;15760:11;;506:2:7;;15787:9:3;;15798:19;15733:26;:85::i;:::-;15714:16;;;:104;;;15918:16;:21;15914:87;;;15969:1;15955:15;;15984:7;;15914:87;16073:76;-1:-1:-1;;;;;;;;;;;16107:4:3;16113:6;:16;;;16131:17;16073:14;:76::i;:::-;16037:20;;;16019:130;-1:-1:-1;;;;;16019:130:3;16020:15;;;16019:130;16180:94;506:2:7;16221:12:3;-1:-1:-1;16235:16:3;;;16253:6;:20;;;16180:26;:94::i;:::-;16160:17;;;:114;;;16299:72;;16315:9;;16326:17;16345:11;16358:12;16299:15;:72::i;:::-;16285:86;;14998:1380;;;;;;;;;;:::o;16384:809::-;-1:-1:-1;;;;;16528:27:3;;16481:6;16528:27;;;:20;:27;;;;;16566:82;;;;-1:-1:-1;;;;;;16611:26:3;;;;;;:19;:26;;;;;16566:82;16667:1;16663:5;;16658:390;16674:17;;16670:21;;16658:390;;;16727:10;16738:1;16727:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16716:24:3;;;16727:13;;16716:24;16712:326;;;16764:3;16760:264;;;16791:5;;16760:264;16915:17;;16904:10;;-1:-1:-1;;16915:21:3;;;16904:33;;;;;;;;;;;;;;;;16888:13;;-1:-1:-1;;;;;16904:33:3;;;;16888:10;;16899:1;;16888:13;;;;;;;;;;;;;;;:49;;-1:-1:-1;;;;;;16888:49:3;-1:-1:-1;;;;;16888:49:3;;;;;;;;;;16959:19;;;;-1:-1:-1;;16959:19:3;;;:::i;:::-;;17000:5;;16760:264;16693:3;;;;;16658:390;;;17062:3;:29;;;;-1:-1:-1;17074:17:3;;17069:22;;17062:29;17058:129;;;17152:24;;:10;;:24;;;;:10;:24;;:::i;:::-;-1:-1:-1;17152:24:3;;;;;;;;;;;-1:-1:-1;;;;;;17152:24:3;-1:-1:-1;;;;;17152:24:3;;;;;17058:129;16384:809;;;;;;:::o;561:171:7:-;-1:-1:-1;;;;;618:26:7;;-1:-1:-1;;;;;;;;;;;618:26:7;614:111;;;-1:-1:-1;;;;;646:15:7;;;;;;:8;:15;;;;;506:2;646:30;;614:111;;;709:5;-1:-1:-1;;;;;709:14:7;;:16;;;;;;;;;;;-1:-1:-1;;;709:16:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;691:15:7;;;;;;:8;:15;;;;;:34;-1:-1:-1;614:111:7;561:171;:::o;23677:593:3:-;23811:4;305:6:7;23839:20:3;;;23831:29;;;;;;23878:14;;;23870:23;;;;;;-1:-1:-1;;;;;23911:25:3;;;;23903:34;;;;;;-1:-1:-1;;;;;23955:11:3;;;;;;;;23947:20;;;;;;-1:-1:-1;;;;;23982:24:3;;-1:-1:-1;;;;;;;;;;;23982:24:3;23978:264;;;24030:9;:22;;24022:31;;;;;;23978:264;;;24092:9;:14;24084:23;;;;;;24221:9;24198:3;-1:-1:-1;;;;;24198:13:3;;24212:4;24198:19;;;;;;;;-1:-1:-1;;;24198:19:3;;;;;;-1:-1:-1;;;;;24198:19:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;24190:41;;;;;;;;-1:-1:-1;24259:4:3;23677:593;;;;;;;:::o;20447:747::-;20591:20;20613:14;20629:21;20694:13;20670:10;:21;;;:37;20666:522;;;-1:-1:-1;20742:13:3;20781:82;-1:-1:-1;;;;;;;;;;;20814:4:3;20742:13;20838:24;;;;20781:13;:82::i;:::-;20769:94;;20895:73;20909:3;-1:-1:-1;;;;;;;;;;;20933:9:3;20944:10;:23;;;20895:13;:73::i;:::-;20877:91;-1:-1:-1;20990:28:3;;;;20982:37;;;;;;20666:522;;;21069:10;:21;;;21050:40;;21122:9;21104:27;;21157:10;:20;;;21145:32;;20666:522;20447:747;;;;;;;;;:::o;22940:477::-;23048:4;23089:9;23069:17;:29;23065:324;;;-1:-1:-1;;;;;23173:24:3;;-1:-1:-1;;;;;;;;;;;23173:24:3;23169:210;;;-1:-1:-1;;;;;23217:15:3;;23233:29;;;23217:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23169:210;23310:3;-1:-1:-1;;;;;23310:12:3;;23323:6;23344:17;23332:9;:29;23310:53;;;;;;;;-1:-1:-1;;;23310:53:3;;;;;;-1:-1:-1;;;;;23310:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23302:62;;;;;;;21621:1198;21897:4;;-1:-1:-1;;;;;21950:11:3;;;;;;;21946:223;;;22081:4;-1:-1:-1;;;;;22057:30:3;:11;-1:-1:-1;;;;;22057:30:3;;;22053:80;;;-1:-1:-1;;;;;22105:20:3;;:28;;;;22126:6;22105:28;;;;;;;;;;;;;;;;;;;;;;;;;;22154:4;22147:11;;;;21946:223;-1:-1:-1;;;;;22183:24:3;;-1:-1:-1;;;;;;;;;;;22183:24:3;22179:73;;;-1:-1:-1;22235:6:3;22179:73;22350:7;-1:-1:-1;;;;;22350:13:3;;22370:9;22381:3;22386:6;22394:4;22400;22406:14;22422:8;22350:81;;;;;;;;-1:-1:-1;;;22350:81:3;;;;;;-1:-1:-1;;;;;22350:81:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22342:90;;;;;;;;22470:4;-1:-1:-1;;;;;22447:28:3;:11;-1:-1:-1;;;;;22447:28:3;;;22443:348;;;-1:-1:-1;;;;;22587:25:3;;-1:-1:-1;;;;;;;;;;;22587:25:3;22583:198;;;-1:-1:-1;;;;;22632:20:3;;:40;;;;22653:18;22632:40;;;;;;;;;;;;;;;;;;;;;;;;;;22583:198;;;22719:4;-1:-1:-1;;;;;22719:13:3;;22733:11;22746:18;22719:46;;;;;;;;-1:-1:-1;;;22719:46:3;;;;;;-1:-1:-1;;;;;22719:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22711:55;;;;;;;;22808:4;22801:11;;21621:1198;;;;;;;;;;;;:::o;738:470:7:-;794:4;;-1:-1:-1;;;;;814:26:7;;-1:-1:-1;;;;;;;;;;;814:26:7;810:51;;;506:2;842:19;;;;810:51;-1:-1:-1;;;;;;915:15:7;;;;;;:8;:15;;;;;;1127:18;;1124:46;;;1154:5;-1:-1:-1;;;;;1154:14:7;;:16;;;;;;;;;;;-1:-1:-1;;;1154:16:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1147:23;;;;1124:46;1188:13;1181:20;;738:470;;;;;:::o;84:206:9:-;206:4;229:54;240:9;251:11;264:12;278:4;229:10;:54::i;:::-;222:61;84:206;-1:-1:-1;;;;;84:206:9:o;979:614:8:-;1103:4;305:6:7;1131:20:8;;;1123:29;;;;;;305:6:7;1170:21:8;;;1162:30;;;;;;1207:26;;;1203:384;;459:2:7;1258:25:8;;;1257:43;;1249:52;;;;;;1387:9;1371:11;1357;:25;1350:2;:33;1349:47;255:6:7;1323:10:8;:22;:74;;;;;;;;1315:83;;;;1203:384;459:2:7;1438:25:8;;;1437:43;;1429:52;;;;;;1566:9;1550:11;1536;:25;1529:2;:33;255:6:7;1503:10:8;:22;:60;:72;;;;;;782:191;878:4;901:65;912:10;924:16;936:3;924:11;:16::i;:::-;942:17;954:4;942:11;:17::i;:::-;961:4;901:10;:65::i;1214:558:7:-;1316:4;305:6;1340:17;;;1332:26;;;;;;369:17;1376:16;;;1368:25;;;;;;1408:26;;;1404:362;;459:2;1459:25;;;1458:43;;1450:52;;;;;;255:6;1524:13;;;1546:25;;;1541:2;:31;1524:49;1523:63;;1404:362;459:2;1626:25;;;1625:43;;1617:52;;;;;;1741:11;1727;:25;1722:2;:31;255:6;1709:45;1700:4;1691:6;:13;1690:65;;;;;;1778:844;1880:4;;;305:6;1904:17;;;1896:26;;;;;;369:17;1940:16;;;1932:25;;;;;;2109:26;;;2105:422;;459:2;2160:25;;;2159:43;;2151:52;;;;;;-1:-1:-1;;2257:25:7;;;2252:2;:31;2230:54;;255:6;2230:54;2313:4;2105:422;;;459:2;2357:25;;;2356:43;;2348:52;;;;;;-1:-1:-1;;255:6:7;2427:18;;2488:25;;;2483:2;:31;2475:40;;2105:422;2575:11;2570:1;2556:11;2544:9;:23;:27;2543:43;;;;;;;;;1778:844;-1:-1:-1;;;;;;;1778:844:7:o;1127:23145:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1127:23145:3;;;;;;-1:-1:-1;;;;;1127:23145:3;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://0f970f05bb18f66eba80f09dd1f88bd42267981f9b6a7b666f30d306bdc040e4
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...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.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to DirtyBytesArrayToStorage (low-severity), ABIDecodeTwoDimensionalArrayMemory (very low-severity), KeccakCaching (medium-severity), EmptyByteArrayCopy (medium-severity), DynamicArrayCleanup (medium-severity), ImplicitConstructorCallvalueCheck (very low-severity), TupleAssignmentMultiStackSlotComponents (very low-severity), MemoryArrayCreationOverflow (low-severity), privateCanBeOverridden (low-severity), SignedArrayStorageCopy (low/medium-severity), ABIEncoderV2StorageArrayWithMultiSlotElement (low-severity), DynamicConstructorArgumentsClippedABIV2 (very low-severity), UninitializedFunctionPointerInConstructor_0.4.x (very low-severity), IncorrectEventSignatureInLibraries_0.4.x (very low-severity), ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.