Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Liquidity | 2429754 | 23 days ago | IN | 0 S | 0.00713146 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
OnlyMemesRouter
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun 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); } (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)); } } 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 ) 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"; import "contracts/interfaces/IVoter.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; function setPID(uint256 pid) external; function setFeeAddresses(IVoter, 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 IVoter { function isBribeWhitelisted(address token) external view returns (bool); function setWhitelistedBribe(address token, bool status) external; function bribe(uint256 pid, address reward, uint256 amount) external; function _lastEpoch() external view returns (uint256); function _epochLength() external view returns(uint256); function _unlockTokens(address owner) external; }
// 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"); } // checks if pair exists 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" ); } }
{ "evmVersion": "cancun", "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
[{"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
60c060405234801561000f575f5ffd5b5060405161409838038061409883398101604081905261002e91610060565b6001600160a01b039182166080521660a052610091565b80516001600160a01b038116811461005b575f5ffd5b919050565b5f5f60408385031215610071575f5ffd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051613e7a61021e5f395f818161015a0152818161035d015281816104ff01528181610604015281816106ba0152818161075b0152818161096c01528181610b6601528181610c8201528181610d0b01528181610e9e01528181611098015281816111130152818161118301528181611434015281816114830152818161152201528181611577015281816115ab0152818161163c0152818161193501528181611a4401528181611acd01528181611f0b01528181611feb01528181612094015261224f01525f8181610437015281816104dd015281816107d70152818161089a01528181610a4201528181610a7901528181610be001528181610d3d01528181610e7c01528181610f82015281816111b5015281816115550152818161179b015281816119af01528181611aff01528181611c8301528181611d4b0152818161210401528181612167015281816122cb01528181612a7d01528181612acd01528181612d6d01528181612f0b01528181612fe70152818161308701526130fa0152613e7a5ff3fe60806040526004361061014a575f3560e01c80635c11d795116100b3578063baa2abde1161006d578063baa2abde14610407578063c45a015514610426578063c8fd02a814610459578063d06ca61f14610478578063e8e3370014610497578063ee2b3836146104b6575f5ffd5b80635c11d7951461032d5780635d4093591461034c5780637ae0a8251461039757806385f8c259146103aa5780638803dbee146103c9578063ad615dec146103e8575f5ffd5b80632a1f3f86116101045780632a1f3f861461027c5780632c1baa331461028f57806338ed1739146102ae5780633e0d80e5146102cd57806344d2f182146102e057806349bdd811146102ff575f5ffd5b806304b4d2691461018d578063054d50d4146101c657806309d66905146101f35780631dd3621b146102125780631f00ca741461023e5780632195995c1461025d575f5ffd5b3661018957336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018757610187613502565b005b5f5ffd5b348015610198575f5ffd5b506101ac6101a736600461355a565b6104d5565b604080519283526020830191909152015b60405180910390f35b3480156101d1575f5ffd5b506101e56101e03660046135ed565b6105bf565b6040519081526020016101bd565b3480156101fe575f5ffd5b506101e561020d366004613616565b6105d3565b34801561021d575f5ffd5b5061023161022c3660046136b1565b61072e565b6040516101bd919061371f565b348015610249575f5ffd5b50610231610258366004613775565b610a3b565b348015610268575f5ffd5b506101ac61027736600461384c565b610a71565b61023161028a3660046138f4565b610b41565b34801561029a575f5ffd5b506101e56102a936600461355a565b610e75565b3480156102b9575f5ffd5b506102316102c83660046136b1565b610f5a565b6101876102db3660046138f4565b611075565b3480156102eb575f5ffd5b506101ac6102fa366004613616565b61140b565b61031261030d366004613616565b6114f8565b604080519384526020840192909252908201526060016101bd565b348015610338575f5ffd5b506101876103473660046136b1565b61174a565b348015610357575f5ffd5b5061037f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bd565b6102316103a53660046138f4565b611910565b3480156103b5575f5ffd5b506101e56103c43660046135ed565b611c4f565b3480156103d4575f5ffd5b506102316103e33660046136b1565b611c5b565b3480156103f3575f5ffd5b506101e56104023660046135ed565b611d16565b348015610412575f5ffd5b506101ac610421366004613956565b611d22565b348015610431575f5ffd5b5061037f7f000000000000000000000000000000000000000000000000000000000000000081565b348015610464575f5ffd5b506101876104733660046136b1565b611ee0565b348015610483575f5ffd5b50610231610492366004613775565b6120fd565b3480156104a2575f5ffd5b506103126104b13660046139c4565b61212a565b3480156104c1575f5ffd5b506102316104d03660046136b1565b612222565b5f5f5f6105237f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061236b565b90505f87610531578c610534565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061056f903390309086908f908e908e908e90600401613a3b565b5f604051808303815f87803b158015610586575f5ffd5b505af1158015610598573d5f5f3e3d5ffd5b505050506105aa8e8e8e8e8e8e61140b565b909f909e509c50505050505050505050505050565b5f6105cb8484846123f9565b949350505050565b5f81428110156105fe5760405162461bcd60e51b81526004016105f590613a7c565b60405180910390fd5b61062d887f00000000000000000000000000000000000000000000000000000000000000008989893089611d22565b6040516370a0823160e01b81523060048201529093506106a49150899086906001600160a01b038316906370a0823190602401602060405180830381865afa15801561067b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069f9190613ab3565b6124d2565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015610703575f5ffd5b505af1158015610715573d5f5f3e3d5ffd5b5050505061072384836125fe565b509695505050505050565b606081428110156107515760405162461bcd60e51b81526004016105f590613a7c565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610788600182613ade565b81811061079757610797613af1565b90506020020160208101906107ac9190613b05565b6001600160a01b0316146107d25760405162461bcd60e51b81526004016105f590613b27565b61082f7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506126d592505050565b915086825f8151811061084457610844613af1565b6020026020010151111561086a5760405162461bcd60e51b81526004016105f590613b5e565b61092c86865f81811061087f5761087f613af1565b90506020020160208101906108949190613b05565b3361090d7f00000000000000000000000000000000000000000000000000000000000000008a8a5f8181106108cb576108cb613af1565b90506020020160208101906108e09190613b05565b8b8b60018181106108f3576108f3613af1565b90506020020160208101906109089190613b05565b61236b565b855f8151811061091f5761091f613af1565b6020026020010151612869565b61096a828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152503092506129a2915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d83600185516109a89190613ade565b815181106109b8576109b8613af1565b60200260200101516040518263ffffffff1660e01b81526004016109de91815260200190565b5f604051808303815f87803b1580156109f5575f5ffd5b505af1158015610a07573d5f5f3e3d5ffd5b50505050610723848360018551610a1e9190613ade565b81518110610a2e57610a2e613af1565b60200260200101516125fe565b6060610a687f000000000000000000000000000000000000000000000000000000000000000084846126d5565b90505b92915050565b5f5f5f610a9f7f00000000000000000000000000000000000000000000000000000000000000008f8f61236b565b90505f87610aad578c610ab0565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610aeb903390309086908f908e908e908e90600401613a3b565b5f604051808303815f87803b158015610b02575f5ffd5b505af1158015610b14573d5f5f3e3d5ffd5b50505050610b278f8f8f8f8f8f8f611d22565b809450819550505050509b509b9950505050505050505050565b60608142811015610b645760405162461bcd60e51b81526004016105f590613a7c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f818110610ba057610ba0613af1565b9050602002016020810190610bb59190613b05565b6001600160a01b031614610bdb5760405162461bcd60e51b81526004016105f590613b27565b610c387f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b9592505050565b9150868260018451610c4a9190613ade565b81518110610c5a57610c5a613af1565b60200260200101511015610c805760405162461bcd60e51b81526004016105f590613ba5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0835f81518110610cc157610cc1613af1565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015610cf2575f5ffd5b505af1158015610d04573d5f5f3e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb610d967f000000000000000000000000000000000000000000000000000000000000000089895f818110610d6e57610d6e613af1565b9050602002016020810190610d839190613b05565b8a8a60018181106108f3576108f3613af1565b845f81518110610da857610da8613af1565b60200260200101516040518363ffffffff1660e01b8152600401610de19291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af1158015610dfd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e219190613bf0565b610e2d57610e2d613502565b610e6b828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129a2915050565b5095945050505050565b5f5f610ec27f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061236b565b90505f86610ed0578b610ed3565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f0e903390309086908e908d908d908d90600401613a3b565b5f604051808303815f87803b158015610f25575f5ffd5b505af1158015610f37573d5f5f3e3d5ffd5b50505050610f498d8d8d8d8d8d6105d3565b9d9c50505050505050505050505050565b60608142811015610f7d5760405162461bcd60e51b81526004016105f590613a7c565b610fda7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b9592505050565b9150868260018451610fec9190613ade565b81518110610ffc57610ffc613af1565b602002602001015110156110225760405162461bcd60e51b81526004016105f590613ba5565b61103786865f81811061087f5761087f613af1565b610723828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129a2915050565b80428110156110965760405162461bcd60e51b81526004016105f590613a7c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685855f8181106110d2576110d2613af1565b90506020020160208101906110e79190613b05565b6001600160a01b03161461110d5760405162461bcd60e51b81526004016105f590613b27565b5f3490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561116a575f5ffd5b505af115801561117c573d5f5f3e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6111e67f000000000000000000000000000000000000000000000000000000000000000089895f818110610d6e57610d6e613af1565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611230573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112549190613bf0565b61126057611260613502565b5f868661126e600182613ade565b81811061127d5761127d613af1565b90506020020160208101906112929190613b05565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156112d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112fc9190613ab3565b905061133b8787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250612cfc915050565b8781888861134a600182613ade565b81811061135957611359613af1565b905060200201602081019061136e9190613b05565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156113b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d99190613ab3565b6113e39190613ade565b10156114015760405162461bcd60e51b81526004016105f590613ba5565b5050505050505050565b5f5f824281101561142e5760405162461bcd60e51b81526004016105f590613a7c565b61145d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611d22565b909350915061146d8986856124d2565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156114cc575f5ffd5b505af11580156114de573d5f5f3e3d5ffd5b505050506114ec85836125fe565b50965096945050505050565b5f5f5f834281101561151c5760405162461bcd60e51b81526004016105f590613a7c565b61154a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c612fba565b90945092505f61159b7f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061236b565b90506115a98b338388612869565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015611602575f5ffd5b505af1158015611614573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303815f875af1158015611686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613bf0565b6116b6576116b6613502565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156116fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171f9190613ab3565b92508334111561173c5761173c336117378634613ade565b6125fe565b505096509650969350505050565b804281101561176b5760405162461bcd60e51b81526004016105f590613a7c565b6117d285855f81811061178057611780613af1565b90506020020160208101906117959190613b05565b336117cc7f000000000000000000000000000000000000000000000000000000000000000089895f818110610d6e57610d6e613af1565b8a612869565b5f85856117e0600182613ade565b8181106117ef576117ef613af1565b90506020020160208101906118049190613b05565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561184a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186e9190613ab3565b90506118ad8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250889250612cfc915050565b868187876118bc600182613ade565b8181106118cb576118cb613af1565b90506020020160208101906118e09190613b05565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a082319060240161139a565b606081428110156119335760405162461bcd60e51b81526004016105f590613a7c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f81811061196f5761196f613af1565b90506020020160208101906119849190613b05565b6001600160a01b0316146119aa5760405162461bcd60e51b81526004016105f590613b27565b611a077f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506126d592505050565b915034825f81518110611a1c57611a1c613af1565b60200260200101511115611a425760405162461bcd60e51b81526004016105f590613b5e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0835f81518110611a8357611a83613af1565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015611ab4575f5ffd5b505af1158015611ac6573d5f5f3e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611b307f000000000000000000000000000000000000000000000000000000000000000089895f818110610d6e57610d6e613af1565b845f81518110611b4257611b42613af1565b60200260200101516040518363ffffffff1660e01b8152600401611b7b9291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af1158015611b97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbb9190613bf0565b611bc757611bc7613502565b611c05828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129a2915050565b815f81518110611c1757611c17613af1565b6020026020010151341115610e6b57610e6b33835f81518110611c3c57611c3c613af1565b6020026020010151346117379190613ade565b5f6105cb8484846131d4565b60608142811015611c7e5760405162461bcd60e51b81526004016105f590613a7c565b611cdb7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506126d592505050565b915086825f81518110611cf057611cf0613af1565b602002602001015111156110225760405162461bcd60e51b81526004016105f590613b5e565b5f6105cb8484846132aa565b5f5f8242811015611d455760405162461bcd60e51b81526004016105f590613a7c565b5f611d717f00000000000000000000000000000000000000000000000000000000000000008c8c61236b565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af1158015611dc4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de89190613bf0565b5060405163226bf2d160e21b81526001600160a01b0387811660048301525f9182918416906389afcb449060240160408051808303815f875af1158015611e31573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e559190613c0b565b915091505f611e648e8e613347565b509050806001600160a01b03168e6001600160a01b031614611e87578183611e8a565b82825b90975095508a871015611eaf5760405162461bcd60e51b81526004016105f590613c2d565b89861015611ecf5760405162461bcd60e51b81526004016105f590613c73565b505050505097509795505050505050565b8042811015611f015760405162461bcd60e51b81526004016105f590613a7c565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611f38600182613ade565b818110611f4757611f47613af1565b9050602002016020810190611f5c9190613b05565b6001600160a01b031614611f825760405162461bcd60e51b81526004016105f590613b27565b611f9785855f81811061178057611780613af1565b611fd48585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250612cfc915050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612038573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205c9190613ab3565b90508681101561207e5760405162461bcd60e51b81526004016105f590613ba5565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156120dd575f5ffd5b505af11580156120ef573d5f5f3e3d5ffd5b5050505061140184826125fe565b6060610a687f00000000000000000000000000000000000000000000000000000000000000008484612b95565b5f5f5f834281101561214e5760405162461bcd60e51b81526004016105f590613a7c565b61215c8c8c8c8c8c8c612fba565b90945092505f61218d7f00000000000000000000000000000000000000000000000000000000000000008e8e61236b565b905061219b8d338388612869565b6121a78c338387612869565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156121ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122109190613ab3565b92505050985098509895505050505050565b606081428110156122455760405162461bcd60e51b81526004016105f590613a7c565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661227c600182613ade565b81811061228b5761228b613af1565b90506020020160208101906122a09190613b05565b6001600160a01b0316146122c65760405162461bcd60e51b81526004016105f590613b27565b6123237f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b9592505050565b91508682600184516123359190613ade565b8151811061234557612345613af1565b6020026020010151101561086a5760405162461bcd60e51b81526004016105f590613ba5565b5f5f5f6123788585613347565b60405163e6a4390560e01b81526001600160a01b03808416600483015280831660248301529294509092509087169063e6a4390590604401602060405180830381865afa1580156123cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ef9190613cb9565b9695505050505050565b5f5f841161245d5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4960448201526a1394155517d05353d5539560aa1b60648201526084016105f5565b5f8311801561246b57505f82115b6124875760405162461bcd60e51b81526004016105f590613cd4565b5f612494856103e5613d1c565b90505f6124a18483613d1c565b90505f826124b1876103e8613d1c565b6124bb9190613d33565b90506124c78183613d46565b979650505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161252d9190613d65565b5f604051808303815f865af19150503d805f8114612566576040519150601f19603f3d011682016040523d82523d5f602084013e61256b565b606091505b50915091508180156125955750805115806125955750808060200190518101906125959190613bf0565b6125f75760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016105f5565b5050505050565b604080515f808252602082019092526001600160a01b0384169083906040516126279190613d65565b5f6040518083038185875af1925050503d805f8114612661576040519150601f19603f3d011682016040523d82523d5f602084013e612666565b606091505b50509050806126d05760405162461bcd60e51b815260206004820152603060248201527f5472616e7366657248656c7065723a3a736166655472616e73666572533a205360448201526f081d1c985b9cd9995c8819985a5b195960821b60648201526084016105f5565b505050565b60606002825110156127295760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f50415448000060448201526064016105f5565b815167ffffffffffffffff81111561274357612743613761565b60405190808252806020026020018201604052801561276c578160200160208202803683370190505b50905082816001835161277f9190613ade565b8151811061278f5761278f613af1565b6020026020010181815250505f600183516127aa9190613ade565b90505b8015612861575f806127fc87866127c5600187613ade565b815181106127d5576127d5613af1565b60200260200101518786815181106127ef576127ef613af1565b602002602001015161343d565b9150915061282484848151811061281557612815613af1565b602002602001015183836131d4565b84612830600186613ade565b8151811061284057612840613af1565b6020026020010181815250505050808061285990613d7b565b9150506127ad565b509392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f928392908816916128cc9190613d65565b5f604051808303815f865af19150503d805f8114612905576040519150601f19603f3d011682016040523d82523d5f602084013e61290a565b606091505b50915091508180156129345750805115806129345750808060200190518101906129349190613bf0565b61299a5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016105f5565b505050505050565b5f5b600183516129b29190613ade565b811015612b8f575f5f8483815181106129cd576129cd613af1565b6020026020010151858460016129e39190613d33565b815181106129f3576129f3613af1565b6020026020010151915091505f612a0a8383613347565b5090505f87612a1a866001613d33565b81518110612a2a57612a2a613af1565b602002602001015190505f5f836001600160a01b0316866001600160a01b031614612a5657825f612a59565b5f835b915091505f60028a51612a6c9190613ade565b8810612a785788612ac6565b612ac67f0000000000000000000000000000000000000000000000000000000000000000878c612aa98c6002613d33565b81518110612ab957612ab9613af1565b602002602001015161236b565b9050612af37f0000000000000000000000000000000000000000000000000000000000000000888861236b565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015612b2f576020820181803683370190505b506040518563ffffffff1660e01b8152600401612b4f9493929190613d90565b5f604051808303815f87803b158015612b66575f5ffd5b505af1158015612b78573d5f5f3e3d5ffd5b5050600190990198506129a4975050505050505050565b50505050565b6060600282511015612be95760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f50415448000060448201526064016105f5565b815167ffffffffffffffff811115612c0357612c03613761565b604051908082528060200260200182016040528015612c2c578160200160208202803683370190505b50905082815f81518110612c4257612c42613af1565b6020026020010181815250505f5b60018351612c5e9190613ade565b811015612861575f5f612ca387868581518110612c7d57612c7d613af1565b602002602001015187866001612c939190613d33565b815181106127ef576127ef613af1565b91509150612ccb848481518110612cbc57612cbc613af1565b602002602001015183836123f9565b84612cd7856001613d33565b81518110612ce757612ce7613af1565b60209081029190910101525050600101612c50565b5f5b60018351612d0c9190613ade565b8110156126d0575f5f848381518110612d2757612d27613af1565b602002602001015185846001612d3d9190613d33565b81518110612d4d57612d4d613af1565b6020026020010151915091505f612d648383613347565b5090505f612d937f0000000000000000000000000000000000000000000000000000000000000000858561236b565b90505f5f5f5f846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612dd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df99190613df8565b506001600160701b031691506001600160701b031691505f5f876001600160a01b03168a6001600160a01b031614612e32578284612e35565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015612e81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea59190613ab3565b612eaf9190613ade565b9550612ebc8683836123f9565b9450505050505f5f856001600160a01b0316886001600160a01b031614612ee457825f612ee7565b5f835b915091505f60028c51612efa9190613ade565b8a10612f06578a612f37565b612f377f0000000000000000000000000000000000000000000000000000000000000000898e612aa98e6002613d33565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90612f789086908690869060248101613d90565b5f604051808303815f87803b158015612f8f575f5ffd5b505af1158015612fa1573d5f5f3e3d5ffd5b50506001909b019a50612cfe9950505050505050505050565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301525f91829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa15801561302e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130529190613cb9565b6001600160a01b0316036130f3576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156130cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130f19190613cb9565b505b5f5f6131207f00000000000000000000000000000000000000000000000000000000000000008b8b61343d565b91509150815f148015613131575080155b15613141578793508692506131c7565b5f61314d8984846132aa565b905087811161318157858110156131765760405162461bcd60e51b81526004016105f590613c73565b8894509250826131c5565b5f61318d8984866132aa565b90508981111561319f5761319f613502565b878110156131bf5760405162461bcd60e51b81526004016105f590613c2d565b94508793505b505b5050965096945050505050565b5f5f84116132395760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4f60448201526b155514155517d05353d5539560a21b60648201526084016105f5565b5f8311801561324757505f82115b6132635760405162461bcd60e51b81526004016105f590613cd4565b5f61326e8585613d1c565b61327a906103e8613d1c565b90505f6132878685613ade565b613293906103e5613d1c565b905061329f8183613d46565b6123ef906001613d33565b5f5f84116133085760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f416044820152641353d5539560da1b60648201526084016105f5565b5f8311801561331657505f82115b6133325760405162461bcd60e51b81526004016105f590613cd4565b8261333d8386613d1c565b6105cb9190613d46565b5f5f826001600160a01b0316846001600160a01b0316036133b85760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016105f5565b826001600160a01b0316846001600160a01b0316106133d85782846133db565b83835b90925090506001600160a01b0382166134365760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a205a45524f5f41444452455353000060448201526064016105f5565b9250929050565b5f5f5f61344a8585613347565b5090505f5f61345a88888861236b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613495573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b99190613df8565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146134f05780826134f3565b81815b90999098509650505050505050565b634e487b7160e01b5f52600160045260245ffd5b6001600160a01b038116811461352a575f5ffd5b50565b803561353881613516565b919050565b801515811461352a575f5ffd5b803560ff81168114613538575f5ffd5b5f5f5f5f5f5f5f5f5f5f6101408b8d031215613574575f5ffd5b8a3561357f81613516565b995060208b0135985060408b0135975060608b0135965060808b01356135a481613516565b955060a08b0135945060c08b01356135bb8161353d565b93506135c960e08c0161354a565b999c989b509699959894979396509194610100810135936101209091013592509050565b5f5f5f606084860312156135ff575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f5f5f60c0878903121561362b575f5ffd5b863561363681613516565b9550602087013594506040870135935060608701359250608087013561365b81613516565b9598949750929591949360a090920135925050565b5f5f83601f840112613680575f5ffd5b50813567ffffffffffffffff811115613697575f5ffd5b6020830191508360208260051b8501011115613436575f5ffd5b5f5f5f5f5f5f60a087890312156136c6575f5ffd5b8635955060208701359450604087013567ffffffffffffffff8111156136ea575f5ffd5b6136f689828a01613670565b909550935050606087013561370a81613516565b95989497509295919493608090920135925050565b602080825282518282018190525f918401906040840190835b81811015613756578351835260209384019390920191600101613738565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215613786575f5ffd5b82359150602083013567ffffffffffffffff8111156137a3575f5ffd5b8301601f810185136137b3575f5ffd5b803567ffffffffffffffff8111156137cd576137cd613761565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156137fa576137fa613761565b604052918252602081840181019290810188841115613817575f5ffd5b6020850194505b8385101561383d5761382f8561352d565b81526020948501940161381e565b50809450505050509250929050565b5f5f5f5f5f5f5f5f5f5f5f6101608c8e031215613867575f5ffd5b8b3561387281613516565b9a5060208c013561388281613516565b995060408c0135985060608c0135975060808c0135965060a08c01356138a781613516565b955060c08c0135945060e08c01356138be8161353d565b93506138cd6101008d0161354a565b9a9d999c50979a969995989497509295919493610120830135935061014090920135919050565b5f5f5f5f5f60808688031215613908575f5ffd5b85359450602086013567ffffffffffffffff811115613925575f5ffd5b61393188828901613670565b909550935050604086013561394581613516565b949793965091946060013592915050565b5f5f5f5f5f5f5f60e0888a03121561396c575f5ffd5b873561397781613516565b9650602088013561398781613516565b955060408801359450606088013593506080880135925060a08801356139ac81613516565b96999598509396929591949193505060c09091013590565b5f5f5f5f5f5f5f5f610100898b0312156139dc575f5ffd5b88356139e781613516565b975060208901356139f781613516565b965060408901359550606089013594506080890135935060a0890135925060c0890135613a2381613516565b979a969950949793969295919450919260e001359150565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526018908201527f4f6e6c794d656d6573526f757465723a20455850495245440000000000000000604082015260600190565b5f60208284031215613ac3575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a6b57610a6b613aca565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613b15575f5ffd5b8135613b2081613516565b9392505050565b6020808252601d908201527f4f6e6c794d656d6573526f757465723a20494e56414c49445f50415448000000604082015260600190565b60208082526027908201527f4f6e6c794d656d6573526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b6020808252602b908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b5f60208284031215613c00575f5ffd5b8151613b208161353d565b5f5f60408385031215613c1c575f5ffd5b505080516020909101519092909150565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b5f60208284031215613cc9575f5ffd5b8151613b2081613516565b60208082526028908201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b8082028115828204841417610a6b57610a6b613aca565b80820180821115610a6b57610a6b613aca565b5f82613d6057634e487b7160e01b5f52601260045260245ffd5b500490565b5f82518060208501845e5f920191825250919050565b5f81613d8957613d89613aca565b505f190190565b84815283602082015260018060a01b0383166040820152608060608201525f8251806080840152806020850160a085015e5f60a0828501015260a0601f19601f83011684010191505095945050505050565b80516001600160701b0381168114613538575f5ffd5b5f5f5f60608486031215613e0a575f5ffd5b613e1384613de2565b9250613e2160208501613de2565b9150604084015163ffffffff81168114613e39575f5ffd5b80915050925092509256fea26469706673582212204591b7356be20e45a5566aee4d9aacfe6a64bf25bb2f2468b49c5f675d0980c264736f6c634300081b0033000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x60806040526004361061014a575f3560e01c80635c11d795116100b3578063baa2abde1161006d578063baa2abde14610407578063c45a015514610426578063c8fd02a814610459578063d06ca61f14610478578063e8e3370014610497578063ee2b3836146104b6575f5ffd5b80635c11d7951461032d5780635d4093591461034c5780637ae0a8251461039757806385f8c259146103aa5780638803dbee146103c9578063ad615dec146103e8575f5ffd5b80632a1f3f86116101045780632a1f3f861461027c5780632c1baa331461028f57806338ed1739146102ae5780633e0d80e5146102cd57806344d2f182146102e057806349bdd811146102ff575f5ffd5b806304b4d2691461018d578063054d50d4146101c657806309d66905146101f35780631dd3621b146102125780631f00ca741461023e5780632195995c1461025d575f5ffd5b3661018957336001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38161461018757610187613502565b005b5f5ffd5b348015610198575f5ffd5b506101ac6101a736600461355a565b6104d5565b604080519283526020830191909152015b60405180910390f35b3480156101d1575f5ffd5b506101e56101e03660046135ed565b6105bf565b6040519081526020016101bd565b3480156101fe575f5ffd5b506101e561020d366004613616565b6105d3565b34801561021d575f5ffd5b5061023161022c3660046136b1565b61072e565b6040516101bd919061371f565b348015610249575f5ffd5b50610231610258366004613775565b610a3b565b348015610268575f5ffd5b506101ac61027736600461384c565b610a71565b61023161028a3660046138f4565b610b41565b34801561029a575f5ffd5b506101e56102a936600461355a565b610e75565b3480156102b9575f5ffd5b506102316102c83660046136b1565b610f5a565b6101876102db3660046138f4565b611075565b3480156102eb575f5ffd5b506101ac6102fa366004613616565b61140b565b61031261030d366004613616565b6114f8565b604080519384526020840192909252908201526060016101bd565b348015610338575f5ffd5b506101876103473660046136b1565b61174a565b348015610357575f5ffd5b5061037f7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b6040516001600160a01b0390911681526020016101bd565b6102316103a53660046138f4565b611910565b3480156103b5575f5ffd5b506101e56103c43660046135ed565b611c4f565b3480156103d4575f5ffd5b506102316103e33660046136b1565b611c5b565b3480156103f3575f5ffd5b506101e56104023660046135ed565b611d16565b348015610412575f5ffd5b506101ac610421366004613956565b611d22565b348015610431575f5ffd5b5061037f7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d81565b348015610464575f5ffd5b506101876104733660046136b1565b611ee0565b348015610483575f5ffd5b50610231610492366004613775565b6120fd565b3480156104a2575f5ffd5b506103126104b13660046139c4565b61212a565b3480156104c1575f5ffd5b506102316104d03660046136b1565b612222565b5f5f5f6105237f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861236b565b90505f87610531578c610534565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061056f903390309086908f908e908e908e90600401613a3b565b5f604051808303815f87803b158015610586575f5ffd5b505af1158015610598573d5f5f3e3d5ffd5b505050506105aa8e8e8e8e8e8e61140b565b909f909e509c50505050505050505050505050565b5f6105cb8484846123f9565b949350505050565b5f81428110156105fe5760405162461bcd60e51b81526004016105f590613a7c565b60405180910390fd5b61062d887f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388989893089611d22565b6040516370a0823160e01b81523060048201529093506106a49150899086906001600160a01b038316906370a0823190602401602060405180830381865afa15801561067b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069f9190613ab3565b6124d2565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015610703575f5ffd5b505af1158015610715573d5f5f3e3d5ffd5b5050505061072384836125fe565b509695505050505050565b606081428110156107515760405162461bcd60e51b81526004016105f590613a7c565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38168686610788600182613ade565b81811061079757610797613af1565b90506020020160208101906107ac9190613b05565b6001600160a01b0316146107d25760405162461bcd60e51b81526004016105f590613b27565b61082f7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506126d592505050565b915086825f8151811061084457610844613af1565b6020026020010151111561086a5760405162461bcd60e51b81526004016105f590613b5e565b61092c86865f81811061087f5761087f613af1565b90506020020160208101906108949190613b05565b3361090d7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8a8a5f8181106108cb576108cb613af1565b90506020020160208101906108e09190613b05565b8b8b60018181106108f3576108f3613af1565b90506020020160208101906109089190613b05565b61236b565b855f8151811061091f5761091f613af1565b6020026020010151612869565b61096a828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152503092506129a2915050565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316632e1a7d4d83600185516109a89190613ade565b815181106109b8576109b8613af1565b60200260200101516040518263ffffffff1660e01b81526004016109de91815260200190565b5f604051808303815f87803b1580156109f5575f5ffd5b505af1158015610a07573d5f5f3e3d5ffd5b50505050610723848360018551610a1e9190613ade565b81518110610a2e57610a2e613af1565b60200260200101516125fe565b6060610a687f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d84846126d5565b90505b92915050565b5f5f5f610a9f7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8f8f61236b565b90505f87610aad578c610ab0565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610aeb903390309086908f908e908e908e90600401613a3b565b5f604051808303815f87803b158015610b02575f5ffd5b505af1158015610b14573d5f5f3e3d5ffd5b50505050610b278f8f8f8f8f8f8f611d22565b809450819550505050509b509b9950505050505050505050565b60608142811015610b645760405162461bcd60e51b81526004016105f590613a7c565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031686865f818110610ba057610ba0613af1565b9050602002016020810190610bb59190613b05565b6001600160a01b031614610bdb5760405162461bcd60e51b81526004016105f590613b27565b610c387f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d348888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b9592505050565b9150868260018451610c4a9190613ade565b81518110610c5a57610c5a613af1565b60200260200101511015610c805760405162461bcd60e51b81526004016105f590613ba5565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0835f81518110610cc157610cc1613af1565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015610cf2575f5ffd5b505af1158015610d04573d5f5f3e3d5ffd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb610d967f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d89895f818110610d6e57610d6e613af1565b9050602002016020810190610d839190613b05565b8a8a60018181106108f3576108f3613af1565b845f81518110610da857610da8613af1565b60200260200101516040518363ffffffff1660e01b8152600401610de19291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af1158015610dfd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e219190613bf0565b610e2d57610e2d613502565b610e6b828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129a2915050565b5095945050505050565b5f5f610ec27f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8d7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861236b565b90505f86610ed0578b610ed3565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f0e903390309086908e908d908d908d90600401613a3b565b5f604051808303815f87803b158015610f25575f5ffd5b505af1158015610f37573d5f5f3e3d5ffd5b50505050610f498d8d8d8d8d8d6105d3565b9d9c50505050505050505050505050565b60608142811015610f7d5760405162461bcd60e51b81526004016105f590613a7c565b610fda7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b9592505050565b9150868260018451610fec9190613ade565b81518110610ffc57610ffc613af1565b602002602001015110156110225760405162461bcd60e51b81526004016105f590613ba5565b61103786865f81811061087f5761087f613af1565b610723828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129a2915050565b80428110156110965760405162461bcd60e51b81526004016105f590613a7c565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031685855f8181106110d2576110d2613af1565b90506020020160208101906110e79190613b05565b6001600160a01b03161461110d5760405162461bcd60e51b81526004016105f590613b27565b5f3490507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561116a575f5ffd5b505af115801561117c573d5f5f3e3d5ffd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb6111e67f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d89895f818110610d6e57610d6e613af1565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611230573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112549190613bf0565b61126057611260613502565b5f868661126e600182613ade565b81811061127d5761127d613af1565b90506020020160208101906112929190613b05565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156112d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112fc9190613ab3565b905061133b8787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250612cfc915050565b8781888861134a600182613ade565b81811061135957611359613af1565b905060200201602081019061136e9190613b05565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156113b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d99190613ab3565b6113e39190613ade565b10156114015760405162461bcd60e51b81526004016105f590613ba5565b5050505050505050565b5f5f824281101561142e5760405162461bcd60e51b81526004016105f590613a7c565b61145d897f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388a8a8a308a611d22565b909350915061146d8986856124d2565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156114cc575f5ffd5b505af11580156114de573d5f5f3e3d5ffd5b505050506114ec85836125fe565b50965096945050505050565b5f5f5f834281101561151c5760405162461bcd60e51b81526004016105f590613a7c565b61154a8a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388b348c8c612fba565b90945092505f61159b7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8c7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861236b565b90506115a98b338388612869565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015611602575f5ffd5b505af1158015611614573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816935063a9059cbb925060440190506020604051808303815f875af1158015611686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613bf0565b6116b6576116b6613502565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156116fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171f9190613ab3565b92508334111561173c5761173c336117378634613ade565b6125fe565b505096509650969350505050565b804281101561176b5760405162461bcd60e51b81526004016105f590613a7c565b6117d285855f81811061178057611780613af1565b90506020020160208101906117959190613b05565b336117cc7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d89895f818110610d6e57610d6e613af1565b8a612869565b5f85856117e0600182613ade565b8181106117ef576117ef613af1565b90506020020160208101906118049190613b05565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561184a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186e9190613ab3565b90506118ad8686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250889250612cfc915050565b868187876118bc600182613ade565b8181106118cb576118cb613af1565b90506020020160208101906118e09190613b05565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a082319060240161139a565b606081428110156119335760405162461bcd60e51b81526004016105f590613a7c565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031686865f81811061196f5761196f613af1565b90506020020160208101906119849190613b05565b6001600160a01b0316146119aa5760405162461bcd60e51b81526004016105f590613b27565b611a077f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d888888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506126d592505050565b915034825f81518110611a1c57611a1c613af1565b60200260200101511115611a425760405162461bcd60e51b81526004016105f590613b5e565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0835f81518110611a8357611a83613af1565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015611ab4575f5ffd5b505af1158015611ac6573d5f5f3e3d5ffd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb611b307f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d89895f818110610d6e57610d6e613af1565b845f81518110611b4257611b42613af1565b60200260200101516040518363ffffffff1660e01b8152600401611b7b9291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af1158015611b97573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbb9190613bf0565b611bc757611bc7613502565b611c05828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129a2915050565b815f81518110611c1757611c17613af1565b6020026020010151341115610e6b57610e6b33835f81518110611c3c57611c3c613af1565b6020026020010151346117379190613ade565b5f6105cb8484846131d4565b60608142811015611c7e5760405162461bcd60e51b81526004016105f590613a7c565b611cdb7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506126d592505050565b915086825f81518110611cf057611cf0613af1565b602002602001015111156110225760405162461bcd60e51b81526004016105f590613b5e565b5f6105cb8484846132aa565b5f5f8242811015611d455760405162461bcd60e51b81526004016105f590613a7c565b5f611d717f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8c8c61236b565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af1158015611dc4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de89190613bf0565b5060405163226bf2d160e21b81526001600160a01b0387811660048301525f9182918416906389afcb449060240160408051808303815f875af1158015611e31573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e559190613c0b565b915091505f611e648e8e613347565b509050806001600160a01b03168e6001600160a01b031614611e87578183611e8a565b82825b90975095508a871015611eaf5760405162461bcd60e51b81526004016105f590613c2d565b89861015611ecf5760405162461bcd60e51b81526004016105f590613c73565b505050505097509795505050505050565b8042811015611f015760405162461bcd60e51b81526004016105f590613a7c565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38168585611f38600182613ade565b818110611f4757611f47613af1565b9050602002016020810190611f5c9190613b05565b6001600160a01b031614611f825760405162461bcd60e51b81526004016105f590613b27565b611f9785855f81811061178057611780613af1565b611fd48585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250612cfc915050565b6040516370a0823160e01b81523060048201525f907f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316906370a0823190602401602060405180830381865afa158015612038573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205c9190613ab3565b90508681101561207e5760405162461bcd60e51b81526004016105f590613ba5565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156120dd575f5ffd5b505af11580156120ef573d5f5f3e3d5ffd5b5050505061140184826125fe565b6060610a687f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8484612b95565b5f5f5f834281101561214e5760405162461bcd60e51b81526004016105f590613a7c565b61215c8c8c8c8c8c8c612fba565b90945092505f61218d7f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8e8e61236b565b905061219b8d338388612869565b6121a78c338387612869565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156121ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122109190613ab3565b92505050985098509895505050505050565b606081428110156122455760405162461bcd60e51b81526004016105f590613a7c565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816868661227c600182613ade565b81811061228b5761228b613af1565b90506020020160208101906122a09190613b05565b6001600160a01b0316146122c65760405162461bcd60e51b81526004016105f590613b27565b6123237f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612b9592505050565b91508682600184516123359190613ade565b8151811061234557612345613af1565b6020026020010151101561086a5760405162461bcd60e51b81526004016105f590613ba5565b5f5f5f6123788585613347565b60405163e6a4390560e01b81526001600160a01b03808416600483015280831660248301529294509092509087169063e6a4390590604401602060405180830381865afa1580156123cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ef9190613cb9565b9695505050505050565b5f5f841161245d5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4960448201526a1394155517d05353d5539560aa1b60648201526084016105f5565b5f8311801561246b57505f82115b6124875760405162461bcd60e51b81526004016105f590613cd4565b5f612494856103e5613d1c565b90505f6124a18483613d1c565b90505f826124b1876103e8613d1c565b6124bb9190613d33565b90506124c78183613d46565b979650505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161252d9190613d65565b5f604051808303815f865af19150503d805f8114612566576040519150601f19603f3d011682016040523d82523d5f602084013e61256b565b606091505b50915091508180156125955750805115806125955750808060200190518101906125959190613bf0565b6125f75760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016105f5565b5050505050565b604080515f808252602082019092526001600160a01b0384169083906040516126279190613d65565b5f6040518083038185875af1925050503d805f8114612661576040519150601f19603f3d011682016040523d82523d5f602084013e612666565b606091505b50509050806126d05760405162461bcd60e51b815260206004820152603060248201527f5472616e7366657248656c7065723a3a736166655472616e73666572533a205360448201526f081d1c985b9cd9995c8819985a5b195960821b60648201526084016105f5565b505050565b60606002825110156127295760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f50415448000060448201526064016105f5565b815167ffffffffffffffff81111561274357612743613761565b60405190808252806020026020018201604052801561276c578160200160208202803683370190505b50905082816001835161277f9190613ade565b8151811061278f5761278f613af1565b6020026020010181815250505f600183516127aa9190613ade565b90505b8015612861575f806127fc87866127c5600187613ade565b815181106127d5576127d5613af1565b60200260200101518786815181106127ef576127ef613af1565b602002602001015161343d565b9150915061282484848151811061281557612815613af1565b602002602001015183836131d4565b84612830600186613ade565b8151811061284057612840613af1565b6020026020010181815250505050808061285990613d7b565b9150506127ad565b509392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f928392908816916128cc9190613d65565b5f604051808303815f865af19150503d805f8114612905576040519150601f19603f3d011682016040523d82523d5f602084013e61290a565b606091505b50915091508180156129345750805115806129345750808060200190518101906129349190613bf0565b61299a5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016105f5565b505050505050565b5f5b600183516129b29190613ade565b811015612b8f575f5f8483815181106129cd576129cd613af1565b6020026020010151858460016129e39190613d33565b815181106129f3576129f3613af1565b6020026020010151915091505f612a0a8383613347565b5090505f87612a1a866001613d33565b81518110612a2a57612a2a613af1565b602002602001015190505f5f836001600160a01b0316866001600160a01b031614612a5657825f612a59565b5f835b915091505f60028a51612a6c9190613ade565b8810612a785788612ac6565b612ac67f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d878c612aa98c6002613d33565b81518110612ab957612ab9613af1565b602002602001015161236b565b9050612af37f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d888861236b565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015612b2f576020820181803683370190505b506040518563ffffffff1660e01b8152600401612b4f9493929190613d90565b5f604051808303815f87803b158015612b66575f5ffd5b505af1158015612b78573d5f5f3e3d5ffd5b5050600190990198506129a4975050505050505050565b50505050565b6060600282511015612be95760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a20494e56414c49445f50415448000060448201526064016105f5565b815167ffffffffffffffff811115612c0357612c03613761565b604051908082528060200260200182016040528015612c2c578160200160208202803683370190505b50905082815f81518110612c4257612c42613af1565b6020026020010181815250505f5b60018351612c5e9190613ade565b811015612861575f5f612ca387868581518110612c7d57612c7d613af1565b602002602001015187866001612c939190613d33565b815181106127ef576127ef613af1565b91509150612ccb848481518110612cbc57612cbc613af1565b602002602001015183836123f9565b84612cd7856001613d33565b81518110612ce757612ce7613af1565b60209081029190910101525050600101612c50565b5f5b60018351612d0c9190613ade565b8110156126d0575f5f848381518110612d2757612d27613af1565b602002602001015185846001612d3d9190613d33565b81518110612d4d57612d4d613af1565b6020026020010151915091505f612d648383613347565b5090505f612d937f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d858561236b565b90505f5f5f5f846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612dd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df99190613df8565b506001600160701b031691506001600160701b031691505f5f876001600160a01b03168a6001600160a01b031614612e32578284612e35565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015612e81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea59190613ab3565b612eaf9190613ade565b9550612ebc8683836123f9565b9450505050505f5f856001600160a01b0316886001600160a01b031614612ee457825f612ee7565b5f835b915091505f60028c51612efa9190613ade565b8a10612f06578a612f37565b612f377f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d898e612aa98e6002613d33565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90612f789086908690869060248101613d90565b5f604051808303815f87803b158015612f8f575f5ffd5b505af1158015612fa1573d5f5f3e3d5ffd5b50506001909b019a50612cfe9950505050505050505050565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301525f91829182917f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d9091169063e6a4390590604401602060405180830381865afa15801561302e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130529190613cb9565b6001600160a01b0316036130f3576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d169063c9c65396906044016020604051808303815f875af11580156130cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130f19190613cb9565b505b5f5f6131207f000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d8b8b61343d565b91509150815f148015613131575080155b15613141578793508692506131c7565b5f61314d8984846132aa565b905087811161318157858110156131765760405162461bcd60e51b81526004016105f590613c73565b8894509250826131c5565b5f61318d8984866132aa565b90508981111561319f5761319f613502565b878110156131bf5760405162461bcd60e51b81526004016105f590613c2d565b94508793505b505b5050965096945050505050565b5f5f84116132395760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4f60448201526b155514155517d05353d5539560a21b60648201526084016105f5565b5f8311801561324757505f82115b6132635760405162461bcd60e51b81526004016105f590613cd4565b5f61326e8585613d1c565b61327a906103e8613d1c565b90505f6132878685613ade565b613293906103e5613d1c565b905061329f8183613d46565b6123ef906001613d33565b5f5f84116133085760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f416044820152641353d5539560da1b60648201526084016105f5565b5f8311801561331657505f82115b6133325760405162461bcd60e51b81526004016105f590613cd4565b8261333d8386613d1c565b6105cb9190613d46565b5f5f826001600160a01b0316846001600160a01b0316036133b85760405162461bcd60e51b815260206004820152602560248201527f4f6e6c794d656d65734c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016105f5565b826001600160a01b0316846001600160a01b0316106133d85782846133db565b83835b90925090506001600160a01b0382166134365760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c794d656d65734c6962726172793a205a45524f5f41444452455353000060448201526064016105f5565b9250929050565b5f5f5f61344a8585613347565b5090505f5f61345a88888861236b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613495573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b99190613df8565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146134f05780826134f3565b81815b90999098509650505050505050565b634e487b7160e01b5f52600160045260245ffd5b6001600160a01b038116811461352a575f5ffd5b50565b803561353881613516565b919050565b801515811461352a575f5ffd5b803560ff81168114613538575f5ffd5b5f5f5f5f5f5f5f5f5f5f6101408b8d031215613574575f5ffd5b8a3561357f81613516565b995060208b0135985060408b0135975060608b0135965060808b01356135a481613516565b955060a08b0135945060c08b01356135bb8161353d565b93506135c960e08c0161354a565b999c989b509699959894979396509194610100810135936101209091013592509050565b5f5f5f606084860312156135ff575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f5f5f60c0878903121561362b575f5ffd5b863561363681613516565b9550602087013594506040870135935060608701359250608087013561365b81613516565b9598949750929591949360a090920135925050565b5f5f83601f840112613680575f5ffd5b50813567ffffffffffffffff811115613697575f5ffd5b6020830191508360208260051b8501011115613436575f5ffd5b5f5f5f5f5f5f60a087890312156136c6575f5ffd5b8635955060208701359450604087013567ffffffffffffffff8111156136ea575f5ffd5b6136f689828a01613670565b909550935050606087013561370a81613516565b95989497509295919493608090920135925050565b602080825282518282018190525f918401906040840190835b81811015613756578351835260209384019390920191600101613738565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215613786575f5ffd5b82359150602083013567ffffffffffffffff8111156137a3575f5ffd5b8301601f810185136137b3575f5ffd5b803567ffffffffffffffff8111156137cd576137cd613761565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156137fa576137fa613761565b604052918252602081840181019290810188841115613817575f5ffd5b6020850194505b8385101561383d5761382f8561352d565b81526020948501940161381e565b50809450505050509250929050565b5f5f5f5f5f5f5f5f5f5f5f6101608c8e031215613867575f5ffd5b8b3561387281613516565b9a5060208c013561388281613516565b995060408c0135985060608c0135975060808c0135965060a08c01356138a781613516565b955060c08c0135945060e08c01356138be8161353d565b93506138cd6101008d0161354a565b9a9d999c50979a969995989497509295919493610120830135935061014090920135919050565b5f5f5f5f5f60808688031215613908575f5ffd5b85359450602086013567ffffffffffffffff811115613925575f5ffd5b61393188828901613670565b909550935050604086013561394581613516565b949793965091946060013592915050565b5f5f5f5f5f5f5f60e0888a03121561396c575f5ffd5b873561397781613516565b9650602088013561398781613516565b955060408801359450606088013593506080880135925060a08801356139ac81613516565b96999598509396929591949193505060c09091013590565b5f5f5f5f5f5f5f5f610100898b0312156139dc575f5ffd5b88356139e781613516565b975060208901356139f781613516565b965060408901359550606089013594506080890135935060a0890135925060c0890135613a2381613516565b979a969950949793969295919450919260e001359150565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526018908201527f4f6e6c794d656d6573526f757465723a20455850495245440000000000000000604082015260600190565b5f60208284031215613ac3575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a6b57610a6b613aca565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613b15575f5ffd5b8135613b2081613516565b9392505050565b6020808252601d908201527f4f6e6c794d656d6573526f757465723a20494e56414c49445f50415448000000604082015260600190565b60208082526027908201527f4f6e6c794d656d6573526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b6020808252602b908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b5f60208284031215613c00575f5ffd5b8151613b208161353d565b5f5f60408385031215613c1c575f5ffd5b505080516020909101519092909150565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526026908201527f4f6e6c794d656d6573526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b5f60208284031215613cc9575f5ffd5b8151613b2081613516565b60208082526028908201527f4f6e6c794d656d65734c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b8082028115828204841417610a6b57610a6b613aca565b80820180821115610a6b57610a6b613aca565b5f82613d6057634e487b7160e01b5f52601260045260245ffd5b500490565b5f82518060208501845e5f920191825250919050565b5f81613d8957613d89613aca565b505f190190565b84815283602082015260018060a01b0383166040820152608060608201525f8251806080840152806020850160a085015e5f60a0828501015260a0601f19601f83011684010191505095945050505050565b80516001600160701b0381168114613538575f5ffd5b5f5f5f60608486031215613e0a575f5ffd5b613e1384613de2565b9250613e2160208501613de2565b9150604084015163ffffffff81168114613e39575f5ffd5b80915050925092509256fea26469706673582212204591b7356be20e45a5566aee4d9aacfe6a64bf25bb2f2468b49c5f675d0980c264736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _factory (address): 0xBF461f164C468e2B1739159B41D2De9dA58ef78D
Arg [1] : _WS (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bf461f164c468e2b1739159b41d2de9da58ef78d
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.