Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 58 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 10942771 | 10 days ago | IN | 0 S | 0.01216583 | ||||
Swap Exact Token... | 10941959 | 10 days ago | IN | 0 S | 0.01214609 | ||||
Swap Exact Token... | 2428778 | 66 days ago | IN | 0 S | 0.00014475 | ||||
Remove Liquidity | 2424418 | 66 days ago | IN | 0 S | 0.00015929 | ||||
Remove Liquidity | 2424330 | 66 days ago | IN | 0 S | 0.00015925 | ||||
Swap Exact Token... | 1847470 | 72 days ago | IN | 0 S | 0.00014991 | ||||
Swap Exact Token... | 1791399 | 73 days ago | IN | 0 S | 0.00014991 | ||||
Swap Exact Token... | 1778352 | 73 days ago | IN | 0 S | 0.00013627 | ||||
Swap Exact Token... | 1707542 | 74 days ago | IN | 0 S | 0.00015352 | ||||
Swap Exact Token... | 1693579 | 74 days ago | IN | 0 S | 0.00014821 | ||||
Swap Exact Token... | 1581604 | 75 days ago | IN | 0 S | 0.00014687 | ||||
Swap Exact Token... | 1580545 | 75 days ago | IN | 0 S | 0.00013612 | ||||
Swap Exact Token... | 1578206 | 75 days ago | IN | 0 S | 0.00013609 | ||||
Swap Exact Token... | 1577774 | 75 days ago | IN | 0 S | 0.00015493 | ||||
Swap Exact Token... | 1452240 | 77 days ago | IN | 0 S | 0.00011894 | ||||
Swap Exact Token... | 1429196 | 77 days ago | IN | 0 S | 0.00014967 | ||||
Swap Exact Token... | 1417945 | 77 days ago | IN | 0 S | 0.00013948 | ||||
Swap Exact Token... | 1417651 | 77 days ago | IN | 0 S | 0.00013948 | ||||
Swap Exact Token... | 1416686 | 77 days ago | IN | 0 S | 0.00013948 | ||||
Swap Exact Token... | 1416352 | 77 days ago | IN | 0 S | 0.00014824 | ||||
Swap Exact Token... | 1410158 | 77 days ago | IN | 0 S | 0.00013607 | ||||
Swap Exact Token... | 1392842 | 77 days ago | IN | 0 S | 0.00013609 | ||||
Swap Exact Token... | 1278444 | 78 days ago | IN | 0 S | 0.00013969 | ||||
Swap Exact Token... | 1276501 | 78 days ago | IN | 0 S | 0.00016475 | ||||
Swap Exact Token... | 1274707 | 78 days ago | IN | 0 S | 0.00013356 |
Loading...
Loading
Contract Name:
OnlyMemesRouter
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.4; import {IOnlyMemesFactory} from "./interfaces/IOnlyMemesFactory.sol"; import {IOnlyMemesRouter} from "./interfaces/IOnlyMemesRouter.sol"; import {IOnlyMemesPair} from "./interfaces/IOnlyMemesPair.sol"; import {IERC20} from "./interfaces/IERC20.sol"; import {IWS} from "./interfaces/IWS.sol"; import {TransferHelper} from "./libraries/TransferHelper.sol"; import {OnlyMemesLibrary} from "./libraries/OnlyMemesLibrary.sol"; contract OnlyMemesRouter is IOnlyMemesRouter { //solhint-disable-next-line immutable-vars-naming address public immutable override factory; address public immutable override WS; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "OnlyMemesRouter: EXPIRED"); _; } constructor(address _factory, address _WS) { factory = _factory; WS = _WS; } receive() external payable { assert(msg.sender == WS); // only accept S via fallback from the WS contract } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet if (IOnlyMemesFactory(factory).getPair(tokenA, tokenB) == address(0)) { IOnlyMemesFactory(factory).createPair(tokenA, tokenB,10); } (uint256 reserveA, uint256 reserveB) = OnlyMemesLibrary.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = OnlyMemesLibrary.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "OnlyMemesRouter: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = OnlyMemesLibrary.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "OnlyMemesRouter: INSUFFICIENT_A_AMOUNT" ); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) { (amountA, amountB) = _addLiquidity( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin ); address pair = OnlyMemesLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IOnlyMemesPair(pair).mint(to); } function addLiquidityS( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountS, uint256 liquidity) { (amountToken, amountS) = _addLiquidity( token, WS, amountTokenDesired, msg.value, amountTokenMin, amountSMin ); address pair = OnlyMemesLibrary.pairFor(factory, token, WS); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWS(WS).deposit{value: amountS}(); assert(IWS(WS).transfer(pair, amountS)); liquidity = IOnlyMemesPair(pair).mint(to); // refund dust S, if any if (msg.value > amountS) TransferHelper.safeTransferS(msg.sender, msg.value - amountS); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = OnlyMemesLibrary.pairFor(factory, tokenA, tokenB); IOnlyMemesPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IOnlyMemesPair(pair).burn(to); (address token0, ) = OnlyMemesLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require( amountA >= amountAMin, "OnlyMemesRouter: INSUFFICIENT_A_AMOUNT" ); require( amountB >= amountBMin, "OnlyMemesRouter: INSUFFICIENT_B_AMOUNT" ); } function removeLiquidityS( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountS) { (amountToken, amountS) = removeLiquidity( token, WS, liquidity, amountTokenMin, amountSMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWS(WS).withdraw(amountS); TransferHelper.safeTransferS(to, amountS); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountA, uint256 amountB) { address pair = OnlyMemesLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? type(uint256).max : liquidity; IOnlyMemesPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountA, amountB) = removeLiquidity( tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline ); } function removeLiquiditySWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountToken, uint256 amountS) { address pair = OnlyMemesLibrary.pairFor(factory, token, WS); uint256 value = approveMax ? type(uint256).max : liquidity; IOnlyMemesPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountToken, amountS) = removeLiquidityS( token, liquidity, amountTokenMin, amountSMin, to, deadline ); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquiditySSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountS) { (, amountS) = removeLiquidity( token, WS, liquidity, amountTokenMin, amountSMin, address(this), deadline ); TransferHelper.safeTransfer( token, to, IERC20(token).balanceOf(address(this)) ); IWS(WS).withdraw(amountS); TransferHelper.safeTransferS(to, amountS); } function removeLiquiditySWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountS) { address pair = OnlyMemesLibrary.pairFor(factory, token, WS); uint256 value = approveMax ? type(uint256).max : liquidity; IOnlyMemesPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); amountS = removeLiquiditySSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountSMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = OnlyMemesLibrary.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? OnlyMemesLibrary.pairFor(factory, output, path[i + 2]) : _to; IOnlyMemesPair(OnlyMemesLibrary.pairFor(factory, input, output)) .swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = OnlyMemesLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "OnlyMemesRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = OnlyMemesLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "OnlyMemesRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactSForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WS, "OnlyMemesRouter: INVALID_PATH"); amounts = OnlyMemesLibrary.getAmountsOut(factory, msg.value, path); require( amounts[amounts.length - 1] >= amountOutMin, "OnlyMemesRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWS(WS).deposit{value: amounts[0]}(); assert( IWS(WS).transfer( OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); } function swapTokensForExactS( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WS, "OnlyMemesRouter: INVALID_PATH"); amounts = OnlyMemesLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "OnlyMemesRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWS(WS).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferS(to, amounts[amounts.length - 1]); } function swapExactTokensForS( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WS, "OnlyMemesRouter: INVALID_PATH"); amounts = OnlyMemesLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "OnlyMemesRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWS(WS).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferS(to, amounts[amounts.length - 1]); } function swapSForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WS, "OnlyMemesRouter: INVALID_PATH"); amounts = OnlyMemesLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= msg.value, "OnlyMemesRouter: EXCESSIVE_INPUT_AMOUNT" ); IWS(WS).deposit{value: amounts[0]}(); assert( IWS(WS).transfer( OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); // refund dust S, if any if (msg.value > amounts[0]) TransferHelper.safeTransferS(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = OnlyMemesLibrary.sortTokens(input, output); IOnlyMemesPair pair = IOnlyMemesPair( OnlyMemesLibrary.pairFor(factory, input, output) ); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput; amountOutput = OnlyMemesLibrary.getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? OnlyMemesLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); pair.sync(); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, "OnlyMemesRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactSForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WS, "OnlyMemesRouter: INVALID_PATH"); uint256 amountIn = msg.value; IWS(WS).deposit{value: amountIn}(); assert( IWS(WS).transfer( OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amountIn ) ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, "OnlyMemesRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForSSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { require(path[path.length - 1] == WS, "OnlyMemesRouter: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, OnlyMemesLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WS).balanceOf(address(this)); require( amountOut >= amountOutMin, "OnlyMemesRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWS(WS).withdraw(amountOut); TransferHelper.safeTransferS(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public pure virtual override returns (uint256 amountB) { return OnlyMemesLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountOut) { return OnlyMemesLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountIn) { return OnlyMemesLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut( uint256 amountIn, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return OnlyMemesLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn( uint256 amountOut, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return OnlyMemesLibrary.getAmountsIn(factory, amountOut, path); } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; interface IERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance( address owner, address spender ) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.4; interface IOnlyMemesERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance( address owner, address spender ) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.4; interface IOnlyMemesFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair( address tokenA, address tokenB ) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair( address tokenA, address tokenB, uint8 totalFee ) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.4; import {IOnlyMemesERC20} from "./IOnlyMemesERC20.sol"; interface IOnlyMemesPair is IOnlyMemesERC20 { event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn( address to ) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; import {IOnlyMemesRouter01} from "./IOnlyMemesRouter01.sol"; interface IOnlyMemesRouter is IOnlyMemesRouter01 { function removeLiquiditySSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external returns (uint256 amountS); function removeLiquiditySWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountS); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactSForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForSSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; //solhint-disable func-name-mixedcase interface IOnlyMemesRouter01 { function factory() external view returns (address); function WS() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityS( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountS, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityS( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountS); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquiditySWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountS); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactSForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactS( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForS( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapSForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut( uint256 amountIn, address[] calldata path ) external view returns (uint256[] memory amounts); function getAmountsIn( uint256 amountOut, address[] calldata path ) external view returns (uint256[] memory amounts); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; interface IWS { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; //solhint-disable reason-string import {IOnlyMemesPair} from "../interfaces/IOnlyMemesPair.sol"; import {IOnlyMemesFactory} from "../interfaces/IOnlyMemesFactory.sol"; library OnlyMemesLibrary { // 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, "OnlyMemesLibrary: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "OnlyMemesLibrary: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = IOnlyMemesFactory(factory).getPair(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, ) = IOnlyMemesPair( 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, "OnlyMemesLibrary: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "OnlyMemesLibrary: INSUFFICIENT_LIQUIDITY" ); amountB = (amountA * 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, "OnlyMemesLibrary: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "OnlyMemesLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn * 997; uint256 numerator = amountInWithFee * reserveOut; uint256 denominator = reserveIn * 1000 + 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, "OnlyMemesLibrary: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "OnlyMemesLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn * amountOut * 1000; uint256 denominator = (reserveOut - amountOut) * 997; amountIn = numerator / denominator + 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, "OnlyMemesLibrary: 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, "OnlyMemesLibrary: 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); } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; // helper methods for interacting with ERC20 tokens and sending S 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 safeTransferS(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require( success, "TransferHelper::safeTransferS: S transfer failed" ); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WS","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityS","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountS","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityS","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquiditySSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquiditySWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquiditySWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactSForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactSForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForS","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForSSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapSForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactS","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620046ee380380620046ee833981016040819052620000349162000070565b6001600160601b0319606092831b8116608052911b1660a052620000a7565b80516001600160a01b03811681146200006b57600080fd5b919050565b6000806040838503121562000083578182fd5b6200008e8362000053565b91506200009e6020840162000053565b90509250929050565b60805160601c60a05160601c6144af6200023f6000396000818161015f0152818161037c0152818161052901528181610637015281816106fe015281816107a401528181610a0f01528181610c3101528181610d6b01528181610e0701528181610fe801528181611208015281816112930152818161130701528181611628015281816116770152818161171d01528181611773015281816117a70152818161183c01528181611bb401528181611ce201528181611d7e01528181612253015281816123520152818161240c01526125e101526000818161045b015281816105070152818161082e0152818161091001528181610b0601528181610b3d01528181610cba01528181610e3901528181610fc6015281816110d30152818161133901528181611751015281816119dc01528181611c3d01528181611db001528181611f920152818161206d01528181612481015281816124e70152818161266b01528181612edb01528181612f3901528181613269015281816134300152818161356d0152818161362601526136ac01526144af6000f3fe60806040526004361061014f5760003560e01c80635c11d795116100b6578063baa2abde1161006f578063baa2abde14610429578063c45a015514610449578063c8fd02a81461047d578063d06ca61f1461049d578063e8e33700146104bd578063ee2b3836146104dd57600080fd5b80635c11d7951461034a5780635d4093591461036a5780637ae0a825146103b657806385f8c259146103c95780638803dbee146103e9578063ad615dec1461040957600080fd5b80632a1f3f86116101085780632a1f3f86146102965780632c1baa33146102a957806338ed1739146102c95780633e0d80e5146102e957806344d2f182146102fc57806349bdd8111461031c57600080fd5b806304b4d269146101a1578063054d50d4146101db57806309d66905146102095780631dd3621b146102295780631f00ca74146102565780632195995c1461027657600080fd5b3661019c57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461019a57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ad57600080fd5b506101c16101bc366004613d88565b6104fd565b604080519283526020830191909152015b60405180910390f35b3480156101e757600080fd5b506101fb6101f636600461406b565b6105f0565b6040519081526020016101d2565b34801561021557600080fd5b506101fb610224366004613d2b565b610605565b34801561023557600080fd5b50610249610244366004613ffa565b610777565b6040516101d291906140f3565b34801561026257600080fd5b50610249610271366004613f04565b610aff565b34801561028257600080fd5b506101c1610291366004613c07565b610b33565b6102496102a4366004613e9f565b610c0c565b3480156102b557600080fd5b506101fb6102c4366004613d88565b610fbe565b3480156102d557600080fd5b506102496102e4366004613ffa565b6110ab565b61019a6102f7366004613e9f565b6111e5565b34801561030857600080fd5b506101c1610317366004613d2b565b6115fe565b61032f61032a366004613d2b565b6116f1565b604080519384526020840192909252908201526060016101d2565b34801561035657600080fd5b5061019a610365366004613ffa565b61197c565b34801561037657600080fd5b5061039e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101d2565b6102496103c4366004613e9f565b611b8f565b3480156103d557600080fd5b506101fb6103e436600461406b565b611f5d565b3480156103f557600080fd5b50610249610404366004613ffa565b611f6a565b34801561041557600080fd5b506101fb61042436600461406b565b612035565b34801561043557600080fd5b506101c1610444366004613b96565b612042565b34801561045557600080fd5b5061039e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048957600080fd5b5061019a610498366004613ffa565b612228565b3480156104a957600080fd5b506102496104b8366004613f04565b61247a565b3480156104c957600080fd5b5061032f6104d8366004613cb0565b6124a7565b3480156104e957600080fd5b506102496104f8366004613ffa565b6125b4565b600080600061054d7f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061271a565b905060008761055c578c610560565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061059b903390309086908f908e908e908e906004016140b2565b600060405180830381600087803b1580156105b557600080fd5b505af11580156105c9573d6000803e3d6000fd5b505050506105db8e8e8e8e8e8e6115fe565b909f909e509c50505050505050505050505050565b60006105fd8484846127bb565b949350505050565b600081428110156106315760405162461bcd60e51b8152600401610628906142d4565b60405180910390fd5b610660887f00000000000000000000000000000000000000000000000000000000000000008989893089612042565b6040516370a0823160e01b81523060048201529093506106e89150899086906001600160a01b038316906370a082319060240160206040518083038186803b1580156106ab57600080fd5b505afa1580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190613e87565b61289a565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561074a57600080fd5b505af115801561075e573d6000803e3d6000fd5b5050505061076c84836129cb565b509695505050505050565b6060814281101561079a5760405162461bcd60e51b8152600401610628906142d4565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866107d16001826143b2565b8181106107ee57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108039190613b5e565b6001600160a01b0316146108295760405162461bcd60e51b8152600401610628906141c9565b6108877f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612aa692505050565b915086826000815181106108ab57634e487b7160e01b600052603260045260246000fd5b602002602001015111156108d15760405162461bcd60e51b815260040161062890614182565b6109ce868660008181106108f557634e487b7160e01b600052603260045260246000fd5b905060200201602081019061090a9190613b5e565b336109a07f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061095057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109659190613b5e565b8b8b600181811061098657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061099b9190613b5e565b61271a565b856000815181106109c157634e487b7160e01b600052603260045260246000fd5b6020026020010151612c90565b610a0d82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612dce915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610a4b91906143b2565b81518110610a6957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610a8f91815260200190565b600060405180830381600087803b158015610aa957600080fd5b505af1158015610abd573d6000803e3d6000fd5b5050505061076c848360018551610ad491906143b2565b81518110610af257634e487b7160e01b600052603260045260246000fd5b60200260200101516129cb565b6060610b2c7f00000000000000000000000000000000000000000000000000000000000000008484612aa6565b9392505050565b6000806000610b637f00000000000000000000000000000000000000000000000000000000000000008f8f61271a565b9050600087610b72578c610b76565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610bb1903390309086908f908e908e908e906004016140b2565b600060405180830381600087803b158015610bcb57600080fd5b505af1158015610bdf573d6000803e3d6000fd5b50505050610bf28f8f8f8f8f8f8f612042565b809450819550505050509b509b9950505050505050505050565b60608142811015610c2f5760405162461bcd60e51b8152600401610628906142d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110610c7a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c8f9190613b5e565b6001600160a01b031614610cb55760405162461bcd60e51b8152600401610628906141c9565b610d137f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300e92505050565b9150868260018451610d2591906143b2565b81518110610d4357634e487b7160e01b600052603260045260246000fd5b60200260200101511015610d695760405162461bcd60e51b815260040161062890614137565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110610db957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015610dec57600080fd5b505af1158015610e00573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb610eaf7f000000000000000000000000000000000000000000000000000000000000000089896000818110610e7957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e8e9190613b5e565b8a8a600181811061098657634e487b7160e01b600052603260045260246000fd5b84600081518110610ed057634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401610f099291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190613e1d565b610f7557634e487b7160e01b600052600160045260246000fd5b610fb482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dce915050565b5095945050505050565b60008061100c7f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061271a565b905060008661101b578b61101f565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061105a903390309086908e908d908d908d906004016140b2565b600060405180830381600087803b15801561107457600080fd5b505af1158015611088573d6000803e3d6000fd5b5050505061109a8d8d8d8d8d8d610605565b9d9c50505050505050505050505050565b606081428110156110ce5760405162461bcd60e51b8152600401610628906142d4565b61112c7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300e92505050565b915086826001845161113e91906143b2565b8151811061115c57634e487b7160e01b600052603260045260246000fd5b602002602001015110156111825760405162461bcd60e51b815260040161062890614137565b6111a6868660008181106108f557634e487b7160e01b600052603260045260246000fd5b61076c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dce915050565b80428110156112065760405162461bcd60e51b8152600401610628906142d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061125157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906112669190613b5e565b6001600160a01b03161461128c5760405162461bcd60e51b8152600401610628906141c9565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6113797f000000000000000000000000000000000000000000000000000000000000000089896000818110610e7957634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190613e1d565b61141357634e487b7160e01b600052600160045260246000fd5b600086866114226001826143b2565b81811061143f57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114549190613b5e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561149757600080fd5b505afa1580156114ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cf9190613e87565b905061150f8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506131d8915050565b8781888861151e6001826143b2565b81811061153b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115509190613b5e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b60206040518083038186803b15801561159457600080fd5b505afa1580156115a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cc9190613e87565b6115d691906143b2565b10156115f45760405162461bcd60e51b815260040161062890614137565b5050505050505050565b60008082428110156116225760405162461bcd60e51b8152600401610628906142d4565b611651897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612042565b909350915061166189868561289a565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156116c357600080fd5b505af11580156116d7573d6000803e3d6000fd5b505050506116e585836129cb565b50965096945050505050565b600080600083428110156117175760405162461bcd60e51b8152600401610628906142d4565b6117458a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61353f565b909450925060006117977f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061271a565b90506117a58b338388612c90565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561180057600080fd5b505af1158015611814573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506044019050602060405180830381600087803b15801561188457600080fd5b505af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613e1d565b6118d657634e487b7160e01b600052600160045260246000fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561191957600080fd5b505af115801561192d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119519190613e87565b92508334111561196e5761196e3361196986346143b2565b6129cb565b505096509650969350505050565b804281101561199d5760405162461bcd60e51b8152600401610628906142d4565b611a22858560008181106119c157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119d69190613b5e565b33611a1c7f000000000000000000000000000000000000000000000000000000000000000089896000818110610e7957634e487b7160e01b600052603260045260246000fd5b8a612c90565b60008585611a316001826143b2565b818110611a4e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611a639190613b5e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade9190613e87565b9050611b1e8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892506131d8915050565b86818787611b2d6001826143b2565b818110611b4a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611b5f9190613b5e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a082319060240161157c565b60608142811015611bb25760405162461bcd60e51b8152600401610628906142d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611bfd57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c129190613b5e565b6001600160a01b031614611c385760405162461bcd60e51b8152600401610628906141c9565b611c967f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612aa692505050565b91503482600081518110611cba57634e487b7160e01b600052603260045260246000fd5b60200260200101511115611ce05760405162461bcd60e51b815260040161062890614182565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611d3057634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6357600080fd5b505af1158015611d77573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611df07f000000000000000000000000000000000000000000000000000000000000000089896000818110610e7957634e487b7160e01b600052603260045260246000fd5b84600081518110611e1157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611e4a9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190613e1d565b611eb657634e487b7160e01b600052600160045260246000fd5b611ef582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dce915050565b81600081518110611f1657634e487b7160e01b600052603260045260246000fd5b6020026020010151341115610fb457610fb43383600081518110611f4a57634e487b7160e01b600052603260045260246000fd5b60200260200101513461196991906143b2565b60006105fd848484613797565b60608142811015611f8d5760405162461bcd60e51b8152600401610628906142d4565b611feb7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612aa692505050565b9150868260008151811061200f57634e487b7160e01b600052603260045260246000fd5b602002602001015111156111825760405162461bcd60e51b815260040161062890614182565b60006105fd848484613872565b60008082428110156120665760405162461bcd60e51b8152600401610628906142d4565b60006120937f00000000000000000000000000000000000000000000000000000000000000008c8c61271a565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c9190613e1d565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561216457600080fd5b505af1158015612178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219c9190613fd7565b9150915060006121ac8e8e613912565b509050806001600160a01b03168e6001600160a01b0316146121cf5781836121d2565b82825b90975095508a8710156121f75760405162461bcd60e51b815260040161062890614248565b898610156122175760405162461bcd60e51b81526004016106289061428e565b505050505097509795505050505050565b80428110156122495760405162461bcd60e51b8152600401610628906142d4565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856122806001826143b2565b81811061229d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906122b29190613b5e565b6001600160a01b0316146122d85760405162461bcd60e51b8152600401610628906141c9565b6122fc858560008181106119c157634e487b7160e01b600052603260045260246000fd5b61233a8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506131d8915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561239c57600080fd5b505afa1580156123b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d49190613e87565b9050868110156123f65760405162461bcd60e51b815260040161062890614137565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561245857600080fd5b505af115801561246c573d6000803e3d6000fd5b505050506115f484826129cb565b6060610b2c7f0000000000000000000000000000000000000000000000000000000000000000848461300e565b600080600083428110156124cd5760405162461bcd60e51b8152600401610628906142d4565b6124db8c8c8c8c8c8c61353f565b9094509250600061250d7f00000000000000000000000000000000000000000000000000000000000000008e8e61271a565b905061251b8d338388612c90565b6125278c338387612c90565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a29190613e87565b92505050985098509895505050505050565b606081428110156125d75760405162461bcd60e51b8152600401610628906142d4565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661260e6001826143b2565b81811061262b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126409190613b5e565b6001600160a01b0316146126665760405162461bcd60e51b8152600401610628906141c9565b6126c47f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300e92505050565b91508682600184516126d691906143b2565b815181106126f457634e487b7160e01b600052603260045260246000fd5b602002602001015110156108d15760405162461bcd60e51b815260040161062890614137565b60008060006127298585613912565b60405163e6a4390560e01b81526001600160a01b03808416600483015280831660248301529294509092509087169063e6a439059060440160206040518083038186803b15801561277957600080fd5b505afa15801561278d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b19190613b7a565b9695505050505050565b60008084116128205760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4960448201526a1394155517d05353d5539560aa1b6064820152608401610628565b6000831180156128305750600082115b61284c5760405162461bcd60e51b815260040161062890614200565b600061285a856103e5614393565b905060006128688483614393565b9050600082612879876103e8614393565b612883919061435b565b905061288f8183614373565b979650505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916128f69190614096565b6000604051808303816000865af19150503d8060008114612933576040519150601f19603f3d011682016040523d82523d6000602084013e612938565b606091505b50915091508180156129625750805115806129625750808060200190518101906129629190613e1d565b6129c45760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610628565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516129f59190614096565b60006040518083038185875af1925050503d8060008114612a32576040519150601f19603f3d011682016040523d82523d6000602084013e612a37565b606091505b5050905080612aa15760405162461bcd60e51b815260206004820152603060248201527f5472616e7366657248656c7065723a3a736166655472616e73666572533a205360448201526f081d1c985b9cd9995c8819985a5b195960821b6064820152608401610628565b505050565b6060600282511015612afa5760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f5041544800006044820152606401610628565b815167ffffffffffffffff811115612b2257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612b4b578160200160208202803683370190505b509050828160018351612b5e91906143b2565b81518110612b7c57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050600060018351612b9891906143b2565b90505b8015612c8857600080612c078786612bb46001876143b2565b81518110612bd257634e487b7160e01b600052603260045260246000fd5b6020026020010151878681518110612bfa57634e487b7160e01b600052603260045260246000fd5b6020026020010151613a0a565b91509150612c3d848481518110612c2e57634e487b7160e01b600052603260045260246000fd5b60200260200101518383613797565b84612c496001866143b2565b81518110612c6757634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080612c80906143f5565b915050612b9b565b509392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612cf49190614096565b6000604051808303816000865af19150503d8060008114612d31576040519150601f19603f3d011682016040523d82523d6000602084013e612d36565b606091505b5091509150818015612d60575080511580612d60575080806020019051810190612d609190613e1d565b612dc65760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610628565b505050505050565b60005b60018351612ddf91906143b2565b81101561300857600080848381518110612e0957634e487b7160e01b600052603260045260246000fd5b602002602001015185846001612e1f919061435b565b81518110612e3d57634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000612e558383613912565b509050600087612e6686600161435b565b81518110612e8457634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612eb257826000612eb6565b6000835b91509150600060028a51612eca91906143b2565b8810612ed65788612f32565b612f327f0000000000000000000000000000000000000000000000000000000000000000878c612f078c600261435b565b81518110612f2557634e487b7160e01b600052603260045260246000fd5b602002602001015161271a565b9050612f5f7f0000000000000000000000000000000000000000000000000000000000000000888861271a565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612f9c576020820181803683370190505b506040518563ffffffff1660e01b8152600401612fbc949392919061430b565b600060405180830381600087803b158015612fd657600080fd5b505af1158015612fea573d6000803e3d6000fd5b505050505050505050505080806130009061440c565b915050612dd1565b50505050565b60606002825110156130625760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f5041544800006044820152606401610628565b815167ffffffffffffffff81111561308a57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156130b3578160200160208202803683370190505b50905082816000815181106130d857634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600183516130f591906143b2565b811015612c88576000806131578786858151811061312357634e487b7160e01b600052603260045260246000fd5b602002602001015187866001613139919061435b565b81518110612bfa57634e487b7160e01b600052603260045260246000fd5b9150915061318d84848151811061317e57634e487b7160e01b600052603260045260246000fd5b602002602001015183836127bb565b8461319985600161435b565b815181106131b757634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806131d09061440c565b9150506130e7565b60005b600183516131e991906143b2565b811015612aa15760008084838151811061321357634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613229919061435b565b8151811061324757634e487b7160e01b600052603260045260246000fd5b602002602001015191509150600061325f8383613912565b509050600061328f7f0000000000000000000000000000000000000000000000000000000000000000858561271a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133089190613e39565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614613342578284613345565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b15801561338e57600080fd5b505afa1580156133a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c69190613e87565b6133d091906143b2565b95506133dd8683836127bb565b945050505050600080856001600160a01b0316886001600160a01b0316146134075782600061340b565b6000835b91509150600060028c5161341f91906143b2565b8a1061342b578a61345c565b61345c7f0000000000000000000000000000000000000000000000000000000000000000898e612f078e600261435b565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f9061349e908690869086906024810161430b565b600060405180830381600087803b1580156134b857600080fd5b505af11580156134cc573d6000803e3d6000fd5b50505050856001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561350b57600080fd5b505af115801561351f573d6000803e3d6000fd5b5050505050505050505050505080806135379061440c565b9150506131db565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a439059060440160206040518083038186803b1580156135b157600080fd5b505afa1580156135c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e99190613b7a565b6001600160a01b031614156136a457604051630f7a9d9960e21b81526001600160a01b0389811660048301528881166024830152600a60448301527f00000000000000000000000000000000000000000000000000000000000000001690633dea766490606401602060405180830381600087803b15801561366a57600080fd5b505af115801561367e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a29190613b7a565b505b6000806136d27f00000000000000000000000000000000000000000000000000000000000000008b8b613a0a565b915091508160001480156136e4575080155b156136f45787935086925061378a565b6000613701898484613872565b9050878111613735578581101561372a5760405162461bcd60e51b81526004016106289061428e565b889450925082613788565b6000613742898486613872565b90508981111561376257634e487b7160e01b600052600160045260246000fd5b878110156137825760405162461bcd60e51b815260040161062890614248565b94508793505b505b5050965096945050505050565b60008084116137fd5760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4f60448201526b155514155517d05353d5539560a21b6064820152608401610628565b60008311801561380d5750600082115b6138295760405162461bcd60e51b815260040161062890614200565b60006138358585614393565b613841906103e8614393565b9050600061384f86856143b2565b61385b906103e5614393565b90506138678183614373565b6127b190600161435b565b60008084116138d15760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f416044820152641353d5539560da1b6064820152608401610628565b6000831180156138e15750600082115b6138fd5760405162461bcd60e51b815260040161062890614200565b826139088386614393565b6105fd9190614373565b600080826001600160a01b0316846001600160a01b031614156139855760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b6064820152608401610628565b826001600160a01b0316846001600160a01b0316106139a55782846139a8565b83835b90925090506001600160a01b038216613a035760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a205a45524f5f4144445245535300006044820152606401610628565b9250929050565b6000806000613a198585613912565b509050600080613a2a88888861271a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a6257600080fd5b505afa158015613a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9a9190613e39565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613ad1578082613ad4565b81815b90999098509650505050505050565b8035613aee81614453565b919050565b60008083601f840112613b04578081fd5b50813567ffffffffffffffff811115613b1b578182fd5b6020830191508360208260051b8501011115613a0357600080fd5b80516001600160701b0381168114613aee57600080fd5b803560ff81168114613aee57600080fd5b600060208284031215613b6f578081fd5b8135610b2c81614453565b600060208284031215613b8b578081fd5b8151610b2c81614453565b600080600080600080600060e0888a031215613bb0578283fd5b8735613bbb81614453565b96506020880135613bcb81614453565b955060408801359450606088013593506080880135925060a0880135613bf081614453565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215613c28578384fd5b8b35613c3381614453565b9a5060208c0135613c4381614453565b995060408c0135985060608c0135975060808c0135965060a08c0135613c6881614453565b955060c08c0135945060e08c0135613c7f8161446b565b9350613c8e6101008d01613b4d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215613ccc578384fd5b8835613cd781614453565b97506020890135613ce781614453565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d1381614453565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215613d43578182fd5b8635613d4e81614453565b95506020870135945060408701359350606087013592506080870135613d7381614453565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215613da7578384fd5b8a35613db281614453565b995060208b0135985060408b0135975060608b0135965060808b0135613dd781614453565b955060a08b0135945060c08b0135613dee8161446b565b9350613dfc60e08c01613b4d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215613e2e578081fd5b8151610b2c8161446b565b600080600060608486031215613e4d578081fd5b613e5684613b36565b9250613e6460208501613b36565b9150604084015163ffffffff81168114613e7c578182fd5b809150509250925092565b600060208284031215613e98578081fd5b5051919050565b600080600080600060808688031215613eb6578283fd5b85359450602086013567ffffffffffffffff811115613ed3578384fd5b613edf88828901613af3565b9095509350506040860135613ef381614453565b949793965091946060013592915050565b60008060408385031215613f16578182fd5b8235915060208084013567ffffffffffffffff80821115613f35578384fd5b818601915086601f830112613f48578384fd5b813581811115613f5a57613f5a61443d565b8060051b604051601f19603f83011681018181108582111715613f7f57613f7f61443d565b604052828152858101935084860182860187018b1015613f9d578788fd5b8795505b83861015613fc657613fb281613ae3565b855260019590950194938601938601613fa1565b508096505050505050509250929050565b60008060408385031215613fe9578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614012578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614036578485fd5b61404289828a01613af3565b909550935050606087013561405681614453565b80925050608087013590509295509295509295565b60008060006060848603121561407f578081fd5b505081359360208301359350604090920135919050565b600082516140a88184602087016143c9565b9190910192915050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6020808252825182820181905260009190848201906040850190845b8181101561412b5783518352928401929184019160010161410f565b50909695505050505050565b6020808252602b908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b60208082526027908201527f4f6e6c794d656d6573526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b6020808252601d908201527f4f6e6c794d656d6573526f757465723a20494e56414c49445f50415448000000604082015260600190565b60208082526028908201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b60208082526018908201527f4f6e6c794d656d6573526f757465723a20455850495245440000000000000000604082015260600190565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526143448160a08501602087016143c9565b601f01601f19169190910160a00195945050505050565b6000821982111561436e5761436e614427565b500190565b60008261438e57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156143ad576143ad614427565b500290565b6000828210156143c4576143c4614427565b500390565b60005b838110156143e45781810151838201526020016143cc565b838111156130085750506000910152565b60008161440457614404614427565b506000190190565b600060001982141561442057614420614427565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461446857600080fd5b50565b801515811461446857600080fdfea2646970667358221220e16b80caf54662868f410ac6f5ebcfd4dd739e5fb13932ee3534dc043d74a0e364736f6c634300080400330000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x60806040526004361061014f5760003560e01c80635c11d795116100b6578063baa2abde1161006f578063baa2abde14610429578063c45a015514610449578063c8fd02a81461047d578063d06ca61f1461049d578063e8e33700146104bd578063ee2b3836146104dd57600080fd5b80635c11d7951461034a5780635d4093591461036a5780637ae0a825146103b657806385f8c259146103c95780638803dbee146103e9578063ad615dec1461040957600080fd5b80632a1f3f86116101085780632a1f3f86146102965780632c1baa33146102a957806338ed1739146102c95780633e0d80e5146102e957806344d2f182146102fc57806349bdd8111461031c57600080fd5b806304b4d269146101a1578063054d50d4146101db57806309d66905146102095780631dd3621b146102295780631f00ca74146102565780632195995c1461027657600080fd5b3661019c57336001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38161461019a57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ad57600080fd5b506101c16101bc366004613d88565b6104fd565b604080519283526020830191909152015b60405180910390f35b3480156101e757600080fd5b506101fb6101f636600461406b565b6105f0565b6040519081526020016101d2565b34801561021557600080fd5b506101fb610224366004613d2b565b610605565b34801561023557600080fd5b50610249610244366004613ffa565b610777565b6040516101d291906140f3565b34801561026257600080fd5b50610249610271366004613f04565b610aff565b34801561028257600080fd5b506101c1610291366004613c07565b610b33565b6102496102a4366004613e9f565b610c0c565b3480156102b557600080fd5b506101fb6102c4366004613d88565b610fbe565b3480156102d557600080fd5b506102496102e4366004613ffa565b6110ab565b61019a6102f7366004613e9f565b6111e5565b34801561030857600080fd5b506101c1610317366004613d2b565b6115fe565b61032f61032a366004613d2b565b6116f1565b604080519384526020840192909252908201526060016101d2565b34801561035657600080fd5b5061019a610365366004613ffa565b61197c565b34801561037657600080fd5b5061039e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b6040516001600160a01b0390911681526020016101d2565b6102496103c4366004613e9f565b611b8f565b3480156103d557600080fd5b506101fb6103e436600461406b565b611f5d565b3480156103f557600080fd5b50610249610404366004613ffa565b611f6a565b34801561041557600080fd5b506101fb61042436600461406b565b612035565b34801561043557600080fd5b506101c1610444366004613b96565b612042565b34801561045557600080fd5b5061039e7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f81565b34801561048957600080fd5b5061019a610498366004613ffa565b612228565b3480156104a957600080fd5b506102496104b8366004613f04565b61247a565b3480156104c957600080fd5b5061032f6104d8366004613cb0565b6124a7565b3480156104e957600080fd5b506102496104f8366004613ffa565b6125b4565b600080600061054d7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861271a565b905060008761055c578c610560565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061059b903390309086908f908e908e908e906004016140b2565b600060405180830381600087803b1580156105b557600080fd5b505af11580156105c9573d6000803e3d6000fd5b505050506105db8e8e8e8e8e8e6115fe565b909f909e509c50505050505050505050505050565b60006105fd8484846127bb565b949350505050565b600081428110156106315760405162461bcd60e51b8152600401610628906142d4565b60405180910390fd5b610660887f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388989893089612042565b6040516370a0823160e01b81523060048201529093506106e89150899086906001600160a01b038316906370a082319060240160206040518083038186803b1580156106ab57600080fd5b505afa1580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190613e87565b61289a565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561074a57600080fd5b505af115801561075e573d6000803e3d6000fd5b5050505061076c84836129cb565b509695505050505050565b6060814281101561079a5760405162461bcd60e51b8152600401610628906142d4565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad381686866107d16001826143b2565b8181106107ee57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108039190613b5e565b6001600160a01b0316146108295760405162461bcd60e51b8152600401610628906141c9565b6108877f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612aa692505050565b915086826000815181106108ab57634e487b7160e01b600052603260045260246000fd5b602002602001015111156108d15760405162461bcd60e51b815260040161062890614182565b6109ce868660008181106108f557634e487b7160e01b600052603260045260246000fd5b905060200201602081019061090a9190613b5e565b336109a07f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8a8a600081811061095057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109659190613b5e565b8b8b600181811061098657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061099b9190613b5e565b61271a565b856000815181106109c157634e487b7160e01b600052603260045260246000fd5b6020026020010151612c90565b610a0d82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612dce915050565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316632e1a7d4d8360018551610a4b91906143b2565b81518110610a6957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610a8f91815260200190565b600060405180830381600087803b158015610aa957600080fd5b505af1158015610abd573d6000803e3d6000fd5b5050505061076c848360018551610ad491906143b2565b81518110610af257634e487b7160e01b600052603260045260246000fd5b60200260200101516129cb565b6060610b2c7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8484612aa6565b9392505050565b6000806000610b637f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8f8f61271a565b9050600087610b72578c610b76565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610bb1903390309086908f908e908e908e906004016140b2565b600060405180830381600087803b158015610bcb57600080fd5b505af1158015610bdf573d6000803e3d6000fd5b50505050610bf28f8f8f8f8f8f8f612042565b809450819550505050509b509b9950505050505050505050565b60608142811015610c2f5760405162461bcd60e51b8152600401610628906142d4565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031686866000818110610c7a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c8f9190613b5e565b6001600160a01b031614610cb55760405162461bcd60e51b8152600401610628906141c9565b610d137f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f3488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300e92505050565b9150868260018451610d2591906143b2565b81518110610d4357634e487b7160e01b600052603260045260246000fd5b60200260200101511015610d695760405162461bcd60e51b815260040161062890614137565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db083600081518110610db957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015610dec57600080fd5b505af1158015610e00573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb610eaf7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f89896000818110610e7957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e8e9190613b5e565b8a8a600181811061098657634e487b7160e01b600052603260045260246000fd5b84600081518110610ed057634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401610f099291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190613e1d565b610f7557634e487b7160e01b600052600160045260246000fd5b610fb482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dce915050565b5095945050505050565b60008061100c7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8d7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861271a565b905060008661101b578b61101f565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061105a903390309086908e908d908d908d906004016140b2565b600060405180830381600087803b15801561107457600080fd5b505af1158015611088573d6000803e3d6000fd5b5050505061109a8d8d8d8d8d8d610605565b9d9c50505050505050505050505050565b606081428110156110ce5760405162461bcd60e51b8152600401610628906142d4565b61112c7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300e92505050565b915086826001845161113e91906143b2565b8151811061115c57634e487b7160e01b600052603260045260246000fd5b602002602001015110156111825760405162461bcd60e51b815260040161062890614137565b6111a6868660008181106108f557634e487b7160e01b600052603260045260246000fd5b61076c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dce915050565b80428110156112065760405162461bcd60e51b8152600401610628906142d4565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b03168585600081811061125157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906112669190613b5e565b6001600160a01b03161461128c5760405162461bcd60e51b8152600401610628906141c9565b60003490507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb6113797f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f89896000818110610e7957634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190613e1d565b61141357634e487b7160e01b600052600160045260246000fd5b600086866114226001826143b2565b81811061143f57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114549190613b5e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561149757600080fd5b505afa1580156114ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cf9190613e87565b905061150f8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506131d8915050565b8781888861151e6001826143b2565b81811061153b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115509190613b5e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b60206040518083038186803b15801561159457600080fd5b505afa1580156115a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cc9190613e87565b6115d691906143b2565b10156115f45760405162461bcd60e51b815260040161062890614137565b5050505050505050565b60008082428110156116225760405162461bcd60e51b8152600401610628906142d4565b611651897f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388a8a8a308a612042565b909350915061166189868561289a565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156116c357600080fd5b505af11580156116d7573d6000803e3d6000fd5b505050506116e585836129cb565b50965096945050505050565b600080600083428110156117175760405162461bcd60e51b8152600401610628906142d4565b6117458a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388b348c8c61353f565b909450925060006117977f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8c7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861271a565b90506117a58b338388612c90565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561180057600080fd5b505af1158015611814573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816935063a9059cbb92506044019050602060405180830381600087803b15801561188457600080fd5b505af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613e1d565b6118d657634e487b7160e01b600052600160045260246000fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561191957600080fd5b505af115801561192d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119519190613e87565b92508334111561196e5761196e3361196986346143b2565b6129cb565b505096509650969350505050565b804281101561199d5760405162461bcd60e51b8152600401610628906142d4565b611a22858560008181106119c157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119d69190613b5e565b33611a1c7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f89896000818110610e7957634e487b7160e01b600052603260045260246000fd5b8a612c90565b60008585611a316001826143b2565b818110611a4e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611a639190613b5e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade9190613e87565b9050611b1e8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892506131d8915050565b86818787611b2d6001826143b2565b818110611b4a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611b5f9190613b5e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a082319060240161157c565b60608142811015611bb25760405162461bcd60e51b8152600401610628906142d4565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031686866000818110611bfd57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c129190613b5e565b6001600160a01b031614611c385760405162461bcd60e51b8152600401610628906141c9565b611c967f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f88888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612aa692505050565b91503482600081518110611cba57634e487b7160e01b600052603260045260246000fd5b60200260200101511115611ce05760405162461bcd60e51b815260040161062890614182565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db083600081518110611d3057634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6357600080fd5b505af1158015611d77573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb611df07f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f89896000818110610e7957634e487b7160e01b600052603260045260246000fd5b84600081518110611e1157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611e4a9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190613e1d565b611eb657634e487b7160e01b600052600160045260246000fd5b611ef582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dce915050565b81600081518110611f1657634e487b7160e01b600052603260045260246000fd5b6020026020010151341115610fb457610fb43383600081518110611f4a57634e487b7160e01b600052603260045260246000fd5b60200260200101513461196991906143b2565b60006105fd848484613797565b60608142811015611f8d5760405162461bcd60e51b8152600401610628906142d4565b611feb7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612aa692505050565b9150868260008151811061200f57634e487b7160e01b600052603260045260246000fd5b602002602001015111156111825760405162461bcd60e51b815260040161062890614182565b60006105fd848484613872565b60008082428110156120665760405162461bcd60e51b8152600401610628906142d4565b60006120937f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8c8c61271a565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c9190613e1d565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561216457600080fd5b505af1158015612178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219c9190613fd7565b9150915060006121ac8e8e613912565b509050806001600160a01b03168e6001600160a01b0316146121cf5781836121d2565b82825b90975095508a8710156121f75760405162461bcd60e51b815260040161062890614248565b898610156122175760405162461bcd60e51b81526004016106289061428e565b505050505097509795505050505050565b80428110156122495760405162461bcd60e51b8152600401610628906142d4565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad381685856122806001826143b2565b81811061229d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906122b29190613b5e565b6001600160a01b0316146122d85760405162461bcd60e51b8152600401610628906141c9565b6122fc858560008181106119c157634e487b7160e01b600052603260045260246000fd5b61233a8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506131d8915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316906370a082319060240160206040518083038186803b15801561239c57600080fd5b505afa1580156123b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d49190613e87565b9050868110156123f65760405162461bcd60e51b815260040161062890614137565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561245857600080fd5b505af115801561246c573d6000803e3d6000fd5b505050506115f484826129cb565b6060610b2c7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f848461300e565b600080600083428110156124cd5760405162461bcd60e51b8152600401610628906142d4565b6124db8c8c8c8c8c8c61353f565b9094509250600061250d7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8e8e61271a565b905061251b8d338388612c90565b6125278c338387612c90565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a29190613e87565b92505050985098509895505050505050565b606081428110156125d75760405162461bcd60e51b8152600401610628906142d4565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816868661260e6001826143b2565b81811061262b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126409190613b5e565b6001600160a01b0316146126665760405162461bcd60e51b8152600401610628906141c9565b6126c47f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300e92505050565b91508682600184516126d691906143b2565b815181106126f457634e487b7160e01b600052603260045260246000fd5b602002602001015110156108d15760405162461bcd60e51b815260040161062890614137565b60008060006127298585613912565b60405163e6a4390560e01b81526001600160a01b03808416600483015280831660248301529294509092509087169063e6a439059060440160206040518083038186803b15801561277957600080fd5b505afa15801561278d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b19190613b7a565b9695505050505050565b60008084116128205760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4960448201526a1394155517d05353d5539560aa1b6064820152608401610628565b6000831180156128305750600082115b61284c5760405162461bcd60e51b815260040161062890614200565b600061285a856103e5614393565b905060006128688483614393565b9050600082612879876103e8614393565b612883919061435b565b905061288f8183614373565b979650505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916128f69190614096565b6000604051808303816000865af19150503d8060008114612933576040519150601f19603f3d011682016040523d82523d6000602084013e612938565b606091505b50915091508180156129625750805115806129625750808060200190518101906129629190613e1d565b6129c45760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610628565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516129f59190614096565b60006040518083038185875af1925050503d8060008114612a32576040519150601f19603f3d011682016040523d82523d6000602084013e612a37565b606091505b5050905080612aa15760405162461bcd60e51b815260206004820152603060248201527f5472616e7366657248656c7065723a3a736166655472616e73666572533a205360448201526f081d1c985b9cd9995c8819985a5b195960821b6064820152608401610628565b505050565b6060600282511015612afa5760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f5041544800006044820152606401610628565b815167ffffffffffffffff811115612b2257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612b4b578160200160208202803683370190505b509050828160018351612b5e91906143b2565b81518110612b7c57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050600060018351612b9891906143b2565b90505b8015612c8857600080612c078786612bb46001876143b2565b81518110612bd257634e487b7160e01b600052603260045260246000fd5b6020026020010151878681518110612bfa57634e487b7160e01b600052603260045260246000fd5b6020026020010151613a0a565b91509150612c3d848481518110612c2e57634e487b7160e01b600052603260045260246000fd5b60200260200101518383613797565b84612c496001866143b2565b81518110612c6757634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080612c80906143f5565b915050612b9b565b509392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612cf49190614096565b6000604051808303816000865af19150503d8060008114612d31576040519150601f19603f3d011682016040523d82523d6000602084013e612d36565b606091505b5091509150818015612d60575080511580612d60575080806020019051810190612d609190613e1d565b612dc65760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610628565b505050505050565b60005b60018351612ddf91906143b2565b81101561300857600080848381518110612e0957634e487b7160e01b600052603260045260246000fd5b602002602001015185846001612e1f919061435b565b81518110612e3d57634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000612e558383613912565b509050600087612e6686600161435b565b81518110612e8457634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612eb257826000612eb6565b6000835b91509150600060028a51612eca91906143b2565b8810612ed65788612f32565b612f327f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f878c612f078c600261435b565b81518110612f2557634e487b7160e01b600052603260045260246000fd5b602002602001015161271a565b9050612f5f7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f888861271a565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612f9c576020820181803683370190505b506040518563ffffffff1660e01b8152600401612fbc949392919061430b565b600060405180830381600087803b158015612fd657600080fd5b505af1158015612fea573d6000803e3d6000fd5b505050505050505050505080806130009061440c565b915050612dd1565b50505050565b60606002825110156130625760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f5041544800006044820152606401610628565b815167ffffffffffffffff81111561308a57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156130b3578160200160208202803683370190505b50905082816000815181106130d857634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600183516130f591906143b2565b811015612c88576000806131578786858151811061312357634e487b7160e01b600052603260045260246000fd5b602002602001015187866001613139919061435b565b81518110612bfa57634e487b7160e01b600052603260045260246000fd5b9150915061318d84848151811061317e57634e487b7160e01b600052603260045260246000fd5b602002602001015183836127bb565b8461319985600161435b565b815181106131b757634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806131d09061440c565b9150506130e7565b60005b600183516131e991906143b2565b811015612aa15760008084838151811061321357634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613229919061435b565b8151811061324757634e487b7160e01b600052603260045260246000fd5b602002602001015191509150600061325f8383613912565b509050600061328f7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f858561271a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133089190613e39565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614613342578284613345565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b15801561338e57600080fd5b505afa1580156133a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c69190613e87565b6133d091906143b2565b95506133dd8683836127bb565b945050505050600080856001600160a01b0316886001600160a01b0316146134075782600061340b565b6000835b91509150600060028c5161341f91906143b2565b8a1061342b578a61345c565b61345c7f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f898e612f078e600261435b565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f9061349e908690869086906024810161430b565b600060405180830381600087803b1580156134b857600080fd5b505af11580156134cc573d6000803e3d6000fd5b50505050856001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561350b57600080fd5b505af115801561351f573d6000803e3d6000fd5b5050505050505050505050505080806135379061440c565b9150506131db565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f9091169063e6a439059060440160206040518083038186803b1580156135b157600080fd5b505afa1580156135c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e99190613b7a565b6001600160a01b031614156136a457604051630f7a9d9960e21b81526001600160a01b0389811660048301528881166024830152600a60448301527f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f1690633dea766490606401602060405180830381600087803b15801561366a57600080fd5b505af115801561367e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a29190613b7a565b505b6000806136d27f0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f8b8b613a0a565b915091508160001480156136e4575080155b156136f45787935086925061378a565b6000613701898484613872565b9050878111613735578581101561372a5760405162461bcd60e51b81526004016106289061428e565b889450925082613788565b6000613742898486613872565b90508981111561376257634e487b7160e01b600052600160045260246000fd5b878110156137825760405162461bcd60e51b815260040161062890614248565b94508793505b505b5050965096945050505050565b60008084116137fd5760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4f60448201526b155514155517d05353d5539560a21b6064820152608401610628565b60008311801561380d5750600082115b6138295760405162461bcd60e51b815260040161062890614200565b60006138358585614393565b613841906103e8614393565b9050600061384f86856143b2565b61385b906103e5614393565b90506138678183614373565b6127b190600161435b565b60008084116138d15760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f416044820152641353d5539560da1b6064820152608401610628565b6000831180156138e15750600082115b6138fd5760405162461bcd60e51b815260040161062890614200565b826139088386614393565b6105fd9190614373565b600080826001600160a01b0316846001600160a01b031614156139855760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b6064820152608401610628565b826001600160a01b0316846001600160a01b0316106139a55782846139a8565b83835b90925090506001600160a01b038216613a035760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a205a45524f5f4144445245535300006044820152606401610628565b9250929050565b6000806000613a198585613912565b509050600080613a2a88888861271a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a6257600080fd5b505afa158015613a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9a9190613e39565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613ad1578082613ad4565b81815b90999098509650505050505050565b8035613aee81614453565b919050565b60008083601f840112613b04578081fd5b50813567ffffffffffffffff811115613b1b578182fd5b6020830191508360208260051b8501011115613a0357600080fd5b80516001600160701b0381168114613aee57600080fd5b803560ff81168114613aee57600080fd5b600060208284031215613b6f578081fd5b8135610b2c81614453565b600060208284031215613b8b578081fd5b8151610b2c81614453565b600080600080600080600060e0888a031215613bb0578283fd5b8735613bbb81614453565b96506020880135613bcb81614453565b955060408801359450606088013593506080880135925060a0880135613bf081614453565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215613c28578384fd5b8b35613c3381614453565b9a5060208c0135613c4381614453565b995060408c0135985060608c0135975060808c0135965060a08c0135613c6881614453565b955060c08c0135945060e08c0135613c7f8161446b565b9350613c8e6101008d01613b4d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215613ccc578384fd5b8835613cd781614453565b97506020890135613ce781614453565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d1381614453565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215613d43578182fd5b8635613d4e81614453565b95506020870135945060408701359350606087013592506080870135613d7381614453565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215613da7578384fd5b8a35613db281614453565b995060208b0135985060408b0135975060608b0135965060808b0135613dd781614453565b955060a08b0135945060c08b0135613dee8161446b565b9350613dfc60e08c01613b4d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215613e2e578081fd5b8151610b2c8161446b565b600080600060608486031215613e4d578081fd5b613e5684613b36565b9250613e6460208501613b36565b9150604084015163ffffffff81168114613e7c578182fd5b809150509250925092565b600060208284031215613e98578081fd5b5051919050565b600080600080600060808688031215613eb6578283fd5b85359450602086013567ffffffffffffffff811115613ed3578384fd5b613edf88828901613af3565b9095509350506040860135613ef381614453565b949793965091946060013592915050565b60008060408385031215613f16578182fd5b8235915060208084013567ffffffffffffffff80821115613f35578384fd5b818601915086601f830112613f48578384fd5b813581811115613f5a57613f5a61443d565b8060051b604051601f19603f83011681018181108582111715613f7f57613f7f61443d565b604052828152858101935084860182860187018b1015613f9d578788fd5b8795505b83861015613fc657613fb281613ae3565b855260019590950194938601938601613fa1565b508096505050505050509250929050565b60008060408385031215613fe9578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614012578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614036578485fd5b61404289828a01613af3565b909550935050606087013561405681614453565b80925050608087013590509295509295509295565b60008060006060848603121561407f578081fd5b505081359360208301359350604090920135919050565b600082516140a88184602087016143c9565b9190910192915050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6020808252825182820181905260009190848201906040850190845b8181101561412b5783518352928401929184019160010161410f565b50909695505050505050565b6020808252602b908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b60208082526027908201527f4f6e6c794d656d6573526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b6020808252601d908201527f4f6e6c794d656d6573526f757465723a20494e56414c49445f50415448000000604082015260600190565b60208082526028908201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b60208082526018908201527f4f6e6c794d656d6573526f757465723a20455850495245440000000000000000604082015260600190565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526143448160a08501602087016143c9565b601f01601f19169190910160a00195945050505050565b6000821982111561436e5761436e614427565b500190565b60008261438e57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156143ad576143ad614427565b500290565b6000828210156143c4576143c4614427565b500390565b60005b838110156143e45781810151838201526020016143cc565b838111156130085750506000910152565b60008161440457614404614427565b506000190190565b600060001982141561442057614420614427565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461446857600080fd5b50565b801515811461446857600080fdfea2646970667358221220e16b80caf54662868f410ac6f5ebcfd4dd739e5fb13932ee3534dc043d74a0e364736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _factory (address): 0x6a71b4bF806756776B2399F98f4Ba72A40aF9a6f
Arg [1] : _WS (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006a71b4bf806756776b2399f98f4ba72a40af9a6f
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.