More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 223,522 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 70589506 | 33 hrs ago | IN | 0 POL | 0.01346896 | ||||
Swap Exact Token... | 70589358 | 33 hrs ago | IN | 0 POL | 0.00677874 | ||||
Remove Liquidity | 70589323 | 33 hrs ago | IN | 0 POL | 0.00961849 | ||||
Swap Exact Token... | 70589061 | 33 hrs ago | IN | 0 POL | 0.00939818 | ||||
Swap Exact Token... | 70578108 | 40 hrs ago | IN | 0 POL | 0.01518605 | ||||
Add Liquidity | 70570721 | 44 hrs ago | IN | 0 POL | 0.00191517 | ||||
Add Liquidity | 70570700 | 44 hrs ago | IN | 0 POL | 0.00886431 | ||||
Add Liquidity | 70570682 | 44 hrs ago | IN | 0 POL | 0.00883872 | ||||
Swap Exact Token... | 70570616 | 44 hrs ago | IN | 0 POL | 0.0102561 | ||||
Swap Exact Token... | 70569747 | 45 hrs ago | IN | 0 POL | 0.00882932 | ||||
Swap Exact Token... | 70501673 | 3 days ago | IN | 0 POL | 0.01305177 | ||||
Add Liquidity | 70501565 | 3 days ago | IN | 0 POL | 0.00841824 | ||||
Add Liquidity | 70501503 | 3 days ago | IN | 0 POL | 0.00877899 | ||||
Swap Exact Token... | 70501470 | 3 days ago | IN | 0 POL | 0.0066136 | ||||
Add Liquidity | 70501334 | 3 days ago | IN | 0 POL | 0.0085931 | ||||
Add Liquidity | 70501307 | 3 days ago | IN | 0 POL | 0.00611994 | ||||
Add Liquidity | 70501230 | 3 days ago | IN | 0 POL | 0.00857508 | ||||
Swap Exact Token... | 70501188 | 3 days ago | IN | 0 POL | 0.00919128 | ||||
Swap Exact Token... | 70453578 | 4 days ago | IN | 0 POL | 0.00753416 | ||||
Swap Exact Token... | 70229388 | 10 days ago | IN | 0 POL | 0.00797734 | ||||
Swap Exact Token... | 70088470 | 13 days ago | IN | 0 POL | 0.00775575 | ||||
Swap Exact Token... | 69991220 | 16 days ago | IN | 0 POL | 0.0229975 | ||||
Swap Exact Token... | 69606794 | 25 days ago | IN | 0 POL | 0.02701678 | ||||
Swap Exact Token... | 69606737 | 25 days ago | IN | 0 POL | 0.0275064 | ||||
Swap Exact Token... | 69606670 | 25 days ago | IN | 0 POL | 0.01413251 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
70589061 | 33 hrs ago | 7.55192489 POL | ||||
70589061 | 33 hrs ago | 7.55192489 POL | ||||
69561057 | 26 days ago | 0.72067569 POL | ||||
69561057 | 26 days ago | 0.72067569 POL | ||||
69561033 | 26 days ago | 3.22746969 POL | ||||
69561033 | 26 days ago | 3.22746969 POL | ||||
69386683 | 31 days ago | 2.78 POL | ||||
69286369 | 33 days ago | 3.6123272 POL | ||||
69286369 | 33 days ago | 3.6123272 POL | ||||
68983322 | 41 days ago | 0.70802461 POL | ||||
68983322 | 41 days ago | 0.70802461 POL | ||||
68883069 | 43 days ago | 4.5380732 POL | ||||
68883069 | 43 days ago | 4.5380732 POL | ||||
68882769 | 43 days ago | 2.19664111 POL | ||||
68882769 | 43 days ago | 2.19664111 POL | ||||
68882495 | 43 days ago | 0.6877264 POL | ||||
68882495 | 43 days ago | 0.6877264 POL | ||||
68804322 | 45 days ago | 0.83804616 POL | ||||
68804322 | 45 days ago | 0.83804616 POL | ||||
68680376 | 48 days ago | 3.38673578 POL | ||||
68680376 | 48 days ago | 3.38673578 POL | ||||
68674009 | 48 days ago | 10.25547959 POL | ||||
68437574 | 54 days ago | 1.00356407 POL | ||||
68437574 | 54 days ago | 1.00356407 POL | ||||
68433183 | 54 days ago | 1 POL |
Loading...
Loading
Contract Name:
DystRouter01
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "../../lib/Math.sol"; import "../../lib/SafeERC20.sol"; import "../../interface/IERC20.sol"; import "../../interface/IWMATIC.sol"; import "../../interface/IPair.sol"; import "../../interface/IFactory.sol"; contract DystRouter01 { using SafeERC20 for IERC20; struct Route { address from; address to; bool stable; } address public immutable factory; IWMATIC public immutable wmatic; uint internal constant MINIMUM_LIQUIDITY = 10 ** 3; bytes32 immutable pairCodeHash; modifier ensure(uint deadline) { require(deadline >= block.timestamp, 'DystRouter: EXPIRED'); _; } constructor(address _factory, address _wmatic) { factory = _factory; pairCodeHash = IFactory(_factory).pairCodeHash(); wmatic = IWMATIC(_wmatic); } receive() external payable { // only accept ETH via fallback from the WETH contract require(msg.sender == address(wmatic), "DystRouter: NOT_WMATIC"); } function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1) { return _sortTokens(tokenA, tokenB); } function _sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'DystRouter: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'DystRouter: ZERO_ADDRESS'); } function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair) { return _pairFor(tokenA, tokenB, stable); } /// @dev Calculates the CREATE2 address for a pair without making any external calls. function _pairFor(address tokenA, address tokenB, bool stable) internal view returns (address pair) { (address token0, address token1) = _sortTokens(tokenA, tokenB); pair = address(uint160(uint(keccak256(abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1, stable)), pairCodeHash // init code hash ))))); } function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB) { return _quoteLiquidity(amountA, reserveA, reserveB); } /// @dev Given some amount of an asset and pair reserves, returns an equivalent amount of the other asset. function _quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) { require(amountA > 0, 'DystRouter: INSUFFICIENT_AMOUNT'); require(reserveA > 0 && reserveB > 0, 'DystRouter: INSUFFICIENT_LIQUIDITY'); amountB = amountA * reserveB / reserveA; } function getReserves(address tokenA, address tokenB, bool stable) external view returns (uint reserveA, uint reserveB) { return _getReserves(tokenA, tokenB, stable); } /// @dev Fetches and sorts the reserves for a pair. function _getReserves(address tokenA, address tokenB, bool stable) internal view returns (uint reserveA, uint reserveB) { (address token0,) = _sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1,) = IPair(_pairFor(tokenA, tokenB, stable)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } /// @dev Performs chained getAmountOut calculations on any number of pairs. function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable) { address pair = _pairFor(tokenIn, tokenOut, true); uint amountStable; uint amountVolatile; if (IFactory(factory).isPair(pair)) { amountStable = IPair(pair).getAmountOut(amountIn, tokenIn); } pair = _pairFor(tokenIn, tokenOut, false); if (IFactory(factory).isPair(pair)) { amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn); } return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false); } function getExactAmountOut(uint amountIn, address tokenIn, address tokenOut, bool stable) external view returns (uint) { address pair = _pairFor(tokenIn, tokenOut, stable); if (IFactory(factory).isPair(pair)) { return IPair(pair).getAmountOut(amountIn, tokenIn); } return 0; } /// @dev Performs chained getAmountOut calculations on any number of pairs. function getAmountsOut(uint amountIn, Route[] memory routes) external view returns (uint[] memory amounts) { return _getAmountsOut(amountIn, routes); } function _getAmountsOut(uint amountIn, Route[] memory routes) internal view returns (uint[] memory amounts) { require(routes.length >= 1, 'DystRouter: INVALID_PATH'); amounts = new uint[](routes.length + 1); amounts[0] = amountIn; for (uint i = 0; i < routes.length; i++) { address pair = _pairFor(routes[i].from, routes[i].to, routes[i].stable); if (IFactory(factory).isPair(pair)) { amounts[i + 1] = IPair(pair).getAmountOut(amounts[i], routes[i].from); } } } function isPair(address pair) external view returns (bool) { return IFactory(factory).isPair(pair); } function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) external view returns (uint amountA, uint amountB, uint liquidity) { // create the pair if it doesn't exist yet address _pair = IFactory(factory).getPair(tokenA, tokenB, stable); (uint reserveA, uint reserveB) = (0, 0); uint _totalSupply = 0; if (_pair != address(0)) { _totalSupply = IERC20(_pair).totalSupply(); (reserveA, reserveB) = _getReserves(tokenA, tokenB, stable); } if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY; } else { uint amountBOptimal = _quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { (amountA, amountB) = (amountADesired, amountBOptimal); liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB); } else { uint amountAOptimal = _quoteLiquidity(amountBDesired, reserveB, reserveA); (amountA, amountB) = (amountAOptimal, amountBDesired); liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB); } } } function quoteRemoveLiquidity( address tokenA, address tokenB, bool stable, uint liquidity ) external view returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet address _pair = IFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { return (0, 0); } (uint reserveA, uint reserveB) = _getReserves(tokenA, tokenB, stable); uint _totalSupply = IERC20(_pair).totalSupply(); // using balances ensures pro-rata distribution amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution amountB = liquidity * reserveB / _totalSupply; } function _addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal returns (uint amountA, uint amountB) { require(amountADesired >= amountAMin, "DystRouter: DESIRED_A_AMOUNT"); require(amountBDesired >= amountBMin, "DystRouter: DESIRED_B_AMOUNT"); // create the pair if it doesn't exist yet address _pair = IFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { _pair = IFactory(factory).createPair(tokenA, tokenB, stable); } (uint reserveA, uint reserveB) = _getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = _quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, 'DystRouter: INSUFFICIENT_B_AMOUNT'); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = _quoteLiquidity(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, 'DystRouter: INSUFFICIENT_A_AMOUNT'); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity( tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin ); address pair = _pairFor(tokenA, tokenB, stable); SafeERC20.safeTransferFrom(IERC20(tokenA), msg.sender, pair, amountA); SafeERC20.safeTransferFrom(IERC20(tokenB), msg.sender, pair, amountB); liquidity = IPair(pair).mint(to); } function addLiquidityMATIC( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountMATICMin, address to, uint deadline ) external payable ensure(deadline) returns (uint amountToken, uint amountMATIC, uint liquidity) { (amountToken, amountMATIC) = _addLiquidity( token, address(wmatic), stable, amountTokenDesired, msg.value, amountTokenMin, amountMATICMin ); address pair = _pairFor(token, address(wmatic), stable); IERC20(token).safeTransferFrom(msg.sender, pair, amountToken); wmatic.deposit{value : amountMATIC}(); assert(wmatic.transfer(pair, amountMATIC)); liquidity = IPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountMATIC) _safeTransferMATIC(msg.sender, msg.value - amountMATIC); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB) { return _removeLiquidity( tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline ); } function _removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) internal ensure(deadline) returns (uint amountA, uint amountB) { address pair = _pairFor(tokenA, tokenB, stable); IERC20(pair).safeTransferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint amount0, uint amount1) = IPair(pair).burn(to); (address token0,) = _sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, 'DystRouter: INSUFFICIENT_A_AMOUNT'); require(amountB >= amountBMin, 'DystRouter: INSUFFICIENT_B_AMOUNT'); } function removeLiquidityMATIC( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountMATICMin, address to, uint deadline ) external returns (uint amountToken, uint amountMATIC) { return _removeLiquidityMATIC( token, stable, liquidity, amountTokenMin, amountMATICMin, to, deadline ); } function _removeLiquidityMATIC( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountMATICMin, address to, uint deadline ) internal ensure(deadline) returns (uint amountToken, uint amountMATIC) { (amountToken, amountMATIC) = _removeLiquidity( token, address(wmatic), stable, liquidity, amountTokenMin, amountMATICMin, address(this), deadline ); IERC20(token).safeTransfer(to, amountToken); wmatic.withdraw(amountMATIC); _safeTransferMATIC(to, amountMATIC); } function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB) { address pair = _pairFor(tokenA, tokenB, stable); { uint value = approveMax ? type(uint).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = _removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityMATICWithPermit( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountMATICMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountMATIC) { address pair = _pairFor(token, address(wmatic), stable); uint value = approveMax ? type(uint).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountMATIC) = _removeLiquidityMATIC(token, stable, liquidity, amountTokenMin, amountMATICMin, to, deadline); } function removeLiquidityMATICSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountFTMMin, address to, uint deadline ) external returns (uint amountToken, uint amountFTM) { return _removeLiquidityMATICSupportingFeeOnTransferTokens( token, stable, liquidity, amountTokenMin, amountFTMMin, to, deadline ); } function _removeLiquidityMATICSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountFTMMin, address to, uint deadline ) internal ensure(deadline) returns (uint amountToken, uint amountFTM) { (amountToken, amountFTM) = _removeLiquidity( token, address(wmatic), stable, liquidity, amountTokenMin, amountFTMMin, address(this), deadline ); IERC20(token).safeTransfer(to, IERC20(token).balanceOf(address(this))); wmatic.withdraw(amountFTM); _safeTransferMATIC(to, amountFTM); } function removeLiquidityMATICWithPermitSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountFTMMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountFTM) { address pair = _pairFor(token, address(wmatic), stable); uint value = approveMax ? type(uint).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountFTM) = _removeLiquidityMATICSupportingFeeOnTransferTokens( token, stable, liquidity, amountTokenMin, amountFTMMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, Route[] memory routes, address _to) internal virtual { for (uint i = 0; i < routes.length; i++) { (address token0,) = _sortTokens(routes[i].from, routes[i].to); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < routes.length - 1 ? _pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; IPair(_pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function _swapSupportingFeeOnTransferTokens(Route[] memory routes, address _to) internal virtual { for (uint i; i < routes.length; i++) { (address input, address output) = (routes[i].from, routes[i].to); (address token0,) = _sortTokens(input, output); IPair pair = IPair(_pairFor(routes[i].from, routes[i].to, routes[i].stable)); uint amountInput; uint amountOutput; {// scope to avoid stack too deep errors (uint reserve0, uint reserve1,) = pair.getReserves(); uint reserveInput = input == token0 ? reserve0 : reserve1; amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput; //(amountOutput,) = getAmountOut(amountInput, input, output, stable); amountOutput = pair.getAmountOut(amountInput, input); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < routes.length - 1 ? _pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) external ensure(deadline) returns (uint[] memory amounts) { Route[] memory routes = new Route[](1); routes[0].from = tokenFrom; routes[0].to = tokenTo; routes[0].stable = stable; amounts = _getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT'); IERC20(routes[0].from).safeTransferFrom( msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, to); } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) returns (uint[] memory amounts) { amounts = _getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT'); IERC20(routes[0].from).safeTransferFrom( msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, to); } function swapExactMATICForTokens(uint amountOutMin, Route[] calldata routes, address to, uint deadline) external payable ensure(deadline) returns (uint[] memory amounts) { require(routes[0].from == address(wmatic), 'DystRouter: INVALID_PATH'); amounts = _getAmountsOut(msg.value, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT'); wmatic.deposit{value : amounts[0]}(); assert(wmatic.transfer(_pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0])); _swap(amounts, routes, to); } function swapExactTokensForMATIC(uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline) external ensure(deadline) returns (uint[] memory amounts) { require(routes[routes.length - 1].to == address(wmatic), 'DystRouter: INVALID_PATH'); amounts = _getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT'); IERC20(routes[0].from).safeTransferFrom( msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, address(this)); wmatic.withdraw(amounts[amounts.length - 1]); _safeTransferMATIC(to, amounts[amounts.length - 1]); } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) { IERC20(routes[0].from).safeTransferFrom( msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn ); uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( IERC20(routes[routes.length - 1].to).balanceOf(to) - balanceBefore >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactMATICForTokensSupportingFeeOnTransferTokens( uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external payable ensure(deadline) { require(routes[0].from == address(wmatic), 'DystRouter: INVALID_PATH'); uint amountIn = msg.value; wmatic.deposit{value : amountIn}(); assert(wmatic.transfer(_pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn)); uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( IERC20(routes[routes.length - 1].to).balanceOf(to) - balanceBefore >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactTokensForMATICSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) { require(routes[routes.length - 1].to == address(wmatic), 'DystRouter: INVALID_PATH'); IERC20(routes[0].from).safeTransferFrom( msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn ); _swapSupportingFeeOnTransferTokens(routes, address(this)); uint amountOut = IERC20(address(wmatic)).balanceOf(address(this)); require(amountOut >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT'); wmatic.withdraw(amountOut); _safeTransferMATIC(to, amountOut); } function UNSAFE_swapExactTokensForTokens( uint[] memory amounts, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) returns (uint[] memory) { IERC20(routes[0].from).safeTransferFrom(msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); return amounts; } function _safeTransferMATIC(address to, uint value) internal { (bool success,) = to.call{value : value}(new bytes(0)); require(success, 'DystRouter: ETH_TRANSFER_FAILED'); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; library Math { function max(uint a, uint b) internal pure returns (uint) { return a >= b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function positiveInt128(int128 value) internal pure returns (int128) { return value < 0 ? int128(0) : value; } function closeTo(uint a, uint b, uint target) internal pure returns (bool) { if (a > b) { if (a - b <= target) { return true; } } else { if (b - a <= target) { return true; } } return false; } function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.13; import "../interface/IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint value ) internal { uint newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IWMATIC { function name() external view returns (string memory); function approve(address guy, uint256 wad) external returns (bool); function totalSupply() external view returns (uint256); function transferFrom( address src, address dst, uint256 wad ) external returns (bool); function withdraw(uint256 wad) external; function decimals() external view returns (uint8); function balanceOf(address) external view returns (uint256); function symbol() external view returns (string memory); function transfer(address dst, uint256 wad) external returns (bool); function deposit() external payable; function allowance(address, address) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IPair { // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint timestamp; uint reserve0Cumulative; uint reserve1Cumulative; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); function claimFees() external returns (uint, uint); function tokens() external returns (address, address); function token0() external returns (address); function token1() external returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IFactory { function treasury() external view returns (address); function isPair(address pair) external view returns (bool); function getInitializable() external view returns (address, address, bool); function isPaused() external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.13; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wmatic","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountMATICMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityMATIC","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountMATIC","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":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getExactAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","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":"quoteLiquidity","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":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountMATICMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityMATIC","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountMATIC","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityMATICSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountMATICMin","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":"removeLiquidityMATICWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountMATIC","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","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":"removeLiquidityMATICWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactMATICForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactMATICForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForMATIC","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForMATICSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"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":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wmatic","outputs":[{"internalType":"contract IWMATIC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162004bad38038062004bad8339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c05161497a620002336000396000612ace0152600081816101cb01528181610629015281816108d901528181610957015281816109cb01528181610cfe01528181610eea015281816117b9015281816118cc0152818161195a01528181611e9201528181611f7d0152818161205d01528181612093015281816120d101528181612166015281816124640152818161256c01528181612617015281816136d301528181613797015261398f01526000818161055201528181610fd0015281816112780152818161138c01528181611a9e01528181611d8e0152818161229d015281816128e001528181612a93015281816134c20152613563015261497a6000f3fe6080604052600436106101bb5760003560e01c80639881fcb4116100ec578063cf14e1b11161008a578063e5e31b1311610064578063e5e31b13146105c7578063f41766d8146105f7578063fb41be1614610617578063fbace4151461064b57600080fd5b8063cf14e1b114610574578063d251deed14610594578063e2dbe241146105b457600080fd5b8063ae568868116100c6578063ae568868146104d2578063b6710cb914610500578063c11efebc14610520578063c45a01551461054057600080fd5b80639881fcb41461047257806398a0fb3c14610492578063a32b1fcd146104b257600080fd5b80635a47ddc3116101595780636cc1ae13116101335780636cc1ae13146103ff5780637301e3c81461041f578063765f62a91461043f57806392e364411461045f57600080fd5b80635a47ddc31461036f5780635e1e6325146103aa5780635e60dab5146103df57600080fd5b8063340dbb0b11610195578063340dbb0b146102b75780634386e63c146102d75780634c1ee03e146102f7578063544caa561461032f57600080fd5b80630dede6c41461023d57806313dcfc591461027757806325200f17146102a457600080fd5b3661023857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102365760405162461bcd60e51b815260206004820152601660248201527544797374526f757465723a204e4f545f574d4154494360501b60448201526064015b60405180910390fd5b005b600080fd5b34801561024957600080fd5b5061025d610258366004613c0e565b61066b565b604080519283526020830191909152015b60405180910390f35b34801561028357600080fd5b50610297610292366004613c93565b61068f565b60405161026e9190613d0e565b6102366102b2366004613d97565b6108b6565b3480156102c357600080fd5b506102976102d2366004613dfe565b610cd1565b3480156102e357600080fd5b5061025d6102f2366004613e71565b610fc9565b34801561030357600080fd5b50610317610312366004613ec2565b611130565b6040516001600160a01b03909116815260200161026e565b34801561033b57600080fd5b5061034f61034a366004613f0d565b611147565b604080516001600160a01b0393841681529290911660208301520161026e565b34801561037b57600080fd5b5061038f61038a366004613f46565b611160565b6040805193845260208401929092529082015260600161026e565b3480156103b657600080fd5b506103ca6103c5366004613fd5565b611240565b6040805192835290151560208301520161026e565b3480156103eb57600080fd5b5061025d6103fa366004613ec2565b611494565b34801561040b57600080fd5b5061023661041a366004613dfe565b6114ae565b34801561042b57600080fd5b5061029761043a366004614077565b6116b7565b34801561044b57600080fd5b5061025d61045a366004614143565b611772565b61029761046d366004613d97565b611794565b34801561047e57600080fd5b5061029761048d366004614214565b611a8a565b34801561049e57600080fd5b5061038f6104ad3660046142ba565b611a96565b3480156104be57600080fd5b5061025d6104cd366004614326565b611c96565b3480156104de57600080fd5b506104f26104ed3660046143e2565b611d51565b60405190815260200161026e565b34801561050c57600080fd5b506104f261051b36600461440e565b611d5e565b34801561052c57600080fd5b5061025d61053b366004614461565b611e87565b34801561054c57600080fd5b506103177f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b5061025d61058f366004614143565b611f60565b3480156105a057600080fd5b5061025d6105af366004614461565b611f72565b61038f6105c2366004614143565b612031565b3480156105d357600080fd5b506105e76105e236600461450b565b61227b565b604051901515815260200161026e565b34801561060357600080fd5b50610297610612366004613dfe565b612310565b34801561062357600080fd5b506103177f000000000000000000000000000000000000000000000000000000000000000081565b34801561065757600080fd5b50610236610666366004613dfe565b612439565b60008061067e8a8a8a8a8a8a8a8a612685565b915091509850989650505050505050565b606081428110156106b25760405162461bcd60e51b815260040161022d90614528565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816106c9579050509050878160008151811061070c5761070c614555565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061074457610744614555565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061077c5761077c614555565b602090810291909101015190151560409091015261079a8a826127ca565b92508883600185516107ac9190614581565b815181106107bc576107bc614555565b602002602001015110156107e25760405162461bcd60e51b815260040161022d90614598565b61089e3361084b836000815181106107fc576107fc614555565b6020026020010151600001518460008151811061081b5761081b614555565b6020026020010151602001518560008151811061083a5761083a614555565b602002602001015160400151612a4c565b8560008151811061085e5761085e614555565b60200260200101518460008151811061087957610879614555565b6020026020010151600001516001600160a01b0316612b54909392919063ffffffff16565b6108a9838287612bc5565b5050979650505050505050565b80428110156108d75760405162461bcd60e51b815260040161022d90614528565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061091457610914614555565b61092a926020606090920201908101915061450b565b6001600160a01b0316146109505760405162461bcd60e51b815260040161022d906145de565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109b057600080fd5b505af11580156109c4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb610a7f88886000818110610a0e57610a0e614555565b610a24926020606090920201908101915061450b565b89896000818110610a3757610a37614555565b9050606002016020016020810190610a4f919061450b565b8a8a6000818110610a6257610a62614555565b9050606002016040016020810190610a7a9190614615565b612a4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190614632565b610afc57610afc61464f565b60008686610b0b600182614581565b818110610b1a57610b1a614555565b9050606002016020016020810190610b32919061450b565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614665565b9050610bfc8787808060200260200160405190810160405280939291908181526020016000905b82821015610bf157610be26060830286013681900381019061467e565b81526020019060010190610bc5565b505050505086612e14565b87818888610c0b600182614581565b818110610c1a57610c1a614555565b9050606002016020016020810190610c32919061450b565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9f9190614665565b610ca99190614581565b1015610cc75760405162461bcd60e51b815260040161022d90614598565b5050505050505050565b60608142811015610cf45760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610d2b600182614581565b818110610d3a57610d3a614555565b9050606002016020016020810190610d52919061450b565b6001600160a01b031614610d785760405162461bcd60e51b815260040161022d906145de565b610dd4888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca57610dbb6060830286013681900381019061467e565b81526020019060010190610d9e565b50505050506127ca565b9150868260018451610de69190614581565b81518110610df657610df6614555565b60200260200101511015610e1c5760405162461bcd60e51b815260040161022d90614598565b610e8b33610e3688886000818110610a0e57610a0e614555565b84600081518110610e4957610e49614555565b602002602001015189896000818110610e6457610e64614555565b610e7a926020606090920201908101915061450b565b6001600160a01b0316929190612b54565b610ee8828787808060200260200160405190810160405280939291908181526020016000905b82821015610edd57610ece6060830286013681900381019061467e565b81526020019060010190610eb1565b505050505030612bc5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610f269190614581565b81518110610f3657610f36614555565b60200260200101516040518263ffffffff1660e01b8152600401610f5c91815260200190565b600060405180830381600087803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b50505050610fbe848360018551610fa19190614581565b81518110610fb157610fb1614555565b602002602001015161319c565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b815260040161101e9392919061469a565b602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906146be565b90506001600160a01b03811661107c576000809250925050611127565b60008061108a898989613259565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f29190614665565b9050806110ff84896146db565b61110991906146fa565b95508061111683896146db565b61112091906146fa565b9450505050505b94509492505050565b600061113d848484612a4c565b90505b9392505050565b6000806111548484613323565b915091505b9250929050565b600080600083428110156111865760405162461bcd60e51b815260040161022d90614528565b6111958d8d8d8d8d8d8d613405565b909450925060006111a78e8e8e612a4c565b90506111b58e338388612b54565b6111c18d338387612b54565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190614665565b9250505099509950999650505050505050565b600080600061125185856001612a4c565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190614632565b1561135e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190614665565b91505b61136a87876000612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614632565b15611472576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f9190614665565b90505b80821161148157806000611485565b8160015b94509450505050935093915050565b6000806114a2858585613259565b91509150935093915050565b80428110156114cf5760405162461bcd60e51b815260040161022d90614528565b6115513361153d878760008181106114e9576114e9614555565b6114ff926020606090920201908101915061450b565b8888600081811061151257611512614555565b905060600201602001602081019061152a919061450b565b89896000818110610a6257610a62614555565b8988886000818110610e6457610e64614555565b60008585611560600182614581565b81811061156f5761156f614555565b9050606002016020016020810190611587919061450b565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190614665565b90506116518686808060200260200160405190810160405280939291908181526020016000905b82821015611646576116376060830286013681900381019061467e565b8152602001906001019061161a565b505050505085612e14565b86818787611660600182614581565b81811061166f5761166f614555565b9050606002016020016020810190611687919061450b565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a0823190602401610c5e565b606081428110156116da5760405162461bcd60e51b815260040161022d90614528565b611707336116f488886000818110610a0e57610a0e614555565b89600081518110610e4957610e49614555565b611764878787808060200260200160405190810160405280939291908181526020016000905b828210156117595761174a6060830286013681900381019061467e565b8152602001906001019061172d565b505050505086612bc5565b8691505b5095945050505050565b600080611784898989898989896136a9565b9150915097509795505050505050565b606081428110156117b75760405162461bcd60e51b815260040161022d90614528565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106117f4576117f4614555565b61180a926020606090920201908101915061450b565b6001600160a01b0316146118305760405162461bcd60e51b815260040161022d906145de565b611882348787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576118736060830286013681900381019061467e565b81526020019060010190611856565b91508682600184516118949190614581565b815181106118a4576118a4614555565b602002602001015110156118ca5760405162461bcd60e51b815260040161022d90614598565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061190c5761190c614555565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561193f57600080fd5b505af1158015611953573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61199d88886000818110610a0e57610a0e614555565b846000815181106119b0576119b0614555565b60200260200101516040518363ffffffff1660e01b81526004016119e99291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2c9190614632565b611a3857611a3861464f565b611768828787808060200260200160405190810160405280939291908181526020016000905b8282101561175957611a7b6060830286013681900381019061467e565b81526020019060010190611a5e565b606061114083836127ca565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611aec9392919061469a565b602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906146be565b9050600080806001600160a01b03841615611bb757836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba49190614665565b9050611bb18c8c8c613259565b90935091505b82158015611bc3575081155b15611bf4578896508795506103e8611be3611bde888a6146db565b613812565b611bed9190614581565b9450611c87565b6000611c018a8585613882565b9050888111611c4957899750955085611c4284611c1e848b6146db565b611c2891906146fa565b84611c33858b6146db565b611c3d91906146fa565b61394f565b9550611c85565b6000611c568a8587613882565b9850899750889050611c8185611c6c85846146db565b611c7691906146fa565b85611c33868c6146db565b9650505b505b50505050955095509592505050565b6000806000611ca68f8f8f612a4c565b9050600087611cb5578c611cb9565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611cf4903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b5050505050611d378f8f8f8f8f8f8f8f612685565b8093508194505050509c509c9a5050505050505050505050565b600061113d848484613882565b600080611d6c858585612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfb9190614632565b15611e79576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190614665565b915050611e7f565b60009150505b949350505050565b6000806000611eb78e7f00000000000000000000000000000000000000000000000000000000000000008f612a4c565b9050600087611ec6578c611eca565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611f05903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611f1f57600080fd5b505af1158015611f33573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f613965565b809450819550505050509b509b9950505050505050505050565b60008061178489898989898989613965565b6000806000611fa28e7f00000000000000000000000000000000000000000000000000000000000000008f612a4c565b9050600087611fb1578c611fb5565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611ff0903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b15801561200a57600080fd5b505af115801561201e573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f6136a9565b600080600083428110156120575760405162461bcd60e51b815260040161022d90614528565b6120868b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d613405565b909450925060006120b88c7f00000000000000000000000000000000000000000000000000000000000000008d612a4c565b90506120cf6001600160a01b038d16338388612b54565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190614632565b6121e3576121e361464f565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f9190614665565b92508334111561226c5761226c336122678634614581565b61319c565b50509750975097945050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156122e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230a9190614632565b92915050565b606081428110156123335760405162461bcd60e51b815260040161022d90614528565b612385888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576123766060830286013681900381019061467e565b81526020019060010190612359565b91508682600184516123979190614581565b815181106123a7576123a7614555565b602002602001015110156123cd5760405162461bcd60e51b815260040161022d90614598565b6123e733610e3688886000818110610a0e57610a0e614555565b610fbe828787808060200260200160405190810160405280939291908181526020016000905b828210156117595761242a6060830286013681900381019061467e565b8152602001906001019061240d565b804281101561245a5760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585612491600182614581565b8181106124a0576124a0614555565b90506060020160200160208101906124b8919061450b565b6001600160a01b0316146124de5760405162461bcd60e51b815260040161022d906145de565b6124f83361153d878760008181106114e9576114e9614555565b6125548585808060200260200160405190810160405280939291908181526020016000905b828210156125495761253a6060830286013681900381019061467e565b8152602001906001019061251d565b505050505030612e14565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df9190614665565b9050868110156126015760405162461bcd60e51b815260040161022d90614598565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561266357600080fd5b505af1158015612677573d6000803e3d6000fd5b50505050610cc7848261319c565b60008082428110156126a95760405162461bcd60e51b815260040161022d90614528565b60006126b68c8c8c612a4c565b90506126cd6001600160a01b03821633838c612b54565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273d919061475d565b91509150600061274d8f8f613323565b509050806001600160a01b03168f6001600160a01b031614612770578183612773565b82825b90975095508a8710156127985760405162461bcd60e51b815260040161022d90614781565b898610156127b85760405162461bcd60e51b815260040161022d906147c2565b50505050509850989650505050505050565b60606001825110156127ee5760405162461bcd60e51b815260040161022d906145de565b81516127fb906001614803565b67ffffffffffffffff8111156128135761281361400c565b60405190808252806020026020018201604052801561283c578160200160208202803683370190505b509050828160008151811061285357612853614555565b60200260200101818152505060005b8251811015612a455760006128be84838151811061288257612882614555565b6020026020010151600001518584815181106128a0576128a0614555565b60200260200101516020015186858151811061083a5761083a614555565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190614632565b15612a3257806001600160a01b031663f140a35a84848151811061297357612973614555565b602002602001015186858151811061298d5761298d614555565b6020026020010151600001516040518363ffffffff1660e01b81526004016129c89291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156129e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a099190614665565b83612a15846001614803565b81518110612a2557612a25614555565b6020026020010181815250505b5080612a3d8161481b565b915050612862565b5092915050565b6000806000612a5b8686613323565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001612b32939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612bbf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139d2565b50505050565b60005b8251811015612bbf576000612c17848381518110612be857612be8614555565b602002602001015160000151858481518110612c0657612c06614555565b602002602001015160200151613323565b509050600085612c28846001614803565b81518110612c3857612c38614555565b60200260200101519050600080836001600160a01b0316878681518110612c6157612c61614555565b6020026020010151600001516001600160a01b031614612c8357826000612c87565b6000835b91509150600060018851612c9b9190614581565b8610612ca75786612d1a565b612d1a88612cb6886001614803565b81518110612cc657612cc6614555565b60200260200101516000015189886001612ce09190614803565b81518110612cf057612cf0614555565b6020026020010151602001518a896001612d0a9190614803565b8151811061083a5761083a614555565b9050612d6d888781518110612d3157612d31614555565b602002602001015160000151898881518110612d4f57612d4f614555565b6020026020010151602001518a898151811061083a5761083a614555565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612daa576020820181803683370190505b506040518563ffffffff1660e01b8152600401612dca949392919061488c565b600060405180830381600087803b158015612de457600080fd5b505af1158015612df8573d6000803e3d6000fd5b5050505050505050508080612e0c9061481b565b915050612bc8565b60005b825181101561319757600080848381518110612e3557612e35614555565b602002602001015160000151858481518110612e5357612e53614555565b602002602001015160200151915091506000612e6f8383613323565b5090506000612ec5878681518110612e8957612e89614555565b602002602001015160000151888781518110612ea757612ea7614555565b60200260200101516020015189888151811061083a5761083a614555565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f91906148d0565b506001600160701b031691506001600160701b031691506000866001600160a01b0316896001600160a01b031614612f675781612f69565b825b6040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa158015612fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd89190614665565b612fe29190614581565b6040516378a051ad60e11b8152600481018290526001600160a01b038b811660248301529196509087169063f140a35a90604401602060405180830381865afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614665565b9350505050600080856001600160a01b0316886001600160a01b03161461308057826000613084565b6000835b91509150600060018c516130989190614581565b8a106130a4578a613107565b6131078c6130b38c6001614803565b815181106130c3576130c3614555565b6020026020010151600001518d8c60016130dd9190614803565b815181106130ed576130ed614555565b6020026020010151602001518e8d6001612d0a9190614803565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613149908690869086906024810161488c565b600060405180830381600087803b15801561316357600080fd5b505af1158015613177573d6000803e3d6000fd5b50505050505050505050505050808061318f9061481b565b915050612e17565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516131c69190614915565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50509050806131975760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204554485f5452414e534645525f4641494c454400604482015260640161022d565b60008060006132688686613323565b509050600080613279888888612a4c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156132b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132da91906148d0565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b031614613311578082613314565b81815b90999098509650505050505050565b600080826001600160a01b0316846001600160a01b0316036133875760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204944454e544943414c5f41444452455353455300604482015260640161022d565b826001600160a01b0316846001600160a01b0316106133a75782846133aa565b83835b90925090506001600160a01b0382166111595760405162461bcd60e51b815260206004820152601860248201527f44797374526f757465723a205a45524f5f414444524553530000000000000000604482015260640161022d565b600080838610156134585760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f415f414d4f554e5400000000604482015260640161022d565b828510156134a85760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f425f414d4f554e5400000000604482015260640161022d565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc30906134fb908d908d908d9060040161469a565b602060405180830381865afa158015613518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353c91906146be565b90506001600160a01b0381166135e2576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce49061359c908d908d908d9060040161469a565b6020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df91906146be565b90505b6000806135f08c8c8c613259565b91509150816000148015613602575080155b156136125788945087935061369a565b600061361f8a8484613882565b905088811161365357868110156136485760405162461bcd60e51b815260040161022d906147c2565b899550935083613698565b60006136608a8486613882565b90508a8111156136725761367261464f565b888110156136925760405162461bcd60e51b815260040161022d90614781565b95508894505b505b50505097509795505050505050565b60008082428110156136cd5760405162461bcd60e51b815260040161022d90614528565b6136fd8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b612685565b6040516370a0823160e01b815230600482015291945092506137819086906001600160a01b038d16906370a0823190602401602060405180830381865afa15801561374c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137709190614665565b6001600160a01b038d169190613aa4565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156137e357600080fd5b505af11580156137f7573d6000803e3d6000fd5b50505050613805858361319c565b5097509795505050505050565b60006003821115613873575080600061382c6002836146fa565b613837906001614803565b90505b8181101561386d5790508060028161385281866146fa565b61385c9190614803565b61386691906146fa565b905061383a565b50919050565b811561387d575060015b919050565b60008084116138d35760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a20494e53554646494349454e545f414d4f554e5400604482015260640161022d565b6000831180156138e35750600082115b61393a5760405162461bcd60e51b815260206004820152602260248201527f44797374526f757465723a20494e53554646494349454e545f4c495155494449604482015261545960f01b606482015260840161022d565b8261394583866146db565b61113d91906146fa565b600081831061395e5781611140565b5090919050565b60008082428110156139895760405162461bcd60e51b815260040161022d90614528565b6139b98a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b612685565b90935091506137816001600160a01b038b168685613aa4565b6000613a27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ad49092919063ffffffff16565b8051909150156131975780806020019051810190613a459190614632565b6131975760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161022d565b6040516001600160a01b03831660248201526044810182905261319790849063a9059cbb60e01b90606401612b88565b60606001600160a01b0384163b613b2d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161022d565b600080856001600160a01b031685604051613b489190614915565b6000604051808303816000865af19150503d8060008114613b85576040519150601f19603f3d011682016040523d82523d6000602084013e613b8a565b606091505b5091509150613b9a828286613ba4565b9695505050505050565b60608315613bb3575081611140565b825115613bc35782518084602001fd5b8160405162461bcd60e51b815260040161022d9190614931565b6001600160a01b0381168114613bf257600080fd5b50565b803561387d81613bdd565b8015158114613bf257600080fd5b600080600080600080600080610100898b031215613c2b57600080fd5b8835613c3681613bdd565b97506020890135613c4681613bdd565b96506040890135613c5681613c00565b9550606089013594506080890135935060a0890135925060c0890135613c7b81613bdd565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613cae57600080fd5b87359650602088013595506040880135613cc781613bdd565b94506060880135613cd781613bdd565b93506080880135613ce781613c00565b925060a0880135613cf781613bdd565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613d4657835183529284019291840191600101613d2a565b50909695505050505050565b60008083601f840112613d6457600080fd5b50813567ffffffffffffffff811115613d7c57600080fd5b60208301915083602060608302850101111561115957600080fd5b600080600080600060808688031215613daf57600080fd5b85359450602086013567ffffffffffffffff811115613dcd57600080fd5b613dd988828901613d52565b9095509350506040860135613ded81613bdd565b949793965091946060013592915050565b60008060008060008060a08789031215613e1757600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613e3c57600080fd5b613e4889828a01613d52565b9095509350506060870135613e5c81613bdd565b80925050608087013590509295509295509295565b60008060008060808587031215613e8757600080fd5b8435613e9281613bdd565b93506020850135613ea281613bdd565b92506040850135613eb281613c00565b9396929550929360600135925050565b600080600060608486031215613ed757600080fd5b8335613ee281613bdd565b92506020840135613ef281613bdd565b91506040840135613f0281613c00565b809150509250925092565b60008060408385031215613f2057600080fd5b8235613f2b81613bdd565b91506020830135613f3b81613bdd565b809150509250929050565b60008060008060008060008060006101208a8c031215613f6557600080fd5b8935613f7081613bdd565b985060208a0135613f8081613bdd565b975060408a0135613f9081613c00565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613fbc81613bdd565b809250506101008a013590509295985092959850929598565b600080600060608486031215613fea57600080fd5b833592506020840135613ffc81613bdd565b91506040840135613f0281613bdd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561404b5761404b61400c565b604052919050565b600067ffffffffffffffff82111561406d5761406d61400c565b5060051b60200190565b60008060008060006080868803121561408f57600080fd5b853567ffffffffffffffff808211156140a757600080fd5b818801915088601f8301126140bb57600080fd5b813560206140d06140cb83614053565b614022565b82815260059290921b8401810191818101908c8411156140ef57600080fd5b948201945b8386101561410d578535825294820194908201906140f4565b9950508901359250508082111561412357600080fd5b5061413088828901613d52565b9095509350613ded905060408701613bf5565b600080600080600080600060e0888a03121561415e57600080fd5b873561416981613bdd565b9650602088013561417981613c00565b955060408801359450606088013593506080880135925060a0880135613cf781613bdd565b6000606082840312156141b057600080fd5b6040516060810181811067ffffffffffffffff821117156141d3576141d361400c565b60405290508082356141e481613bdd565b815260208301356141f481613bdd565b6020820152604083013561420781613c00565b6040919091015292915050565b6000806040838503121561422757600080fd5b8235915060208084013567ffffffffffffffff81111561424657600080fd5b8401601f8101861361425757600080fd5b80356142656140cb82614053565b8181526060918202830184019184820191908984111561428457600080fd5b938501935b838510156142aa5761429b8a8661419e565b83529384019391850191614289565b5080955050505050509250929050565b600080600080600060a086880312156142d257600080fd5b85356142dd81613bdd565b945060208601356142ed81613bdd565b935060408601356142fd81613c00565b94979396509394606081013594506080013592915050565b803560ff8116811461387d57600080fd5b6000806000806000806000806000806000806101808d8f03121561434957600080fd5b8c3561435481613bdd565b9b5060208d013561436481613bdd565b9a5060408d013561437481613c00565b995060608d0135985060808d0135975060a08d0135965060c08d013561439981613bdd565b955060e08d013594506101008d01356143b181613c00565b93506143c06101208e01614315565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000606084860312156143f757600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561442457600080fd5b84359350602085013561443681613bdd565b9250604085013561444681613bdd565b9150606085013561445681613c00565b939692955090935050565b60008060008060008060008060008060006101608c8e03121561448357600080fd5b8b3561448e81613bdd565b9a5060208c013561449e81613c00565b995060408c0135985060608c0135975060808c0135965060a08c01356144c381613bdd565b955060c08c0135945060e08c01356144da81613c00565b93506144e96101008d01614315565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60006020828403121561451d57600080fd5b813561114081613bdd565b602080825260139082015272111e5cdd149bdd5d195c8e8811561412549151606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156145935761459361456b565b500390565b60208082526026908201527f44797374526f757465723a20494e53554646494349454e545f4f55545055545f604082015265105353d5539560d21b606082015260800190565b60208082526018908201527f44797374526f757465723a20494e56414c49445f504154480000000000000000604082015260600190565b60006020828403121561462757600080fd5b813561114081613c00565b60006020828403121561464457600080fd5b815161114081613c00565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561467757600080fd5b5051919050565b60006060828403121561469057600080fd5b611140838361419e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156146d057600080fd5b815161114081613bdd565b60008160001904831182151516156146f5576146f561456b565b500290565b60008261471757634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806040838503121561477057600080fd5b505080516020909101519092909150565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f415f414d4f554e6040820152601560fa1b606082015260800190565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f425f414d4f554e6040820152601560fa1b606082015260800190565b600082198211156148165761481661456b565b500190565b60006001820161482d5761482d61456b565b5060010190565b60005b8381101561484f578181015183820152602001614837565b83811115612bbf5750506000910152565b60008151808452614878816020860160208601614834565b601f01601f19169290920160200192915050565b84815283602082015260018060a01b0383166040820152608060608201526000613b9a6080830184614860565b80516001600160701b038116811461387d57600080fd5b6000806000606084860312156148e557600080fd5b6148ee846148b9565b92506148fc602085016148b9565b9150604084015163ffffffff81168114613f0257600080fd5b60008251614927818460208701614834565b9190910192915050565b602081526000611140602083018461486056fea2646970667358221220b8778e24ce11299fa15b6e6e6848c3232e6eaec9bba1df8244d538430bb1f09a64736f6c634300080d00330000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec90000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c80639881fcb4116100ec578063cf14e1b11161008a578063e5e31b1311610064578063e5e31b13146105c7578063f41766d8146105f7578063fb41be1614610617578063fbace4151461064b57600080fd5b8063cf14e1b114610574578063d251deed14610594578063e2dbe241146105b457600080fd5b8063ae568868116100c6578063ae568868146104d2578063b6710cb914610500578063c11efebc14610520578063c45a01551461054057600080fd5b80639881fcb41461047257806398a0fb3c14610492578063a32b1fcd146104b257600080fd5b80635a47ddc3116101595780636cc1ae13116101335780636cc1ae13146103ff5780637301e3c81461041f578063765f62a91461043f57806392e364411461045f57600080fd5b80635a47ddc31461036f5780635e1e6325146103aa5780635e60dab5146103df57600080fd5b8063340dbb0b11610195578063340dbb0b146102b75780634386e63c146102d75780634c1ee03e146102f7578063544caa561461032f57600080fd5b80630dede6c41461023d57806313dcfc591461027757806325200f17146102a457600080fd5b3661023857336001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127016146102365760405162461bcd60e51b815260206004820152601660248201527544797374526f757465723a204e4f545f574d4154494360501b60448201526064015b60405180910390fd5b005b600080fd5b34801561024957600080fd5b5061025d610258366004613c0e565b61066b565b604080519283526020830191909152015b60405180910390f35b34801561028357600080fd5b50610297610292366004613c93565b61068f565b60405161026e9190613d0e565b6102366102b2366004613d97565b6108b6565b3480156102c357600080fd5b506102976102d2366004613dfe565b610cd1565b3480156102e357600080fd5b5061025d6102f2366004613e71565b610fc9565b34801561030357600080fd5b50610317610312366004613ec2565b611130565b6040516001600160a01b03909116815260200161026e565b34801561033b57600080fd5b5061034f61034a366004613f0d565b611147565b604080516001600160a01b0393841681529290911660208301520161026e565b34801561037b57600080fd5b5061038f61038a366004613f46565b611160565b6040805193845260208401929092529082015260600161026e565b3480156103b657600080fd5b506103ca6103c5366004613fd5565b611240565b6040805192835290151560208301520161026e565b3480156103eb57600080fd5b5061025d6103fa366004613ec2565b611494565b34801561040b57600080fd5b5061023661041a366004613dfe565b6114ae565b34801561042b57600080fd5b5061029761043a366004614077565b6116b7565b34801561044b57600080fd5b5061025d61045a366004614143565b611772565b61029761046d366004613d97565b611794565b34801561047e57600080fd5b5061029761048d366004614214565b611a8a565b34801561049e57600080fd5b5061038f6104ad3660046142ba565b611a96565b3480156104be57600080fd5b5061025d6104cd366004614326565b611c96565b3480156104de57600080fd5b506104f26104ed3660046143e2565b611d51565b60405190815260200161026e565b34801561050c57600080fd5b506104f261051b36600461440e565b611d5e565b34801561052c57600080fd5b5061025d61053b366004614461565b611e87565b34801561054c57600080fd5b506103177f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec981565b34801561058057600080fd5b5061025d61058f366004614143565b611f60565b3480156105a057600080fd5b5061025d6105af366004614461565b611f72565b61038f6105c2366004614143565b612031565b3480156105d357600080fd5b506105e76105e236600461450b565b61227b565b604051901515815260200161026e565b34801561060357600080fd5b50610297610612366004613dfe565b612310565b34801561062357600080fd5b506103177f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127081565b34801561065757600080fd5b50610236610666366004613dfe565b612439565b60008061067e8a8a8a8a8a8a8a8a612685565b915091509850989650505050505050565b606081428110156106b25760405162461bcd60e51b815260040161022d90614528565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816106c9579050509050878160008151811061070c5761070c614555565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061074457610744614555565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061077c5761077c614555565b602090810291909101015190151560409091015261079a8a826127ca565b92508883600185516107ac9190614581565b815181106107bc576107bc614555565b602002602001015110156107e25760405162461bcd60e51b815260040161022d90614598565b61089e3361084b836000815181106107fc576107fc614555565b6020026020010151600001518460008151811061081b5761081b614555565b6020026020010151602001518560008151811061083a5761083a614555565b602002602001015160400151612a4c565b8560008151811061085e5761085e614555565b60200260200101518460008151811061087957610879614555565b6020026020010151600001516001600160a01b0316612b54909392919063ffffffff16565b6108a9838287612bc5565b5050979650505050505050565b80428110156108d75760405162461bcd60e51b815260040161022d90614528565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b03168585600081811061091457610914614555565b61092a926020606090920201908101915061450b565b6001600160a01b0316146109505760405162461bcd60e51b815260040161022d906145de565b60003490507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109b057600080fd5b505af11580156109c4573d6000803e3d6000fd5b50505050507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663a9059cbb610a7f88886000818110610a0e57610a0e614555565b610a24926020606090920201908101915061450b565b89896000818110610a3757610a37614555565b9050606002016020016020810190610a4f919061450b565b8a8a6000818110610a6257610a62614555565b9050606002016040016020810190610a7a9190614615565b612a4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190614632565b610afc57610afc61464f565b60008686610b0b600182614581565b818110610b1a57610b1a614555565b9050606002016020016020810190610b32919061450b565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614665565b9050610bfc8787808060200260200160405190810160405280939291908181526020016000905b82821015610bf157610be26060830286013681900381019061467e565b81526020019060010190610bc5565b505050505086612e14565b87818888610c0b600182614581565b818110610c1a57610c1a614555565b9050606002016020016020810190610c32919061450b565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9f9190614665565b610ca99190614581565b1015610cc75760405162461bcd60e51b815260040161022d90614598565b5050505050505050565b60608142811015610cf45760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270168686610d2b600182614581565b818110610d3a57610d3a614555565b9050606002016020016020810190610d52919061450b565b6001600160a01b031614610d785760405162461bcd60e51b815260040161022d906145de565b610dd4888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca57610dbb6060830286013681900381019061467e565b81526020019060010190610d9e565b50505050506127ca565b9150868260018451610de69190614581565b81518110610df657610df6614555565b60200260200101511015610e1c5760405162461bcd60e51b815260040161022d90614598565b610e8b33610e3688886000818110610a0e57610a0e614555565b84600081518110610e4957610e49614555565b602002602001015189896000818110610e6457610e64614555565b610e7a926020606090920201908101915061450b565b6001600160a01b0316929190612b54565b610ee8828787808060200260200160405190810160405280939291908181526020016000905b82821015610edd57610ece6060830286013681900381019061467e565b81526020019060010190610eb1565b505050505030612bc5565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316632e1a7d4d8360018551610f269190614581565b81518110610f3657610f36614555565b60200260200101516040518263ffffffff1660e01b8152600401610f5c91815260200190565b600060405180830381600087803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b50505050610fbe848360018551610fa19190614581565b81518110610fb157610fb1614555565b602002602001015161319c565b509695505050505050565b60008060007f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec96001600160a01b0316636801cc308888886040518463ffffffff1660e01b815260040161101e9392919061469a565b602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906146be565b90506001600160a01b03811661107c576000809250925050611127565b60008061108a898989613259565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f29190614665565b9050806110ff84896146db565b61110991906146fa565b95508061111683896146db565b61112091906146fa565b9450505050505b94509492505050565b600061113d848484612a4c565b90505b9392505050565b6000806111548484613323565b915091505b9250929050565b600080600083428110156111865760405162461bcd60e51b815260040161022d90614528565b6111958d8d8d8d8d8d8d613405565b909450925060006111a78e8e8e612a4c565b90506111b58e338388612b54565b6111c18d338387612b54565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190614665565b9250505099509950999650505050505050565b600080600061125185856001612a4c565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190614632565b1561135e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190614665565b91505b61136a87876000612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614632565b15611472576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f9190614665565b90505b80821161148157806000611485565b8160015b94509450505050935093915050565b6000806114a2858585613259565b91509150935093915050565b80428110156114cf5760405162461bcd60e51b815260040161022d90614528565b6115513361153d878760008181106114e9576114e9614555565b6114ff926020606090920201908101915061450b565b8888600081811061151257611512614555565b905060600201602001602081019061152a919061450b565b89896000818110610a6257610a62614555565b8988886000818110610e6457610e64614555565b60008585611560600182614581565b81811061156f5761156f614555565b9050606002016020016020810190611587919061450b565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190614665565b90506116518686808060200260200160405190810160405280939291908181526020016000905b82821015611646576116376060830286013681900381019061467e565b8152602001906001019061161a565b505050505085612e14565b86818787611660600182614581565b81811061166f5761166f614555565b9050606002016020016020810190611687919061450b565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a0823190602401610c5e565b606081428110156116da5760405162461bcd60e51b815260040161022d90614528565b611707336116f488886000818110610a0e57610a0e614555565b89600081518110610e4957610e49614555565b611764878787808060200260200160405190810160405280939291908181526020016000905b828210156117595761174a6060830286013681900381019061467e565b8152602001906001019061172d565b505050505086612bc5565b8691505b5095945050505050565b600080611784898989898989896136a9565b9150915097509795505050505050565b606081428110156117b75760405162461bcd60e51b815260040161022d90614528565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316868660008181106117f4576117f4614555565b61180a926020606090920201908101915061450b565b6001600160a01b0316146118305760405162461bcd60e51b815260040161022d906145de565b611882348787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576118736060830286013681900381019061467e565b81526020019060010190611856565b91508682600184516118949190614581565b815181106118a4576118a4614555565b602002602001015110156118ca5760405162461bcd60e51b815260040161022d90614598565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db08360008151811061190c5761190c614555565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561193f57600080fd5b505af1158015611953573d6000803e3d6000fd5b50505050507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663a9059cbb61199d88886000818110610a0e57610a0e614555565b846000815181106119b0576119b0614555565b60200260200101516040518363ffffffff1660e01b81526004016119e99291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2c9190614632565b611a3857611a3861464f565b611768828787808060200260200160405190810160405280939291908181526020016000905b8282101561175957611a7b6060830286013681900381019061467e565b81526020019060010190611a5e565b606061114083836127ca565b6000806000807f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec96001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611aec9392919061469a565b602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906146be565b9050600080806001600160a01b03841615611bb757836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba49190614665565b9050611bb18c8c8c613259565b90935091505b82158015611bc3575081155b15611bf4578896508795506103e8611be3611bde888a6146db565b613812565b611bed9190614581565b9450611c87565b6000611c018a8585613882565b9050888111611c4957899750955085611c4284611c1e848b6146db565b611c2891906146fa565b84611c33858b6146db565b611c3d91906146fa565b61394f565b9550611c85565b6000611c568a8587613882565b9850899750889050611c8185611c6c85846146db565b611c7691906146fa565b85611c33868c6146db565b9650505b505b50505050955095509592505050565b6000806000611ca68f8f8f612a4c565b9050600087611cb5578c611cb9565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611cf4903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b5050505050611d378f8f8f8f8f8f8f8f612685565b8093508194505050509c509c9a5050505050505050505050565b600061113d848484613882565b600080611d6c858585612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa158015611dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfb9190614632565b15611e79576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190614665565b915050611e7f565b60009150505b949350505050565b6000806000611eb78e7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708f612a4c565b9050600087611ec6578c611eca565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611f05903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611f1f57600080fd5b505af1158015611f33573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f613965565b809450819550505050509b509b9950505050505050505050565b60008061178489898989898989613965565b6000806000611fa28e7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708f612a4c565b9050600087611fb1578c611fb5565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611ff0903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b15801561200a57600080fd5b505af115801561201e573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f6136a9565b600080600083428110156120575760405162461bcd60e51b815260040161022d90614528565b6120868b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708c8c348d8d613405565b909450925060006120b88c7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708d612a4c565b90506120cf6001600160a01b038d16338388612b54565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127016935063a9059cbb925060440190506020604051808303816000875af11580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190614632565b6121e3576121e361464f565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f9190614665565b92508334111561226c5761226c336122678634614581565b61319c565b50509750975097945050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa1580156122e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230a9190614632565b92915050565b606081428110156123335760405162461bcd60e51b815260040161022d90614528565b612385888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576123766060830286013681900381019061467e565b81526020019060010190612359565b91508682600184516123979190614581565b815181106123a7576123a7614555565b602002602001015110156123cd5760405162461bcd60e51b815260040161022d90614598565b6123e733610e3688886000818110610a0e57610a0e614555565b610fbe828787808060200260200160405190810160405280939291908181526020016000905b828210156117595761242a6060830286013681900381019061467e565b8152602001906001019061240d565b804281101561245a5760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270168585612491600182614581565b8181106124a0576124a0614555565b90506060020160200160208101906124b8919061450b565b6001600160a01b0316146124de5760405162461bcd60e51b815260040161022d906145de565b6124f83361153d878760008181106114e9576114e9614555565b6125548585808060200260200160405190810160405280939291908181526020016000905b828210156125495761253a6060830286013681900381019061467e565b8152602001906001019061251d565b505050505030612e14565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316906370a0823190602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df9190614665565b9050868110156126015760405162461bcd60e51b815260040161022d90614598565b604051632e1a7d4d60e01b8152600481018290527f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561266357600080fd5b505af1158015612677573d6000803e3d6000fd5b50505050610cc7848261319c565b60008082428110156126a95760405162461bcd60e51b815260040161022d90614528565b60006126b68c8c8c612a4c565b90506126cd6001600160a01b03821633838c612b54565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273d919061475d565b91509150600061274d8f8f613323565b509050806001600160a01b03168f6001600160a01b031614612770578183612773565b82825b90975095508a8710156127985760405162461bcd60e51b815260040161022d90614781565b898610156127b85760405162461bcd60e51b815260040161022d906147c2565b50505050509850989650505050505050565b60606001825110156127ee5760405162461bcd60e51b815260040161022d906145de565b81516127fb906001614803565b67ffffffffffffffff8111156128135761281361400c565b60405190808252806020026020018201604052801561283c578160200160208202803683370190505b509050828160008151811061285357612853614555565b60200260200101818152505060005b8251811015612a455760006128be84838151811061288257612882614555565b6020026020010151600001518584815181106128a0576128a0614555565b60200260200101516020015186858151811061083a5761083a614555565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190614632565b15612a3257806001600160a01b031663f140a35a84848151811061297357612973614555565b602002602001015186858151811061298d5761298d614555565b6020026020010151600001516040518363ffffffff1660e01b81526004016129c89291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156129e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a099190614665565b83612a15846001614803565b81518110612a2557612a25614555565b6020026020010181815250505b5080612a3d8161481b565b915050612862565b5092915050565b6000806000612a5b8686613323565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec990604901604051602081830303815290604052805190602001207f009bce6d7eb00d3d075e5bd9851068137f44bba159f1cde806a268e20baaf2e8604051602001612b32939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612bbf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139d2565b50505050565b60005b8251811015612bbf576000612c17848381518110612be857612be8614555565b602002602001015160000151858481518110612c0657612c06614555565b602002602001015160200151613323565b509050600085612c28846001614803565b81518110612c3857612c38614555565b60200260200101519050600080836001600160a01b0316878681518110612c6157612c61614555565b6020026020010151600001516001600160a01b031614612c8357826000612c87565b6000835b91509150600060018851612c9b9190614581565b8610612ca75786612d1a565b612d1a88612cb6886001614803565b81518110612cc657612cc6614555565b60200260200101516000015189886001612ce09190614803565b81518110612cf057612cf0614555565b6020026020010151602001518a896001612d0a9190614803565b8151811061083a5761083a614555565b9050612d6d888781518110612d3157612d31614555565b602002602001015160000151898881518110612d4f57612d4f614555565b6020026020010151602001518a898151811061083a5761083a614555565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612daa576020820181803683370190505b506040518563ffffffff1660e01b8152600401612dca949392919061488c565b600060405180830381600087803b158015612de457600080fd5b505af1158015612df8573d6000803e3d6000fd5b5050505050505050508080612e0c9061481b565b915050612bc8565b60005b825181101561319757600080848381518110612e3557612e35614555565b602002602001015160000151858481518110612e5357612e53614555565b602002602001015160200151915091506000612e6f8383613323565b5090506000612ec5878681518110612e8957612e89614555565b602002602001015160000151888781518110612ea757612ea7614555565b60200260200101516020015189888151811061083a5761083a614555565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f91906148d0565b506001600160701b031691506001600160701b031691506000866001600160a01b0316896001600160a01b031614612f675781612f69565b825b6040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa158015612fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd89190614665565b612fe29190614581565b6040516378a051ad60e11b8152600481018290526001600160a01b038b811660248301529196509087169063f140a35a90604401602060405180830381865afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614665565b9350505050600080856001600160a01b0316886001600160a01b03161461308057826000613084565b6000835b91509150600060018c516130989190614581565b8a106130a4578a613107565b6131078c6130b38c6001614803565b815181106130c3576130c3614555565b6020026020010151600001518d8c60016130dd9190614803565b815181106130ed576130ed614555565b6020026020010151602001518e8d6001612d0a9190614803565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613149908690869086906024810161488c565b600060405180830381600087803b15801561316357600080fd5b505af1158015613177573d6000803e3d6000fd5b50505050505050505050505050808061318f9061481b565b915050612e17565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516131c69190614915565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50509050806131975760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204554485f5452414e534645525f4641494c454400604482015260640161022d565b60008060006132688686613323565b509050600080613279888888612a4c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156132b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132da91906148d0565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b031614613311578082613314565b81815b90999098509650505050505050565b600080826001600160a01b0316846001600160a01b0316036133875760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204944454e544943414c5f41444452455353455300604482015260640161022d565b826001600160a01b0316846001600160a01b0316106133a75782846133aa565b83835b90925090506001600160a01b0382166111595760405162461bcd60e51b815260206004820152601860248201527f44797374526f757465723a205a45524f5f414444524553530000000000000000604482015260640161022d565b600080838610156134585760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f415f414d4f554e5400000000604482015260640161022d565b828510156134a85760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f425f414d4f554e5400000000604482015260640161022d565b6040516306801cc360e41b81526000906001600160a01b037f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec91690636801cc30906134fb908d908d908d9060040161469a565b602060405180830381865afa158015613518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353c91906146be565b90506001600160a01b0381166135e2576040516320b7f73960e21b81526001600160a01b037f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec916906382dfdce49061359c908d908d908d9060040161469a565b6020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df91906146be565b90505b6000806135f08c8c8c613259565b91509150816000148015613602575080155b156136125788945087935061369a565b600061361f8a8484613882565b905088811161365357868110156136485760405162461bcd60e51b815260040161022d906147c2565b899550935083613698565b60006136608a8486613882565b90508a8111156136725761367261464f565b888110156136925760405162461bcd60e51b815260040161022d90614781565b95508894505b505b50505097509795505050505050565b60008082428110156136cd5760405162461bcd60e51b815260040161022d90614528565b6136fd8a7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708b8b8b8b308b612685565b6040516370a0823160e01b815230600482015291945092506137819086906001600160a01b038d16906370a0823190602401602060405180830381865afa15801561374c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137709190614665565b6001600160a01b038d169190613aa4565b604051632e1a7d4d60e01b8152600481018390527f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156137e357600080fd5b505af11580156137f7573d6000803e3d6000fd5b50505050613805858361319c565b5097509795505050505050565b60006003821115613873575080600061382c6002836146fa565b613837906001614803565b90505b8181101561386d5790508060028161385281866146fa565b61385c9190614803565b61386691906146fa565b905061383a565b50919050565b811561387d575060015b919050565b60008084116138d35760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a20494e53554646494349454e545f414d4f554e5400604482015260640161022d565b6000831180156138e35750600082115b61393a5760405162461bcd60e51b815260206004820152602260248201527f44797374526f757465723a20494e53554646494349454e545f4c495155494449604482015261545960f01b606482015260840161022d565b8261394583866146db565b61113d91906146fa565b600081831061395e5781611140565b5090919050565b60008082428110156139895760405162461bcd60e51b815260040161022d90614528565b6139b98a7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708b8b8b8b308b612685565b90935091506137816001600160a01b038b168685613aa4565b6000613a27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ad49092919063ffffffff16565b8051909150156131975780806020019051810190613a459190614632565b6131975760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161022d565b6040516001600160a01b03831660248201526044810182905261319790849063a9059cbb60e01b90606401612b88565b60606001600160a01b0384163b613b2d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161022d565b600080856001600160a01b031685604051613b489190614915565b6000604051808303816000865af19150503d8060008114613b85576040519150601f19603f3d011682016040523d82523d6000602084013e613b8a565b606091505b5091509150613b9a828286613ba4565b9695505050505050565b60608315613bb3575081611140565b825115613bc35782518084602001fd5b8160405162461bcd60e51b815260040161022d9190614931565b6001600160a01b0381168114613bf257600080fd5b50565b803561387d81613bdd565b8015158114613bf257600080fd5b600080600080600080600080610100898b031215613c2b57600080fd5b8835613c3681613bdd565b97506020890135613c4681613bdd565b96506040890135613c5681613c00565b9550606089013594506080890135935060a0890135925060c0890135613c7b81613bdd565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613cae57600080fd5b87359650602088013595506040880135613cc781613bdd565b94506060880135613cd781613bdd565b93506080880135613ce781613c00565b925060a0880135613cf781613bdd565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613d4657835183529284019291840191600101613d2a565b50909695505050505050565b60008083601f840112613d6457600080fd5b50813567ffffffffffffffff811115613d7c57600080fd5b60208301915083602060608302850101111561115957600080fd5b600080600080600060808688031215613daf57600080fd5b85359450602086013567ffffffffffffffff811115613dcd57600080fd5b613dd988828901613d52565b9095509350506040860135613ded81613bdd565b949793965091946060013592915050565b60008060008060008060a08789031215613e1757600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613e3c57600080fd5b613e4889828a01613d52565b9095509350506060870135613e5c81613bdd565b80925050608087013590509295509295509295565b60008060008060808587031215613e8757600080fd5b8435613e9281613bdd565b93506020850135613ea281613bdd565b92506040850135613eb281613c00565b9396929550929360600135925050565b600080600060608486031215613ed757600080fd5b8335613ee281613bdd565b92506020840135613ef281613bdd565b91506040840135613f0281613c00565b809150509250925092565b60008060408385031215613f2057600080fd5b8235613f2b81613bdd565b91506020830135613f3b81613bdd565b809150509250929050565b60008060008060008060008060006101208a8c031215613f6557600080fd5b8935613f7081613bdd565b985060208a0135613f8081613bdd565b975060408a0135613f9081613c00565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613fbc81613bdd565b809250506101008a013590509295985092959850929598565b600080600060608486031215613fea57600080fd5b833592506020840135613ffc81613bdd565b91506040840135613f0281613bdd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561404b5761404b61400c565b604052919050565b600067ffffffffffffffff82111561406d5761406d61400c565b5060051b60200190565b60008060008060006080868803121561408f57600080fd5b853567ffffffffffffffff808211156140a757600080fd5b818801915088601f8301126140bb57600080fd5b813560206140d06140cb83614053565b614022565b82815260059290921b8401810191818101908c8411156140ef57600080fd5b948201945b8386101561410d578535825294820194908201906140f4565b9950508901359250508082111561412357600080fd5b5061413088828901613d52565b9095509350613ded905060408701613bf5565b600080600080600080600060e0888a03121561415e57600080fd5b873561416981613bdd565b9650602088013561417981613c00565b955060408801359450606088013593506080880135925060a0880135613cf781613bdd565b6000606082840312156141b057600080fd5b6040516060810181811067ffffffffffffffff821117156141d3576141d361400c565b60405290508082356141e481613bdd565b815260208301356141f481613bdd565b6020820152604083013561420781613c00565b6040919091015292915050565b6000806040838503121561422757600080fd5b8235915060208084013567ffffffffffffffff81111561424657600080fd5b8401601f8101861361425757600080fd5b80356142656140cb82614053565b8181526060918202830184019184820191908984111561428457600080fd5b938501935b838510156142aa5761429b8a8661419e565b83529384019391850191614289565b5080955050505050509250929050565b600080600080600060a086880312156142d257600080fd5b85356142dd81613bdd565b945060208601356142ed81613bdd565b935060408601356142fd81613c00565b94979396509394606081013594506080013592915050565b803560ff8116811461387d57600080fd5b6000806000806000806000806000806000806101808d8f03121561434957600080fd5b8c3561435481613bdd565b9b5060208d013561436481613bdd565b9a5060408d013561437481613c00565b995060608d0135985060808d0135975060a08d0135965060c08d013561439981613bdd565b955060e08d013594506101008d01356143b181613c00565b93506143c06101208e01614315565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000606084860312156143f757600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561442457600080fd5b84359350602085013561443681613bdd565b9250604085013561444681613bdd565b9150606085013561445681613c00565b939692955090935050565b60008060008060008060008060008060006101608c8e03121561448357600080fd5b8b3561448e81613bdd565b9a5060208c013561449e81613c00565b995060408c0135985060608c0135975060808c0135965060a08c01356144c381613bdd565b955060c08c0135945060e08c01356144da81613c00565b93506144e96101008d01614315565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60006020828403121561451d57600080fd5b813561114081613bdd565b602080825260139082015272111e5cdd149bdd5d195c8e8811561412549151606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156145935761459361456b565b500390565b60208082526026908201527f44797374526f757465723a20494e53554646494349454e545f4f55545055545f604082015265105353d5539560d21b606082015260800190565b60208082526018908201527f44797374526f757465723a20494e56414c49445f504154480000000000000000604082015260600190565b60006020828403121561462757600080fd5b813561114081613c00565b60006020828403121561464457600080fd5b815161114081613c00565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561467757600080fd5b5051919050565b60006060828403121561469057600080fd5b611140838361419e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156146d057600080fd5b815161114081613bdd565b60008160001904831182151516156146f5576146f561456b565b500290565b60008261471757634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806040838503121561477057600080fd5b505080516020909101519092909150565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f415f414d4f554e6040820152601560fa1b606082015260800190565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f425f414d4f554e6040820152601560fa1b606082015260800190565b600082198211156148165761481661456b565b500190565b60006001820161482d5761482d61456b565b5060010190565b60005b8381101561484f578181015183820152602001614837565b83811115612bbf5750506000910152565b60008151808452614878816020860160208601614834565b601f01601f19169290920160200192915050565b84815283602082015260018060a01b0383166040820152608060608201526000613b9a6080830184614860565b80516001600160701b038116811461387d57600080fd5b6000806000606084860312156148e557600080fd5b6148ee846148b9565b92506148fc602085016148b9565b9150604084015163ffffffff81168114613f0257600080fd5b60008251614927818460208701614834565b9190910192915050565b602081526000611140602083018461486056fea2646970667358221220b8778e24ce11299fa15b6e6e6848c3232e6eaec9bba1df8244d538430bb1f09a64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec90000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
-----Decoded View---------------
Arg [0] : _factory (address): 0x1d21Db6cde1b18c7E47B0F7F42f4b3F68b9beeC9
Arg [1] : _wmatic (address): 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec9
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.