Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
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.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Available on 9 networks: Ethereum mainnet, Linea, Polygon, Optimism, BNB Chain, zkSync Era, Base, Avalanche.
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
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (>200)386.1528691 ANKRAnkr Network (ANKR)$14.20@0.03680.442 ABTArcBlock (ABT)$0.67@1.5120 LEOBitfinex LEO... (LEO)$187.80@9.3932.54617015 BLZBluzelle (BLZ)$1.94@0.05974.67 CELRCelerToken (CELR)$0.09@0.01944,994.1521304 LINKChainLink To... (LINK)$119,360.24@23.900.0255102 EKGEkon Gold (EKG)1.092 ELFELF (ELF)$0.52@0.479541.28989636 HOTHoloToken (HOT)$0.10@0.002413.18031205 KNCKyberNetwork (KNC)$7.31@0.55576.95563482 LRCLoopringCoin... (LRC)$16.06@0.20870.06180662 OMGOMG Network (OMG)$0.02@0.349420 PNTpNetwork Tok... (PNT)$0.09@0.004594.10878976 NPXSPundi X Toke... (NPXS)$0.45@0.00475.16 RLCRLC (RLC)$10.99@2.138.6 STORJStorj (STORJ)$4.15@0.48261.2 TNTTierion Netw... (TNT)$0.01@0.005247.7607563 ZRXZRX (ZRX)$22.36@0.46820.1 AMBAmber (AMB)$0.00@0.0081333.04495355 COMPCompound (COMP)$27,722.66@83.24402,595.87902225 cDAICompound Dai (cDAI)$9,699.36@0.0241793,851.78266144 cUSDCCompound USD... (cUSDC)$19,396.04@0.02441,449.4538932 DAIDai Stableco... (DAI)$1,448.76@0.99951.59 FTMFantom Token (FTM)$1.62@1.0171.93 MATICMatic Token (MATIC)$0.95@0.49420.011 MCOMCO (MCO)2,607.25470934 SAISai Stableco... (SAI)$46,956.66@18.012.29568411 SNTStatusNetwor... (SNT)$0.10@0.04373,031.404961 USDCUSDC (USDC)$3,031.40@1.003.12513603 WBTCWrapped BTC (WBTC)$293,162.76@93,808.00572.33768977 WETHWrapped Ethe... (WETH)$1,942,496.82@3,393.969820,000,000,000,000ERC-20:750 $stLink rewards on stlink.fiERC-20: ! st... ($stLin...)2,500 $ Evmosia.comERC-20: $ E... ($ Evm...)48,000 Earn $TUSD airdrops at https://www.tenorusd.orgERC-20: $ te... (Earn $...)4.75ERC20 ***1,000,000 AfroXAfroDex$0.01@0.000.69779708 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)5.67838954 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)354.2891758 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)20.97233994 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)0.68833963 BACOLERC-20: Base... (BACOL)0.09755214 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)0 BACOLERC-20: Base... (BACOL)20 BCTBitcratic0 BTCETHERC-20: BitE... (BTCETH)0 BTCETHERC-20: BitE... (BTCETH)0.00000481 BTCETHERC-20: BitE... (BTCETH)0.00000045ERC20 ***0.00000001ERC20 ***0.00000001 BTCETHERC-20: BTCE... (BTCETH)0.10951059 BTCETHERC-20: BTCE... (BTCETH)0.00000003 BTCETHERC-20: BTCE... (BTCETH)0.00000004 BTCETHERC-20: BTCE... (BTCETH)0.00000001 BTCETHERC-20: BTCE... (BTCETH)0.00000003 BTCETHERC-20: BTCE... (BTCETH)0.00000007 BTCETHERC-20: BTCE... (BTCETH)0.03327894 BTCETHERC-20: BTCE... (BTCETH)0.00000004 BTCETHERC-20: BTCE... (BTCETH)0.00000001 BTCETHERC-20: BTCE... (BTCETH)0.00000002 BTCETHERC-20: BTCE... (BTCETH)0.00000001 BTCETHERC-20: BTCE... (BTCETH)0.00000012 BTCETHERC-20: BTCE... (BTCETH)0.00000002 BTCETHERC-20: BTCE... (BTCETH)0.00000001 BTCETHERC-20: BTCE... (BTCETH)0.0314993 BTCETHERC-20: BTCE... (BTCETH)0.00000009 BTCETHERC-20: BTCE... (BTCETH)0.00000006 BTCETHERC-20: BTCE... (BTCETH)0.00000003 BTCETHERC-20: BTCE... (BTCETH)0.00000006 BTCETHERC-20: BTCE... (BTCETH)0.00000001 BTCETHERC-20: BTCE... (BTCETH)0 BTCETHERC-20: BTCE... (BTCETH)0.00000003 BTCETHERC-20: BTCE... (BTCETH)0.00000001 BTCETHERC-20: BTCE... (BTCETH)0.00000016 BTCETHERC-20: BTCE... (BTCETH)0.00000003 BTCETHERC-20: BTCE... (BTCETH)0.00000013 BTCETHERC-20: BTCE... (BTCETH)0.00000003 BTCETHERC-20: BTCE... (BTCETH)0ERC20 ***6,577.81187ERC20 ***0.213 CPITERC-20: CPIT... (CPIT)0.00000007ERC20 ***0.00000002ERC20 ***0.0511325ERC20 ***0ERC20 ***0.00000006ERC20 ***0.00000002ERC20 ***0.00000004ERC20 ***0.00000007ERC20 ***0.00000003ERC20 ***0.00000001ERC20 ***0.08898876ERC20 ***0.00000016ERC20 ***0.00000002ERC20 ***0.0000001ERC20 ***0.00000001ERC20 ***0.00000003ERC20 ***0.01740399ERC20 ***0.00000006ERC20 ***0.00000003ERC20 ***0.00000002ERC20 ***0ERC20 ***0ERC20 ***0.00000009ERC20 ***0ERC20 ***0.00000001ERC20 ***0.00000004ERC20 ***0.00000002ERC20 ***0.00000017ERC20 ***0.00000002ERC20 ***0.00000002ERC20 ***0.00000003ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***1.52131388ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***3.67973636ERC20 ***0.01059425ERC20 ***0ERC20 ***1.33790202ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***0ERC20 ***20 EDOEidoo869.15536474ERC20 ***25,000 EOSTEOS TRUST$0.97@0.000ERC20 ***1,000 FLTFlit Token888,888 KICKKickToken0.00180713ERC20 ***337.45402ERC20 ***0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)4.74098677 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0.06960598 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)0 LINKWETHERC-20: LINK... (LINKWE...)NFT Tokens (28)claim rewards on apylink.comapylink.comERC-1155claim rewards on apyusd.netapyusd.netERC-1155nft-dai.comDAI Mysterybox NFTERC-1155claim rewards on get-clink.netget-clink.netERC-1155claim rewards on wbtcnetwork.netwbtcnetwork.netERC-1155Let's Go!🎁ERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]
More Info
Private Name Tags
ContractCreator
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 20 from a total of 20 transactions
Transaction Hash MethodBlockFromToTransfer 9974874 2020-04-30 15:57:45 1698 days ago 1588262265 IN 0 ETH$0.00 0.00042 20 Set Time Lock Pe... 7612180 2019-04-21 16:57:29 2073 days ago 1555865849 IN 0 ETH$0.00 0.0004344 20 Batch Transfer B... 7611635 2019-04-21 14:52:18 2073 days ago 1555858338 IN 0 ETH$0.00 0.00011095 4 Batch Decrement ... 7611625 2019-04-21 14:50:10 2073 days ago 1555858210 IN 0 ETH$0.00 0.00010492 4 Batch Increment ... 7611621 2019-04-21 14:48:55 2073 days ago 1555858135 IN 0 ETH$0.00 0.00010492 4 Batch Withdraw T... 7611617 2019-04-21 14:47:44 2073 days ago 1555858064 IN 0 ETH$0.00 0.00010527 4 Transfer Balance 7611593 2019-04-21 14:44:04 2073 days ago 1555857844 IN 0 ETH$0.00 0.00010668 4 Decrement Token ... 7611587 2019-04-21 14:43:08 2073 days ago 1555857788 IN 0 ETH$0.00 0.00010064 4 Increment Token ... 7611564 2019-04-21 14:37:56 2073 days ago 1555857476 IN 0 ETH$0.00 0.00010072 4 Withdraw To 7611562 2019-04-21 14:37:50 2073 days ago 1555857470 IN 0 ETH$0.00 0.0001009 4 Approve 7611531 2019-04-21 14:29:38 2073 days ago 1555856978 IN 0 ETH$0.00 0.00009297 4 Remove Address 7611467 2019-04-21 14:17:31 2073 days ago 1555856251 IN 0 ETH$0.00 0.00009182 4 Remove Authorize... 7611199 2019-04-21 13:18:05 2073 days ago 1555852685 IN 0 ETH$0.00 0.00009316 4 Transfer Ownersh... 7611168 2019-04-21 13:09:23 2073 days ago 1555852163 IN 0 ETH$0.00 0.00009359 4 Renounce Ownersh... 7610814 2019-04-21 11:53:50 2073 days ago 1555847630 IN 0 ETH$0.00 0.00006555 3 Remove Authorize... 7610803 2019-04-21 11:52:11 2073 days ago 1555847531 IN 0 ETH$0.00 0.00006987 3 Add Authorized A... 7610789 2019-04-21 11:49:37 2073 days ago 1555847377 IN 0 ETH$0.00 0.00006993 3 Transfer Ownersh... 7536691 2019-04-09 22:52:27 2085 days ago 1554850347 IN 0 ETH$0.00 0.00006129 2 Set Time Lock Pe... 7536646 2019-04-09 22:41:51 2085 days ago 1554849711 IN 0 ETH$0.00 0.00008484 2 Add Authorized A... 7536644 2019-04-09 22:41:28 2085 days ago 1554849688 IN 0 ETH$0.00 0.00017226 2 View more zero value Internal Transactions in Advanced View mode
Advanced mode:Loading...LoadingThis contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.Contract Name:Vault
Compiler Versionv0.5.7+commit.6da8b019
Optimization Enabled:Yes with 200 runs
Other Settings:byzantium EvmVersionContract Source Code (Solidity)
- library SafeMath
- - function mul(uint256 a, uint256 b)
- - function div(uint256 a, uint256 b)
- - function sub(uint256 a, uint256 b)
- - function add(uint256 a, uint256 b)
- - function mod(uint256 a, uint256 b)
- contract Ownable
- - function owner()
- - function isOwner()
- - function renounceOwnership()
- - function transferOwnership(address ne ...
- - function _transferOwnership(address n ...
- library AddressArrayUtils
- - function indexOf(address[] memory A, ...
- - function contains(address[] memory A, ...
- - function indexOfFromEnd(address[] mem ...
- - function extend(address[] memory A, a ...
- - function append(address[] memory A, a ...
- - function sExtend(address[] storage A, ...
- - function intersect(address[] memory A ...
- - function union(address[] memory A, ad ...
- - function unionB(address[] memory A, a ...
- - function difference(address[] memory ...
- - function sReverse(address[] storage A ...
- - function pop(address[] memory A, uint ...
- - function remove(address[] memory A, a ...
- - function sPop(address[] storage A, ui ...
- - function sPopCheap(address[] storage ...
- - function sRemoveCheap(address[] stora ...
- - function hasDuplicate(address[] memor ...
- - function isEqual(address[] memory A, ...
- - function argGet(address[] memory A, u ...
- contract TimeLockUpgrade is
- - function setTimeLockPeriod(
- contract Authorizable is
- - function addAuthorizedAddress(address ...
- - function removeAuthorizedAddress(addr ...
- - function getAuthorizedAddresses()
- library CommonMath
- - function maxUInt256()
- - function safePower(
- - function getPartialAmount(
- interface IERC20
- - function balanceOf(
- - function allowance(
- - function transfer(
- - function transferFrom(
- - function approve(
- library ERC20Wrapper
- - function balanceOf(
- - function allowance(
- - function transfer(
- - function transferFrom(
- - function approve(
- - function ensureAllowance(
- - function checkSuccess(
- contract Vault is *
- - function withdrawTo(
- - function incrementTokenOwner(
- - function decrementTokenOwner(
- - function transferBalance(
- - function batchWithdrawTo(
- - function batchIncrementTokenOwner(
- - function batchDecrementTokenOwner(
- - function batchTransferBalance(
- - function getOwnerBalance(
/** *Submitted for verification at Etherscan.io on 2019-05-09 */ // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.2; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.2; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. * @notice Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/lib/AddressArrayUtils.sol // Pulled in from Cryptofin Solidity package in order to control Solidity compiler version // https://github.com/cryptofinlabs/cryptofin-solidity/blob/master/contracts/array-utils/AddressArrayUtils.sol pragma solidity 0.5.7; library AddressArrayUtils { /** * Finds the index of the first occurrence of the given element. * @param A The input array to search * @param a The value to find * @return Returns (index and isIn) for the first occurrence starting from index 0 */ function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) { uint256 length = A.length; for (uint256 i = 0; i < length; i++) { if (A[i] == a) { return (i, true); } } return (0, false); } /** * Returns true if the value is present in the list. Uses indexOf internally. * @param A The input array to search * @param a The value to find * @return Returns isIn for the first occurrence starting from index 0 */ function contains(address[] memory A, address a) internal pure returns (bool) { bool isIn; (, isIn) = indexOf(A, a); return isIn; } /// @return Returns index and isIn for the first occurrence starting from /// end function indexOfFromEnd(address[] memory A, address a) internal pure returns (uint256, bool) { uint256 length = A.length; for (uint256 i = length; i > 0; i--) { if (A[i - 1] == a) { return (i, true); } } return (0, false); } /** * Returns the combination of the two arrays * @param A The first array * @param B The second array * @return Returns A extended by B */ function extend(address[] memory A, address[] memory B) internal pure returns (address[] memory) { uint256 aLength = A.length; uint256 bLength = B.length; address[] memory newAddresses = new address[](aLength + bLength); for (uint256 i = 0; i < aLength; i++) { newAddresses[i] = A[i]; } for (uint256 j = 0; j < bLength; j++) { newAddresses[aLength + j] = B[j]; } return newAddresses; } /** * Returns the array with a appended to A. * @param A The first array * @param a The value to append * @return Returns A appended by a */ function append(address[] memory A, address a) internal pure returns (address[] memory) { address[] memory newAddresses = new address[](A.length + 1); for (uint256 i = 0; i < A.length; i++) { newAddresses[i] = A[i]; } newAddresses[A.length] = a; return newAddresses; } /** * Returns the combination of two storage arrays. * @param A The first array * @param B The second array * @return Returns A appended by a */ function sExtend(address[] storage A, address[] storage B) internal { uint256 length = B.length; for (uint256 i = 0; i < length; i++) { A.push(B[i]); } } /** * Returns the intersection of two arrays. Arrays are treated as collections, so duplicates are kept. * @param A The first array * @param B The second array * @return The intersection of the two arrays */ function intersect(address[] memory A, address[] memory B) internal pure returns (address[] memory) { uint256 length = A.length; bool[] memory includeMap = new bool[](length); uint256 newLength = 0; for (uint256 i = 0; i < length; i++) { if (contains(B, A[i])) { includeMap[i] = true; newLength++; } } address[] memory newAddresses = new address[](newLength); uint256 j = 0; for (uint256 k = 0; k < length; k++) { if (includeMap[k]) { newAddresses[j] = A[k]; j++; } } return newAddresses; } /** * Returns the union of the two arrays. Order is not guaranteed. * @param A The first array * @param B The second array * @return The union of the two arrays */ function union(address[] memory A, address[] memory B) internal pure returns (address[] memory) { address[] memory leftDifference = difference(A, B); address[] memory rightDifference = difference(B, A); address[] memory intersection = intersect(A, B); return extend(leftDifference, extend(intersection, rightDifference)); } /** * Alternate implementation * Assumes there are no duplicates */ function unionB(address[] memory A, address[] memory B) internal pure returns (address[] memory) { bool[] memory includeMap = new bool[](A.length + B.length); uint256 count = 0; for (uint256 i = 0; i < A.length; i++) { includeMap[i] = true; count++; } for (uint256 j = 0; j < B.length; j++) { if (!contains(A, B[j])) { includeMap[A.length + j] = true; count++; } } address[] memory newAddresses = new address[](count); uint256 k = 0; for (uint256 m = 0; m < A.length; m++) { if (includeMap[m]) { newAddresses[k] = A[m]; k++; } } for (uint256 n = 0; n < B.length; n++) { if (includeMap[A.length + n]) { newAddresses[k] = B[n]; k++; } } return newAddresses; } /** * Computes the difference of two arrays. Assumes there are no duplicates. * @param A The first array * @param B The second array * @return The difference of the two arrays */ function difference(address[] memory A, address[] memory B) internal pure returns (address[] memory) { uint256 length = A.length; bool[] memory includeMap = new bool[](length); uint256 count = 0; // First count the new length because can't push for in-memory arrays for (uint256 i = 0; i < length; i++) { address e = A[i]; if (!contains(B, e)) { includeMap[i] = true; count++; } } address[] memory newAddresses = new address[](count); uint256 j = 0; for (uint256 k = 0; k < length; k++) { if (includeMap[k]) { newAddresses[j] = A[k]; j++; } } return newAddresses; } /** * @dev Reverses storage array in place */ function sReverse(address[] storage A) internal { address t; uint256 length = A.length; for (uint256 i = 0; i < length / 2; i++) { t = A[i]; A[i] = A[A.length - i - 1]; A[A.length - i - 1] = t; } } /** * Removes specified index from array * Resulting ordering is not guaranteed * @return Returns the new array and the removed entry */ function pop(address[] memory A, uint256 index) internal pure returns (address[] memory, address) { uint256 length = A.length; address[] memory newAddresses = new address[](length - 1); for (uint256 i = 0; i < index; i++) { newAddresses[i] = A[i]; } for (uint256 j = index + 1; j < length; j++) { newAddresses[j - 1] = A[j]; } return (newAddresses, A[index]); } /** * @return Returns the new array */ function remove(address[] memory A, address a) internal pure returns (address[] memory) { (uint256 index, bool isIn) = indexOf(A, a); if (!isIn) { revert(); } else { (address[] memory _A,) = pop(A, index); return _A; } } function sPop(address[] storage A, uint256 index) internal returns (address) { uint256 length = A.length; if (index >= length) { revert("Error: index out of bounds"); } address entry = A[index]; for (uint256 i = index; i < length - 1; i++) { A[i] = A[i + 1]; } A.length--; return entry; } /** * Deletes address at index and fills the spot with the last address. * Order is not preserved. * @return Returns the removed entry */ function sPopCheap(address[] storage A, uint256 index) internal returns (address) { uint256 length = A.length; if (index >= length) { revert("Error: index out of bounds"); } address entry = A[index]; if (index != length - 1) { A[index] = A[length - 1]; delete A[length - 1]; } A.length--; return entry; } /** * Deletes address at index. Works by swapping it with the last address, then deleting. * Order is not preserved * @param A Storage array to remove from */ function sRemoveCheap(address[] storage A, address a) internal { (uint256 index, bool isIn) = indexOf(A, a); if (!isIn) { revert("Error: entry not found"); } else { sPopCheap(A, index); return; } } /** * Returns whether or not there's a duplicate. Runs in O(n^2). * @param A Array to search * @return Returns true if duplicate, false otherwise */ function hasDuplicate(address[] memory A) internal pure returns (bool) { if (A.length == 0) { return false; } for (uint256 i = 0; i < A.length - 1; i++) { for (uint256 j = i + 1; j < A.length; j++) { if (A[i] == A[j]) { return true; } } } return false; } /** * Returns whether the two arrays are equal. * @param A The first array * @param B The second array * @return True is the arrays are equal, false if not. */ function isEqual(address[] memory A, address[] memory B) internal pure returns (bool) { if (A.length != B.length) { return false; } for (uint256 i = 0; i < A.length; i++) { if (A[i] != B[i]) { return false; } } return true; } /** * Returns the elements indexed at indexArray. * @param A The array to index * @param indexArray The array to use to index * @return Returns array containing elements indexed at indexArray */ function argGet(address[] memory A, uint256[] memory indexArray) internal pure returns (address[] memory) { address[] memory array = new address[](indexArray.length); for (uint256 i = 0; i < indexArray.length; i++) { array[i] = A[indexArray[i]]; } return array; } } // File: contracts/lib/TimeLockUpgrade.sol /* Copyright 2018 Set Labs Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity 0.5.7; /** * @title TimeLockUpgrade * @author Set Protocol * * The TimeLockUpgrade contract contains a modifier for handling minimum time period updates */ contract TimeLockUpgrade is Ownable { using SafeMath for uint256; /* ============ State Variables ============ */ // Timelock Upgrade Period in seconds uint256 public timeLockPeriod; // Mapping of upgradable units and initialized timelock mapping(bytes32 => uint256) public timeLockedUpgrades; /* ============ Events ============ */ event UpgradeRegistered( bytes32 _upgradeHash, uint256 _timestamp ); /* ============ Modifiers ============ */ modifier timeLockUpgrade() { // If the time lock period is 0, then allow non-timebound upgrades. // This is useful for initialization of the protocol and for testing. if (timeLockPeriod == 0) { _; return; } // The upgrade hash is defined by the hash of the transaction call data, // which uniquely identifies the function as well as the passed in arguments. bytes32 upgradeHash = keccak256( abi.encodePacked( msg.data ) ); uint256 registrationTime = timeLockedUpgrades[upgradeHash]; // If the upgrade hasn't been registered, register with the current time. if (registrationTime == 0) { timeLockedUpgrades[upgradeHash] = block.timestamp; emit UpgradeRegistered( upgradeHash, block.timestamp ); return; } require( block.timestamp >= registrationTime.add(timeLockPeriod), "TimeLockUpgrade: Time lock period must have elapsed." ); // Reset the timestamp to 0 timeLockedUpgrades[upgradeHash] = 0; // Run the rest of the upgrades _; } /* ============ Function ============ */ /** * Change timeLockPeriod period. Generally called after initially settings have been set up. * * @param _timeLockPeriod Time in seconds that upgrades need to be evaluated before execution */ function setTimeLockPeriod( uint256 _timeLockPeriod ) external onlyOwner { // Only allow setting of the timeLockPeriod if the period is greater than the existing require( _timeLockPeriod > timeLockPeriod, "TimeLockUpgrade: New period must be greater than existing" ); timeLockPeriod = _timeLockPeriod; } } // File: contracts/lib/Authorizable.sol /* Copyright 2018 Set Labs Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity 0.5.7; /** * @title Authorizable * @author Set Protocol * * The Authorizable contract is an inherited contract that sets permissions on certain function calls * through the onlyAuthorized modifier. Permissions can be managed only by the Owner of the contract. */ contract Authorizable is Ownable, TimeLockUpgrade { using SafeMath for uint256; using AddressArrayUtils for address[]; /* ============ State Variables ============ */ // Mapping of addresses to bool indicator of authorization mapping (address => bool) public authorized; // Array of authorized addresses address[] public authorities; /* ============ Modifiers ============ */ // Only authorized addresses can invoke functions with this modifier. modifier onlyAuthorized { require( authorized[msg.sender], "Authorizable.onlyAuthorized: Sender not included in authorities" ); _; } /* ============ Events ============ */ // Event emitted when new address is authorized. event AddressAuthorized ( address indexed authAddress, address authorizedBy ); // Event emitted when address is deauthorized. event AuthorizedAddressRemoved ( address indexed addressRemoved, address authorizedBy ); /* ============ Setters ============ */ /** * Add authorized address to contract. Can only be set by owner. * * @param _authTarget The address of the new authorized contract */ function addAuthorizedAddress(address _authTarget) external onlyOwner timeLockUpgrade { // Require that address is not already authorized require( !authorized[_authTarget], "Authorizable.addAuthorizedAddress: Address already registered" ); // Set address authority to true authorized[_authTarget] = true; // Add address to authorities array authorities.push(_authTarget); // Emit authorized address event emit AddressAuthorized( _authTarget, msg.sender ); } /** * Remove authorized address from contract. Can only be set by owner. * * @param _authTarget The address to be de-permissioned */ function removeAuthorizedAddress(address _authTarget) external onlyOwner { // Require address is authorized require( authorized[_authTarget], "Authorizable.removeAuthorizedAddress: Address not authorized" ); // Delete address from authorized mapping authorized[_authTarget] = false; authorities = authorities.remove(_authTarget); // Emit AuthorizedAddressRemoved event. emit AuthorizedAddressRemoved( _authTarget, msg.sender ); } /* ============ Getters ============ */ /** * Get array of authorized addresses. * * @return address[] Array of authorized addresses */ function getAuthorizedAddresses() external view returns (address[] memory) { // Return array of authorized addresses return authorities; } } // File: contracts/lib/CommonMath.sol /* Copyright 2018 Set Labs Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity 0.5.7; library CommonMath { using SafeMath for uint256; /** * Calculates and returns the maximum value for a uint256 * * @return The maximum value for uint256 */ function maxUInt256() internal pure returns (uint256) { return 2 ** 256 - 1; } /** * @dev Performs the power on a specified value, reverts on overflow. */ function safePower( uint256 a, uint256 pow ) internal pure returns (uint256) { require(a > 0); uint256 result = 1; for (uint256 i = 0; i < pow; i++){ uint256 previousResult = result; // Using safemath multiplication prevents overflows result = previousResult.mul(a); } return result; } /** * Checks for rounding errors and returns value of potential partial amounts of a principal * * @param _principal Number fractional amount is derived from * @param _numerator Numerator of fraction * @param _denominator Denominator of fraction * @return uint256 Fractional amount of principal calculated */ function getPartialAmount( uint256 _principal, uint256 _numerator, uint256 _denominator ) internal pure returns (uint256) { // Get remainder of partial amount (if 0 not a partial amount) uint256 remainder = mulmod(_principal, _numerator, _denominator); // Return if not a partial amount if (remainder == 0) { return _principal.mul(_numerator).div(_denominator); } // Calculate error percentage uint256 errPercentageTimes1000000 = remainder.mul(1000000).div(_numerator.mul(_principal)); // Require error percentage is less than 0.1%. require( errPercentageTimes1000000 < 1000, "CommonMath.getPartialAmount: Rounding error exceeds bounds" ); return _principal.mul(_numerator).div(_denominator); } } // File: contracts/lib/IERC20.sol /* Copyright 2018 Set Labs Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity 0.5.7; /** * @title IERC20 * @author Set Protocol * * Interface for using ERC20 Tokens. This interface is needed to interact with tokens that are not * fully ERC20 compliant and return something other than true on successful transfers. */ interface IERC20 { function balanceOf( address _owner ) external view returns (uint256); function allowance( address _owner, address _spender ) external view returns (uint256); function transfer( address _to, uint256 _quantity ) external; function transferFrom( address _from, address _to, uint256 _quantity ) external; function approve( address _spender, uint256 _quantity ) external returns (bool); } // File: contracts/lib/ERC20Wrapper.sol /* Copyright 2018 Set Labs Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity 0.5.7; /** * @title ERC20Wrapper * @author Set Protocol * * This library contains functions for interacting wtih ERC20 tokens, even those not fully compliant. * For all functions we will only accept tokens that return a null or true value, any other values will * cause the operation to revert. */ library ERC20Wrapper { // ============ Internal Functions ============ /** * Check balance owner's balance of ERC20 token * * @param _token The address of the ERC20 token * @param _owner The owner who's balance is being checked * @return uint256 The _owner's amount of tokens */ function balanceOf( address _token, address _owner ) external view returns (uint256) { return IERC20(_token).balanceOf(_owner); } /** * Checks spender's allowance to use token's on owner's behalf. * * @param _token The address of the ERC20 token * @param _owner The token owner address * @param _spender The address the allowance is being checked on * @return uint256 The spender's allowance on behalf of owner */ function allowance( address _token, address _owner, address _spender ) internal view returns (uint256) { return IERC20(_token).allowance(_owner, _spender); } /** * Transfers tokens from an address. Handle's tokens that return true or null. * If other value returned, reverts. * * @param _token The address of the ERC20 token * @param _to The address to transfer to * @param _quantity The amount of tokens to transfer */ function transfer( address _token, address _to, uint256 _quantity ) external { IERC20(_token).transfer(_to, _quantity); // Check that transfer returns true or null require( checkSuccess(), "ERC20Wrapper.transfer: Bad return value" ); } /** * Transfers tokens from an address (that has set allowance on the proxy). * Handle's tokens that return true or null. If other value returned, reverts. * * @param _token The address of the ERC20 token * @param _from The address to transfer from * @param _to The address to transfer to * @param _quantity The number of tokens to transfer */ function transferFrom( address _token, address _from, address _to, uint256 _quantity ) external { IERC20(_token).transferFrom(_from, _to, _quantity); // Check that transferFrom returns true or null require( checkSuccess(), "ERC20Wrapper.transferFrom: Bad return value" ); } /** * Grants spender ability to spend on owner's behalf. * Handle's tokens that return true or null. If other value returned, reverts. * * @param _token The address of the ERC20 token * @param _spender The address to approve for transfer * @param _quantity The amount of tokens to approve spender for */ function approve( address _token, address _spender, uint256 _quantity ) internal { IERC20(_token).approve(_spender, _quantity); // Check that approve returns true or null require( checkSuccess(), "ERC20Wrapper.approve: Bad return value" ); } /** * Ensure's the owner has granted enough allowance for system to * transfer tokens. * * @param _token The address of the ERC20 token * @param _owner The address of the token owner * @param _spender The address to grant/check allowance for * @param _quantity The amount to see if allowed for */ function ensureAllowance( address _token, address _owner, address _spender, uint256 _quantity ) internal { uint256 currentAllowance = allowance(_token, _owner, _spender); if (currentAllowance < _quantity) { approve( _token, _spender, CommonMath.maxUInt256() ); } } // ============ Private Functions ============ /** * Checks the return value of the previous function up to 32 bytes. Returns true if the previous * function returned 0 bytes or 1. */ function checkSuccess( ) private pure returns (bool) { // default to failure uint256 returnValue = 0; assembly { // check number of bytes returned from last function call switch returndatasize // no bytes returned: assume success case 0x0 { returnValue := 1 } // 32 bytes returned case 0x20 { // copy 32 bytes into scratch space returndatacopy(0x0, 0x0, 0x20) // load those bytes into returnValue returnValue := mload(0x0) } // not sure what was returned: dont mark as success default { } } // check if returned value is one or nothing return returnValue == 1; } } // File: contracts/core/Vault.sol /* Copyright 2018 Set Labs Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity 0.5.7; /** * @title Vault * @author Set Protocol * * The vault contract is responsible for holding all funds and keeping track of the * fund state and which Sets own which funds. * */ contract Vault is Authorizable { // Use SafeMath library for all uint256 arithmetic using SafeMath for uint256; /* ============ State Variables ============ */ // Mapping of token address to map of owner or Set address to balance. // Example of mapping below: // +--------------+---------------------+--------+ // | TokenAddress | Set OR User Address | Amount | // +--------------+---------------------+--------+ // | TokenA | User 0x123 | 500 | // | | User 0xABC | 300 | // | | Set 0x456 | 1000 | // | TokenB | User 0xDEF | 100 | // | | Set 0xSET | 700 | // +--------------+---------------------+--------+ mapping (address => mapping (address => uint256)) public balances; /* ============ External Functions ============ */ /* * Withdraws user's unassociated tokens to user account. Can only be * called by authorized core contracts. * * @param _token The address of the ERC20 token * @param _to The address to transfer token to * @param _quantity The number of tokens to transfer */ function withdrawTo( address _token, address _to, uint256 _quantity ) public onlyAuthorized { if (_quantity > 0) { // Retrieve current balance of token for the vault uint256 existingVaultBalance = ERC20Wrapper.balanceOf( _token, address(this) ); // Call specified ERC20 token contract to transfer tokens from Vault to user ERC20Wrapper.transfer( _token, _to, _quantity ); // Verify transfer quantity is reflected in balance uint256 newVaultBalance = ERC20Wrapper.balanceOf( _token, address(this) ); // Check to make sure current balances are as expected require( newVaultBalance == existingVaultBalance.sub(_quantity), "Vault.withdrawTo: Invalid post withdraw balance" ); } } /* * Increment quantity owned of a token for a given address. Can * only be called by authorized core contracts. * * @param _token The address of the ERC20 token * @param _owner The address of the token owner * @param _quantity The number of tokens to attribute to owner */ function incrementTokenOwner( address _token, address _owner, uint256 _quantity ) public onlyAuthorized { if (_quantity > 0) { // Increment balances state variable adding _quantity to user's token amount balances[_token][_owner] = balances[_token][_owner].add(_quantity); } } /* * Decrement quantity owned of a token for a given address. Can only * be called by authorized core contracts. * * @param _token The address of the ERC20 token * @param _owner The address of the token owner * @param _quantity The number of tokens to deattribute to owner */ function decrementTokenOwner( address _token, address _owner, uint256 _quantity ) public onlyAuthorized { // Require that user has enough unassociated tokens to withdraw tokens or issue Set require( balances[_token][_owner] >= _quantity, "Vault.decrementTokenOwner: Insufficient token balance" ); if (_quantity > 0) { // Decrement balances state variable subtracting _quantity to user's token amount balances[_token][_owner] = balances[_token][_owner].sub(_quantity); } } /** * Transfers tokens associated with one account to another account in the vault * * @param _token Address of token being transferred * @param _from Address token being transferred from * @param _to Address token being transferred to * @param _quantity Amount of tokens being transferred */ function transferBalance( address _token, address _from, address _to, uint256 _quantity ) public onlyAuthorized { if (_quantity > 0) { // Require that user has enough unassociated tokens to withdraw tokens or issue Set require( balances[_token][_from] >= _quantity, "Vault.transferBalance: Insufficient token balance" ); // Decrement balances state variable subtracting _quantity to user's token amount balances[_token][_from] = balances[_token][_from].sub(_quantity); // Increment balances state variable adding _quantity to user's token amount balances[_token][_to] = balances[_token][_to].add(_quantity); } } /* * Withdraws user's unassociated tokens to user account. Can only be * called by authorized core contracts. * * @param _tokens The addresses of the ERC20 tokens * @param _to The address of the recipient * @param _quantities The numbers of tokens to attribute to owner */ function batchWithdrawTo( address[] calldata _tokens, address _to, uint256[] calldata _quantities ) external onlyAuthorized { // Storing token count to local variable to save on invocation uint256 tokenCount = _tokens.length; // Confirm and empty _tokens array is not passed require( tokenCount > 0, "Vault.batchWithdrawTo: Tokens must not be empty" ); // Confirm there is one quantity for every token address require( tokenCount == _quantities.length, "Vault.batchWithdrawTo: Tokens and quantities lengths mismatch" ); for (uint256 i = 0; i < tokenCount; i++) { withdrawTo( _tokens[i], _to, _quantities[i] ); } } /* * Increment quantites owned of a collection of tokens for a given address. Can * only be called by authorized core contracts. * * @param _tokens The addresses of the ERC20 tokens * @param _owner The address of the token owner * @param _quantities The numbers of tokens to attribute to owner */ function batchIncrementTokenOwner( address[] calldata _tokens, address _owner, uint256[] calldata _quantities ) external onlyAuthorized { // Storing token count to local variable to save on invocation uint256 tokenCount = _tokens.length; // Confirm and empty _tokens array is not passed require( tokenCount > 0, "Vault.batchIncrementTokenOwner: Tokens must not be empty" ); // Confirm there is one quantity for every token address require( tokenCount == _quantities.length, "Vault.batchIncrementTokenOwner: Tokens and quantities lengths mismatch" ); for (uint256 i = 0; i < tokenCount; i++) { incrementTokenOwner( _tokens[i], _owner, _quantities[i] ); } } /* * Decrements quantites owned of a collection of tokens for a given address. Can * only be called by authorized core contracts. * * @param _tokens The addresses of the ERC20 tokens * @param _owner The address of the token owner * @param _quantities The numbers of tokens to attribute to owner */ function batchDecrementTokenOwner( address[] calldata _tokens, address _owner, uint256[] calldata _quantities ) external onlyAuthorized { // Storing token count to local variable to save on invocation uint256 tokenCount = _tokens.length; // Confirm and empty _tokens array is not passed require( tokenCount > 0, "Vault.batchDecrementTokenOwner: Tokens must not be empty" ); // Confirm there is one quantity for every token address require( tokenCount == _quantities.length, "Vault.batchDecrementTokenOwner: Tokens and quantities lengths mismatch" ); for (uint256 i = 0; i < tokenCount; i++) { decrementTokenOwner( _tokens[i], _owner, _quantities[i] ); } } /** * Transfers tokens associated with one account to another account in the vault * * @param _tokens Addresses of tokens being transferred * @param _from Address tokens being transferred from * @param _to Address tokens being transferred to * @param _quantities Amounts of tokens being transferred */ function batchTransferBalance( address[] calldata _tokens, address _from, address _to, uint256[] calldata _quantities ) external onlyAuthorized { // Storing token count to local variable to save on invocation uint256 tokenCount = _tokens.length; // Confirm and empty _tokens array is not passed require( tokenCount > 0, "Vault.batchTransferBalance: Tokens must not be empty" ); // Confirm there is one quantity for every token address require( tokenCount == _quantities.length, "Vault.batchTransferBalance: Tokens and quantities lengths mismatch" ); for (uint256 i = 0; i < tokenCount; i++) { transferBalance( _tokens[i], _from, _to, _quantities[i] ); } } /* * Get balance of particular contract for owner. * * @param _token The address of the ERC20 token * @param _owner The address of the token owner */ function getOwnerBalance( address _token, address _owner ) external view returns (uint256) { // Return owners token balance return balances[_token][_owner]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"constant":false,"inputs":[{"name":"_tokens","type":"address[]"},{"name":"_owner","type":"address"},{"name":"_quantities","type":"uint256[]"}],"name":"batchIncrementTokenOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"timeLockedUpgrades","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"},{"name":"_owner","type":"address"}],"name":"getOwnerBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokens","type":"address[]"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_quantities","type":"uint256[]"}],"name":"batchTransferBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokens","type":"address[]"},{"name":"_to","type":"address"},{"name":"_quantities","type":"uint256[]"}],"name":"batchWithdrawTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokens","type":"address[]"},{"name":"_owner","type":"address"},{"name":"_quantities","type":"uint256[]"}],"name":"batchDecrementTokenOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_authTarget","type":"address"}],"name":"addAuthorizedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"authorities","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_authTarget","type":"address"}],"name":"removeAuthorizedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"timeLockPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_owner","type":"address"},{"name":"_quantity","type":"uint256"}],"name":"decrementTokenOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_timeLockPeriod","type":"uint256"}],"name":"setTimeLockPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_quantity","type":"uint256"}],"name":"transferBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"authorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_owner","type":"address"},{"name":"_quantity","type":"uint256"}],"name":"incrementTokenOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_quantity","type":"uint256"}],"name":"withdrawTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAuthorizedAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authAddress","type":"address"},{"indexed":false,"name":"authorizedBy","type":"address"}],"name":"AddressAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addressRemoved","type":"address"},{"indexed":false,"name":"authorizedBy","type":"address"}],"name":"AuthorizedAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_upgradeHash","type":"bytes32"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"UpgradeRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
6080604081905260008054600160a060020a0319163317808255600160a060020a0316917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3611edb806100576000396000f3fe608060405234801561001057600080fd5b506004361061015f576000357c01000000000000000000000000000000000000000000000000000000009004806380ddda30116100d5578063b918161111610099578063b918161114610653578063bada572614610679578063c23f001f146106af578063c3b35a7e146106dd578063d39de6e914610713578063f2fde38b1461076b5761015f565b806380ddda30146105a05780638da5cb5b146105d65780638f32d59b146105de5780639303b16f146105fa578063b19ad577146106175761015f565b80633911477c116101275780633911477c1461043c57806342f1181e1461050b578063494503d414610531578063707129391461056a578063715018a61461059057806378446bc1146105985761015f565b806312a3bbe3146101645780631766486d146102355780631f98ade31461026457806320153c38146102925780632321af6a1461036d575b600080fd5b6102336004803603606081101561017a57600080fd5b81019060208101813564010000000081111561019557600080fd5b8201836020820111156101a757600080fd5b803590602001918460208302840111640100000000831117156101c957600080fd5b91939092600160a060020a03833516926040810190602001356401000000008111156101f457600080fd5b82018360208201111561020657600080fd5b8035906020019184602083028401116401000000008311171561022857600080fd5b509092509050610791565b005b6102526004803603602081101561024b57600080fd5b50356108b7565b60408051918252519081900360200190f35b6102526004803603604081101561027a57600080fd5b50600160a060020a03813581169160200135166108c9565b610233600480360360808110156102a857600080fd5b8101906020810181356401000000008111156102c357600080fd5b8201836020820111156102d557600080fd5b803590602001918460208302840111640100000000831117156102f757600080fd5b91939092600160a060020a038335811693602081013590911692919060608101906040013564010000000081111561032e57600080fd5b82018360208201111561034057600080fd5b8035906020019184602083028401116401000000008311171561036257600080fd5b5090925090506108f6565b6102336004803603606081101561038357600080fd5b81019060208101813564010000000081111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460208302840111640100000000831117156103d257600080fd5b91939092600160a060020a03833516926040810190602001356401000000008111156103fd57600080fd5b82018360208201111561040f57600080fd5b8035906020019184602083028401116401000000008311171561043157600080fd5b509092509050610a1e565b6102336004803603606081101561045257600080fd5b81019060208101813564010000000081111561046d57600080fd5b82018360208201111561047f57600080fd5b803590602001918460208302840111640100000000831117156104a157600080fd5b91939092600160a060020a03833516926040810190602001356401000000008111156104cc57600080fd5b8201836020820111156104de57600080fd5b8035906020019184602083028401116401000000008311171561050057600080fd5b509092509050610b3b565b6102336004803603602081101561052157600080fd5b5035600160a060020a0316610c58565b61054e6004803603602081101561054757600080fd5b5035610f82565b60408051600160a060020a039092168252519081900360200190f35b6102336004803603602081101561058057600080fd5b5035600160a060020a0316610fa9565b6102336110f8565b610252611160565b610233600480360360608110156105b657600080fd5b50600160a060020a03813581169160208101359091169060400135611166565b61054e611286565b6105e6611296565b604080519115158252519081900360200190f35b6102336004803603602081101561061057600080fd5b50356112a7565b6102336004803603608081101561062d57600080fd5b50600160a060020a03813581169160208101358216916040820135169060600135611300565b6105e66004803603602081101561066957600080fd5b5035600160a060020a031661145d565b6102336004803603606081101561068f57600080fd5b50600160a060020a03813581169160208101359091169060400135611472565b610252600480360360408110156106c557600080fd5b50600160a060020a03813581169160200135166114ff565b610233600480360360608110156106f357600080fd5b50600160a060020a0381358116916020810135909116906040013561151c565b61071b6117bc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561075757818101518382015260200161073f565b505050509050019250505060405180910390f35b6102336004803603602081101561078157600080fd5b5035600160a060020a031661181e565b3360009081526003602052604090205460ff166107e25760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b83806108225760405160e560020a62461bcd028152600401808060200182810382526038815260200180611b5e6038913960400191505060405180910390fd5b8082146108635760405160e560020a62461bcd028152600401808060200182810382526046815260200180611c106046913960600191505060405180910390fd5b60005b818110156108ae576108a687878381811061087d57fe5b90506020020135600160a060020a03168686868581811061089a57fe5b90506020020135611472565b600101610866565b50505050505050565b60026020526000908152604090205481565b600160a060020a038083166000908152600560209081526040808320938516835292905220545b92915050565b3360009081526003602052604090205460ff166109475760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b84806109875760405160e560020a62461bcd028152600401808060200182810382526034815260200180611cd26034913960400191505060405180910390fd5b8082146109c85760405160e560020a62461bcd028152600401808060200182810382526042815260200180611bce6042913960600191505060405180910390fd5b60005b81811015610a1457610a0c8888838181106109e257fe5b90506020020135600160a060020a03168787878786818110610a0057fe5b90506020020135611300565b6001016109cb565b5050505050505050565b3360009081526003602052604090205460ff16610a6f5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b8380610aaf5760405160e560020a62461bcd02815260040180806020018281038252602f815260200180611e81602f913960400191505060405180910390fd5b808214610af05760405160e560020a62461bcd02815260040180806020018281038252603d815260200180611d3b603d913960400191505060405180910390fd5b60005b818110156108ae57610b33878783818110610b0a57fe5b90506020020135600160a060020a031686868685818110610b2757fe5b9050602002013561151c565b600101610af3565b3360009081526003602052604090205460ff16610b8c5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b8380610bcc5760405160e560020a62461bcd028152600401808060200182810382526038815260200180611b966038913960400191505060405180910390fd5b808214610c0d5760405160e560020a62461bcd028152600401808060200182810382526046815260200180611b186046913960600191505060405180910390fd5b60005b818110156108ae57610c50878783818110610c2757fe5b90506020020135600160a060020a031686868685818110610c4457fe5b90506020020135611166565b600101610c10565b610c60611296565b610c6957600080fd5b600154610d7757600160a060020a03811660009081526003602052604090205460ff1615610ccb5760405160e560020a62461bcd02815260040180806020018281038252603d815260200180611c56603d913960400191505060405180910390fd5b600160a060020a0381166000818152600360209081526040808320805460ff191660019081179091556004805491820181559093527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909201805473ffffffffffffffffffffffffffffffffffffffff191684179055815133815291517f8918da6429714f0e9c40ae7f270773e27fc8caf7a256e19807f859563b7514de9281900390910190a2610f7f565b60008036604051602001808383808284376040805191909301818103601f1901825283528051602091820120600081815260029092529290205491955090935050508115159050610e1657600082815260026020908152604091829020429081905582518581529182015281517f0e0905d1a972d476e353bdcc3e06b19a71709054c8ba01eccb7e0691eca6d374929181900390910190a15050610f7f565b600154610e2a90829063ffffffff61183816565b421015610e6b5760405160e560020a62461bcd028152600401808060200182810382526034815260200180611e146034913960400191505060405180910390fd5b6000828152600260209081526040808320839055600160a060020a0386168352600390915290205460ff1615610ed55760405160e560020a62461bcd02815260040180806020018281038252603d815260200180611c56603d913960400191505060405180910390fd5b600160a060020a0383166000818152600360209081526040808320805460ff191660019081179091556004805491820181559093527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909201805473ffffffffffffffffffffffffffffffffffffffff191684179055815133815291517f8918da6429714f0e9c40ae7f270773e27fc8caf7a256e19807f859563b7514de9281900390910190a250505b50565b60048181548110610f8f57fe5b600091825260209091200154600160a060020a0316905081565b610fb1611296565b610fba57600080fd5b600160a060020a03811660009081526003602052604090205460ff166110145760405160e560020a62461bcd02815260040180806020018281038252603c815260200180611d78603c913960400191505060405180910390fd5b600160a060020a038116600090815260036020908152604091829020805460ff19169055600480548351818402810184019094528084526110a19385939092919083018282801561108e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611070575b505050505061185190919063ffffffff16565b80516110b591600491602090910190611a74565b50604080513381529051600160a060020a038316917f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b0919081900360200190a250565b611100611296565b61110957600080fd5b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60015481565b3360009081526003602052604090205460ff166111b75760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b600160a060020a0380841660009081526005602090815260408083209386168352929052205481111561121e5760405160e560020a62461bcd028152600401808060200182810382526035815260200180611d066035913960400191505060405180910390fd5b801561128157600160a060020a0380841660009081526005602090815260408083209386168352929052205461125a908263ffffffff61188616565b600160a060020a038085166000908152600560209081526040808320938716835292905220555b505050565b600054600160a060020a03165b90565b600054600160a060020a0316331490565b6112af611296565b6112b857600080fd5b60015481116112fb5760405160e560020a62461bcd028152600401808060200182810382526039815260200180611e486039913960400191505060405180910390fd5b600155565b3360009081526003602052604090205460ff166113515760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b801561145757600160a060020a038085166000908152600560209081526040808320938716835292905220548111156113be5760405160e560020a62461bcd028152600401808060200182810382526031815260200180611de36031913960400191505060405180910390fd5b600160a060020a038085166000908152600560209081526040808320938716835292905220546113f4908263ffffffff61188616565b600160a060020a038581166000908152600560209081526040808320888516845290915280822093909355908416815220546114309082611838565b600160a060020a038086166000908152600560209081526040808320938716835292905220555b50505050565b60036020526000908152604090205460ff1681565b3360009081526003602052604090205460ff166114c35760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b801561128157600160a060020a0380841660009081526005602090815260408083209386168352929052205461125a908263ffffffff61183816565b600560209081526000928352604080842090915290825290205481565b3360009081526003602052604090205460ff1661156d5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b801561128157604080517ff7888aec000000000000000000000000000000000000000000000000000000008152600160a060020a0385166004820152306024820152905160009173eadada7c6943c223c0d4bea475a6dacc7368f8d69163f7888aec91604480820192602092909190829003018186803b1580156115f057600080fd5b505af4158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b5051604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0380881660048301528616602482015260448101859052905191925073eadada7c6943c223c0d4bea475a6dacc7368f8d69163beabacc891606480820192600092909190829003018186803b1580156116a257600080fd5b505af41580156116b6573d6000803e3d6000fd5b5050604080517ff7888aec000000000000000000000000000000000000000000000000000000008152600160a060020a038816600482015230602482015290516000935073eadada7c6943c223c0d4bea475a6dacc7368f8d6925063f7888aec91604480820192602092909190829003018186803b15801561173757600080fd5b505af415801561174b573d6000803e3d6000fd5b505050506040513d602081101561176157600080fd5b50519050611775828463ffffffff61188616565b81146117b55760405160e560020a62461bcd02815260040180806020018281038252602f815260200180611db4602f913960400191505060405180910390fd5b5050505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561181457602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116117f6575b5050505050905090565b611826611296565b61182f57600080fd5b610f7f8161189b565b60008282018381101561184a57600080fd5b9392505050565b60606000806118608585611916565b915091508061186e57600080fd5b606061187a868461197a565b5093506108f092505050565b60008282111561189557600080fd5b50900390565b600160a060020a0381166118ae57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b81516000908190815b818110156119695784600160a060020a031686828151811061193d57fe5b6020026020010151600160a060020a03161415611961579250600191506119739050565b60010161191f565b5060009250829150505b9250929050565b6060600080845190506060600182036040519080825280602002602001820160405280156119b2578160200160208202803883390190505b50905060005b85811015611a00578681815181106119cc57fe5b60200260200101518282815181106119e057fe5b600160a060020a03909216602092830291909101909101526001016119b8565b50600185015b82811015611a5157868181518110611a1a57fe5b6020026020010151826001830381518110611a3157fe5b600160a060020a0390921660209283029190910190910152600101611a06565b5080868681518110611a5f57fe5b60200260200101519350935050509250929050565b828054828255906000526020600020908101928215611ad6579160200282015b82811115611ad6578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909116178255602090920191600190910190611a94565b50611ae2929150611ae6565b5090565b61129391905b80821115611ae257805473ffffffffffffffffffffffffffffffffffffffff19168155600101611aec56fe5661756c742e626174636844656372656d656e74546f6b656e4f776e65723a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d617463685661756c742e6261746368496e6372656d656e74546f6b656e4f776e65723a20546f6b656e73206d757374206e6f7420626520656d7074795661756c742e626174636844656372656d656e74546f6b656e4f776e65723a20546f6b656e73206d757374206e6f7420626520656d7074795661756c742e62617463685472616e7366657242616c616e63653a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d617463685661756c742e6261746368496e6372656d656e74546f6b656e4f776e65723a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d61746368417574686f72697a61626c652e616464417574686f72697a6564416464726573733a204164647265737320616c72656164792072656769737465726564417574686f72697a61626c652e6f6e6c79417574686f72697a65643a2053656e646572206e6f7420696e636c7564656420696e20617574686f7269746965735661756c742e62617463685472616e7366657242616c616e63653a20546f6b656e73206d757374206e6f7420626520656d7074795661756c742e64656372656d656e74546f6b656e4f776e65723a20496e73756666696369656e7420746f6b656e2062616c616e63655661756c742e62617463685769746864726177546f3a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d61746368417574686f72697a61626c652e72656d6f7665417574686f72697a6564416464726573733a2041646472657373206e6f7420617574686f72697a65645661756c742e7769746864726177546f3a20496e76616c696420706f73742077697468647261772062616c616e63655661756c742e7472616e7366657242616c616e63653a20496e73756666696369656e7420746f6b656e2062616c616e636554696d654c6f636b557067726164653a2054696d65206c6f636b20706572696f64206d757374206861766520656c61707365642e54696d654c6f636b557067726164653a204e657720706572696f64206d7573742062652067726561746572207468616e206578697374696e675661756c742e62617463685769746864726177546f3a20546f6b656e73206d757374206e6f7420626520656d707479a165627a7a72305820f480fd92e3c5500732696bb72ac4c783538dc9cf7a7880b833efd8beea04f8170029Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061015f576000357c01000000000000000000000000000000000000000000000000000000009004806380ddda30116100d5578063b918161111610099578063b918161114610653578063bada572614610679578063c23f001f146106af578063c3b35a7e146106dd578063d39de6e914610713578063f2fde38b1461076b5761015f565b806380ddda30146105a05780638da5cb5b146105d65780638f32d59b146105de5780639303b16f146105fa578063b19ad577146106175761015f565b80633911477c116101275780633911477c1461043c57806342f1181e1461050b578063494503d414610531578063707129391461056a578063715018a61461059057806378446bc1146105985761015f565b806312a3bbe3146101645780631766486d146102355780631f98ade31461026457806320153c38146102925780632321af6a1461036d575b600080fd5b6102336004803603606081101561017a57600080fd5b81019060208101813564010000000081111561019557600080fd5b8201836020820111156101a757600080fd5b803590602001918460208302840111640100000000831117156101c957600080fd5b91939092600160a060020a03833516926040810190602001356401000000008111156101f457600080fd5b82018360208201111561020657600080fd5b8035906020019184602083028401116401000000008311171561022857600080fd5b509092509050610791565b005b6102526004803603602081101561024b57600080fd5b50356108b7565b60408051918252519081900360200190f35b6102526004803603604081101561027a57600080fd5b50600160a060020a03813581169160200135166108c9565b610233600480360360808110156102a857600080fd5b8101906020810181356401000000008111156102c357600080fd5b8201836020820111156102d557600080fd5b803590602001918460208302840111640100000000831117156102f757600080fd5b91939092600160a060020a038335811693602081013590911692919060608101906040013564010000000081111561032e57600080fd5b82018360208201111561034057600080fd5b8035906020019184602083028401116401000000008311171561036257600080fd5b5090925090506108f6565b6102336004803603606081101561038357600080fd5b81019060208101813564010000000081111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460208302840111640100000000831117156103d257600080fd5b91939092600160a060020a03833516926040810190602001356401000000008111156103fd57600080fd5b82018360208201111561040f57600080fd5b8035906020019184602083028401116401000000008311171561043157600080fd5b509092509050610a1e565b6102336004803603606081101561045257600080fd5b81019060208101813564010000000081111561046d57600080fd5b82018360208201111561047f57600080fd5b803590602001918460208302840111640100000000831117156104a157600080fd5b91939092600160a060020a03833516926040810190602001356401000000008111156104cc57600080fd5b8201836020820111156104de57600080fd5b8035906020019184602083028401116401000000008311171561050057600080fd5b509092509050610b3b565b6102336004803603602081101561052157600080fd5b5035600160a060020a0316610c58565b61054e6004803603602081101561054757600080fd5b5035610f82565b60408051600160a060020a039092168252519081900360200190f35b6102336004803603602081101561058057600080fd5b5035600160a060020a0316610fa9565b6102336110f8565b610252611160565b610233600480360360608110156105b657600080fd5b50600160a060020a03813581169160208101359091169060400135611166565b61054e611286565b6105e6611296565b604080519115158252519081900360200190f35b6102336004803603602081101561061057600080fd5b50356112a7565b6102336004803603608081101561062d57600080fd5b50600160a060020a03813581169160208101358216916040820135169060600135611300565b6105e66004803603602081101561066957600080fd5b5035600160a060020a031661145d565b6102336004803603606081101561068f57600080fd5b50600160a060020a03813581169160208101359091169060400135611472565b610252600480360360408110156106c557600080fd5b50600160a060020a03813581169160200135166114ff565b610233600480360360608110156106f357600080fd5b50600160a060020a0381358116916020810135909116906040013561151c565b61071b6117bc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561075757818101518382015260200161073f565b505050509050019250505060405180910390f35b6102336004803603602081101561078157600080fd5b5035600160a060020a031661181e565b3360009081526003602052604090205460ff166107e25760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b83806108225760405160e560020a62461bcd028152600401808060200182810382526038815260200180611b5e6038913960400191505060405180910390fd5b8082146108635760405160e560020a62461bcd028152600401808060200182810382526046815260200180611c106046913960600191505060405180910390fd5b60005b818110156108ae576108a687878381811061087d57fe5b90506020020135600160a060020a03168686868581811061089a57fe5b90506020020135611472565b600101610866565b50505050505050565b60026020526000908152604090205481565b600160a060020a038083166000908152600560209081526040808320938516835292905220545b92915050565b3360009081526003602052604090205460ff166109475760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b84806109875760405160e560020a62461bcd028152600401808060200182810382526034815260200180611cd26034913960400191505060405180910390fd5b8082146109c85760405160e560020a62461bcd028152600401808060200182810382526042815260200180611bce6042913960600191505060405180910390fd5b60005b81811015610a1457610a0c8888838181106109e257fe5b90506020020135600160a060020a03168787878786818110610a0057fe5b90506020020135611300565b6001016109cb565b5050505050505050565b3360009081526003602052604090205460ff16610a6f5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b8380610aaf5760405160e560020a62461bcd02815260040180806020018281038252602f815260200180611e81602f913960400191505060405180910390fd5b808214610af05760405160e560020a62461bcd02815260040180806020018281038252603d815260200180611d3b603d913960400191505060405180910390fd5b60005b818110156108ae57610b33878783818110610b0a57fe5b90506020020135600160a060020a031686868685818110610b2757fe5b9050602002013561151c565b600101610af3565b3360009081526003602052604090205460ff16610b8c5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b8380610bcc5760405160e560020a62461bcd028152600401808060200182810382526038815260200180611b966038913960400191505060405180910390fd5b808214610c0d5760405160e560020a62461bcd028152600401808060200182810382526046815260200180611b186046913960600191505060405180910390fd5b60005b818110156108ae57610c50878783818110610c2757fe5b90506020020135600160a060020a031686868685818110610c4457fe5b90506020020135611166565b600101610c10565b610c60611296565b610c6957600080fd5b600154610d7757600160a060020a03811660009081526003602052604090205460ff1615610ccb5760405160e560020a62461bcd02815260040180806020018281038252603d815260200180611c56603d913960400191505060405180910390fd5b600160a060020a0381166000818152600360209081526040808320805460ff191660019081179091556004805491820181559093527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909201805473ffffffffffffffffffffffffffffffffffffffff191684179055815133815291517f8918da6429714f0e9c40ae7f270773e27fc8caf7a256e19807f859563b7514de9281900390910190a2610f7f565b60008036604051602001808383808284376040805191909301818103601f1901825283528051602091820120600081815260029092529290205491955090935050508115159050610e1657600082815260026020908152604091829020429081905582518581529182015281517f0e0905d1a972d476e353bdcc3e06b19a71709054c8ba01eccb7e0691eca6d374929181900390910190a15050610f7f565b600154610e2a90829063ffffffff61183816565b421015610e6b5760405160e560020a62461bcd028152600401808060200182810382526034815260200180611e146034913960400191505060405180910390fd5b6000828152600260209081526040808320839055600160a060020a0386168352600390915290205460ff1615610ed55760405160e560020a62461bcd02815260040180806020018281038252603d815260200180611c56603d913960400191505060405180910390fd5b600160a060020a0383166000818152600360209081526040808320805460ff191660019081179091556004805491820181559093527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909201805473ffffffffffffffffffffffffffffffffffffffff191684179055815133815291517f8918da6429714f0e9c40ae7f270773e27fc8caf7a256e19807f859563b7514de9281900390910190a250505b50565b60048181548110610f8f57fe5b600091825260209091200154600160a060020a0316905081565b610fb1611296565b610fba57600080fd5b600160a060020a03811660009081526003602052604090205460ff166110145760405160e560020a62461bcd02815260040180806020018281038252603c815260200180611d78603c913960400191505060405180910390fd5b600160a060020a038116600090815260036020908152604091829020805460ff19169055600480548351818402810184019094528084526110a19385939092919083018282801561108e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611070575b505050505061185190919063ffffffff16565b80516110b591600491602090910190611a74565b50604080513381529051600160a060020a038316917f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b0919081900360200190a250565b611100611296565b61110957600080fd5b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60015481565b3360009081526003602052604090205460ff166111b75760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b600160a060020a0380841660009081526005602090815260408083209386168352929052205481111561121e5760405160e560020a62461bcd028152600401808060200182810382526035815260200180611d066035913960400191505060405180910390fd5b801561128157600160a060020a0380841660009081526005602090815260408083209386168352929052205461125a908263ffffffff61188616565b600160a060020a038085166000908152600560209081526040808320938716835292905220555b505050565b600054600160a060020a03165b90565b600054600160a060020a0316331490565b6112af611296565b6112b857600080fd5b60015481116112fb5760405160e560020a62461bcd028152600401808060200182810382526039815260200180611e486039913960400191505060405180910390fd5b600155565b3360009081526003602052604090205460ff166113515760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b801561145757600160a060020a038085166000908152600560209081526040808320938716835292905220548111156113be5760405160e560020a62461bcd028152600401808060200182810382526031815260200180611de36031913960400191505060405180910390fd5b600160a060020a038085166000908152600560209081526040808320938716835292905220546113f4908263ffffffff61188616565b600160a060020a038581166000908152600560209081526040808320888516845290915280822093909355908416815220546114309082611838565b600160a060020a038086166000908152600560209081526040808320938716835292905220555b50505050565b60036020526000908152604090205460ff1681565b3360009081526003602052604090205460ff166114c35760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b801561128157600160a060020a0380841660009081526005602090815260408083209386168352929052205461125a908263ffffffff61183816565b600560209081526000928352604080842090915290825290205481565b3360009081526003602052604090205460ff1661156d5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180611c93603f913960400191505060405180910390fd5b801561128157604080517ff7888aec000000000000000000000000000000000000000000000000000000008152600160a060020a0385166004820152306024820152905160009173eadada7c6943c223c0d4bea475a6dacc7368f8d69163f7888aec91604480820192602092909190829003018186803b1580156115f057600080fd5b505af4158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b5051604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0380881660048301528616602482015260448101859052905191925073eadada7c6943c223c0d4bea475a6dacc7368f8d69163beabacc891606480820192600092909190829003018186803b1580156116a257600080fd5b505af41580156116b6573d6000803e3d6000fd5b5050604080517ff7888aec000000000000000000000000000000000000000000000000000000008152600160a060020a038816600482015230602482015290516000935073eadada7c6943c223c0d4bea475a6dacc7368f8d6925063f7888aec91604480820192602092909190829003018186803b15801561173757600080fd5b505af415801561174b573d6000803e3d6000fd5b505050506040513d602081101561176157600080fd5b50519050611775828463ffffffff61188616565b81146117b55760405160e560020a62461bcd02815260040180806020018281038252602f815260200180611db4602f913960400191505060405180910390fd5b5050505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561181457602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116117f6575b5050505050905090565b611826611296565b61182f57600080fd5b610f7f8161189b565b60008282018381101561184a57600080fd5b9392505050565b60606000806118608585611916565b915091508061186e57600080fd5b606061187a868461197a565b5093506108f092505050565b60008282111561189557600080fd5b50900390565b600160a060020a0381166118ae57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b81516000908190815b818110156119695784600160a060020a031686828151811061193d57fe5b6020026020010151600160a060020a03161415611961579250600191506119739050565b60010161191f565b5060009250829150505b9250929050565b6060600080845190506060600182036040519080825280602002602001820160405280156119b2578160200160208202803883390190505b50905060005b85811015611a00578681815181106119cc57fe5b60200260200101518282815181106119e057fe5b600160a060020a03909216602092830291909101909101526001016119b8565b50600185015b82811015611a5157868181518110611a1a57fe5b6020026020010151826001830381518110611a3157fe5b600160a060020a0390921660209283029190910190910152600101611a06565b5080868681518110611a5f57fe5b60200260200101519350935050509250929050565b828054828255906000526020600020908101928215611ad6579160200282015b82811115611ad6578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909116178255602090920191600190910190611a94565b50611ae2929150611ae6565b5090565b61129391905b80821115611ae257805473ffffffffffffffffffffffffffffffffffffffff19168155600101611aec56fe5661756c742e626174636844656372656d656e74546f6b656e4f776e65723a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d617463685661756c742e6261746368496e6372656d656e74546f6b656e4f776e65723a20546f6b656e73206d757374206e6f7420626520656d7074795661756c742e626174636844656372656d656e74546f6b656e4f776e65723a20546f6b656e73206d757374206e6f7420626520656d7074795661756c742e62617463685472616e7366657242616c616e63653a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d617463685661756c742e6261746368496e6372656d656e74546f6b656e4f776e65723a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d61746368417574686f72697a61626c652e616464417574686f72697a6564416464726573733a204164647265737320616c72656164792072656769737465726564417574686f72697a61626c652e6f6e6c79417574686f72697a65643a2053656e646572206e6f7420696e636c7564656420696e20617574686f7269746965735661756c742e62617463685472616e7366657242616c616e63653a20546f6b656e73206d757374206e6f7420626520656d7074795661756c742e64656372656d656e74546f6b656e4f776e65723a20496e73756666696369656e7420746f6b656e2062616c616e63655661756c742e62617463685769746864726177546f3a20546f6b656e7320616e64207175616e746974696573206c656e67746873206d69736d61746368417574686f72697a61626c652e72656d6f7665417574686f72697a6564416464726573733a2041646472657373206e6f7420617574686f72697a65645661756c742e7769746864726177546f3a20496e76616c696420706f73742077697468647261772062616c616e63655661756c742e7472616e7366657242616c616e63653a20496e73756666696369656e7420746f6b656e2062616c616e636554696d654c6f636b557067726164653a2054696d65206c6f636b20706572696f64206d757374206861766520656c61707365642e54696d654c6f636b557067726164653a204e657720706572696f64206d7573742062652067726561746572207468616e206578697374696e675661756c742e62617463685769746864726177546f3a20546f6b656e73206d757374206e6f7420626520656d707479a165627a7a72305820f480fd92e3c5500732696bb72ac4c783538dc9cf7a7880b833efd8beea04f8170029
Deployed Bytecode Sourcemap
34904:11004:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34904:11004:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41825:940;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41825:940:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;41825:940:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41825:940:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41825:940:0;;;;-1:-1:-1;;;;;41825:940:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;41825:940:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41825:940:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;41825:940:0;;-1:-1:-1;41825:940:0;-1:-1:-1;41825:940:0;:::i;:::-;;16913:53;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16913:53:0;;:::i;:::-;;;;;;;;;;;;;;;;45669:236;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45669:236:0;;;;;;;;;;:::i;44488:966::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;44488:966:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;44488:966:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44488:966:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;44488:966:0;;;;-1:-1:-1;;;;;44488:966:0;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;44488:966:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44488:966:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;44488:966:0;;-1:-1:-1;44488:966:0;-1:-1:-1;44488:966:0;:::i;40548:898::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40548:898:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;40548:898:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40548:898:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40548:898:0;;;;-1:-1:-1;;;;;40548:898:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;40548:898:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40548:898:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;40548:898:0;;-1:-1:-1;40548:898:0;-1:-1:-1;40548:898:0;:::i;43145:940::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43145:940:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;43145:940:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43145:940:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43145:940:0;;;;-1:-1:-1;;;;;43145:940:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;43145:940:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43145:940:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;43145:940:0;;-1:-1:-1;43145:940:0;-1:-1:-1;43145:940:0;:::i;21435:642::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21435:642:0;-1:-1:-1;;;;;21435:642:0;;:::i;20478:28::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20478:28:0;;:::i;:::-;;;;-1:-1:-1;;;;;20478:28:0;;;;;;;;;;;;;;22252:596;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22252:596:0;-1:-1:-1;;;;;22252:596:0;;:::i;3531:140::-;;;:::i;16814:29::-;;;:::i;38342:630::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38342:630:0;;;;;;;;;;;;;;;;;:::i;2741:79::-;;;:::i;3076:92::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;18745:409;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18745:409:0;;:::i;39363:827::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39363:827:0;;;;;;;;;;;;;;;;;;;;;;:::i;20388:43::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20388:43:0;-1:-1:-1;;;;;20388:43:0;;:::i;37602:379::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37602:379:0;;;;;;;;;;;;;;;;;:::i;35708:65::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35708:65:0;;;;;;;;;;:::i;36177:1066::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36177:1066:0;;;;;;;;;;;;;;;;;:::i;23030:193::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23030:193:0;;;;;;;;;;;;;;;;;3848:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3848:109:0;-1:-1:-1;;;;;3848:109:0;;:::i;41825:940::-;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42120:7;42227:14;42205:120;;;;-1:-1:-1;;;;;42205:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42426:32;;;42404:152;;;;-1:-1:-1;;;;;42404:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42574:9;42569:189;42593:10;42589:1;:14;42569:189;;;42625:121;42663:7;;42671:1;42663:10;;;;;;;;;;;;;-1:-1:-1;;;;;42663:10:0;42692:6;42717:11;;42729:1;42717:14;;;;;;;;;;;;;42625:19;:121::i;:::-;42605:3;;42569:189;;;;20820:1;41825:940;;;;;:::o;16913:53::-;;;;;;;;;;;;;:::o;45669:236::-;-1:-1:-1;;;;;45873:16:0;;;45801:7;45873:16;;;:8;:16;;;;;;;;:24;;;;;;;;;;45669:236;;;;;:::o;44488:966::-;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44800:7;44907:14;44885:116;;;;-1:-1:-1;;;;;44885:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45102:32;;;45080:148;;;;-1:-1:-1;;;;;45080:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45246:9;45241:206;45265:10;45261:1;:14;45241:206;;;45297:138;45331:7;;45339:1;45331:10;;;;;;;;;;;;;-1:-1:-1;;;;;45331:10:0;45360:5;45384:3;45406:11;;45418:1;45406:14;;;;;;;;;;;;;45297:15;:138::i;:::-;45277:3;;45241:206;;;;20820:1;44488:966;;;;;;:::o;40548:898::-;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40831:7;40938:14;40916:111;;;;-1:-1:-1;;;;;40916:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41128:32;;;41106:143;;;;-1:-1:-1;;;;;41106:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41267:9;41262:177;41286:10;41282:1;:14;41262:177;;;41318:109;41347:7;;41355:1;41347:10;;;;;;;;;;;;;-1:-1:-1;;;;;41347:10:0;41376:3;41398:11;;41410:1;41398:14;;;;;;;;;;;;;41318:10;:109::i;:::-;41298:3;;41262:177;;43145:940;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43440:7;43547:14;43525:120;;;;-1:-1:-1;;;;;43525:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43746:32;;;43724:152;;;;-1:-1:-1;;;;;43724:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43894:9;43889:189;43913:10;43909:1;:14;43889:189;;;43945:121;43983:7;;43991:1;43983:10;;;;;;;;;;;;;-1:-1:-1;;;;;43983:10:0;44012:6;44037:11;;44049:1;44037:14;;;;;;;;;;;;;43945:19;:121::i;:::-;43925:3;;43889:189;;21435:642;2953:9;:7;:9::i;:::-;2945:18;;;;;;17367:14;;17363:76;;-1:-1:-1;;;;;21646:23:0;;;;;;:10;:23;;;;;;;;21645:24;21623:135;;;;-1:-1:-1;;;;;21623:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21813:23:0;;;;;;:10;:23;;;;;;;;:30;;-1:-1:-1;;21813:30:0;21839:4;21813:30;;;;;;21901:11;27:10:-1;;23:18;;;45:23;;21901:29:0;;;;;;;;;-1:-1:-1;;21901:29:0;;;;;21990:79;;22048:10;21990:79;;;;;;;;;;;;;;17421:7;;17363:76;17620:19;17701:8;;17666:58;;;;;;;30:3:-1;22:6;14;1:33;17666:58:0;;;45:16:-1;;;;26:21;;;-1:-1;;22:32;6:49;;17666:58:0;;17642:93;;49:4:-1;17642:93:0;;;;17748:24;17775:31;;;:18;:31;;;;;;;17642:93;;-1:-1:-1;17775:31:0;;-1:-1:-1;;;17906:21:0;;17902:244;;-1:-1:-1;17902:244:0;;17944:31;;;;:18;:31;;;;;;;;;17978:15;17944:49;;;;18015:96;;;;;;;;;;;;;;;;;;;;;;18128:7;;;;17902:244;18220:14;;18199:36;;:16;;:36;:20;:36;:::i;:::-;18180:15;:55;;18158:157;;;;-1:-1:-1;;;;;18158:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18399:1;18365:31;;;:18;:31;;;;;;;;:35;;;-1:-1:-1;;;;;21646:23:0;;;;:10;:23;;;;;;;;21645:24;21623:135;;;;-1:-1:-1;;;;;21623:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21813:23:0;;;;;;:10;:23;;;;;;;;:30;;-1:-1:-1;;21813:30:0;21839:4;21813:30;;;;;;21901:11;27:10:-1;;23:18;;;45:23;;21901:29:0;;;;;;;;;-1:-1:-1;;21901:29:0;;;;;21990:79;;22048:10;21990:79;;;;;;;;;;;;;;2974:1;;;21435:642;:::o;20478:28::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20478:28:0;;-1:-1:-1;20478:28:0;:::o;22252:596::-;2953:9;:7;:9::i;:::-;2945:18;;;;;;-1:-1:-1;;;;;22423:23:0;;;;;;:10;:23;;;;;;;;22401:133;;;;-1:-1:-1;;;;;22401:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22598:23:0;;22624:5;22598:23;;;:10;:23;;;;;;;;;:31;;-1:-1:-1;;22598:31:0;;;22656:11;:18;;;;;;;;;;;;;;;;;:31;;22609:11;;22656:18;;:11;:18;;;:11;:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22656:18:0;;;;;;;;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;22642:45;;;;:11;;:45;;;;;;:::i;:::-;-1:-1:-1;22754:86:0;;;22819:10;22754:86;;;;-1:-1:-1;;;;;22754:86:0;;;;;;;;;;;;;22252:596;:::o;3531:140::-;2953:9;:7;:9::i;:::-;2945:18;;;;;;3630:1;3614:6;;3593:40;;-1:-1:-1;;;;;3614:6:0;;;;3593:40;;3630:1;;3593:40;3661:1;3644:19;;-1:-1:-1;;3644:19:0;;;3531:140::o;16814:29::-;;;;:::o;38342:630::-;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38627:16:0;;;;;;;:8;:16;;;;;;;;:24;;;;;;;;;;:37;-1:-1:-1;38627:37:0;38605:140;;;;-1:-1:-1;;;;;38605:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38762:13;;38758:207;;-1:-1:-1;;;;;38914:16:0;;;;;;;:8;:16;;;;;;;;:24;;;;;;;;;;:39;;38943:9;38914:39;:28;:39;:::i;:::-;-1:-1:-1;;;;;38887:16:0;;;;;;;:8;:16;;;;;;;;:24;;;;;;;;;:66;38758:207;38342:630;;;:::o;2741:79::-;2779:7;2806:6;-1:-1:-1;;;;;2806:6:0;2741:79;;:::o;3076:92::-;3116:4;3154:6;-1:-1:-1;;;;;3154:6:0;3140:10;:20;;3076:92::o;18745:409::-;2953:9;:7;:9::i;:::-;2945:18;;;;;;19002:14;;18984:15;:32;18962:139;;;;-1:-1:-1;;;;;18962:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19114:14;:32;18745:409::o;39363:827::-;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39554:13;;39550:633;;-1:-1:-1;;;;;39707:16:0;;;;;;;:8;:16;;;;;;;;:23;;;;;;;;;;:36;-1:-1:-1;39707:36:0;39681:147;;;;-1:-1:-1;;;;;39681:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39966:16:0;;;;;;;:8;:16;;;;;;;;:23;;;;;;;;;;:38;;39994:9;39966:38;:27;:38;:::i;:::-;-1:-1:-1;;;;;39940:16:0;;;;;;;:8;:16;;;;;;;;:23;;;;;;;;;;;:64;;;;40135:21;;;;;;;:36;;40161:9;40135:25;:36::i;:::-;-1:-1:-1;;;;;40111:16:0;;;;;;;:8;:16;;;;;;;;:21;;;;;;;;;:60;39550:633;39363:827;;;;:::o;20388:43::-;;;;;;;;;;;;;;;:::o;37602:379::-;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37776:13;;37772:202;;-1:-1:-1;;;;;37923:16:0;;;;;;;:8;:16;;;;;;;;:24;;;;;;;;;;:39;;37952:9;37923:39;:28;:39;:::i;35708:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;36177:1066::-;20707:10;20696:22;;;;:10;:22;;;;;;;;20674:135;;;;-1:-1:-1;;;;;20674:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36339:13;;36335:901;;36464:94;;;;;;-1:-1:-1;;;;;36464:94:0;;;;;;36538:4;36464:94;;;;;;36433:28;;36464:12;;:22;;:94;;;;;;;;;;;;;;;:12;:94;;;5:2:-1;;;;30:1;27;20:12;5:2;36464:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36464:94:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36464:94:0;36665:111;;;;;;-1:-1:-1;;;;;36665:111:0;;;;;;;;;;;;;;;;;;;;;36464:94;;-1:-1:-1;36665:12:0;;:21;;:111;;;;;-1:-1:-1;;36665:111:0;;;;;;;;:12;:111;;;5:2:-1;;;;30:1;27;20:12;5:2;36665:111:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;36884:94:0;;;;;;-1:-1:-1;;;;;36884:94:0;;;;;;36958:4;36884:94;;;;;;36858:23;;-1:-1:-1;36884:12:0;;-1:-1:-1;36884:22:0;;:94;;;;;;;;;;;;;;;:12;:94;;;5:2:-1;;;;30:1;27;20:12;5:2;36884:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36884:94:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36884:94:0;;-1:-1:-1;37106:35:0;:20;37131:9;37106:35;:24;:35;:::i;:::-;37087:15;:54;37061:163;;;;-1:-1:-1;;;;;37061:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36335:901;;36177:1066;;;:::o;23030:193::-;23114:16;23204:11;23197:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23197:18:0;;;;;;;;;;;;;;;;;;;;;;;23030:193;:::o;3848:109::-;2953:9;:7;:9::i;:::-;2945:18;;;;;;3921:28;3940:8;3921:18;:28::i;1550:150::-;1608:7;1640:5;;;1664:6;;;;1656:15;;;;;;1691:1;1550:150;-1:-1:-1;;;1550:150:0:o;12272:332::-;12369:16;12404:13;12419:9;12432:13;12440:1;12443;12432:7;:13::i;:::-;12403:42;;;;12461:4;12456:141;;12482:8;;;12456:141;12524:19;12548:13;12552:1;12555:5;12548:3;:13::i;:::-;-1:-1:-1;12523:38:0;-1:-1:-1;12576:9:0;;-1:-1:-1;;;12576:9:0;1312:150;1370:7;1403:1;1398;:6;;1390:15;;;;;;-1:-1:-1;1428:5:0;;;1312:150::o;4107:187::-;-1:-1:-1;;;;;4181:22:0;;4173:31;;;;;;4241:6;;;4220:38;;-1:-1:-1;;;;;4220:38:0;;;;4241:6;;;4220:38;;;4269:6;:17;;-1:-1:-1;;4269:17:0;-1:-1:-1;;;;;4269:17:0;;;;;;;;;;4107:187::o;4872:297::-;4986:8;;4943:7;;;;;5005:129;5029:6;5025:1;:10;5005:129;;;5069:1;-1:-1:-1;;;;;5061:9:0;:1;5063;5061:4;;;;;;;;;;;;;;-1:-1:-1;;;;;5061:9:0;;5057:66;;;5099:1;-1:-1:-1;5102:4:0;;-1:-1:-1;5091:16:0;;-1:-1:-1;5091:16:0;5057:66;5037:3;;5005:129;;;-1:-1:-1;5152:1:0;;-1:-1:-1;5152:1:0;;-1:-1:-1;;4872:297:0;;;;;;:::o;11721:487::-;11819:16;11837:7;11862:14;11879:1;:8;11862:25;;11898:29;11953:1;11944:6;:10;11930:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;11930:25:0;-1:-1:-1;11898:57:0;-1:-1:-1;11971:9:0;11966:85;11990:5;11986:1;:9;11966:85;;;12035:1;12037;12035:4;;;;;;;;;;;;;;12017:12;12030:1;12017:15;;;;;;;;-1:-1:-1;;;;;12017:22:0;;;:15;;;;;;;;;;;:22;11997:3;;11966:85;;;-1:-1:-1;12086:1:0;12078:9;;12061:98;12093:6;12089:1;:10;12061:98;;;12143:1;12145;12143:4;;;;;;;;;;;;;;12121:12;12138:1;12134;:5;12121:19;;;;;;;;-1:-1:-1;;;;;12121:26:0;;;:19;;;;;;;;;;;:26;12101:3;;12061:98;;;;12177:12;12191:1;12193:5;12191:8;;;;;;;;;;;;;;12169:31;;;;;;11721:487;;;;;:::o;34904:11004::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34904:11004:0;-1:-1:-1;;;;;34904:11004:0;;;;;;;;;;;-1:-1:-1;34904:11004:0;;;;;;;-1:-1:-1;34904:11004:0;;;-1:-1:-1;34904:11004:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;34904:11004:0;;;;;;
Swarm Source
bzzr://f480fd92e3c5500732696bb72ac4c783538dc9cf7a7880b833efd8beea04f817
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value ETH 78.85% $3,393.97 572.3377 $1,942,496.82 ETH 11.90% $93,808 3.1251 $293,162.76 ETH 4.85% $23.9 4,994.1521 $119,360.24 ETH 1.91% $18.01 2,607.2547 $46,956.66 ETH 1.13% $83.24 333.045 $27,722.66 ETH 0.79% $0.024433 793,851.7827 $19,396.04 ETH 0.39% $0.024092 402,595.879 $9,699.36 ETH 0.12% $1 3,031.405 $3,031.4 ETH 0.06% $0.99952 1,449.4539 $1,448.76 ETH <0.01% $9.39 20 $187.8 ETH <0.01% $0.468222 47.7608 $22.36 ETH <0.01% $0.208687 76.9556 $16.06 ETH <0.01% $0.036763 386.1529 $14.2 ETH <0.01% $2.13 5.16 $10.99 ETH <0.01% $0.554957 13.1803 $7.31 ETH <0.01% $0.482642 8.6 $4.15 ETH <0.01% $0.05966 32.5462 $1.94 ETH <0.01% $1.02 1.59 $1.62 ETH <0.01% $0.000039 25,000 $0.9732 ETH <0.01% $0.494213 1.93 $0.9538 ETH <0.01% $1.51 0.442 $0.6674 ETH <0.01% $0.479461 1.092 $0.5235 ETH <0.01% $0.004735 94.1088 $0.4455 ETH <0.01% $0.002443 41.2899 $0.1008 ETH <0.01% $0.043729 2.2957 $0.1003 Loading...Loading[ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
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), ABIEncoderV2CalldataStructsWithStaticallySizedAndDynamicallyEncodedMembers (low-severity), SignedArrayStorageCopy (low/medium-severity), ABIEncoderV2StorageArrayWithMultiSlotElement (low-severity), DynamicConstructorArgumentsClippedABIV2 (very low-severity), UninitializedFunctionPointerInConstructor (very low-severity), IncorrectEventSignatureInLibraries (very low-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.