Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,154 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Tokens For ... | 12950708 | 1075 days ago | IN | 0 ETH | 0.011368 | ||||
Swap ETH For Tok... | 12802094 | 1099 days ago | IN | 0.10036927 ETH | 0.00323303 | ||||
Swap ETH For All... | 12661336 | 1120 days ago | IN | 0.39942448 ETH | 0.01409726 | ||||
Swap ETH For All... | 12654738 | 1121 days ago | IN | 0.46526295 ETH | 0.01580953 | ||||
Swap ETH For All... | 12649921 | 1122 days ago | IN | 1.48550807 ETH | 0.0143723 | ||||
Swap ETH For All... | 12648264 | 1122 days ago | IN | 0.24932979 ETH | 0.01653303 | ||||
Swap ETH For Tok... | 12647877 | 1123 days ago | IN | 0.33973846 ETH | 0.00404434 | ||||
Swap ETH For Tok... | 12647855 | 1123 days ago | IN | 0.92378016 ETH | 0.00368231 | ||||
Swap ETH For Tok... | 12647853 | 1123 days ago | IN | 0.92378016 ETH | 0.00399011 | ||||
Swap ETH For All... | 12645812 | 1123 days ago | IN | 1.65242225 ETH | 0.02463007 | ||||
Swap Tokens For ... | 12645738 | 1123 days ago | IN | 0 ETH | 0.00372126 | ||||
Swap ETH For All... | 12642806 | 1123 days ago | IN | 1.00064914 ETH | 0.02021952 | ||||
Swap ETH For All... | 12642806 | 1123 days ago | IN | 1.00077346 ETH | 0.02055238 | ||||
Swap Tokens For ... | 12642426 | 1123 days ago | IN | 0 ETH | 0.00290732 | ||||
Swap ETH For All... | 12642043 | 1123 days ago | IN | 1.21132283 ETH | 0.01649481 | ||||
Swap Tokens For ... | 12627579 | 1126 days ago | IN | 0 ETH | 0.02201726 | ||||
Swap Tokens For ... | 12627206 | 1126 days ago | IN | 0 ETH | 0.01354908 | ||||
Swap Tokens For ... | 12621757 | 1127 days ago | IN | 0 ETH | 0.01354908 | ||||
Swap Tokens For ... | 12618065 | 1127 days ago | IN | 0 ETH | 0.01354908 | ||||
Swap Tokens For ... | 12616120 | 1127 days ago | IN | 0 ETH | 0.01354908 | ||||
Swap Tokens For ... | 12613616 | 1128 days ago | IN | 0 ETH | 0.01704052 | ||||
Swap Tokens For ... | 12611448 | 1128 days ago | IN | 0 ETH | 0.01363241 | ||||
Swap Exact ETH F... | 12609010 | 1129 days ago | IN | 39 ETH | 0.00571182 | ||||
Swap Exact ETH F... | 12608199 | 1129 days ago | IN | 2.48 ETH | 0.0042505 | ||||
Swap Tokens For ... | 12608068 | 1129 days ago | IN | 0 ETH | 0.01665043 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12802094 | 1099 days ago | 0.00196802 ETH | ||||
12802094 | 1099 days ago | 0.09840124 ETH | ||||
12661336 | 1120 days ago | 0.00764012 ETH | ||||
12661336 | 1120 days ago | 0.00764012 ETH | ||||
12661336 | 1120 days ago | 0.39942448 ETH | ||||
12654738 | 1121 days ago | 0.0091868 ETH | ||||
12654738 | 1121 days ago | 0.0091868 ETH | ||||
12654738 | 1121 days ago | 0.46526295 ETH | ||||
12649921 | 1122 days ago | 0.0288796 ETH | ||||
12649921 | 1122 days ago | 0.0288796 ETH | ||||
12649921 | 1122 days ago | 1.48550807 ETH | ||||
12648264 | 1122 days ago | 0.00493484 ETH | ||||
12648264 | 1122 days ago | 0.00493484 ETH | ||||
12648264 | 1122 days ago | 0.24932979 ETH | ||||
12647877 | 1123 days ago | 0.00666153 ETH | ||||
12647877 | 1123 days ago | 0.33307692 ETH | ||||
12647855 | 1123 days ago | 0.01155234 ETH | ||||
12647855 | 1123 days ago | 0.91222781 ETH | ||||
12647853 | 1123 days ago | 0.01488638 ETH | ||||
12647853 | 1123 days ago | 0.90889377 ETH | ||||
12645812 | 1123 days ago | 0.03263733 ETH | ||||
12645812 | 1123 days ago | 0.03263733 ETH | ||||
12645812 | 1123 days ago | 1.65242225 ETH | ||||
12642806 | 1123 days ago | 0.01591847 ETH | ||||
12642806 | 1123 days ago | 0.01591847 ETH |
Loading...
Loading
Contract Name:
IndexedUniswapRouterMinter
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; pragma experimental ABIEncoderV2; import "@uniswap/lib/contracts/libraries/TransferHelper.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IERC20.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IWETH.sol"; import "@indexed-finance/indexed-core/contracts/interfaces/IIndexPool.sol"; import "./libraries/UniswapV2Library.sol"; import "./BMath.sol"; contract IndexedUniswapRouterMinter is BMath { address public immutable factory; address public immutable weth; constructor(address factory_, address weth_) public { factory = factory_; weth = weth_; } receive() external payable { require(msg.sender == weth, "IndexedUniswapRouterMinter: RECEIVED_ETHER"); } // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, address[] memory path) internal { for (uint i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, address token1) = UniswapV2Library.sortTokens(input, output); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : address(this); IUniswapV2Pair(UniswapV2Library.calculatePair(factory, token0, token1)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function _mintTokenAmountIn( address tokenIn, uint amountIn, address indexPool, uint minPoolAmountOut ) internal returns (uint poolAmountOut) { TransferHelper.safeApprove(tokenIn, indexPool, amountIn); poolAmountOut = IIndexPool(indexPool).joinswapExternAmountIn( tokenIn, amountIn, minPoolAmountOut ); TransferHelper.safeTransfer(indexPool, msg.sender, poolAmountOut); } function _mintPoolAmountOut( address tokenIn, uint amountIn, address indexPool, uint poolAmountOut ) internal { TransferHelper.safeApprove(tokenIn, indexPool, amountIn); IIndexPool(indexPool).joinswapPoolAmountOut( tokenIn, poolAmountOut, amountIn ); TransferHelper.safeTransfer(indexPool, msg.sender, poolAmountOut); } function _tokenInGivenPoolOut( address indexPool, address tokenIn, uint256 poolAmountOut ) internal view returns (uint256 amountIn) { IIndexPool.Record memory record = IIndexPool(indexPool).getTokenRecord(tokenIn); if (!record.ready) { uint256 minimumBalance = IIndexPool(indexPool).getMinimumBalance(tokenIn); uint256 realToMinRatio = bdiv( bsub(minimumBalance, record.balance), minimumBalance ); uint256 weightPremium = bmul(MIN_WEIGHT / 10, realToMinRatio); record.balance = minimumBalance; record.denorm = uint96(badd(MIN_WEIGHT, weightPremium)); } uint256 totalSupply = IERC20(indexPool).totalSupply(); uint256 totalWeight = IIndexPool(indexPool).getTotalDenormalizedWeight(); uint256 swapFee = IIndexPool(indexPool).getSwapFee(); return calcSingleInGivenPoolOut( record.balance, record.denorm, totalSupply, totalWeight, poolAmountOut, swapFee ); } /** * @dev Swaps ether for each token in `path` using their Uniswap pairs, * then mints at least `minPoolAmountOut` pool tokens from `indexPool`. * * @param path Array of tokens to swap using the Uniswap router. * @param indexPool Address of the index pool to mint tokens from. * @param minPoolAmountOut Amount of pool tokens that must be received to not revert. */ function swapExactETHForTokensAndMint( address[] calldata path, address indexPool, uint minPoolAmountOut ) external payable returns (uint poolAmountOut) { require(path[0] == weth, 'IndexedUniswapRouterMinter: INVALID_PATH'); uint[] memory amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path); IWETH(weth).deposit{value: amounts[0]}(); require( IWETH(weth).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]), "IndexedUniswapRouterMinter: WETH_TRANSFER_FAIL" ); _swap(amounts, path); uint amountOut = amounts[amounts.length - 1]; return _mintTokenAmountIn( path[path.length - 1], amountOut, indexPool, minPoolAmountOut ); } /** * @dev Swaps a token for each other token in `path` using their Uniswap pairs, * then mints at least `minPoolAmountOut` pool tokens from `indexPool`. * * @param amountIn Amount of the first token in `path` to swap. * @param path Array of tokens to swap using the Uniswap router. * @param indexPool Address of the index pool to mint tokens from. * @param minPoolAmountOut Amount of pool tokens that must be received to not revert. */ function swapExactTokensForTokensAndMint( uint amountIn, address[] calldata path, address indexPool, uint minPoolAmountOut ) external returns (uint poolAmountOut) { uint[] memory amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path); uint amountOut = amounts[amounts.length - 1]; return _mintTokenAmountIn( path[path.length - 1], amountOut, indexPool, minPoolAmountOut ); } /** * @dev Swaps ether for each token in `path` through Uniswap, * then mints `poolAmountOut` pool tokens from `indexPool`. * * @param path Array of tokens to swap using the Uniswap router. * @param indexPool Address of the index pool to mint tokens from. * @param poolAmountOut Amount of pool tokens that must be received to not revert. */ function swapETHForTokensAndMintExact( address[] calldata path, address indexPool, uint poolAmountOut ) external payable { address swapTokenOut = path[path.length - 1]; uint amountOut = _tokenInGivenPoolOut(indexPool, swapTokenOut, poolAmountOut); require(path[0] == weth, 'IndexedUniswapRouterMinter: INVALID_PATH'); uint[] memory amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= msg.value, 'IndexedUniswapRouterMinter: EXCESSIVE_INPUT_AMOUNT'); IWETH(weth).deposit{value: amounts[0]}(); require( IWETH(weth).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]), "IndexedUniswapRouterMinter: WETH_TRANSFER_FAIL" ); _swap(amounts, path); // refund dust eth, if any if (msg.value > amounts[0]) { TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } return _mintPoolAmountOut( swapTokenOut, amountOut, indexPool, poolAmountOut ); } /** * @dev Swaps a token for each other token in `path` through Uniswap, * then mints at least `poolAmountOut` pool tokens from `indexPool`. * * @param amountInMax Maximum amount of the first token in `path` to give. * @param path Array of tokens to swap using the Uniswap router. * @param indexPool Address of the index pool to mint tokens from. * @param poolAmountOut Amount of pool tokens that must be received to not revert. */ function swapTokensForTokensAndMintExact( uint amountInMax, address[] calldata path, address indexPool, uint poolAmountOut ) external { address swapTokenOut = path[path.length - 1]; uint amountOut = _tokenInGivenPoolOut(indexPool, swapTokenOut, poolAmountOut); uint[] memory amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, 'IndexedUniswapRouterMinter: EXCESSIVE_INPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path); _mintPoolAmountOut( swapTokenOut, amountOut, indexPool, poolAmountOut ); } function _getSwapAmountsForJoin( address indexPool, address intermediate, address poolToken, address[] memory path, uint256 poolRatio ) internal view returns (uint[] memory amounts) { if (intermediate == address(0)) { // If no intermediate token is given, set path length to 2 so the other // functions will not use the 3rd address. assembly { mstore(path, 2) } path[1] = poolToken; } else { // If an intermediary is given, set path length to 3 so the other // functions will use all addresses. assembly { mstore(path, 3) } path[1] = intermediate; path[2] = poolToken; } uint256 usedBalance = IIndexPool(indexPool).getUsedBalance(poolToken); uint256 amountToPool = bmul(poolRatio, usedBalance); amounts = UniswapV2Library.getAmountsIn(factory, amountToPool, path); } /** * @dev Swaps an input token for every underlying token in an index pool, * then mints `poolAmountOut` pool tokens from the pool. * * Up to one intermediary token may be provided in `intermediaries` for each * underlying token in the index pool. * * If a null address is provided as an intermediary, the input token will be * swapped directly for the output token. */ function swapTokensForAllTokensAndMintExact( address tokenIn, uint256 amountInMax, address[] calldata intermediaries, address indexPool, uint256 poolAmountOut ) external returns (uint256 amountInTotal) { address[] memory tokens = IIndexPool(indexPool).getCurrentTokens(); require( tokens.length == intermediaries.length, "IndexedUniswapRouterMinter: BAD_ARRAY_LENGTH" ); uint256[] memory amountsToPool = new uint256[](tokens.length); uint256 ratio = bdiv(poolAmountOut, IERC20(indexPool).totalSupply()); // Reserve 3 slots in memory for the addresses address[] memory path = new address[](3); path[0] = tokenIn; for (uint256 i = 0; i < tokens.length; i++) { uint[] memory amounts = _getSwapAmountsForJoin( indexPool, intermediaries[i], tokens[i], path, ratio ); amountInMax = SafeMath.sub(amountInMax, amounts[0], "IndexedUniswapRouterMinter: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path); uint amountToPool = amounts[amounts.length - 1]; amountsToPool[i] = amountToPool; amountInTotal = SafeMath.add(amountInTotal, amounts[0]); TransferHelper.safeApprove(tokens[i], indexPool, amountToPool); } IIndexPool(indexPool).joinPool(poolAmountOut, amountsToPool); TransferHelper.safeTransfer(indexPool, msg.sender, poolAmountOut); } /** * @dev Swaps ether for every underlying token in an index pool, * then mints `poolAmountOut` pool tokens from the pool. * * Up to one intermediary token may be provided in `intermediaries` for each * underlying token in the index pool. * * If a null address is provided as an intermediary, the input token will be * swapped directly for the output token. */ function swapETHForAllTokensAndMintExact( address indexPool, address[] calldata intermediaries, uint256 poolAmountOut ) external payable returns (uint amountInTotal) { uint256 amountInMax = msg.value; IWETH(weth).deposit{value: msg.value}(); address[] memory tokens = IIndexPool(indexPool).getCurrentTokens(); require( tokens.length == intermediaries.length, "IndexedUniswapRouterMinter: BAD_ARRAY_LENGTH" ); uint256[] memory amountsToPool = new uint256[](tokens.length); uint256 ratio = bdiv(poolAmountOut, IERC20(indexPool).totalSupply()); // Reserve 3 slots in memory for the addresses address[] memory path = new address[](3); path[0] = weth; for (uint256 i = 0; i < tokens.length; i++) { uint[] memory amounts = _getSwapAmountsForJoin( indexPool, intermediaries[i], tokens[i], path, ratio ); amountInMax = SafeMath.sub(amountInMax, amounts[0], "IndexedUniswapRouterMinter: EXCESSIVE_INPUT_AMOUNT"); require( IWETH(weth).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]), "IndexedUniswapRouterMinter: WETH_TRANSFER_FAIL" ); _swap(amounts, path); uint amountToPool = amounts[amounts.length - 1]; amountsToPool[i] = amountToPool; amountInTotal = SafeMath.add(amountInTotal, amounts[0]); TransferHelper.safeApprove(tokens[i], indexPool, amountToPool); } IIndexPool(indexPool).joinPool(poolAmountOut, amountsToPool); TransferHelper.safeTransfer(indexPool, msg.sender, poolAmountOut); if (msg.value > amountInTotal) { uint256 remainder = msg.value - amountInTotal; IWETH(weth).withdraw(remainder); TransferHelper.safeTransferETH(msg.sender, remainder); } } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.0; import "./BNum.sol"; contract BMath is BNum { function calcSingleInGivenPoolOut( uint256 tokenBalanceIn, uint256 tokenWeightIn, uint256 poolSupply, uint256 totalWeight, uint256 poolAmountOut, uint256 swapFee ) internal pure returns (uint256 tokenAmountIn) { uint256 normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint256 newPoolSupply = badd(poolSupply, poolAmountOut); uint256 poolRatio = bdiv(newPoolSupply, poolSupply); //uint newBalTi = poolRatio^(1/weightTi) * balTi; uint256 boo = bdiv(BONE, normalizedWeight); uint256 tokenInRatio = bpow(poolRatio, boo); uint256 newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn); uint256 tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn); // Do reverse order of fees charged in joinswap_ExternAmountIn, this way // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ``` //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ; uint256 zar = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar)); return tokenAmountIn; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.0; contract BNum { uint256 internal constant BONE = 1e18; uint256 internal constant MIN_BPOW_BASE = 1 wei; uint256 internal constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint256 internal constant BPOW_PRECISION = BONE / 10**10; uint256 internal constant MIN_WEIGHT = BONE / 4; function btoi(uint256 a) internal pure returns (uint256) { return a / BONE; } function bfloor(uint256 a) internal pure returns (uint256) { return btoi(a) * BONE; } function badd(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } function bsub(uint256 a, uint256 b) internal pure returns (uint256) { (uint256 c, bool flag) = bsubSign(a, b); require(!flag, "ERR_SUB_UNDERFLOW"); return c; } function bsubSign(uint256 a, uint256 b) internal pure returns (uint256, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } function bmul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c0 = a * b; require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW"); uint256 c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint256 c2 = c1 / BONE; return c2; } function bdiv(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "ERR_DIV_ZERO"); uint256 c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint256 c1 = c0 + (b / 2); require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require uint256 c2 = c1 / b; return c2; } // DSMath.wpow function bpowi(uint256 a, uint256 n) internal pure returns (uint256) { uint256 z = n % 2 != 0 ? a : BONE; for (n /= 2; n != 0; n /= 2) { a = bmul(a, a); if (n % 2 != 0) { z = bmul(z, a); } } return z; } // Compute b^(e.w) by splitting it into (b^e)*(b^0.w). // Use `bpowi` for `b^e` and `bpowK` for k iterations // of approximation of b^0.w function bpow(uint256 base, uint256 exp) internal pure returns (uint256) { require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW"); require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH"); uint256 whole = bfloor(exp); uint256 remain = bsub(exp, whole); uint256 wholePow = bpowi(base, btoi(whole)); if (remain == 0) { return wholePow; } uint256 partialResult = bpowApprox(base, remain, BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox( uint256 base, uint256 exp, uint256 precision ) internal pure returns (uint256) { // term 0: uint256 a = exp; (uint256 x, bool xneg) = bsubSign(base, BONE); uint256 term = BONE; uint256 sum = term; bool negative = false; // term(k) = numer / denom // = (product(a - i - 1, i=1-->k) * x^k) / (k!) // each iteration, multiply previous term by (a-(k-1)) * x / k // continue until term is less than precision for (uint256 i = 1; term >= precision; i++) { uint256 bigK = i * BONE; (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, BONE)); term = bmul(term, bmul(c, x)); term = bdiv(term, bigK); if (term == 0) break; if (xneg) negative = !negative; if (cneg) negative = !negative; if (negative) { sum = bsub(sum, term); } else { sum = badd(sum, term); } } return sum; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
pragma solidity >=0.5.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); }
pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface IIndexPool { /** * @dev Token record data structure * @param bound is token bound to pool * @param ready has token been initialized * @param lastDenormUpdate timestamp of last denorm change * @param denorm denormalized weight * @param desiredDenorm desired denormalized weight (used for incremental changes) * @param index index of address in tokens array * @param balance token balance */ struct Record { bool bound; bool ready; uint40 lastDenormUpdate; uint96 denorm; uint96 desiredDenorm; uint8 index; uint256 balance; } event LOG_SWAP( address indexed caller, address indexed tokenIn, address indexed tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut ); event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event LOG_DENORM_UPDATED(address indexed token, uint256 newDenorm); event LOG_DESIRED_DENORM_SET(address indexed token, uint256 desiredDenorm); event LOG_TOKEN_REMOVED(address token); event LOG_TOKEN_ADDED( address indexed token, uint256 desiredDenorm, uint256 minimumBalance ); event LOG_MINIMUM_BALANCE_UPDATED(address token, uint256 minimumBalance); event LOG_TOKEN_READY(address indexed token); event LOG_PUBLIC_SWAP_ENABLED(); event LOG_MAX_TOKENS_UPDATED(uint256 maxPoolTokens); event LOG_SWAP_FEE_UPDATED(uint256 swapFee); function configure( address controller, string calldata name, string calldata symbol ) external; function initialize( address[] calldata tokens, uint256[] calldata balances, uint96[] calldata denorms, address tokenProvider, address unbindHandler ) external; function setMaxPoolTokens(uint256 maxPoolTokens) external; function setSwapFee(uint256 swapFee) external; function reweighTokens( address[] calldata tokens, uint96[] calldata desiredDenorms ) external; function reindexTokens( address[] calldata tokens, uint96[] calldata desiredDenorms, uint256[] calldata minimumBalances ) external; function setMinimumBalance(address token, uint256 minimumBalance) external; function joinPool(uint256 poolAmountOut, uint256[] calldata maxAmountsIn) external; function joinswapExternAmountIn( address tokenIn, uint256 tokenAmountIn, uint256 minPoolAmountOut ) external returns (uint256/* poolAmountOut */); function joinswapPoolAmountOut( address tokenIn, uint256 poolAmountOut, uint256 maxAmountIn ) external returns (uint256/* tokenAmountIn */); function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut) external; function exitswapPoolAmountIn( address tokenOut, uint256 poolAmountIn, uint256 minAmountOut ) external returns (uint256/* tokenAmountOut */); function exitswapExternAmountOut( address tokenOut, uint256 tokenAmountOut, uint256 maxPoolAmountIn ) external returns (uint256/* poolAmountIn */); function gulp(address token) external; function flashBorrow( address recipient, address token, uint256 amount, bytes calldata data ) external; function swapExactAmountIn( address tokenIn, uint256 tokenAmountIn, address tokenOut, uint256 minAmountOut, uint256 maxPrice ) external returns (uint256/* tokenAmountOut */, uint256/* spotPriceAfter */); function swapExactAmountOut( address tokenIn, uint256 maxAmountIn, address tokenOut, uint256 tokenAmountOut, uint256 maxPrice ) external returns (uint256 /* tokenAmountIn */, uint256 /* spotPriceAfter */); function isPublicSwap() external view returns (bool); function getSwapFee() external view returns (uint256/* swapFee */); function getController() external view returns (address); function getMaxPoolTokens() external view returns (uint256); function isBound(address t) external view returns (bool); function getNumTokens() external view returns (uint256); function getCurrentTokens() external view returns (address[] memory tokens); function getCurrentDesiredTokens() external view returns (address[] memory tokens); function getDenormalizedWeight(address token) external view returns (uint256/* denorm */); function getTokenRecord(address token) external view returns (Record memory record); function extrapolatePoolValueFromToken() external view returns (address/* token */, uint256/* extrapolatedValue */); function getTotalDenormalizedWeight() external view returns (uint256); function getBalance(address token) external view returns (uint256); function getMinimumBalance(address token) external view returns (uint256); function getUsedBalance(address token) external view returns (uint256); function getSpotPrice(address tokenIn, address tokenOut) external view returns (uint256); }
pragma solidity >=0.5.0; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; library UniswapV2Library { using SafeMath for uint256; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "UniswapV2Library: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "UniswapV2Library: ZERO_ADDRESS"); } function calculatePair( address factory, address token0, address token1 ) internal pure returns (address pair) { pair = address( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" // init code hash ) ) ) ); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = calculatePair(factory, token0, token1); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "UniswapV2Library: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY" ); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } }
pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(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-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
{ "metadata": { "useLiteralContent": false }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"factory_","type":"address"},{"internalType":"address","name":"weth_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"indexPool","type":"address"},{"internalType":"address[]","name":"intermediaries","type":"address[]"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"name":"swapETHForAllTokensAndMintExact","outputs":[{"internalType":"uint256","name":"amountInTotal","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"indexPool","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"name":"swapETHForTokensAndMintExact","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"indexPool","type":"address"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"swapExactETHForTokensAndMint","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"indexPool","type":"address"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"swapExactTokensForTokensAndMint","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"intermediaries","type":"address[]"},{"internalType":"address","name":"indexPool","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"name":"swapTokensForAllTokensAndMintExact","outputs":[{"internalType":"uint256","name":"amountInTotal","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"indexPool","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"name":"swapTokensForTokensAndMintExact","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620036d5380380620036d5833981016040819052620000349162000053565b6001600160601b0319606092831b8116608052911b1660a052620000aa565b6000806040838503121562000066578182fd5b8251620000738162000091565b6020840151909250620000868162000091565b809150509250929050565b6001600160a01b0381168114620000a757600080fd5b50565b60805160601c60a05160601c61358a6200014b60003980608f52806101fc5280610304528061038c52806105575280610883528061095752806109df5280610f4f5280611109528061118a52806113a752508061027352806103be52806105b85280610672528061073652806107bc52806108fa5280610a115280610dd45280610f2552806111bc528061190352806119395280611f35525061358a6000f3fe60806040526004361061007f5760003560e01c806384be7c151161004e57806384be7c1514610167578063acb5a8021461017a578063c45a01551461019a578063cd4e2c51146101af576100d7565b80633f7f09ea146100dc5780633fc8cef3146100ef578063506dc1921461011a578063588aa3b71461013a576100d7565b366100d757336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100d55760405162461bcd60e51b81526004016100cc90612e0f565b60405180910390fd5b005b600080fd5b6100d56100ea366004612a31565b6101c2565b3480156100fb57600080fd5b50610104610555565b6040516101119190612d8a565b60405180910390f35b34801561012657600080fd5b506100d5610135366004612c60565b610579565b34801561014657600080fd5b5061015a610155366004612c60565b61072d565b6040516101119190613402565b61015a610175366004612a31565b61087f565b34801561018657600080fd5b5061015a6101953660046129b7565b610b7a565b3480156101a657600080fd5b50610104610f23565b61015a6101bd36600461295d565b610f47565b6000848460001981018181106101d457fe5b90506020020160208101906101e99190612941565b905060006101f8848385611427565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061023157fe5b90506020020160208101906102469190612941565b6001600160a01b03161461026c5760405162461bcd60e51b81526004016100cc906130c1565b60606102cc7f00000000000000000000000000000000000000000000000000000000000000008389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061171292505050565b905034816000815181106102dc57fe5b602002602001015111156103025760405162461bcd60e51b81526004016100cc906131bc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08260008151811061033e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561037157600080fd5b505af1158015610385573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6104267f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106103ea57fe5b90506020020160208101906103ff9190612941565b8b8b600181811061040c57fe5b90506020020160208101906104219190612941565b61182a565b8360008151811061043357fe5b60200260200101516040518363ffffffff1660e01b8152600401610458929190612dc2565b602060405180830381600087803b15801561047257600080fd5b505af1158015610486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104aa9190612b37565b6104c65760405162461bcd60e51b81526004016100cc90612edc565b6105038188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b8060008151811061051057fe5b602002602001015134111561053f5761053f338260008151811061053057fe5b60200260200101513403611a07565b61054b83838787611a94565b5050505b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008484600019810181811061058b57fe5b90506020020160208101906105a09190612941565b905060006105af848385611427565b905060606106117f00000000000000000000000000000000000000000000000000000000000000008389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061171292505050565b9050878160008151811061062157fe5b602002602001015111156106475760405162461bcd60e51b81526004016100cc906131bc565b6106da8787600081811061065757fe5b905060200201602081019061066c9190612941565b336106c07f00000000000000000000000000000000000000000000000000000000000000008b8b600081811061069e57fe5b90506020020160208101906106b39190612941565b8c8c600181811061040c57fe5b846000815181106106cd57fe5b6020026020010151611b2d565b6107178188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b61072383838787611a94565b5050505050505050565b6000606061078f7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c1e92505050565b90506107e8868660008181106107a157fe5b90506020020160208101906107b69190612941565b336106c07f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106103ea57fe5b6108258187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b60008160018351038151811061083757fe5b60200260200101519050610873878760018a8a90500381811061085657fe5b905060200201602081019061086b9190612941565b828787611d20565b98975050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106108b857fe5b90506020020160208101906108cd9190612941565b6001600160a01b0316146108f35760405162461bcd60e51b81526004016100cc906130c1565b60606109537f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c1e92505050565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08260008151811061099157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109c457600080fd5b505af11580156109d8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb610a5f7f000000000000000000000000000000000000000000000000000000000000000089896000818110610a3d57fe5b9050602002016020810190610a529190612941565b8a8a600181811061040c57fe5b83600081518110610a6c57fe5b60200260200101516040518363ffffffff1660e01b8152600401610a91929190612dc2565b602060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae39190612b37565b610aff5760405162461bcd60e51b81526004016100cc90612edc565b610b3c8187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b600081600183510381518110610b4e57fe5b60200260200101519050610b6d878760018a8a90500381811061085657fe5b925050505b949350505050565b60006060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf39190810190612a8c565b80519091508514610c165760405162461bcd60e51b81526004016100cc90612fcf565b6060815167ffffffffffffffff81118015610c3057600080fd5b50604051908082528060200260200182016040528015610c5a578160200160208202803683370190505b5090506000610cd985876001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9c57600080fd5b505afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd49190612c48565b611dbc565b60408051600380825260808201909252919250606091906020820183803683370190505090508a81600081518110610d0d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015610ea9576060610d7b898c8c85818110610d4b57fe5b9050602002016020810190610d609190612941565b888581518110610d6c57fe5b60200260200101518688611e5d565b9050610db48c82600081518110610d8e57fe5b602002602001015160405180606001604052806032815260200161352360329139611f5b565b9b50610e2283600081518110610dc657fe5b6020026020010151336106c07f000000000000000000000000000000000000000000000000000000000000000087600081518110610e0057fe5b602002602001015188600181518110610e1557fe5b602002602001015161182a565b610e2c8184611852565b600081600183510381518110610e3e57fe5b6020026020010151905080868481518110610e5557fe5b602002602001018181525050610e7f8883600081518110610e7257fe5b6020026020010151611f87565b9750610e9f878481518110610e9057fe5b60200260200101518b83611fb3565b5050600101610d30565b506040516313da703560e21b81526001600160a01b03881690634f69c0d490610ed8908990879060040161340b565b600060405180830381600087803b158015610ef257600080fd5b505af1158015610f06573d6000803e3d6000fd5b50505050610f158733886120a1565b505050509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000803490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610fa857600080fd5b505af1158015610fbc573d6000803e3d6000fd5b50505050506060866001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610ffc57600080fd5b505afa158015611010573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110389190810190612a8c565b8051909150851461105b5760405162461bcd60e51b81526004016100cc90612fcf565b6060815167ffffffffffffffff8111801561107557600080fd5b5060405190808252806020026020018201604052801561109f578160200160208202803683370190505b50905060006110e1868a6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9c57600080fd5b60408051600380825260808201909252919250606091906020820183803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156113175760606111738c8c8c85818110610d4b57fe5b90506111868782600081518110610d8e57fe5b96507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6111fd7f0000000000000000000000000000000000000000000000000000000000000000866000815181106111e857fe5b602002602001015187600181518110610e1557fe5b8360008151811061120a57fe5b60200260200101516040518363ffffffff1660e01b815260040161122f929190612dc2565b602060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190612b37565b61129d5760405162461bcd60e51b81526004016100cc90612edc565b6112a78184611852565b6000816001835103815181106112b957fe5b60200260200101519050808684815181106112d057fe5b6020026020010181815250506112ed8983600081518110610e7257fe5b985061130d8784815181106112fe57fe5b60200260200101518e83611fb3565b5050600101611158565b506040516313da703560e21b81526001600160a01b038b1690634f69c0d490611346908a90879060040161340b565b600060405180830381600087803b15801561136057600080fd5b505af1158015611374573d6000803e3d6000fd5b505050506113838a33896120a1565b8534111561141a57604051632e1a7d4d60e01b815234879003906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906113dc908490600401613402565b600060405180830381600087803b1580156113f657600080fd5b505af115801561140a573d6000803e3d6000fd5b505050506114183382611a07565b505b5050505050949350505050565b60006114316128a1565b6040516364c7d66160e01b81526001600160a01b038616906364c7d6619061145d908790600401612d8a565b60e06040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190612b53565b90508060200151611594576040516391bfa2bf60e01b81526000906001600160a01b038716906391bfa2bf906114e7908890600401612d8a565b60206040518083038186803b1580156114ff57600080fd5b505afa158015611513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190612c48565b9050600061155261154c838560c00151612188565b83611dbc565b905060006115676658d15e17628000836121b9565b60c0850184905290506115826703782dace9d900008261222b565b6001600160601b031660608501525050505b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115cf57600080fd5b505afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612c48565b90506000866001600160a01b031663936c34776040518163ffffffff1660e01b815260040160206040518083038186803b15801561164457600080fd5b505afa158015611658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167c9190612c48565b90506000876001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f19190612c48565b90506108738460c0015185606001516001600160601b031685858a86612250565b60606002825110156117365760405162461bcd60e51b81526004016100cc90613060565b815167ffffffffffffffff8111801561174e57600080fd5b50604051908082528060200260200182016040528015611778578160200160208202803683370190505b509050828160018351038151811061178c57fe5b60209081029190910101528151600019015b8015611822576000806117db878660018603815181106117ba57fe5b60200260200101518786815181106117ce57fe5b6020026020010151612303565b915091506117fd8484815181106117ee57fe5b602002602001015183836123dc565b84600185038151811061180c57fe5b602090810291909101015250506000190161179e565b509392505050565b6000806000611839858561246c565b915091506118488683836124f6565b9695505050505050565b60005b6001825103811015611a025760008083838151811061187057fe5b602002602001015184846001018151811061188757fe5b6020026020010151915091506000806118a0848461246c565b9150915060008786600101815181106118b557fe5b60200260200101519050600080846001600160a01b0316876001600160a01b0316146118e3578260006118e7565b6000835b91509150600060028a510389106118fe5730611932565b6119327f0000000000000000000000000000000000000000000000000000000000000000888c8c60020181518110610e1557fe5b905061195f7f000000000000000000000000000000000000000000000000000000000000000087876124f6565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561199c576020820181803683370190505b506040518563ffffffff1660e01b81526004016119bc9493929190613458565b600060405180830381600087803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b50506001909a01995061185598505050505050505050565b505050565b604080516000808252602082019092526001600160a01b038416908390604051611a319190612d18565b60006040518083038185875af1925050503d8060008114611a6e576040519150601f19603f3d011682016040523d82523d6000602084013e611a73565b606091505b5050905080611a025760405162461bcd60e51b81526004016100cc90612f7b565b611a9f848385611fb3565b60405163036836fd60e51b81526001600160a01b03831690636d06dfa090611acf90879085908890600401612ddb565b602060405180830381600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b219190612c48565b5061054f8233836120a1565b60006060856001600160a01b03166323b872dd868686604051602401611b5593929190612d9e565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611b8e9190612d18565b6000604051808303816000865af19150503d8060008114611bcb576040519150601f19603f3d011682016040523d82523d6000602084013e611bd0565b606091505b5091509150818015611bfa575080511580611bfa575080806020019051810190611bfa9190612b37565b611c165760405162461bcd60e51b81526004016100cc90612f2a565b505050505050565b6060600282511015611c425760405162461bcd60e51b81526004016100cc90613060565b815167ffffffffffffffff81118015611c5a57600080fd5b50604051908082528060200260200182016040528015611c84578160200160208202803683370190505b5090508281600081518110611c9557fe5b60200260200101818152505060005b600183510381101561182257600080611cda87868581518110611cc357fe5b60200260200101518786600101815181106117ce57fe5b91509150611cfc848481518110611ced57fe5b60200260200101518383612553565b848460010181518110611d0b57fe5b60209081029190910101525050600101611ca4565b6000611d2d858486611fb3565b604051635db3427760e01b81526001600160a01b03841690635db3427790611d5d90889088908790600401612ddb565b602060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611daf9190612c48565b9050610b728333836120a1565b600081611ddb5760405162461bcd60e51b81526004016100cc90613259565b670de0b6b3a76400008302831580611e035750670de0b6b3a7640000848281611e0057fe5b04145b611e1f5760405162461bcd60e51b81526004016100cc90613097565b60028304810181811015611e455760405162461bcd60e51b81526004016100cc90613097565b6000848281611e5057fe5b0493505050505b92915050565b60606001600160a01b038516611e8557600283526001600160a01b0384166040840152611ea1565b600383526001600160a01b038581166040850152841660608401525b604051634aa4e0b560e01b81526000906001600160a01b03881690634aa4e0b590611ed0908890600401612d8a565b60206040518083038186803b158015611ee857600080fd5b505afa158015611efc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f209190612c48565b90506000611f2e84836121b9565b90506108737f00000000000000000000000000000000000000000000000000000000000000008287611712565b60008184841115611f7f5760405162461bcd60e51b81526004016100cc9190612dfc565b505050900390565b600082820183811015611fac5760405162461bcd60e51b81526004016100cc90612e59565b9392505050565b60006060846001600160a01b031663095ea7b38585604051602401611fd9929190612dc2565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120129190612d18565b6000604051808303816000865af19150503d806000811461204f576040519150601f19603f3d011682016040523d82523d6000602084013e612054565b606091505b509150915081801561207e57508051158061207e57508080602001905181019061207e9190612b37565b61209a5760405162461bcd60e51b81526004016100cc9061320e565b5050505050565b60006060846001600160a01b031663a9059cbb85856040516024016120c7929190612dc2565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516121009190612d18565b6000604051808303816000865af19150503d806000811461213d576040519150601f19603f3d011682016040523d82523d6000602084013e612142565b606091505b509150915081801561216c57508051158061216c57508080602001905181019061216c9190612b37565b61209a5760405162461bcd60e51b81526004016100cc906132d9565b600080600061219785856125ed565b9150915080156118225760405162461bcd60e51b81526004016100cc906132ae565b60008282028315806121d35750828482816121d057fe5b04145b6121ef5760405162461bcd60e51b81526004016100cc90613192565b6706f05b59d3b2000081018181101561221a5760405162461bcd60e51b81526004016100cc90613192565b6000670de0b6b3a764000082611e50565b600082820183811015611fac5760405162461bcd60e51b81526004016100cc9061335d565b60008061225d8786611dbc565b9050600061226b878661222b565b905060006122798289611dbc565b9050600061228f670de0b6b3a764000085611dbc565b9050600061229d838361260f565b905060006122ab828e6121b9565b905060006122b9828f612188565b905060006122d86122d2670de0b6b3a76400008a612188565b8b6121b9565b90506122f082610cd4670de0b6b3a764000084612188565b9f9e505050505050505050505050505050565b6000806000612312858561246c565b50905060008061232388888861182a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561235b57600080fd5b505afa15801561236f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123939190612bf4565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146123ca5780826123cd565b81815b90999098509650505050505050565b60008084116123fd5760405162461bcd60e51b81526004016100cc90612e90565b60008311801561240d5750600082115b6124295760405162461bcd60e51b81526004016100cc90613109565b60006124416103e861243b86886126c2565b906126c2565b905060006124556103e561243b86896126fc565b9050611848600182848161246557fe5b0490611f87565b600080826001600160a01b0316846001600160a01b031614156124a15760405162461bcd60e51b81526004016100cc9061301b565b826001600160a01b0316846001600160a01b0316106124c15782846124c4565b83835b90925090506001600160a01b0382166124ef5760405162461bcd60e51b81526004016100cc90613326565b9250929050565b600083838360405160200161250c929190612cf1565b60405160208183030381529060405280519060200120604051602001612533929190612d34565b60408051601f198184030181529190528051602090910120949350505050565b60008084116125745760405162461bcd60e51b81526004016100cc90613387565b6000831180156125845750600082115b6125a05760405162461bcd60e51b81526004016100cc90613109565b60006125ae856103e56126c2565b905060006125bc82856126c2565b905060006125d6836125d0886103e86126c2565b90611f87565b90508082816125e157fe5b04979650505050505050565b60008082841061260357505080820360006124ef565b505081810360016124ef565b600060018310156126325760405162461bcd60e51b81526004016100cc9061327f565b671bc16d674ec7ffff83111561265a5760405162461bcd60e51b81526004016100cc906133d2565b60006126658361273e565b905060006126738483612188565b905060006126898661268485612759565b612767565b90508161269a579250611e57915050565b60006126ab87846305f5e1006127be565b90506126b782826121b9565b979650505050505050565b6000826126d157506000611e57565b828202828482816126de57fe5b0414611fac5760405162461bcd60e51b81526004016100cc90613151565b6000611fac83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f5b565b6000670de0b6b3a764000061275283612759565b0292915050565b670de0b6b3a7640000900490565b6000806002830661278057670de0b6b3a7640000612782565b835b90506002830492505b8215611fac5761279b84856121b9565b935060028306156127b3576127b081856121b9565b90505b60028304925061278b565b60008281806127d587670de0b6b3a76400006125ed565b9092509050670de0b6b3a764000080600060015b888410612892576000670de0b6b3a76400008202905060008061281d8a61281885670de0b6b3a7640000612188565b6125ed565b915091506128348761282f848c6121b9565b6121b9565b96506128408784611dbc565b96508661284f57505050612892565b8715612859579315935b8015612863579315935b841561287a576128738688612188565b9550612887565b612884868861222b565b95505b5050506001016127e9565b50909998505050505050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b8051611e57816134d8565b60008083601f8401126128f9578182fd5b50813567ffffffffffffffff811115612910578182fd5b60208301915083602080830285010111156124ef57600080fd5b80516001600160601b0381168114611e5757600080fd5b600060208284031215612952578081fd5b8135611fac816134d8565b60008060008060608587031215612972578283fd5b843561297d816134d8565b9350602085013567ffffffffffffffff811115612998578384fd5b6129a4878288016128e8565b9598909750949560400135949350505050565b60008060008060008060a087890312156129cf578182fd5b86356129da816134d8565b955060208701359450604087013567ffffffffffffffff8111156129fc578283fd5b612a0889828a016128e8565b9095509350506060870135612a1c816134d8565b80925050608087013590509295509295509295565b60008060008060608587031215612a46578384fd5b843567ffffffffffffffff811115612a5c578485fd5b612a68878288016128e8565b9095509350506020850135612a7c816134d8565b9396929550929360400135925050565b60006020808385031215612a9e578182fd5b825167ffffffffffffffff80821115612ab5578384fd5b818501915085601f830112612ac8578384fd5b815181811115612ad6578485fd5b8381029150612ae6848301613485565b8181528481019084860184860187018a1015612b00578788fd5b8795505b83861015612b2a57612b168a826128dd565b835260019590950194918601918601612b04565b5098975050505050505050565b600060208284031215612b48578081fd5b8151611fac816134f0565b600060e08284031215612b64578081fd5b612b6e60e0613485565b8251612b79816134f0565b81526020830151612b89816134f0565b6020820152604083015164ffffffffff81168114612ba5578283fd5b6040820152612bb7846060850161292a565b6060820152612bc9846080850161292a565b608082015260a0830151612bdc81613513565b60a082015260c0928301519281019290925250919050565b600080600060608486031215612c08578283fd5b8351612c13816134fe565b6020850151909350612c24816134fe565b604085015190925063ffffffff81168114612c3d578182fd5b809150509250925092565b600060208284031215612c59578081fd5b5051919050565b600080600080600060808688031215612c77578081fd5b85359450602086013567ffffffffffffffff811115612c94578182fd5b612ca0888289016128e8565b9095509350506040860135612cb4816134d8565b949793965091946060013592915050565b60008151808452612cdd8160208601602086016134ac565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b60008251612d2a8184602087016134ac565b9190910192915050565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060208252611fac6020830184612cc5565b6020808252602a908201527f496e6465786564556e6973776170526f757465724d696e7465723a205245434560408201526924ab22a22fa2aa2422a960b11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602c908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252602e908201527f496e6465786564556e6973776170526f757465724d696e7465723a205745544860408201526d17d514905394d1915497d190525360921b606082015260800190565b60208082526031908201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604082015270185b9cd9995c919c9bdb4819985a5b1959607a1b606082015260800190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b6020808252602c908201527f496e6465786564556e6973776170526f757465724d696e7465723a204241445f60408201526b082a4a482b2be988a9c8ea8960a31b606082015260800190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604082015260600190565b60208082526010908201526f11549497d1125597d25395115493905360821b604082015260600190565b60208082526028908201527f496e6465786564556e6973776170526f757465724d696e7465723a20494e56416040820152670989288bea082a8960c31b606082015260800190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526010908201526f4552525f4d554c5f4f564552464c4f5760801b604082015260600190565b60208082526032908201527f496e6465786564556e6973776170526f757465724d696e7465723a204558434560408201527114d4d2559157d25394155517d05353d5539560721b606082015260800190565b6020808252602b908201527f5472616e7366657248656c7065723a3a73616665417070726f76653a2061707060408201526a1c9bdd994819985a5b195960aa1b606082015260800190565b6020808252600c908201526b4552525f4449565f5a45524f60a01b604082015260600190565b6020808252601590820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604082015260600190565b6020808252601190820152704552525f5355425f554e444552464c4f5760781b604082015260600190565b6020808252602d908201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260408201526c185b9cd9995c8819985a5b1959609a1b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b60208082526010908201526f4552525f4144445f4f564552464c4f5760801b604082015260600190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b60208082526016908201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604082015260600190565b90815260200190565b60006040820184835260206040818501528185518084526060860191508287019350845b8181101561344b5784518352938301939183019160010161342f565b5090979650505050505050565b600085825284602083015260018060a01b0384166040830152608060608301526118486080830184612cc5565b60405181810167ffffffffffffffff811182821017156134a457600080fd5b604052919050565b60005b838110156134c75781810151838201526020016134af565b8381111561054f5750506000910152565b6001600160a01b03811681146134ed57600080fd5b50565b80151581146134ed57600080fd5b6001600160701b03811681146134ed57600080fd5b60ff811681146134ed57600080fdfe496e6465786564556e6973776170526f757465724d696e7465723a204558434553534956455f494e5055545f414d4f554e54a264697066735822122042b335277d8709254d1c6a997d2c7c5a4a8e99b5c6bd071f434f0f65ba0fca6464736f6c634300060c00330000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x60806040526004361061007f5760003560e01c806384be7c151161004e57806384be7c1514610167578063acb5a8021461017a578063c45a01551461019a578063cd4e2c51146101af576100d7565b80633f7f09ea146100dc5780633fc8cef3146100ef578063506dc1921461011a578063588aa3b71461013a576100d7565b366100d757336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146100d55760405162461bcd60e51b81526004016100cc90612e0f565b60405180910390fd5b005b600080fd5b6100d56100ea366004612a31565b6101c2565b3480156100fb57600080fd5b50610104610555565b6040516101119190612d8a565b60405180910390f35b34801561012657600080fd5b506100d5610135366004612c60565b610579565b34801561014657600080fd5b5061015a610155366004612c60565b61072d565b6040516101119190613402565b61015a610175366004612a31565b61087f565b34801561018657600080fd5b5061015a6101953660046129b7565b610b7a565b3480156101a657600080fd5b50610104610f23565b61015a6101bd36600461295d565b610f47565b6000848460001981018181106101d457fe5b90506020020160208101906101e99190612941565b905060006101f8848385611427565b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061023157fe5b90506020020160208101906102469190612941565b6001600160a01b03161461026c5760405162461bcd60e51b81526004016100cc906130c1565b60606102cc7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061171292505050565b905034816000815181106102dc57fe5b602002602001015111156103025760405162461bcd60e51b81526004016100cc906131bc565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08260008151811061033e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561037157600080fd5b505af1158015610385573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6104267f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8a8a60008181106103ea57fe5b90506020020160208101906103ff9190612941565b8b8b600181811061040c57fe5b90506020020160208101906104219190612941565b61182a565b8360008151811061043357fe5b60200260200101516040518363ffffffff1660e01b8152600401610458929190612dc2565b602060405180830381600087803b15801561047257600080fd5b505af1158015610486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104aa9190612b37565b6104c65760405162461bcd60e51b81526004016100cc90612edc565b6105038188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b8060008151811061051057fe5b602002602001015134111561053f5761053f338260008151811061053057fe5b60200260200101513403611a07565b61054b83838787611a94565b5050505b50505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60008484600019810181811061058b57fe5b90506020020160208101906105a09190612941565b905060006105af848385611427565b905060606106117f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061171292505050565b9050878160008151811061062157fe5b602002602001015111156106475760405162461bcd60e51b81526004016100cc906131bc565b6106da8787600081811061065757fe5b905060200201602081019061066c9190612941565b336106c07f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8b8b600081811061069e57fe5b90506020020160208101906106b39190612941565b8c8c600181811061040c57fe5b846000815181106106cd57fe5b6020026020010151611b2d565b6107178188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b61072383838787611a94565b5050505050505050565b6000606061078f7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f88888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c1e92505050565b90506107e8868660008181106107a157fe5b90506020020160208101906107b69190612941565b336106c07f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8a8a60008181106103ea57fe5b6108258187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b60008160018351038151811061083757fe5b60200260200101519050610873878760018a8a90500381811061085657fe5b905060200201602081019061086b9190612941565b828787611d20565b98975050505050505050565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316858560008181106108b857fe5b90506020020160208101906108cd9190612941565b6001600160a01b0316146108f35760405162461bcd60e51b81526004016100cc906130c1565b60606109537f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f34888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c1e92505050565b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08260008151811061099157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109c457600080fd5b505af11580156109d8573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb610a5f7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f89896000818110610a3d57fe5b9050602002016020810190610a529190612941565b8a8a600181811061040c57fe5b83600081518110610a6c57fe5b60200260200101516040518363ffffffff1660e01b8152600401610a91929190612dc2565b602060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae39190612b37565b610aff5760405162461bcd60e51b81526004016100cc90612edc565b610b3c8187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061185292505050565b600081600183510381518110610b4e57fe5b60200260200101519050610b6d878760018a8a90500381811061085657fe5b925050505b949350505050565b60006060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf39190810190612a8c565b80519091508514610c165760405162461bcd60e51b81526004016100cc90612fcf565b6060815167ffffffffffffffff81118015610c3057600080fd5b50604051908082528060200260200182016040528015610c5a578160200160208202803683370190505b5090506000610cd985876001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9c57600080fd5b505afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd49190612c48565b611dbc565b60408051600380825260808201909252919250606091906020820183803683370190505090508a81600081518110610d0d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015610ea9576060610d7b898c8c85818110610d4b57fe5b9050602002016020810190610d609190612941565b888581518110610d6c57fe5b60200260200101518688611e5d565b9050610db48c82600081518110610d8e57fe5b602002602001015160405180606001604052806032815260200161352360329139611f5b565b9b50610e2283600081518110610dc657fe5b6020026020010151336106c07f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f87600081518110610e0057fe5b602002602001015188600181518110610e1557fe5b602002602001015161182a565b610e2c8184611852565b600081600183510381518110610e3e57fe5b6020026020010151905080868481518110610e5557fe5b602002602001018181525050610e7f8883600081518110610e7257fe5b6020026020010151611f87565b9750610e9f878481518110610e9057fe5b60200260200101518b83611fb3565b5050600101610d30565b506040516313da703560e21b81526001600160a01b03881690634f69c0d490610ed8908990879060040161340b565b600060405180830381600087803b158015610ef257600080fd5b505af1158015610f06573d6000803e3d6000fd5b50505050610f158733886120a1565b505050509695505050505050565b7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000803490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610fa857600080fd5b505af1158015610fbc573d6000803e3d6000fd5b50505050506060866001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610ffc57600080fd5b505afa158015611010573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110389190810190612a8c565b8051909150851461105b5760405162461bcd60e51b81526004016100cc90612fcf565b6060815167ffffffffffffffff8111801561107557600080fd5b5060405190808252806020026020018201604052801561109f578160200160208202803683370190505b50905060006110e1868a6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9c57600080fd5b60408051600380825260808201909252919250606091906020820183803683370190505090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156113175760606111738c8c8c85818110610d4b57fe5b90506111868782600081518110610d8e57fe5b96507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6111fd7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f866000815181106111e857fe5b602002602001015187600181518110610e1557fe5b8360008151811061120a57fe5b60200260200101516040518363ffffffff1660e01b815260040161122f929190612dc2565b602060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190612b37565b61129d5760405162461bcd60e51b81526004016100cc90612edc565b6112a78184611852565b6000816001835103815181106112b957fe5b60200260200101519050808684815181106112d057fe5b6020026020010181815250506112ed8983600081518110610e7257fe5b985061130d8784815181106112fe57fe5b60200260200101518e83611fb3565b5050600101611158565b506040516313da703560e21b81526001600160a01b038b1690634f69c0d490611346908a90879060040161340b565b600060405180830381600087803b15801561136057600080fd5b505af1158015611374573d6000803e3d6000fd5b505050506113838a33896120a1565b8534111561141a57604051632e1a7d4d60e01b815234879003906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d906113dc908490600401613402565b600060405180830381600087803b1580156113f657600080fd5b505af115801561140a573d6000803e3d6000fd5b505050506114183382611a07565b505b5050505050949350505050565b60006114316128a1565b6040516364c7d66160e01b81526001600160a01b038616906364c7d6619061145d908790600401612d8a565b60e06040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190612b53565b90508060200151611594576040516391bfa2bf60e01b81526000906001600160a01b038716906391bfa2bf906114e7908890600401612d8a565b60206040518083038186803b1580156114ff57600080fd5b505afa158015611513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190612c48565b9050600061155261154c838560c00151612188565b83611dbc565b905060006115676658d15e17628000836121b9565b60c0850184905290506115826703782dace9d900008261222b565b6001600160601b031660608501525050505b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115cf57600080fd5b505afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612c48565b90506000866001600160a01b031663936c34776040518163ffffffff1660e01b815260040160206040518083038186803b15801561164457600080fd5b505afa158015611658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167c9190612c48565b90506000876001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f19190612c48565b90506108738460c0015185606001516001600160601b031685858a86612250565b60606002825110156117365760405162461bcd60e51b81526004016100cc90613060565b815167ffffffffffffffff8111801561174e57600080fd5b50604051908082528060200260200182016040528015611778578160200160208202803683370190505b509050828160018351038151811061178c57fe5b60209081029190910101528151600019015b8015611822576000806117db878660018603815181106117ba57fe5b60200260200101518786815181106117ce57fe5b6020026020010151612303565b915091506117fd8484815181106117ee57fe5b602002602001015183836123dc565b84600185038151811061180c57fe5b602090810291909101015250506000190161179e565b509392505050565b6000806000611839858561246c565b915091506118488683836124f6565b9695505050505050565b60005b6001825103811015611a025760008083838151811061187057fe5b602002602001015184846001018151811061188757fe5b6020026020010151915091506000806118a0848461246c565b9150915060008786600101815181106118b557fe5b60200260200101519050600080846001600160a01b0316876001600160a01b0316146118e3578260006118e7565b6000835b91509150600060028a510389106118fe5730611932565b6119327f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f888c8c60020181518110610e1557fe5b905061195f7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f87876124f6565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561199c576020820181803683370190505b506040518563ffffffff1660e01b81526004016119bc9493929190613458565b600060405180830381600087803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b50506001909a01995061185598505050505050505050565b505050565b604080516000808252602082019092526001600160a01b038416908390604051611a319190612d18565b60006040518083038185875af1925050503d8060008114611a6e576040519150601f19603f3d011682016040523d82523d6000602084013e611a73565b606091505b5050905080611a025760405162461bcd60e51b81526004016100cc90612f7b565b611a9f848385611fb3565b60405163036836fd60e51b81526001600160a01b03831690636d06dfa090611acf90879085908890600401612ddb565b602060405180830381600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b219190612c48565b5061054f8233836120a1565b60006060856001600160a01b03166323b872dd868686604051602401611b5593929190612d9e565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611b8e9190612d18565b6000604051808303816000865af19150503d8060008114611bcb576040519150601f19603f3d011682016040523d82523d6000602084013e611bd0565b606091505b5091509150818015611bfa575080511580611bfa575080806020019051810190611bfa9190612b37565b611c165760405162461bcd60e51b81526004016100cc90612f2a565b505050505050565b6060600282511015611c425760405162461bcd60e51b81526004016100cc90613060565b815167ffffffffffffffff81118015611c5a57600080fd5b50604051908082528060200260200182016040528015611c84578160200160208202803683370190505b5090508281600081518110611c9557fe5b60200260200101818152505060005b600183510381101561182257600080611cda87868581518110611cc357fe5b60200260200101518786600101815181106117ce57fe5b91509150611cfc848481518110611ced57fe5b60200260200101518383612553565b848460010181518110611d0b57fe5b60209081029190910101525050600101611ca4565b6000611d2d858486611fb3565b604051635db3427760e01b81526001600160a01b03841690635db3427790611d5d90889088908790600401612ddb565b602060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611daf9190612c48565b9050610b728333836120a1565b600081611ddb5760405162461bcd60e51b81526004016100cc90613259565b670de0b6b3a76400008302831580611e035750670de0b6b3a7640000848281611e0057fe5b04145b611e1f5760405162461bcd60e51b81526004016100cc90613097565b60028304810181811015611e455760405162461bcd60e51b81526004016100cc90613097565b6000848281611e5057fe5b0493505050505b92915050565b60606001600160a01b038516611e8557600283526001600160a01b0384166040840152611ea1565b600383526001600160a01b038581166040850152841660608401525b604051634aa4e0b560e01b81526000906001600160a01b03881690634aa4e0b590611ed0908890600401612d8a565b60206040518083038186803b158015611ee857600080fd5b505afa158015611efc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f209190612c48565b90506000611f2e84836121b9565b90506108737f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8287611712565b60008184841115611f7f5760405162461bcd60e51b81526004016100cc9190612dfc565b505050900390565b600082820183811015611fac5760405162461bcd60e51b81526004016100cc90612e59565b9392505050565b60006060846001600160a01b031663095ea7b38585604051602401611fd9929190612dc2565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120129190612d18565b6000604051808303816000865af19150503d806000811461204f576040519150601f19603f3d011682016040523d82523d6000602084013e612054565b606091505b509150915081801561207e57508051158061207e57508080602001905181019061207e9190612b37565b61209a5760405162461bcd60e51b81526004016100cc9061320e565b5050505050565b60006060846001600160a01b031663a9059cbb85856040516024016120c7929190612dc2565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516121009190612d18565b6000604051808303816000865af19150503d806000811461213d576040519150601f19603f3d011682016040523d82523d6000602084013e612142565b606091505b509150915081801561216c57508051158061216c57508080602001905181019061216c9190612b37565b61209a5760405162461bcd60e51b81526004016100cc906132d9565b600080600061219785856125ed565b9150915080156118225760405162461bcd60e51b81526004016100cc906132ae565b60008282028315806121d35750828482816121d057fe5b04145b6121ef5760405162461bcd60e51b81526004016100cc90613192565b6706f05b59d3b2000081018181101561221a5760405162461bcd60e51b81526004016100cc90613192565b6000670de0b6b3a764000082611e50565b600082820183811015611fac5760405162461bcd60e51b81526004016100cc9061335d565b60008061225d8786611dbc565b9050600061226b878661222b565b905060006122798289611dbc565b9050600061228f670de0b6b3a764000085611dbc565b9050600061229d838361260f565b905060006122ab828e6121b9565b905060006122b9828f612188565b905060006122d86122d2670de0b6b3a76400008a612188565b8b6121b9565b90506122f082610cd4670de0b6b3a764000084612188565b9f9e505050505050505050505050505050565b6000806000612312858561246c565b50905060008061232388888861182a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561235b57600080fd5b505afa15801561236f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123939190612bf4565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146123ca5780826123cd565b81815b90999098509650505050505050565b60008084116123fd5760405162461bcd60e51b81526004016100cc90612e90565b60008311801561240d5750600082115b6124295760405162461bcd60e51b81526004016100cc90613109565b60006124416103e861243b86886126c2565b906126c2565b905060006124556103e561243b86896126fc565b9050611848600182848161246557fe5b0490611f87565b600080826001600160a01b0316846001600160a01b031614156124a15760405162461bcd60e51b81526004016100cc9061301b565b826001600160a01b0316846001600160a01b0316106124c15782846124c4565b83835b90925090506001600160a01b0382166124ef5760405162461bcd60e51b81526004016100cc90613326565b9250929050565b600083838360405160200161250c929190612cf1565b60405160208183030381529060405280519060200120604051602001612533929190612d34565b60408051601f198184030181529190528051602090910120949350505050565b60008084116125745760405162461bcd60e51b81526004016100cc90613387565b6000831180156125845750600082115b6125a05760405162461bcd60e51b81526004016100cc90613109565b60006125ae856103e56126c2565b905060006125bc82856126c2565b905060006125d6836125d0886103e86126c2565b90611f87565b90508082816125e157fe5b04979650505050505050565b60008082841061260357505080820360006124ef565b505081810360016124ef565b600060018310156126325760405162461bcd60e51b81526004016100cc9061327f565b671bc16d674ec7ffff83111561265a5760405162461bcd60e51b81526004016100cc906133d2565b60006126658361273e565b905060006126738483612188565b905060006126898661268485612759565b612767565b90508161269a579250611e57915050565b60006126ab87846305f5e1006127be565b90506126b782826121b9565b979650505050505050565b6000826126d157506000611e57565b828202828482816126de57fe5b0414611fac5760405162461bcd60e51b81526004016100cc90613151565b6000611fac83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f5b565b6000670de0b6b3a764000061275283612759565b0292915050565b670de0b6b3a7640000900490565b6000806002830661278057670de0b6b3a7640000612782565b835b90506002830492505b8215611fac5761279b84856121b9565b935060028306156127b3576127b081856121b9565b90505b60028304925061278b565b60008281806127d587670de0b6b3a76400006125ed565b9092509050670de0b6b3a764000080600060015b888410612892576000670de0b6b3a76400008202905060008061281d8a61281885670de0b6b3a7640000612188565b6125ed565b915091506128348761282f848c6121b9565b6121b9565b96506128408784611dbc565b96508661284f57505050612892565b8715612859579315935b8015612863579315935b841561287a576128738688612188565b9550612887565b612884868861222b565b95505b5050506001016127e9565b50909998505050505050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b8051611e57816134d8565b60008083601f8401126128f9578182fd5b50813567ffffffffffffffff811115612910578182fd5b60208301915083602080830285010111156124ef57600080fd5b80516001600160601b0381168114611e5757600080fd5b600060208284031215612952578081fd5b8135611fac816134d8565b60008060008060608587031215612972578283fd5b843561297d816134d8565b9350602085013567ffffffffffffffff811115612998578384fd5b6129a4878288016128e8565b9598909750949560400135949350505050565b60008060008060008060a087890312156129cf578182fd5b86356129da816134d8565b955060208701359450604087013567ffffffffffffffff8111156129fc578283fd5b612a0889828a016128e8565b9095509350506060870135612a1c816134d8565b80925050608087013590509295509295509295565b60008060008060608587031215612a46578384fd5b843567ffffffffffffffff811115612a5c578485fd5b612a68878288016128e8565b9095509350506020850135612a7c816134d8565b9396929550929360400135925050565b60006020808385031215612a9e578182fd5b825167ffffffffffffffff80821115612ab5578384fd5b818501915085601f830112612ac8578384fd5b815181811115612ad6578485fd5b8381029150612ae6848301613485565b8181528481019084860184860187018a1015612b00578788fd5b8795505b83861015612b2a57612b168a826128dd565b835260019590950194918601918601612b04565b5098975050505050505050565b600060208284031215612b48578081fd5b8151611fac816134f0565b600060e08284031215612b64578081fd5b612b6e60e0613485565b8251612b79816134f0565b81526020830151612b89816134f0565b6020820152604083015164ffffffffff81168114612ba5578283fd5b6040820152612bb7846060850161292a565b6060820152612bc9846080850161292a565b608082015260a0830151612bdc81613513565b60a082015260c0928301519281019290925250919050565b600080600060608486031215612c08578283fd5b8351612c13816134fe565b6020850151909350612c24816134fe565b604085015190925063ffffffff81168114612c3d578182fd5b809150509250925092565b600060208284031215612c59578081fd5b5051919050565b600080600080600060808688031215612c77578081fd5b85359450602086013567ffffffffffffffff811115612c94578182fd5b612ca0888289016128e8565b9095509350506040860135612cb4816134d8565b949793965091946060013592915050565b60008151808452612cdd8160208601602086016134ac565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b60008251612d2a8184602087016134ac565b9190910192915050565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b600060208252611fac6020830184612cc5565b6020808252602a908201527f496e6465786564556e6973776170526f757465724d696e7465723a205245434560408201526924ab22a22fa2aa2422a960b11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602c908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252602e908201527f496e6465786564556e6973776170526f757465724d696e7465723a205745544860408201526d17d514905394d1915497d190525360921b606082015260800190565b60208082526031908201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604082015270185b9cd9995c919c9bdb4819985a5b1959607a1b606082015260800190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b6020808252602c908201527f496e6465786564556e6973776170526f757465724d696e7465723a204241445f60408201526b082a4a482b2be988a9c8ea8960a31b606082015260800190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604082015260600190565b60208082526010908201526f11549497d1125597d25395115493905360821b604082015260600190565b60208082526028908201527f496e6465786564556e6973776170526f757465724d696e7465723a20494e56416040820152670989288bea082a8960c31b606082015260800190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526010908201526f4552525f4d554c5f4f564552464c4f5760801b604082015260600190565b60208082526032908201527f496e6465786564556e6973776170526f757465724d696e7465723a204558434560408201527114d4d2559157d25394155517d05353d5539560721b606082015260800190565b6020808252602b908201527f5472616e7366657248656c7065723a3a73616665417070726f76653a2061707060408201526a1c9bdd994819985a5b195960aa1b606082015260800190565b6020808252600c908201526b4552525f4449565f5a45524f60a01b604082015260600190565b6020808252601590820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604082015260600190565b6020808252601190820152704552525f5355425f554e444552464c4f5760781b604082015260600190565b6020808252602d908201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260408201526c185b9cd9995c8819985a5b1959609a1b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b60208082526010908201526f4552525f4144445f4f564552464c4f5760801b604082015260600190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b60208082526016908201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604082015260600190565b90815260200190565b60006040820184835260206040818501528185518084526060860191508287019350845b8181101561344b5784518352938301939183019160010161342f565b5090979650505050505050565b600085825284602083015260018060a01b0384166040830152608060608301526118486080830184612cc5565b60405181810167ffffffffffffffff811182821017156134a457600080fd5b604052919050565b60005b838110156134c75781810151838201526020016134af565b8381111561054f5750506000910152565b6001600160a01b03811681146134ed57600080fd5b50565b80151581146134ed57600080fd5b6001600160701b03811681146134ed57600080fd5b60ff811681146134ed57600080fdfe496e6465786564556e6973776170526f757465724d696e7465723a204558434553534956455f494e5055545f414d4f554e54a264697066735822122042b335277d8709254d1c6a997d2c7c5a4a8e99b5c6bd071f434f0f65ba0fca6464736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : factory_ (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
Arg [1] : weth_ (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.