Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 102 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity | 18334274 | 441 days ago | IN | 0 ETH | 0.00094871 | ||||
Remove Liquidity | 18014368 | 486 days ago | IN | 0 ETH | 0.00476468 | ||||
Remove Liquidity | 18014349 | 486 days ago | IN | 0 ETH | 0.00590668 | ||||
Remove Liquidity | 18014316 | 486 days ago | IN | 0 ETH | 0.00523379 | ||||
Remove Liquidity | 18014261 | 486 days ago | IN | 0 ETH | 0.00617311 | ||||
Remove Liquidity | 18014246 | 486 days ago | IN | 0 ETH | 0.00686484 | ||||
Remove Liquidity | 17986008 | 490 days ago | IN | 0 ETH | 0.00364483 | ||||
Remove Liquidity | 17985999 | 490 days ago | IN | 0 ETH | 0.00415742 | ||||
Remove Liquidity | 17985954 | 490 days ago | IN | 0 ETH | 0.00521096 | ||||
Remove Liquidity | 17985930 | 490 days ago | IN | 0 ETH | 0.00410662 | ||||
Remove Liquidity | 17985912 | 490 days ago | IN | 0 ETH | 0.004811 | ||||
Remove Liquidity | 17982841 | 490 days ago | IN | 0 ETH | 0.00312275 | ||||
Remove Liquidity | 17982795 | 490 days ago | IN | 0 ETH | 0.00325744 | ||||
Swap Exact Token... | 17976091 | 491 days ago | IN | 0 ETH | 0.00351595 | ||||
Swap Exact ETH F... | 17974903 | 491 days ago | IN | 0.01 ETH | 0.00317883 | ||||
Swap Exact Token... | 17973347 | 492 days ago | IN | 0 ETH | 0.00335964 | ||||
Swap Exact ETH F... | 17972459 | 492 days ago | IN | 0.4 ETH | 0.00482213 | ||||
Swap Exact Token... | 17972406 | 492 days ago | IN | 0 ETH | 0.00338584 | ||||
Swap Exact Token... | 17971552 | 492 days ago | IN | 0 ETH | 0.00899823 | ||||
Remove Liquidity | 17949499 | 495 days ago | IN | 0 ETH | 0.00187403 | ||||
Remove Liquidity | 17949491 | 495 days ago | IN | 0 ETH | 0.0018346 | ||||
Remove Liquidity | 17949486 | 495 days ago | IN | 0 ETH | 0.00189725 | ||||
Remove Liquidity | 17949475 | 495 days ago | IN | 0 ETH | 0.00195933 | ||||
Remove Liquidity | 17949470 | 495 days ago | IN | 0 ETH | 0.00200223 | ||||
Remove Liquidity | 17949463 | 495 days ago | IN | 0 ETH | 0.00222942 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18014349 | 486 days ago | 10.2918371 ETH | ||||
18014349 | 486 days ago | 10.2918371 ETH | ||||
17985954 | 490 days ago | 7.30161383 ETH | ||||
17985954 | 490 days ago | 7.30161383 ETH | ||||
17982841 | 490 days ago | 5.03149012 ETH | ||||
17982841 | 490 days ago | 5.03149012 ETH | ||||
17982795 | 490 days ago | 29.02430816 ETH | ||||
17982795 | 490 days ago | 29.02430816 ETH | ||||
17974903 | 491 days ago | 0.01 ETH | ||||
17972459 | 492 days ago | 0.4 ETH | ||||
17971552 | 492 days ago | 0.28847958 ETH | ||||
17971552 | 492 days ago | 0.28847958 ETH | ||||
17948814 | 495 days ago | 0.6421382 ETH | ||||
17948814 | 495 days ago | 0.6421382 ETH | ||||
17750937 | 523 days ago | 0.60704866 ETH | ||||
17750937 | 523 days ago | 0.60704866 ETH | ||||
17734635 | 525 days ago | 0.31986124 ETH | ||||
17734635 | 525 days ago | 0.31986124 ETH | ||||
17705606 | 529 days ago | 0.83649699 ETH | ||||
17705606 | 529 days ago | 0.83649699 ETH | ||||
17651917 | 537 days ago | 0.18682765 ETH | ||||
17651917 | 537 days ago | 0.18682765 ETH | ||||
17641257 | 538 days ago | 0.45838905 ETH | ||||
17641257 | 538 days ago | 0.45838905 ETH | ||||
17635504 | 539 days ago | 0.00000036 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
XfaiV0Periphery02
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.19; import './IXfaiV0Core.sol'; import './IXfaiPool.sol'; import './IXfaiV0Periphery02.sol'; import './IXfaiFactory.sol'; import './IXFETH.sol'; import './IXfaiINFT.sol'; import './IERC20.sol'; import './IWETH.sol'; library TransferHelper { function safeTransferFrom(address _token, address _from, address _to, uint256 _value) internal { require(_token.code.length > 0, 'Xfai: TRANSFERFROM_FAILED'); (bool success, bytes memory data) = _token.call( abi.encodeWithSelector(IERC20.transferFrom.selector, _from, _to, _value) ); require(success && (data.length == 0 || abi.decode(data, (bool))), 'Xfai: TRANSFERFROM_FAILED'); } function safeTransferETH(address _to, uint _value) internal { (bool success, ) = _to.call{value: _value}(new bytes(0)); require(success, 'Xfai: ETH_TRANSFER_FAILED'); } function safeTransfer(address _token, address _to, uint256 _value) internal { require(_token.code.length > 0, 'Xfai: TRANSFER_FAILED'); (bool success, bytes memory data) = _token.call( abi.encodeWithSelector(IERC20.transfer.selector, _to, _value) ); require(success && (data.length == 0 || abi.decode(data, (bool))), 'Xfai: TRANSFER_FAILED'); } } library XfaiLibrary { /** * @notice Calculates the CREATE2 address for a pool without making any external calls * @param _token An ERC20 token address * @param _factory The factory contract of Xfai * @param _poolCodeHash The codehash of the Xfai pool contract * @return pool The deterministic pool address for a given _token */ function poolFor( address _token, address _factory, bytes32 _poolCodeHash ) internal pure returns (address pool) { pool = address( uint160( uint256( keccak256( abi.encodePacked( hex'ff', _factory, keccak256(abi.encodePacked(_token)), _poolCodeHash // init code hash ) ) ) ) ); } function getAdjustedOutput(uint _amountIn, uint _r, uint _w) internal pure returns (uint out) { out = (_amountIn * _w) / (_r + _amountIn); } function getAdjustedInput(uint _amountOut, uint _r, uint _w) internal pure returns (uint input) { input = ((_amountOut * _r) / (_w - _amountOut)) + 1; } function quote(uint _amountIn, uint _a, uint _b) internal pure returns (uint out) { out = (_amountIn * _a) / _b; } /** * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1 * @dev either token0 or token1 must be xfETH * @param _reserve0 The reserve of _token0 (can be xfETH) * @param _reserve1 The reserve of _token1 (can be xfETH) * @param _amountIn The token input amount to _pool0 * @return output The token output between a token - xfETH interaction */ function getAmountOut( uint _reserve0, uint _reserve1, uint _amountIn, uint _totalFee ) public pure returns (uint output) { require(_amountIn > 0, 'Xfai: INSUFFICIENT_AMOUNT'); require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); uint amountInWithFee = _amountIn * (10000 - _totalFee); uint numerator = amountInWithFee * _reserve1; output = numerator / (_reserve0 * 10000 + amountInWithFee); } /** * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0 * @param _reserve0 The reserve of _token0 (can be xfETH) * @param _reserve1 The reserve of _token1 (can be xfETH) * @param _amountOut The token output amount from _pool0 * @return input The token input amount to _pool0 */ function getAmountIn( uint _reserve0, uint _reserve1, uint _amountOut, uint _totalFee ) public pure returns (uint input) { require(_amountOut > 0, 'Xfai: INSUFFICIENT_AMOUNT'); require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY'); uint numerator = _amountOut * _reserve0 * 10000; uint denominator = (_reserve1 - _amountOut) * (10000 - _totalFee); input = (numerator / denominator) + 1; } /** * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1 * @param _pool0 A pool address * @param _pool1 A pool address * @param _amountIn The token input amount to _pool0 * @return out1 The token output amount from _pool1 */ function getAmountsOut( address _pool0, address _pool1, uint _amountIn, uint _totalFee ) public view returns (uint out1) { (uint r0, uint w0) = IXfaiPool(_pool0).getStates(); (uint r1, uint w1) = IXfaiPool(_pool1).getStates(); uint weight0Out = getAmountOut(r0, w0, _amountIn, _totalFee); out1 = getAdjustedOutput(weight0Out, w1, r1); } /** * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0 * @param _pool0 A pool address * @param _pool1 A pool address * @param _amountOut The token output amount from _pool1 * @return inp0 The token input amount to _pool0 */ function getAmountsIn( address _pool0, address _pool1, uint _amountOut, uint _totalFee ) public view returns (uint inp0) { (uint r0, uint w0) = IXfaiPool(_pool0).getStates(); (uint r1, uint w1) = IXfaiPool(_pool1).getStates(); uint weight0Out = getAdjustedInput(_amountOut, w1, r1); inp0 = getAmountIn(r0, w0, weight0Out, _totalFee); } } /** * @title Xfai's Xfai Periphery Contract * @author Xfai * @notice XfaiV0Periphery02 performs the necessary high level safety checks to interact with XfaiV0Core. It does not store any pool related state. */ contract XfaiV0Periphery02 is IXfaiV0Periphery02 { /** * @notice The factory address of Xfai */ address private immutable factory; /** * @notice The address of the xfETH token */ address private immutable xfETH; /** * @notice The address of the XfaiV0Core contract */ address private immutable core; /** * @notice The weth address. * @dev In the case of a chain ID other than Ethereum, the wrapped ERC20 token address of the chain's native coin */ address private immutable weth; /** * @notice The code hash od XfaiPool * @dev keccak256(type(XfaiPool).creationCode) */ bytes32 private immutable poolCodeHash; modifier ensure(uint deadline) { require(deadline >= block.timestamp, 'XfaiV0Periphery02: EXPIRED'); _; } /** * @notice XfaiV0Periphery02 constructor * @param _factory The factory address of Xfai * @param _weth The weth address * @param _xfETH The xfETH address */ constructor(address _factory, address _weth, address _xfETH) { factory = _factory; core = IXfaiFactory(_factory).getXfaiCore(); xfETH = _xfETH; weth = _weth; poolCodeHash = IXfaiFactory(_factory).poolCodeHash(); } receive() external payable { assert(msg.sender == weth || msg.sender == xfETH); // only accept ETH via fallback from the weth contract } // **** ADD LIQUIDITY **** function _getLiquidityAmounts( address _token, uint _amountTokenDesired, uint _amountXfETHDesired, uint _amountTokenMin, uint _amountXfETHMin ) internal returns (uint amountToken, uint amountXfETH) { address pool = IXfaiFactory(factory).getPool(_token); if (pool == address(0)) { // create the pool if it doesn't exist yet pool = IXfaiFactory(factory).createPool(_token); } (uint reserve, uint weight) = IXfaiPool(pool).getStates(); if (reserve == 0 && weight == 0) { (amountToken, amountXfETH) = (_amountTokenDesired, _amountXfETHDesired); } else { uint amountXfETHOptimal = XfaiLibrary.quote(_amountTokenDesired, weight, reserve); if (amountXfETHOptimal <= _amountXfETHDesired) { require(amountXfETHOptimal >= _amountXfETHMin, 'XfaiV0Periphery02: INSUFFICIENT_1_AMOUNT'); (amountToken, amountXfETH) = (_amountTokenDesired, amountXfETHOptimal); } else { uint amountTokenOptimal = XfaiLibrary.quote(_amountXfETHDesired, reserve, weight); assert(amountTokenOptimal <= _amountTokenDesired); require(amountTokenOptimal >= _amountTokenMin, 'XfaiV0Periphery02: INSUFFICIENT_0_AMOUNT'); (amountToken, amountXfETH) = (amountTokenOptimal, _amountXfETHDesired); } } } function _addLiquidity( address _token, uint _amountTokenDesired, uint _amountETHDesired, uint _amountTokenMin, uint _amountETHMin ) internal returns (uint amountToken, uint amountETH) { address _xfETH = xfETH; // gas saving uint amountXfETH; (amountToken, amountXfETH) = _getLiquidityAmounts( _token, _amountTokenDesired, IXFETH(_xfETH).ETHToXfETH(_amountETHDesired), _amountTokenMin, IXFETH(_xfETH).ETHToXfETH(_amountETHMin) ); amountETH = IXFETH(_xfETH).xfETHToETH(amountXfETH); } /** * @notice Provide two-sided liquidity to a pool * @dev Requires _token approval. A given amount of _token and ETH get consumed and a given amount of liquidity tokens is minted * @param _to The address of the recipient * @param _token An ERC20 token address * @param _amountTokenDesired The input amount of _token to be provided * @param _amountTokenMin The minimal amount that the user will accept for _amountTokenDesired * @param _amountETHMin The minimal amount that the user will accept for the provided ETH * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically */ function addLiquidity( address _to, address _token, uint _amountTokenDesired, uint _amountTokenMin, uint _amountETHMin, uint _deadline ) external payable override ensure(_deadline) returns (uint liquidity) { address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash); (uint amount0, uint amount1) = _addLiquidity( _token, _amountTokenDesired, msg.value, _amountTokenMin, _amountETHMin ); TransferHelper.safeTransferFrom(_token, msg.sender, pool, amount0); uint amountXfETH = IXFETH(xfETH).deposit{value: amount1}(); TransferHelper.safeTransfer(xfETH, pool, amountXfETH); liquidity = IXfaiV0Core(core).mint(_token, _to); // refund dust eth, if any if (msg.value > amount1) TransferHelper.safeTransferETH(msg.sender, msg.value - amount1); } /** * @notice Provide one-sided liquidity to the ETH pool * @dev A given amount of ETH get consumed and a given amount of liquidity tokens is minted * @param _to The address of the recipient * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically */ function addLiquidityETH( address _to, uint _deadline, uint _amountETHMin, uint _amountXfETHMin ) external payable override ensure(_deadline) returns (uint liquidity) { address _weth = weth; // gas saving address _xfeth = xfETH; // gas saving uint amountETH; uint amountXfETHtoETH; address pool = IXfaiFactory(factory).getPool(_weth); if (pool == address(0)) { // create the pool if it doesn't exist yet pool = IXfaiFactory(factory).createPool(_weth); } { (uint ETHReserve, uint xfETHReserve) = IXfaiPool(pool).getStates(); if (ETHReserve == 0 && xfETHReserve == 0) { (amountETH, amountXfETHtoETH) = (msg.value / 2, msg.value / 2); } else { amountETH = (msg.value * ETHReserve) / (ETHReserve + IXFETH(_xfeth).xfETHToETH(xfETHReserve)); amountXfETHtoETH = msg.value - amountETH; } } uint amountXfETH = IXFETH(_xfeth).deposit{value: amountXfETHtoETH}(); require(amountETH >= _amountETHMin, 'XfaiV0Periphery02: INSUFFICIENT_0_AMOUNT'); require(amountXfETH >= _amountXfETHMin, 'XfaiV0Periphery02: INSUFFICIENT_0_AMOUNT'); IWETH(_weth).deposit{value: amountETH}(); TransferHelper.safeTransfer(_xfeth, pool, amountXfETH); TransferHelper.safeTransfer(_weth, pool, amountETH); liquidity = IXfaiV0Core(core).mint(_weth, _to); require(msg.value == amountETH + amountXfETHtoETH, 'XfaiV0Periphery02: INSUFFICIENT_AMOUNT'); } // **** REMOVE LIQUIDITY **** function _removeLiquidity( address _token0, address _token1, uint _liquidity, uint _amount0Min, uint _amount1Min, address _to ) private returns (uint amount0, uint amount1) { address _core = core; // gas saving address pool = XfaiLibrary.poolFor(_token0, factory, poolCodeHash); TransferHelper.safeTransferFrom(pool, msg.sender, _core, _liquidity); (amount0, amount1) = IXfaiV0Core(_core).burn(_token0, _token1, _to); require(amount0 >= _amount0Min, 'XfaiV0Periphery02: INSUFFICIENT_AMOUNT0'); require(amount1 >= _amount1Min, 'XfaiV0Periphery02: INSUFFICIENT_AMOUNT1'); } function _removeLiquidityOptions( address _to, address _token0, address _token1, uint _liquidity, uint _amount0Min, uint _amount1Min ) private returns (uint amount0, uint amount1) { address wrappedETH = weth; // gas saving if (_token0 == wrappedETH && _token1 == wrappedETH) { (amount0, amount1) = _removeLiquidity( _token0, xfETH, _liquidity, _amount0Min, _amount1Min, address(this) ); IWETH(_token0).withdraw(amount0); uint amountInETH = IXFETH(xfETH).withdraw(amount1); TransferHelper.safeTransferETH(_to, amount0 + amountInETH); } else if (_token0 == wrappedETH) { (amount0, amount1) = _removeLiquidity( _token0, _token1, _liquidity, _amount0Min, _amount1Min, address(this) ); IWETH(_token0).withdraw(amount0); TransferHelper.safeTransferETH(_to, amount0); TransferHelper.safeTransfer(_token1, _to, amount1); } else if (_token1 == wrappedETH) { (amount0, amount1) = _removeLiquidity( _token0, xfETH, _liquidity, _amount0Min, _amount1Min, address(this) ); uint amountInETH = IXFETH(xfETH).withdraw(amount1); TransferHelper.safeTransferETH(_to, amountInETH); TransferHelper.safeTransfer(_token0, _to, amount0); } else { (amount0, amount1) = _removeLiquidity( _token0, _token1, _liquidity, _amount0Min, _amount1Min, _to ); } } /** * @notice Remove liquidity from pool0 * @dev Requires approval of the pool's liquidity token. At the end of the function call, a given amount of LP tokens are burned, and a given amount of _token0 and _token1 are returned to the recipient. * @param _to The address of the recipient * @param _token0 The address of an ERC20 token * @param _token1 The address of an ERC20 token * @param _liquidity The amount of LP tokens to be burned * @param _amount0Min The minimal amount of _token that the user will accept for a given amount of _liquidity * @param _amount1Min The minimal amount of _token that the user will accept for a given amount of _liquidity * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically * @return amount0 The amount of _token that are returned to the recipient * @return amount1 The amount of ether that are returned to the recipient */ function removeLiquidity( address _to, address _token0, address _token1, uint _liquidity, uint _amount0Min, uint _amount1Min, uint _deadline ) external override ensure(_deadline) returns (uint amount0, uint amount1) { (amount0, amount1) = _removeLiquidityOptions( _to, _token0, _token1, _liquidity, _amount0Min, _amount1Min ); } // **** SWAP **** // requires the initial amount to have already been sent to the primary pool function _swap( address _token0, address _token1, address _to ) internal returns (uint input, uint output) { (input, output) = IXfaiV0Core(core).swap(_token0, _token1, _to); } /** * @notice Swap an exact amount of one ERC20 token (_token0) for another one (_token1) * @dev Requires _token0 approval. At the end of the function call, an amount _amount0In of _token0 is deposited into Xfai, and a given amount (larger than _amount1OutMin) of _token1 is returned to the recipient. * @param _to The address of the recipient * @param _token0 An ERC20 token address * @param _token1 An ERC20 token address * @param _amount0In The amount of _token0 to be swapped * @param _amount1OutMin The minimal amount of _token1 that the user will accept for a given amount of _amount0In * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically */ function swapExactTokensForTokens( address _to, address _token0, address _token1, uint _amount0In, uint _amount1OutMin, uint _deadline ) external override ensure(_deadline) returns (uint) { address pool; if (_token0 == xfETH) { pool = XfaiLibrary.poolFor(_token1, factory, poolCodeHash); } else { pool = XfaiLibrary.poolFor(_token0, factory, poolCodeHash); } TransferHelper.safeTransferFrom(_token0, msg.sender, pool, _amount0In); (, uint amount1Out) = _swap(_token0, _token1, _to); require(amount1Out >= _amount1OutMin, 'XfaiV0Periphery02: INSUFFICIENT_OUTPUT_AMOUNT'); return amount1Out; } /** * @notice Swap an amount of one ERC20 token (_token0) for an exact amount of another one (_token1) * @dev Requires _token0 approval. At the end of the function call, an amount (smaller than _amount0InMax) of _token0 is deposited into xfai, and an amount _amount1Out og _token1 is returned to the recipient. * @param _to The address of the recipient * @param _token0 An ERC20 token address * @param _token1 An ERC20 token address * @param _amount1Out The amount of _token1 that one wants to receive * @param _amount0InMax The maximal amount of _token0 that the user is willing to trade for a given amount of _amount1Out * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically */ function swapTokensForExactTokens( address _to, address _token0, address _token1, uint _amount1Out, uint _amount0InMax, uint _deadline ) external override ensure(_deadline) returns (uint amount0In) { address pool0; address pool1; if (_token0 == xfETH) { pool0 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash); pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash); (uint r, uint w) = IXfaiPool(pool0).getStates(); amount0In = XfaiLibrary.getAmountIn(w, r, _amount1Out, IXfaiV0Core(core).getTotalFee()); } else if (_token1 == xfETH) { pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash); (uint r, uint w) = IXfaiPool(pool0).getStates(); amount0In = XfaiLibrary.getAmountIn(r, w, _amount1Out, IXfaiV0Core(core).getTotalFee()); } else { pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash); pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash); amount0In = XfaiLibrary.getAmountsIn( pool0, pool1, _amount1Out, IXfaiV0Core(core).getTotalFee() ); } require(amount0In <= _amount0InMax, 'XfaiV0Periphery02: INSUFFICIENT_INPUT_AMOUNT'); TransferHelper.safeTransferFrom(_token0, msg.sender, pool0, amount0In); _swap(_token0, _token1, _to); } /** * @notice Swap an exact amount of ether for an ERC20 token (_token1) * @dev At the end of the function call, an exact amount of ether is deposited into Xfai, and a given amount (larger than _amount1OutMin) of _token1 is returned to the recipient. * @param _to The address of the recipient * @param _token1 An ERC20 token address * @param _amount1OutMin The minimal amount of _token1 that the user will accept for a given amount of _amount0In * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically */ function swapExactETHForTokens( address _to, address _token1, uint _amount1OutMin, uint _deadline ) external payable override ensure(_deadline) returns (uint amount1Out) { address wrappedETH = weth; // gas savings uint amount0In = msg.value; address pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash); IWETH(wrappedETH).deposit{value: amount0In}(); assert(IWETH(weth).transfer(pool0, amount0In)); if (_token1 == xfETH) { (, amount1Out) = _swap(wrappedETH, xfETH, _to); } else { (, amount1Out) = _swap(wrappedETH, _token1, _to); } require(amount1Out >= _amount1OutMin, 'XfaiV0Periphery02: INSUFFICIENT_OUTPUT_AMOUNT'); } /** * @notice Swap an amount of one ERC20 token (_token0) for an exact amount of ether * @dev Requires _token0 approval. At the end of the function call, a given amount (smaller than _amount0InMax) of _token0 is deposited into xfai, and and the amount _amount1Out of ether is returned to the recipient. * @param _to The address of the recipient * @param _token0 An ERC20 token address * @param _amount1Out The amount of ether that one wants to receive * @param _amount0InMax The maximal amount of _token0 that the user is willing to trade for a given amount of _amount1Out * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically */ function swapTokensForExactETH( address _to, address _token0, uint _amount1Out, uint _amount0InMax, uint _deadline ) external override ensure(_deadline) returns (uint amount0In) { address wrappedETH = weth; // gas savings address pool0; if (_token0 == xfETH) { pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash); (uint r, uint w) = IXfaiPool(pool0).getStates(); amount0In = XfaiLibrary.getAmountIn(w, r, _amount1Out, IXfaiV0Core(core).getTotalFee()); } else { pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash); amount0In = XfaiLibrary.getAmountsIn( pool0, XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash), _amount1Out, IXfaiV0Core(core).getTotalFee() ); } require(amount0In <= _amount0InMax, 'XfaiV0Periphery02: INSUFFICIENT_INPUT_AMOUNT'); TransferHelper.safeTransferFrom(_token0, msg.sender, pool0, amount0In); _swap(_token0, wrappedETH, address(this)); IWETH(wrappedETH).withdraw(_amount1Out); TransferHelper.safeTransferETH(_to, _amount1Out); return amount0In; } /** * @notice Swap an exact amount of one ERC20 token (_token0) for ether * @dev Requires _token0 approval. At the end of the function call, a given amount _amount0In of _token0 is deposited into Xfai, and an amount (larger than _amount1OutMin) of ether is returned to the recipient. * @param _to The address of the recipient * @param _token0 An ERC20 token address * @param _amount0In The amount of _token0 to be swapped * @param _amount1OutMin The minimal amount of ether that the user will accept for a given amount of _amount0In * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically */ function swapExactTokensForETH( address _to, address _token0, uint _amount0In, uint _amount1OutMin, uint _deadline ) external override ensure(_deadline) returns (uint amount1Out) { address pool0; address wrappedETH = weth; if (_token0 == xfETH) { pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash); } else { pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash); } TransferHelper.safeTransferFrom(_token0, msg.sender, pool0, _amount0In); (, amount1Out) = _swap(_token0, wrappedETH, address(this)); require(amount1Out >= _amount1OutMin, 'XfaiV0Periphery02: INSUFFICIENT_OUTPUT_AMOUNT'); IWETH(wrappedETH).withdraw(amount1Out); TransferHelper.safeTransferETH(_to, amount1Out); } /** * @notice Swap an amount of ether for an exact amount of ERC20 tokens (_token1) * @dev At the end of the function call, a given amount of ether is deposited into xfai, and a given amount _amount1Out of _token1 is returned to the recipient. * @param _to The address of the recipient * @param _token1 An ERC20 token address * @param _amount1Out The amount of _token1 that the user accepts for a given amount of ether * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically */ function swapETHForExactTokens( address _to, address _token1, uint _amount1Out, uint _deadline ) external payable override ensure(_deadline) returns (uint input) { address wrappedETH = weth; // gas savings address pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash); address pool1; if (_token1 == xfETH) { pool1 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash); (uint r, uint w) = IXfaiPool(pool1).getStates(); input = XfaiLibrary.getAmountIn(r, w, _amount1Out, IXfaiV0Core(core).getTotalFee()); } else { pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash); input = XfaiLibrary.getAmountsIn(pool0, pool1, _amount1Out, IXfaiV0Core(core).getTotalFee()); } require(input <= msg.value, 'XfaiV0Periphery02: INSUFFICIENT_INPUT_AMOUNT'); IWETH(wrappedETH).deposit{value: input}(); assert(IWETH(weth).transfer(pool0, input)); _swap(wrappedETH, _token1, _to); // refund dust eth, if any if (msg.value > input) TransferHelper.safeTransferETH(msg.sender, msg.value - input); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.19; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import './IERC20.sol'; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.19; import './IERC165.sol'; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.19; import './IERC721.sol'; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; import './IERC20Metadata.sol'; interface IWETH is IERC20Metadata { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; interface IXfaiFactory { function getPool(address _token) external view returns (address pool); function allPools(uint256) external view returns (address pool); function poolCodeHash() external pure returns (bytes32); function allPoolsLength() external view returns (uint); function createPool(address _token) external returns (address pool); function setXfaiCore(address _core) external; function getXfaiCore() external view returns (address); function setOwner(address _owner) external; function getOwner() external view returns (address); event ChangedOwner(address indexed owner); event ChangedCore(address indexed core); event Whitelisting(bool state); event PoolCreated(address indexed token, address indexed pool, uint allPoolsSize); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; import './IERC721Enumerable.sol'; interface IXfaiINFT is IERC721Enumerable { function reserve() external view returns (uint); function totalSharesIssued() external view returns (uint); function initialReserve() external view returns (uint); function harvestedBalance(address _token) external view returns (uint); function INFTShares(uint _id) external view returns (uint); function sharesHarvestedByPool(address _token, uint _id) external view returns (uint); function totalSharesHarvestedByPool(address _token) external view returns (uint); function setBaseURI(string memory _baseURI) external; function getStates() external view returns (uint, uint, uint); function shareToTokenAmount( uint _tokenID, address _token ) external view returns (uint share2amount, uint inftShare, uint harvestedShares); function premint(address[] memory _legacyLNFTHolders, uint[] memory _initialShares) external; function mint(address _to) external returns (uint tokenID, uint share); function boost(uint _tokenID) external returns (uint share); function harvestToken(address _token, uint _tokenID, uint _amount) external returns (uint); function harvestETH(uint _tokenID, uint _amount) external returns (uint); event Mint(address indexed from, address indexed to, uint share, uint id); event Boost(address indexed from, uint share, uint id); event HarvestToken(address token, uint harvestedAmount, uint harvestedShare, uint id); event HarvestETH(uint harvestedAmount, uint harvestedShare, uint id); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; import './IERC20Metadata.sol'; interface IXfaiPool is IERC20Metadata { function getXfaiCore() external view returns (address); function poolToken() external view returns (address); function initialize(address _token, address _xfaiFactory) external; function getStates() external view returns (uint, uint); function update(uint _reserveBalance, uint _weightBalance) external; function mint(address _to, uint _amount) external; function burn(address _to, uint _amount) external; function linkedTransfer(address _token, address _to, uint256 _value) external; event Sync(uint _reserve, uint _weight); event Write(uint _reserve, uint _weight, uint _blockTimestamp); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; interface IXfaiV0Core { function lpFee() external view returns (uint); function changeLpFee(uint _newFee) external; function infinityNFTFee() external view returns (uint); function changeInfinityNFTFee(uint _newFee) external; function getTotalFee() external view returns (uint); function pause(bool _p) external; function swap( address _token0, address _token1, address _to ) external returns (uint input, uint output); function flashLoan(address _token, uint _amount, address _to, bytes calldata _data) external; function mint(address _token, address _to) external returns (uint liquidity); function burn( address _token0, address _token1, address _to ) external returns (uint amount0, uint amount1); function skim(address _token, address _to) external; function sync(address _token) external; event ChangedOwner(address indexed owner); event Mint(address indexed sender, uint liquidity); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap(address indexed sender, uint input, uint output, address indexed to); event FlashLoan(address indexed sender, uint amount); event LpFeeChange(uint newFee); event InfinityNFTFeeChange(uint newFee); event Paused(bool p); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; interface IXfaiV0Periphery02 { function addLiquidity( address _to, address _token, uint _amountTokenDesired, uint _amountTokenMin, uint _amountETHMin, uint _deadline ) external payable returns (uint liquidity); function addLiquidityETH( address _to, uint _deadline, uint _amountETHMin, uint _amountXfETHMin ) external payable returns (uint liquidity); function removeLiquidity( address _to, address _token0, address _token1, uint _liquidity, uint _amount0Min, uint _amount1Min, uint _deadline ) external returns (uint amount0, uint amount1); function swapExactTokensForTokens( address _to, address _token0, address _token1, uint _amount0In, uint _amount1OutMin, uint _deadline ) external returns (uint); function swapTokensForExactTokens( address _to, address _token0, address _token1, uint _amount1Out, uint _amount0InMax, uint _deadline ) external returns (uint); function swapExactETHForTokens( address _to, address _token1, uint _amount1OutMin, uint _deadline ) external payable returns (uint); function swapTokensForExactETH( address _to, address _token0, uint _amount1Out, uint _amount0InMax, uint _deadline ) external returns (uint amount0In); function swapExactTokensForETH( address _to, address _token0, uint _amount0In, uint _amount1OutMin, uint _deadline ) external returns (uint); function swapETHForExactTokens( address _to, address _token1, uint _amount1Out, uint _deadline ) external payable returns (uint input); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.19; import './IERC20Metadata.sol'; interface IXFETH is IERC20Metadata { event Deposit(address indexed dst, uint amountXfETH, uint amountETH); event Withdrawal(address indexed src, uint amountETH); event FlashMint(address indexed dst, uint amountXfETH); event FeeChange(uint newFee); event OwnerChange(address newOwner); event ArbitrageurChange(address arbitrageur); event StatusChange(bool state); function owner() external view returns (address _owner); function flashMintFee() external view returns (uint _flashMintFee); function setStatus(bool _state) external; function setOwner(address _newOwner) external; function setArbitrageur(address _arbitrageur) external; function setFlashMintFee(uint _newFee) external; function xfETHToETH(uint _xfETHAmount) external view returns (uint _ETH); function ETHToXfETH(uint _ETHAmount) external view returns (uint _xfETH); function deposit() external payable returns (uint amountInXfETH); function withdraw(uint _liquidity) external returns (uint amountInETH); function flashMint(uint _amount) external; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_xfETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"uint256","name":"_amountXfETHMin","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amount0Min","type":"uint256"},{"internalType":"uint256","name":"_amount1Min","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_amount1Out","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_amount1OutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"amount1Out","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"uint256","name":"_amount0In","type":"uint256"},{"internalType":"uint256","name":"_amount1OutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"amount1Out","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_amount0In","type":"uint256"},{"internalType":"uint256","name":"_amount1OutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"uint256","name":"_amount1Out","type":"uint256"},{"internalType":"uint256","name":"_amount0InMax","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256","name":"amount0In","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_amount1Out","type":"uint256"},{"internalType":"uint256","name":"_amount0InMax","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256","name":"amount0In","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040523480156200001257600080fd5b50604051620042e7380380620042e7833981016040819052620000359162000151565b6001600160a01b038316608081905260408051637f86e3b960e01b81529051637f86e3b9916004808201926020929091908290030181865afa15801562000080573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a691906200019b565b6001600160a01b0390811660c05281811660a05282811660e0526040805163554dcae760e01b815290519185169163554dcae7916004808201926020929091908290030181865afa15801562000100573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001269190620001c0565b6101005250620001da915050565b80516001600160a01b03811681146200014c57600080fd5b919050565b6000806000606084860312156200016757600080fd5b620001728462000134565b9250620001826020850162000134565b9150620001926040850162000134565b90509250925092565b600060208284031215620001ae57600080fd5b620001b98262000134565b9392505050565b600060208284031215620001d357600080fd5b5051919050565b60805160a05160c05160e05161010051613ed262000415600039600081816102fc01528181610632015281816106d4015281816108d501528181610cbf01528181610f9e0152818161119f0152818161120701528181611587015281816115d40152818161182801528181611972015281816119bf015281816123e401528181612436015281816127070152818161275901526138c701526000818160b7015281816102b3015281816103cc015281816105ea01528181610b8401528181610f1601528181611c850152818161235e01526130c301526000818161078e0152818161091a01528181610e13015281816110580152818161122e0152818161168e015281816118e201528181611a04015281816121d70152818161298f015261388001526000818160f60152818161044b015281816104a20152818161065c01528181610d0901528181610da001528181610f4e0152818161150f015281816117b001528181611caf015281816123940152818161268f01528181612af7015281816131400152818161321e015281816133d0015261342f0152600081816102db01528181610611015281816106b3015281816108b401528181610c9e01528181610f7d0152818161117e015281816111e601528181611566015281816115b301528181611807015281816119510152818161199e01528181611cd801528181611da7015281816123c301528181612415015281816126e601528181612738015281816135340152818161360301526138a60152613ed26000f3fe60806040526004361061009a5760003560e01c8063515a22d311610069578063b1f0d8401161004e578063b1f0d840146101ca578063cb7cfbe7146101ea578063f448a6161461021f57600080fd5b8063515a22d3146101975780635625d383146101b757600080fd5b806312d4b07c1461012b578063293b15a9146101515780633351733f14610164578063433182141461017757600080fd5b36610126573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061011857503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b61012457610124613aeb565b005b600080fd5b61013e610139366004613b3f565b61023f565b6040519081526020015b60405180910390f35b61013e61015f366004613b3f565b61057b565b61013e610172366004613b85565b610c29565b34801561018357600080fd5b5061013e610192366004613bde565b610ea7565b3480156101a357600080fd5b5061013e6101b2366004613c2f565b61149d565b61013e6101c5366004613c94565b611bdb565b3480156101d657600080fd5b5061013e6101e5366004613bde565b6122ed565b3480156101f657600080fd5b5061020a610205366004613ccf565b612591565b60408051928352602083019190915201610148565b34801561022b57600080fd5b5061013e61023a366004613c2f565b61261e565b600081428110156102b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064015b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000346000610320837f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90508273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561036a57600080fd5b505af115801561037e573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018790527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190613d3d565b61044957610449613aeb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036104d0576104c7837f00000000000000000000000000000000000000000000000000000000000000008b612935565b95506104df9050565b6104db83898b612935565b9550505b8685101561056f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b50505050949350505050565b600081428110156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f00000000000000000000000000000000000000000000000000000000000000006000610656827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036108ae576106f8837f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a59190613d8a565b96505050610a4a565b6108f9887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a479190613d8a565b94505b34851115610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b2257600080fd5b505af1158015610b36573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018a90527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf59190613d3d565b610c0157610c01613aeb565b610c0c83898b612935565b50508434111561056f5761056f33610c248734613dd2565b612a07565b60008142811015610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000610ce3887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b9050600080610cf58a8a348b8b612af0565b91509150610d058a338585612cd3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b815260040160206040518083038185885af1158015610d74573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d999190613d8a565b9050610dc67f00000000000000000000000000000000000000000000000000000000000000008583612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301528d811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ee1fe2ad906044016020604051808303816000875af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e809190613d8a565b955081341115610e9857610e9833610c248434613dd2565b50505050509695505050505050565b60008142811015610f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f0000000000000000000000000000000000000000000000000000000000000000600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169089160361117857610fc2827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e59190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190613d8a565b9550505061135e565b6111c3887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be448261122b857f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b8a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613d8a565b93505b858411156113ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b6113fa88338387612cd3565b611405888330612935565b50506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff831690632e1a7d4d90602401600060405180830381600087803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b505050506114918988612a07565b50505095945050505050565b6000814281101561150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036117ae576115ab887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91506115f8887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015611781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a59190613d8a565b95505050611b34565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff160361194b5761184c897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561189b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bf9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b611996897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91506119e3887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a919190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b319190613d8a565b93505b85841115611bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b611bd089338487612cd3565b610e9889898c612935565b60008342811015611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008181166004840152917f000000000000000000000000000000000000000000000000000000000000000091600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116611e17576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639049f9d2906024016020604051808303816000875af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e149190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e889190613d66565b91509150816000148015611e9a575080155b15611ebf57611eaa600234613e08565b611eb5600234613e08565b9095509350611f7b565b6040517fa398030d0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff87169063a398030d90602401602060405180830381865afa158015611f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4e9190613d8a565b611f589083613e43565b611f628334613e56565b611f6c9190613e08565b9450611f788534613dd2565b93505b505060008473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b815260040160206040518083038185885af1158015611fcc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ff19190613d8a565b905089841015612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b88811015612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b8573ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215b57600080fd5b505af115801561216f573d6000803e3d6000fd5b505050505061217f858383612ecd565b61218a868386612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528d811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ee1fe2ad906044016020604051808303816000875af1158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122449190613d8a565b97506122508385613e43565b34146122de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016102a8565b50505050505050949350505050565b6000814281101561235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169089160361240f57612408817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b915061245d565b61245a887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91505b6124698833848a612cd3565b612474888230612935565b94505085841015612507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b15801561256f57600080fd5b505af1158015612583573d6000803e3d6000fd5b505050506114918985612a07565b60008082428110156125ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b61260d8a8a8a8a8a8a6130be565b909b909a5098505050505050505050565b6000814281101561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036127325761272b877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b9050612780565b61277d887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90505b61278c88338389612cd3565b600061279989898c612935565b9150508581101561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b9998505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152600090839060340160405160208183030381529060405280519060200120836040516020016128f7939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6040517f9331621200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528381166024830152828116604483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063933162129060640160408051808303816000875af11580156129d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fb9190613d66565b90969095509350505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8416908390604051612a3e9190613e6d565b60006040518083038185875af1925050503d8060008114612a7b576040519150601f19603f3d011682016040523d82523d6000602084013e612a80565b606091505b5050905080612aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a204554485f5452414e534645525f4641494c45440000000000000060448201526064016102a8565b505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000090506000612c3189898473ffffffffffffffffffffffffffffffffffffffff1663b3c174048b6040518263ffffffff1660e01b8152600401612b5a91815260200190565b602060405180830381865afa158015612b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9b9190613d8a565b6040517fb3c17404000000000000000000000000000000000000000000000000000000008152600481018a90528a9073ffffffffffffffffffffffffffffffffffffffff88169063b3c1740490602401602060405180830381865afa158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190613d8a565b6134e8565b6040517fa398030d00000000000000000000000000000000000000000000000000000000815260048101829052919550915073ffffffffffffffffffffffffffffffffffffffff83169063a398030d90602401602060405180830381865afa158015612ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc59190613d8a565b925050509550959350505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b11612d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691612df39190613e6d565b6000604051808303816000865af19150503d8060008114612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b5091509150818015612e5f575080511580612e5f575080806020019051810190612e5f9190613d3d565b612ec5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11612f4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691612fe59190613e6d565b6000604051808303816000865af19150503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b50915091508180156130515750805115806130515750808060200190518101906130519190613d3d565b6130b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b5050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff88811690821614801561313557508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b156132b757613168887f00000000000000000000000000000000000000000000000000000000000000008888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b1580156131d557600080fd5b505af11580156131e9573d6000803e3d6000fd5b50506040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101859052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150632e1a7d4d906024016020604051808303816000875af115801561327d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a19190613d8a565b90506132b18a610c248387613e43565b506134dc565b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603613397576132f888888888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b505050506133878984612a07565b613392878a84612ecd565b6134dc565b8073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036134c8576133f8887f00000000000000000000000000000000000000000000000000000000000000008888883061387b565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905291945092506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024016020604051808303816000875af115801561348d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b19190613d8a565b90506134bd8a82612a07565b6132b1898b86612ecd565b6134d688888888888e61387b565b90935091505b50965096945050505050565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa15801561357d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a19190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116613673576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639049f9d2906024016020604051808303816000875af115801561364c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136709190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e49190613d66565b915091508160001480156136f6575080155b156137065788945087935061386e565b60006137138a8385613acc565b90508881116137b757868110156137ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f315f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b89955093508361386c565b60006137c48a8585613acc565b90508a8111156137d6576137d6613aeb565b88811015613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b95508894505b505b5050509550959350505050565b6000807f0000000000000000000000000000000000000000000000000000000000000000816138eb8a7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506138f98133848b612cd3565b6040517f45a11cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a8116602483015286811660448301528316906345a11cec9060640160408051808303816000875af1158015613976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399a9190613d66565b909450925086841015613a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54300000000000000000000000000000000000000000000000000060648201526084016102a8565b85831015613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54310000000000000000000000000000000000000000000000000060648201526084016102a8565b5050965096945050505050565b600081613ad98486613e56565b613ae39190613e08565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114613b3c57600080fd5b50565b60008060008060808587031215613b5557600080fd5b8435613b6081613b1a565b93506020850135613b7081613b1a565b93969395505050506040820135916060013590565b60008060008060008060c08789031215613b9e57600080fd5b8635613ba981613b1a565b95506020870135613bb981613b1a565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600080600060a08688031215613bf657600080fd5b8535613c0181613b1a565b94506020860135613c1181613b1a565b94979496505050506040830135926060810135926080909101359150565b60008060008060008060c08789031215613c4857600080fd5b8635613c5381613b1a565b95506020870135613c6381613b1a565b94506040870135613c7381613b1a565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060808587031215613caa57600080fd5b8435613cb581613b1a565b966020860135965060408601359560600135945092505050565b600080600080600080600060e0888a031215613cea57600080fd5b8735613cf581613b1a565b96506020880135613d0581613b1a565b95506040880135613d1581613b1a565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b600060208284031215613d4f57600080fd5b81518015158114613d5f57600080fd5b9392505050565b60008060408385031215613d7957600080fd5b505080516020909101519092909150565b600060208284031215613d9c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115613de557613de5613da3565b92915050565b600060208284031215613dfd57600080fd5b8151613d5f81613b1a565b600082613e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115613de557613de5613da3565b8082028115828204841417613de557613de5613da3565b6000825160005b81811015613e8e5760208186018101518583015201613e74565b50600092019182525091905056fea2646970667358221220a95f33b4286ad5dea5afdaed301e181f75bbf44e00456839003044a4264ee0c564736f6c634300081300330000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021
Deployed Bytecode
0x60806040526004361061009a5760003560e01c8063515a22d311610069578063b1f0d8401161004e578063b1f0d840146101ca578063cb7cfbe7146101ea578063f448a6161461021f57600080fd5b8063515a22d3146101975780635625d383146101b757600080fd5b806312d4b07c1461012b578063293b15a9146101515780633351733f14610164578063433182141461017757600080fd5b36610126573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216148061011857503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02116145b61012457610124613aeb565b005b600080fd5b61013e610139366004613b3f565b61023f565b6040519081526020015b60405180910390f35b61013e61015f366004613b3f565b61057b565b61013e610172366004613b85565b610c29565b34801561018357600080fd5b5061013e610192366004613bde565b610ea7565b3480156101a357600080fd5b5061013e6101b2366004613c2f565b61149d565b61013e6101c5366004613c94565b611bdb565b3480156101d657600080fd5b5061013e6101e5366004613bde565b6122ed565b3480156101f657600080fd5b5061020a610205366004613ccf565b612591565b60408051928352602083019190915201610148565b34801561022b57600080fd5b5061013e61023a366004613c2f565b61261e565b600081428110156102b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064015b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2346000610320837f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90508273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561036a57600080fd5b505af115801561037e573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018790527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190613d3d565b61044957610449613aeb565b7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036104d0576104c7837f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218b612935565b95506104df9050565b6104db83898b612935565b9550505b8685101561056f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b50505050949350505050565b600081428110156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26000610656827f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b905060007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036108ae576106f8837f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a59190613d8a565b96505050610a4a565b6108f9887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a479190613d8a565b94505b34851115610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b2257600080fd5b505af1158015610b36573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018a90527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af1158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf59190613d3d565b610c0157610c01613aeb565b610c0c83898b612935565b50508434111561056f5761056f33610c248734613dd2565b612a07565b60008142811015610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000610ce3887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b9050600080610cf58a8a348b8b612af0565b91509150610d058a338585612cd3565b60007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b815260040160206040518083038185885af1158015610d74573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d999190613d8a565b9050610dc67f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218583612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301528d811660248301527f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7169063ee1fe2ad906044016020604051808303816000875af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e809190613d8a565b955081341115610e9857610e9833610c248434613dd2565b50505050509695505050505050565b60008142811015610f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02181169089160361117857610fc2827f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e59190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190613d8a565b9550505061135e565b6111c3887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be448261122b857f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b8a7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613d8a565b93505b858411156113ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b6113fa88338387612cd3565b611405888330612935565b50506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff831690632e1a7d4d90602401600060405180830381600087803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b505050506114918988612a07565b50505095945050505050565b6000814281101561150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000807f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036117ae576115ab887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91506115f8887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015611781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a59190613d8a565b95505050611b34565b7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff160361194b5761184c897f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561189b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bf9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b611996897f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91506119e3887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a919190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b319190613d8a565b93505b85841115611bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b611bd089338487612cd3565b610e9889898c612935565b60008342811015611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28181166004840152917f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02191600091829182917f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b79091169063bbe4f6db90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116611e17576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b71690639049f9d2906024016020604051808303816000875af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e149190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e889190613d66565b91509150816000148015611e9a575080155b15611ebf57611eaa600234613e08565b611eb5600234613e08565b9095509350611f7b565b6040517fa398030d0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff87169063a398030d90602401602060405180830381865afa158015611f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4e9190613d8a565b611f589083613e43565b611f628334613e56565b611f6c9190613e08565b9450611f788534613dd2565b93505b505060008473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b815260040160206040518083038185885af1158015611fcc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ff19190613d8a565b905089841015612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b88811015612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b8573ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215b57600080fd5b505af115801561216f573d6000803e3d6000fd5b505050505061217f858383612ecd565b61218a868386612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528d811660248301527f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7169063ee1fe2ad906044016020604051808303816000875af1158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122449190613d8a565b97506122508385613e43565b34146122de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016102a8565b50505050505050949350505050565b6000814281101561235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02181169089160361240f57612408817f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b915061245d565b61245a887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91505b6124698833848a612cd3565b612474888230612935565b94505085841015612507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b15801561256f57600080fd5b505af1158015612583573d6000803e3d6000fd5b505050506114918985612a07565b60008082428110156125ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b61260d8a8a8a8a8a8a6130be565b909b909a5098505050505050505050565b6000814281101561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036127325761272b877f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b9050612780565b61277d887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90505b61278c88338389612cd3565b600061279989898c612935565b9150508581101561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b9998505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152600090839060340160405160208183030381529060405280519060200120836040516020016128f7939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6040517f9331621200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528381166024830152828116604483015260009182917f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7169063933162129060640160408051808303816000875af11580156129d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fb9190613d66565b90969095509350505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8416908390604051612a3e9190613e6d565b60006040518083038185875af1925050503d8060008114612a7b576040519150601f19603f3d011682016040523d82523d6000602084013e612a80565b606091505b5050905080612aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a204554485f5452414e534645525f4641494c45440000000000000060448201526064016102a8565b505050565b60008060007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02190506000612c3189898473ffffffffffffffffffffffffffffffffffffffff1663b3c174048b6040518263ffffffff1660e01b8152600401612b5a91815260200190565b602060405180830381865afa158015612b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9b9190613d8a565b6040517fb3c17404000000000000000000000000000000000000000000000000000000008152600481018a90528a9073ffffffffffffffffffffffffffffffffffffffff88169063b3c1740490602401602060405180830381865afa158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190613d8a565b6134e8565b6040517fa398030d00000000000000000000000000000000000000000000000000000000815260048101829052919550915073ffffffffffffffffffffffffffffffffffffffff83169063a398030d90602401602060405180830381865afa158015612ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc59190613d8a565b925050509550959350505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b11612d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691612df39190613e6d565b6000604051808303816000865af19150503d8060008114612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b5091509150818015612e5f575080511580612e5f575080806020019051810190612e5f9190613d3d565b612ec5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11612f4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691612fe59190613e6d565b6000604051808303816000865af19150503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b50915091508180156130515750805115806130515750808060200190518101906130519190613d3d565b6130b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b5050505050565b6000807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff88811690821614801561313557508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b156132b757613168887f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b1580156131d557600080fd5b505af11580156131e9573d6000803e3d6000fd5b50506040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101859052600092507f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff169150632e1a7d4d906024016020604051808303816000875af115801561327d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a19190613d8a565b90506132b18a610c248387613e43565b506134dc565b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603613397576132f888888888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b505050506133878984612a07565b613392878a84612ecd565b6134dc565b8073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036134c8576133f8887f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218888883061387b565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905291945092506000907f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024016020604051808303816000875af115801561348d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b19190613d8a565b90506134bd8a82612a07565b6132b1898b86612ecd565b6134d688888888888e61387b565b90935091505b50965096945050505050565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152600091829182917f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b79091169063bbe4f6db90602401602060405180830381865afa15801561357d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a19190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116613673576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b71690639049f9d2906024016020604051808303816000875af115801561364c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136709190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e49190613d66565b915091508160001480156136f6575080155b156137065788945087935061386e565b60006137138a8385613acc565b90508881116137b757868110156137ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f315f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b89955093508361386c565b60006137c48a8585613acc565b90508a8111156137d6576137d6613aeb565b88811015613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b95508894505b505b5050509550959350505050565b6000807f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7816138eb8a7f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506138f98133848b612cd3565b6040517f45a11cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a8116602483015286811660448301528316906345a11cec9060640160408051808303816000875af1158015613976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399a9190613d66565b909450925086841015613a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54300000000000000000000000000000000000000000000000000060648201526084016102a8565b85831015613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54310000000000000000000000000000000000000000000000000060648201526084016102a8565b5050965096945050505050565b600081613ad98486613e56565b613ae39190613e08565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114613b3c57600080fd5b50565b60008060008060808587031215613b5557600080fd5b8435613b6081613b1a565b93506020850135613b7081613b1a565b93969395505050506040820135916060013590565b60008060008060008060c08789031215613b9e57600080fd5b8635613ba981613b1a565b95506020870135613bb981613b1a565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600080600060a08688031215613bf657600080fd5b8535613c0181613b1a565b94506020860135613c1181613b1a565b94979496505050506040830135926060810135926080909101359150565b60008060008060008060c08789031215613c4857600080fd5b8635613c5381613b1a565b95506020870135613c6381613b1a565b94506040870135613c7381613b1a565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060808587031215613caa57600080fd5b8435613cb581613b1a565b966020860135965060408601359560600135945092505050565b600080600080600080600060e0888a031215613cea57600080fd5b8735613cf581613b1a565b96506020880135613d0581613b1a565b95506040880135613d1581613b1a565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b600060208284031215613d4f57600080fd5b81518015158114613d5f57600080fd5b9392505050565b60008060408385031215613d7957600080fd5b505080516020909101519092909150565b600060208284031215613d9c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115613de557613de5613da3565b92915050565b600060208284031215613dfd57600080fd5b8151613d5f81613b1a565b600082613e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115613de557613de5613da3565b8082028115828204841417613de557613de5613da3565b6000825160005b81811015613e8e5760208186018101518583015201613e74565b50600092019182525091905056fea2646970667358221220a95f33b4286ad5dea5afdaed301e181f75bbf44e00456839003044a4264ee0c564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021
-----Decoded View---------------
Arg [0] : _factory (address): 0x0b51D00eF3Df0B66766938220542185F6fDbC0B7
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _xfETH (address): 0xa449845c3309ac5269DFA6b2F80eb6E73D0AE021
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021
Deployed Bytecode Sourcemap
5843:20095:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7089:10;:18;7103:4;7089:18;;;:41;;-1:-1:-1;7111:10:12;:19;7125:5;7111:19;;7089:41;7082:49;;;;:::i;:::-;5843:20095;;;;;20317:699;;;;;;:::i;:::-;;:::i;:::-;;;1038:25:13;;;1026:2;1011:18;20317:699:12;;;;;;;;24846:1090;;;;;;:::i;:::-;;:::i;9736:839::-;;;;;;:::i;:::-;;:::i;21727:1130::-;;;;;;;;;;-1:-1:-1;21727:1130:12;;;;;:::i;:::-;;:::i;18410:1327::-;;;;;;;;;;-1:-1:-1;18410:1327:12;;;;;:::i;:::-;;:::i;10889:1480::-;;;;;;:::i;:::-;;:::i;23523:770::-;;;;;;;;;;-1:-1:-1;23523:770:12;;;;;:::i;:::-;;:::i;15552:404::-;;;;;;;;;;-1:-1:-1;15552:404:12;;;;;:::i;:::-;;:::i;:::-;;;;4523:25:13;;;4579:2;4564:18;;4557:34;;;;4496:18;15552:404:12;4349:248:13;16983:663:12;;;;;;;;;;-1:-1:-1;16983:663:12;;;;;:::i;:::-;;:::i;20317:699::-;20488:15;20468:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;;;;;;;;;20532:4:::1;20574:9;20511:18;20605:54;20532:4:::0;20637:7:::1;20646:12;20605:19;:54::i;:::-;20589:70;;20671:10;20665:25;;;20698:9;20665:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20723:38:12::1;::::0;;;;:20:::1;5149:55:13::0;;;20723:38:12::1;::::0;::::1;5131:74:13::0;5221:18;;;5214:34;;;20729:4:12::1;20723:20;::::0;-1:-1:-1;20723:20:12::1;::::0;-1:-1:-1;5104:18:13;;;-1:-1:-1;20723:38:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20716:46;;;;:::i;:::-;20783:5;20772:16;;:7;:16;;::::0;20768:152:::1;;20815:29;20821:10;20833:5;20840:3;20815:5;:29::i;:::-;20798:46:::0;-1:-1:-1;20768:152:12::1;::::0;-1:-1:-1;20768:152:12::1;;20882:31;20888:10;20900:7;20909:3;20882:5;:31::i;:::-;20865:48:::0;-1:-1:-1;;20768:152:12::1;20947:14;20933:10;:28;;20925:86;;;::::0;::::1;::::0;;5743:2:13;20925:86:12::1;::::0;::::1;5725:21:13::0;5782:2;5762:18;;;5755:30;5821:34;5801:18;;;5794:62;5892:15;5872:18;;;5865:43;5925:19;;20925:86:12::1;5541:409:13::0;20925:86:12::1;20505:511;;;20317:699:::0;;;;;;;:::o;24846:1090::-;25014:10;24994:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;25053:4:::1;25032:18;25094:54;25053:4:::0;25126:7:::1;25135:12;25094:19;:54::i;:::-;25078:70;;25154:13;25188:5;25177:16;;:7;:16;;::::0;25173:425:::1;;25211:54;25231:10;25243:7;25252:12;25211:19;:54::i;:::-;25203:62;;25274:6;25282::::0;25302:5:::1;25292:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25273:47;;;;25336:11;:23;25360:1;25363;25366:11;25391:4;25379:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25336:75;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6633:25:13::0;;;;6674:18;;;6667:34;;;;6717:18;;;6710:34;6760:18;;;6753:34;6605:19;;25336:75:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25328:83;;25195:223;;25173:425;;;25440:51;25460:7;25469;25478:12;25440:19;:51::i;:::-;25432:59;;25507:11;:24;25532:5;25539;25546:11;25571:4;25559:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25507:84;::::0;;::::1;::::0;;;;;;7047:42:13;7116:15;;;25507:84:12::1;::::0;::::1;7098:34:13::0;7168:15;;;;7148:18;;;7141:43;7200:18;;;7193:34;7243:18;;;7236:34;7009:19;;25507:84:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25499:92;;25173:425;25620:9;25611:5;:18;;25603:75;;;::::0;::::1;::::0;;7483:2:13;25603:75:12::1;::::0;::::1;7465:21:13::0;7522:2;7502:18;;;7495:30;7561:34;7541:18;;;7534:62;7632:14;7612:18;;;7605:42;7664:19;;25603:75:12::1;7281:408:13::0;25603:75:12::1;25690:10;25684:25;;;25717:5;25684:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25738:34:12::1;::::0;;;;:20:::1;5149:55:13::0;;;25738:34:12::1;::::0;::::1;5131:74:13::0;5221:18;;;5214:34;;;25744:4:12::1;25738:20;::::0;-1:-1:-1;25738:20:12::1;::::0;-1:-1:-1;5104:18:13;;;-1:-1:-1;25738:34:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25731:42;;;;:::i;:::-;25779:31;25785:10;25797:7;25806:3;25779:5;:31::i;:::-;;;25863:5;25851:9;:17;25847:84;;;25870:61;25901:10;25913:17;25925:5:::0;25913:9:::1;:17;:::i;:::-;25870:30;:61::i;9736:839::-:0;9952:14;9932:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;9974:12:::1;9989:50;10009:6;10017:7;10026:12;9989:19;:50::i;:::-;9974:65;;10046:12;10060::::0;10076:121:::1;10097:6;10111:19;10138:9;10155:15;10178:13;10076;:121::i;:::-;10045:152;;;;10203:66;10235:6;10243:10;10255:4;10261:7;10203:31;:66::i;:::-;10275:16;10301:5;10294:21;;;10323:7;10294:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10275:58;;10339:53;10367:5;10374:4;10380:11;10339:27;:53::i;:::-;10410:35;::::0;;;;:22:::1;8269:15:13::0;;;10410:35:12::1;::::0;::::1;8251:34:13::0;8321:15;;;8301:18;;;8294:43;10422:4:12::1;10410:22;::::0;::::1;::::0;8163:18:13;;10410:35:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10398:47;;10498:7;10486:9;:19;10482:88;;;10507:63;10538:10;10550:19;10562:7:::0;10550:9:::1;:19;:::i;10507:63::-;9968:607;;;;9736:839:::0;;;;;;;;;:::o;21727:1130::-;21911:14;21891:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;21954:4:::1;21933:18;22002:16;22013:5;22002:16:::0;::::1;::::0;;::::1;::::0;21998:522:::1;;22036:54;22056:10;22068:7;22077:12;22036:19;:54::i;:::-;22028:62;;22099:6;22107::::0;22127:5:::1;22117:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22098:47;;;;22165:11;:23;22189:1;22192;22195:11;22220:4;22208:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22165:75;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6633:25:13::0;;;;6674:18;;;6667:34;;;;6717:18;;;6710:34;6760:18;;;6753:34;6605:19;;22165:75:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22153:87;;22020:227;;21998:522;;;22269:51;22289:7;22298;22307:12;22269:19;:51::i;:::-;22261:59;;22340:11;:24;22374:5;22389:54;22409:10;22421:7;22430:12;22389:19;:54::i;:::-;22453:11;22486:4;22474:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22340:173;::::0;;::::1;::::0;;;;;;7047:42:13;7116:15;;;22340:173:12::1;::::0;::::1;7098:34:13::0;7168:15;;;;7148:18;;;7141:43;7200:18;;;7193:34;7243:18;;;7236:34;7009:19;;22340:173:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22328:185;;21998:522;22546:13;22533:9;:26;;22525:83;;;::::0;::::1;::::0;;7483:2:13;22525:83:12::1;::::0;::::1;7465:21:13::0;7522:2;7502:18;;;7495:30;7561:34;7541:18;;;7534:62;7632:14;7612:18;;;7605:42;7664:19;;22525:83:12::1;7281:408:13::0;22525:83:12::1;22614:70;22646:7;22655:10;22667:5;22674:9;22614:31;:70::i;:::-;22690:41;22696:7;22705:10;22725:4;22690:5;:41::i;:::-;-1:-1:-1::0;;22737:39:12::1;::::0;;;;::::1;::::0;::::1;1038:25:13::0;;;22737:26:12::1;::::0;::::1;::::0;::::1;::::0;1011:18:13;;22737:39:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22782:48;22813:3;22818:11;22782:30;:48::i;:::-;22836:16;;21727:1130:::0;;;;;;;;:::o;18410:1327::-;18618:14;18598:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;18640:13:::1;18659::::0;18693:5:::1;18682:16;;:7;:16;;::::0;18678:856:::1;;18716:51;18736:7;18745;18754:12;18716:19;:51::i;:::-;18708:59;;18783:51;18803:7;18812;18821:12;18783:19;:51::i;:::-;18775:59;;18843:6;18851::::0;18871:5:::1;18861:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18842:47;;;;18909:11;:23;18933:1;18936;18939:11;18964:4;18952:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18909:75;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6633:25:13::0;;;;6674:18;;;6667:34;;;;6717:18;;;6710:34;6760:18;;;6753:34;6605:19;;18909:75:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18897:87;;18700:291;;18678:856;;;19012:5;19001:16;;:7;:16;;::::0;18997:537:::1;;19035:51;19055:7;19064;19073:12;19035:19;:51::i;:::-;19027:59;;19095:6;19103::::0;19123:5:::1;19113:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19094:47;;;;19161:11;:23;19185:1;19188;19191:11;19216:4;19204:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;18997:537;19265:51;19285:7;19294;19303:12;19265:19;:51::i;:::-;19257:59;;19332:51;19352:7;19361;19370:12;19332:19;:51::i;:::-;19324:59;;19403:11;:24;19437:5;19452;19467:11;19500:4;19488:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19403:124;::::0;;::::1;::::0;;;;;;7047:42:13;7116:15;;;19403:124:12::1;::::0;::::1;7098:34:13::0;7168:15;;;;7148:18;;;7141:43;7200:18;;;7193:34;7243:18;;;7236:34;7009:19;;19403:124:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19391:136;;18997:537;19560:13;19547:9;:26;;19539:83;;;::::0;::::1;::::0;;7483:2:13;19539:83:12::1;::::0;::::1;7465:21:13::0;7522:2;7502:18;;;7495:30;7561:34;7541:18;;;7534:62;7632:14;7612:18;;;7605:42;7664:19;;19539:83:12::1;7281:408:13::0;19539:83:12::1;19628:70;19660:7;19669:10;19681:5;19688:9;19628:31;:70::i;:::-;19704:28;19710:7;19719;19728:3;19704:5;:28::i;10889:1480::-:0;11058:14;11038:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;11224:36:::1;::::0;;;;:29:::1;11096:4;8512:55:13::0;;;11224:36:12::1;::::0;::::1;8494:74:13::0;11096:4:12;11137:5:::1;::::0;11080:13:::1;::::0;;;;;11237:7:::1;11224:29:::0;;::::1;::::0;::::1;::::0;8467:18:13;;11224:36:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11209:51:::0;-1:-1:-1;11270:18:12::1;::::0;::::1;11266:134;;11354:39;::::0;;;;:32:::1;8512:55:13::0;;;11354:39:12::1;::::0;::::1;8494:74:13::0;11367:7:12::1;11354:32;::::0;::::1;::::0;8467:18:13;;11354:39:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11347:46;;11266:134;11414:15;11431:17:::0;11462:4:::1;11452:25;;;:27;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11413:66;;;;11491:10;11505:1;11491:15;:36;;;;-1:-1:-1::0;11510:17:12;;11491:36:::1;11487:311;;;11572:13;11584:1;11572:9;:13;:::i;:::-;11587;11599:1;11587:9;:13;:::i;:::-;11539:62:::0;;-1:-1:-1;11539:62:12;-1:-1:-1;11487:311:12::1;;;11699:39;::::0;;;;::::1;::::0;::::1;1038:25:13::0;;;11699::12::1;::::0;::::1;::::0;::::1;::::0;1011:18:13;;11699:39:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11686:52;::::0;:10;:52:::1;:::i;:::-;11649:22;11661:10:::0;11649:9:::1;:22;:::i;:::-;11648:91;;;;:::i;:::-;11626:113:::0;-1:-1:-1;11768:21:12::1;11626:113:::0;11768:9:::1;:21;:::i;:::-;11749:40;;11487:311;11405:399;;11809:16;11835:6;11828:22;;;11858:16;11828:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11809:68;;11904:13;11891:9;:26;;11883:79;;;::::0;::::1;::::0;;9619:2:13;11883:79:12::1;::::0;::::1;9601:21:13::0;9658:2;9638:18;;;9631:30;9697:34;9677:18;;;9670:62;9768:10;9748:18;;;9741:38;9796:19;;11883:79:12::1;9417:404:13::0;11883:79:12::1;11991:15;11976:11;:30;;11968:83;;;::::0;::::1;::::0;;9619:2:13;11968:83:12::1;::::0;::::1;9601:21:13::0;9658:2;9638:18;;;9631:30;9697:34;9677:18;;;9670:62;9768:10;9748:18;;;9741:38;9796:19;;11968:83:12::1;9417:404:13::0;11968:83:12::1;12063:5;12057:20;;;12085:9;12057:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;12103:54;12131:6;12139:4;12145:11;12103:27;:54::i;:::-;12163:51;12191:5;12198:4;12204:9;12163:27;:51::i;:::-;12232:34;::::0;;;;:22:::1;8269:15:13::0;;;12232:34:12::1;::::0;::::1;8251::13::0;8321:15;;;8301:18;;;8294:43;12244:4:12::1;12232:22;::::0;::::1;::::0;8163:18:13;;12232:34:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12220:46:::0;-1:-1:-1;12293:28:12::1;12305:16:::0;12293:9;:28:::1;:::i;:::-;12280:9;:41;12272:92;;;::::0;::::1;::::0;;10028:2:13;12272:92:12::1;::::0;::::1;10010:21:13::0;10067:2;10047:18;;;10040:30;10106:34;10086:18;;;10079:62;10177:8;10157:18;;;10150:36;10203:19;;12272:92:12::1;9826:402:13::0;12272:92:12::1;11074:1295;;;;;;10889:1480:::0;;;;;;;:::o;23523:770::-;23707:15;23687:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;23730:13:::1;23770:4;23784:16;23795:5;23784:16:::0;::::1;::::0;;::::1;::::0;23780:179:::1;;23818:54;23838:10;23850:7;23859:12;23818:19;:54::i;:::-;23810:62;;23780:179;;;23901:51;23921:7;23930;23939:12;23901:19;:51::i;:::-;23893:59;;23780:179;23964:71;23996:7;24005:10;24017:5;24024:10;23964:31;:71::i;:::-;24058:41;24064:7;24073:10;24093:4;24058:5;:41::i;:::-;24041:58:::0;-1:-1:-1;;24113:28:12;;::::1;;24105:86;;;::::0;::::1;::::0;;5743:2:13;24105:86:12::1;::::0;::::1;5725:21:13::0;5782:2;5762:18;;;5755:30;5821:34;5801:18;;;5794:62;5892:15;5872:18;;;5865:43;5925:19;;24105:86:12::1;5541:409:13::0;24105:86:12::1;24197:38;::::0;;;;::::1;::::0;::::1;1038:25:13::0;;;24197:26:12::1;::::0;::::1;::::0;::::1;::::0;1011:18:13;;24197:38:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24241:47;24272:3;24277:10;24241:30;:47::i;15552:404::-:0;15770:12;15784;15750:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;15825:126:::1;15856:3;15867:7;15882;15897:10;15915:11;15934;15825:23;:126::i;:::-;15804:147:::0;;;;-1:-1:-1;15552:404:12;-1:-1:-1;;;;;;;;;15552:404:12:o;16983:663::-;17191:4;17171:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;17203:12:::1;17236:5;17225:16;;:7;:16;;::::0;17221:174:::1;;17258:51;17278:7;17287;17296:12;17258:19;:51::i;:::-;17251:58;;17221:174;;;17337:51;17357:7;17366;17375:12;17337:19;:51::i;:::-;17330:58;;17221:174;17400:70;17432:7;17441:10;17453:4;17459:10;17400:31;:70::i;:::-;17479:15;17498:28;17504:7;17513;17522:3;17498:5;:28::i;:::-;17476:50;;;17554:14;17540:10;:28;;17532:86;;;::::0;::::1;::::0;;5743:2:13;17532:86:12::1;::::0;::::1;5725:21:13::0;5782:2;5762:18;;;5755:30;5821:34;5801:18;;;5794:62;5892:15;5872:18;;;5865:43;5925:19;;17532:86:12::1;5541:409:13::0;17532:86:12::1;17631:10:::0;16983:663;-1:-1:-1;;;;;;;;;16983:663:12:o;1619:430::-;1922:24;;10395:66:13;10382:2;10378:15;;;10374:88;1922:24:12;;;10362:101:13;1732:12:12;;1888:8;;10479:12:13;;1922:24:12;;;;;;;;;;;;1912:35;;;;;;1963:13;1833:175;;;;;;;;;10800:66:13;10788:79;;10904:2;10900:15;;;;10917:66;10896:88;10892:1;10883:11;;10876:109;11010:2;11001:12;;10994:28;;;;11047:2;11038:12;;11031:28;11084:2;11075:12;;10502:591;1833:175:12;;;;;;;;;;;;;;1810:210;;1833:175;1810:210;;;;;1619:430;-1:-1:-1;;;;1619:430:12:o;16059:195::-;16204:45;;;;;:22;11379:15:13;;;16204:45:12;;;11361:34:13;11431:15;;;11411:18;;;11404:43;11483:15;;;11463:18;;;11456:43;16155:10:12;;;;16216:4;16204:22;;;;11273:18:13;;16204:45:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16186:63;;;;-1:-1:-1;16059:195:12;-1:-1:-1;;;;16059:195:12:o;714:178::-;823:12;;;781;823;;;;;;;;;799:8;;;;815:6;;799:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;780:56;;;850:7;842:45;;;;;;;12318:2:13;842:45:12;;;12300:21:13;12357:2;12337:18;;;12330:30;12396:27;12376:18;;;12369:55;12441:18;;842:45:12;12116:349:13;842:45:12;774:118;714:178;;:::o;8529:557::-;8702:16;8720:14;8742;8759:5;8742:22;;8784:16;8835:190;8863:6;8877:19;8911:6;8904:25;;;8930:17;8904:44;;;;;;;;;;;;;1038:25:13;;1026:2;1011:18;;892:177;8904:44:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8979:40;;;;;;;;1038:25:13;;;8956:15:12;;8979:25;;;;;;1011:18:13;;8979:40:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8835:20;:190::i;:::-;9043:38;;;;;;;;1038:25:13;;;8806:219:12;;-1:-1:-1;8806:219:12;-1:-1:-1;9043:25:12;;;;;;1011:18:13;;9043:38:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9031:50;;8736:350;;8529:557;;;;;;;;:::o;304:406::-;434:1;413:6;:18;;;:22;405:60;;;;;;;12672:2:13;405:60:12;;;12654:21:13;12711:2;12691:18;;;12684:30;12750:27;12730:18;;;12723:55;12795:18;;405:60:12;12470:349:13;405:60:12;526:72;;;507:11;13105:15:13;;;526:72:12;;;13087:34:13;13157:15;;;13137:18;;;13130:43;13189:18;;;;13182:34;;;526:72:12;;;;;;;;;;12999:18:13;;;;526:72:12;;;;;;;;;549:28;526:72;;;507:97;;-1:-1:-1;;;;507:11:12;;;;:97;;526:72;507:97;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;471:133;;;;618:7;:57;;;;-1:-1:-1;630:11:12;;:16;;:44;;;661:4;650:24;;;;;;;;;;;;:::i;:::-;610:95;;;;;;;12672:2:13;610:95:12;;;12654:21:13;12711:2;12691:18;;;12684:30;12750:27;12730:18;;;12723:55;12795:18;;610:95:12;12470:349:13;610:95:12;399:311;;304:406;;;;:::o;896:368::-;1007:1;986:6;:18;;;:22;978:56;;;;;;;13429:2:13;978:56:12;;;13411:21:13;13468:2;13448:18;;;13441:30;13507:23;13487:18;;;13480:51;13548:18;;978:56:12;13227:345:13;978:56:12;1095:61;;;1076:11;5149:55:13;;;1095:61:12;;;5131:74:13;5221:18;;;;5214:34;;;1095:61:12;;;;;;;;;;5104:18:13;;;;1095:61:12;;;;;;;;;1118:24;1095:61;;;1076:86;;-1:-1:-1;;;;1076:11:12;;;;:86;;1095:61;1076:86;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1040:122;;;;1176:7;:57;;;;-1:-1:-1;1188:11:12;;:16;;:44;;;1219:4;1208:24;;;;;;;;;;;;:::i;:::-;1168:91;;;;;;;13429:2:13;1168:91:12;;;13411:21:13;13468:2;13448:18;;;13441:30;13507:23;13487:18;;;13480:51;13548:18;;1168:91:12;13227:345:13;1168:91:12;972:292;;896:368;;;:::o;13033:1573::-;13211:12;;13266:4;13294:21;;;;;;;;:46;;;;;13330:10;13319:21;;:7;:21;;;13294:46;13290:1312;;;13371:141;13397:7;13414:5;13429:10;13449:11;13470;13499:4;13371:16;:141::i;:::-;13520:32;;;;;;;;1038:25:13;;;13350:162:12;;-1:-1:-1;13350:162:12;-1:-1:-1;13520:23:12;;;;;;1011:18:13;;13520:32:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13579:31:12;;;;;;;;1038:25:13;;;13560:16:12;;-1:-1:-1;13586:5:12;13579:22;;;-1:-1:-1;13579:22:12;;1011:18:13;;13579:31:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13560:50;-1:-1:-1;13618:58:12;13649:3;13654:21;13560:50;13654:7;:21;:::i;13618:58::-;13342:341;13290:1312;;;13704:10;13693:21;;:7;:21;;;13689:913;;13745:143;13771:7;13788;13805:10;13825:11;13846;13875:4;13745:16;:143::i;:::-;13896:32;;;;;;;;1038:25:13;;;13724:164:12;;-1:-1:-1;13724:164:12;-1:-1:-1;13896:23:12;;;;;;1011:18:13;;13896:32:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13936:44;13967:3;13972:7;13936:30;:44::i;:::-;13988:50;14016:7;14025:3;14030:7;13988:27;:50::i;:::-;13689:913;;;14066:10;14055:21;;:7;:21;;;14051:551;;14107:141;14133:7;14150:5;14165:10;14185:11;14206;14235:4;14107:16;:141::i;:::-;14275:31;;;;;;;;1038:25:13;;;14086:162:12;;-1:-1:-1;14086:162:12;-1:-1:-1;14256:16:12;;14282:5;14275:22;;;;;1011:18:13;;14275:31:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14256:50;;14314:48;14345:3;14350:11;14314:30;:48::i;:::-;14370:50;14398:7;14407:3;14412:7;14370:27;:50::i;14051:551::-;14462:133;14488:7;14505;14522:10;14542:11;14563;14584:3;14462:16;:133::i;:::-;14441:154;;-1:-1:-1;14441:154:12;-1:-1:-1;14051:551:12;13239:1367;13033:1573;;;;;;;;;:::o;7225:1300::-;7466:37;;;;;:29;8512:55:13;;;7466:37:12;;;8494:74:13;-1:-1:-1;;;;;;7479:7:12;7466:29;;;;;;8467:18:13;;7466:37:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7451:52;-1:-1:-1;7513:18:12;;;7509:135;;7597:40;;;;;:32;8512:55:13;;;7597:40:12;;;8494:74:13;7610:7:12;7597:32;;;;8467:18:13;;7597:40:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7590:47;;7509:135;7650:12;7664:11;7689:4;7679:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7649:57;;;;7716:7;7727:1;7716:12;:27;;;;-1:-1:-1;7732:11:12;;7716:27;7712:809;;;7783:19;;-1:-1:-1;7804:19:12;;-1:-1:-1;7712:809:12;;;7845:23;7871:55;7889:19;7910:6;7918:7;7871:17;:55::i;:::-;7845:81;;7960:19;7938:18;:41;7934:581;;8021:15;7999:18;:37;;7991:90;;;;;;;13779:2:13;7991:90:12;;;13761:21:13;13818:2;13798:18;;;13791:30;13857:34;13837:18;;;13830:62;13928:10;13908:18;;;13901:38;13956:19;;7991:90:12;13577:404:13;7991:90:12;8121:19;;-1:-1:-1;8142:18:12;-1:-1:-1;8142:18:12;7934:581;;;8186:23;8212:55;8230:19;8251:7;8260:6;8212:17;:55::i;:::-;8186:81;;8306:19;8284:18;:41;;8277:49;;;;:::i;:::-;8366:15;8344:18;:37;;8336:90;;;;;;;9619:2:13;8336:90:12;;;9601:21:13;9658:2;9638:18;;;9631:30;9697:34;9677:18;;;9670:62;9768:10;9748:18;;;9741:38;9796:19;;8336:90:12;9417:404:13;8336:90:12;8466:18;-1:-1:-1;8486:19:12;;-1:-1:-1;7934:581:12;7837:684;7712:809;7445:1080;;;7225:1300;;;;;;;;:::o;12406:623::-;12577:12;;12627:4;12577:12;12666:51;12686:7;12695;12704:12;12666:19;:51::i;:::-;12651:66;;12723:68;12755:4;12761:10;12773:5;12780:10;12723:31;:68::i;:::-;12818:46;;;;;:23;11379:15:13;;;12818:46:12;;;11361:34:13;11431:15;;;11411:18;;;11404:43;11483:15;;;11463:18;;;11456:43;12818:23:12;;;;;11273:18:13;;12818:46:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12797:67;;-1:-1:-1;12797:67:12;-1:-1:-1;12878:22:12;;;;12870:74;;;;;;;14188:2:13;12870:74:12;;;14170:21:13;14227:2;14207:18;;;14200:30;14266:34;14246:18;;;14239:62;14337:9;14317:18;;;14310:37;14364:19;;12870:74:12;13986:403:13;12870:74:12;12969:11;12958:7;:22;;12950:74;;;;;;;14596:2:13;12950:74:12;;;14578:21:13;14635:2;14615:18;;;14608:30;14674:34;14654:18;;;14647:62;14745:9;14725:18;;;14718:37;14772:19;;12950:74:12;14394:403:13;12950:74:12;12605:424;;12406:623;;;;;;;;;:::o;2365:120::-;2437:8;2478:2;2460:14;2472:2;2460:9;:14;:::i;:::-;2459:21;;;;:::i;:::-;2453:27;2365:120;-1:-1:-1;;;;2365:120:12:o;14:184:13:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:154;289:42;282:5;278:54;271:5;268:65;258:93;;347:1;344;337:12;258:93;203:154;:::o;362:525::-;448:6;456;464;472;525:3;513:9;504:7;500:23;496:33;493:53;;;542:1;539;532:12;493:53;581:9;568:23;600:31;625:5;600:31;:::i;:::-;650:5;-1:-1:-1;707:2:13;692:18;;679:32;720:33;679:32;720:33;:::i;:::-;362:525;;772:7;;-1:-1:-1;;;;826:2:13;811:18;;798:32;;877:2;862:18;849:32;;362:525::o;1074:663::-;1178:6;1186;1194;1202;1210;1218;1271:3;1259:9;1250:7;1246:23;1242:33;1239:53;;;1288:1;1285;1278:12;1239:53;1327:9;1314:23;1346:31;1371:5;1346:31;:::i;:::-;1396:5;-1:-1:-1;1453:2:13;1438:18;;1425:32;1466:33;1425:32;1466:33;:::i;:::-;1074:663;;1518:7;;-1:-1:-1;;;;1572:2:13;1557:18;;1544:32;;1623:2;1608:18;;1595:32;;1674:3;1659:19;;1646:33;;-1:-1:-1;1726:3:13;1711:19;;;1698:33;;-1:-1:-1;1074:663:13:o;1742:594::-;1837:6;1845;1853;1861;1869;1922:3;1910:9;1901:7;1897:23;1893:33;1890:53;;;1939:1;1936;1929:12;1890:53;1978:9;1965:23;1997:31;2022:5;1997:31;:::i;:::-;2047:5;-1:-1:-1;2104:2:13;2089:18;;2076:32;2117:33;2076:32;2117:33;:::i;:::-;1742:594;;2169:7;;-1:-1:-1;;;;2223:2:13;2208:18;;2195:32;;2274:2;2259:18;;2246:32;;2325:3;2310:19;;;2297:33;;-1:-1:-1;1742:594:13:o;2341:736::-;2445:6;2453;2461;2469;2477;2485;2538:3;2526:9;2517:7;2513:23;2509:33;2506:53;;;2555:1;2552;2545:12;2506:53;2594:9;2581:23;2613:31;2638:5;2613:31;:::i;:::-;2663:5;-1:-1:-1;2720:2:13;2705:18;;2692:32;2733:33;2692:32;2733:33;:::i;:::-;2785:7;-1:-1:-1;2844:2:13;2829:18;;2816:32;2857:33;2816:32;2857:33;:::i;:::-;2341:736;;;;-1:-1:-1;2909:7:13;;2963:2;2948:18;;2935:32;;-1:-1:-1;3014:3:13;2999:19;;2986:33;;3066:3;3051:19;;;3038:33;;-1:-1:-1;2341:736:13;-1:-1:-1;;2341:736:13:o;3082:452::-;3168:6;3176;3184;3192;3245:3;3233:9;3224:7;3220:23;3216:33;3213:53;;;3262:1;3259;3252:12;3213:53;3301:9;3288:23;3320:31;3345:5;3320:31;:::i;:::-;3370:5;3422:2;3407:18;;3394:32;;-1:-1:-1;3473:2:13;3458:18;;3445:32;;3524:2;3509:18;3496:32;;-1:-1:-1;3082:452:13;-1:-1:-1;;;3082:452:13:o;3539:805::-;3652:6;3660;3668;3676;3684;3692;3700;3753:3;3741:9;3732:7;3728:23;3724:33;3721:53;;;3770:1;3767;3760:12;3721:53;3809:9;3796:23;3828:31;3853:5;3828:31;:::i;:::-;3878:5;-1:-1:-1;3935:2:13;3920:18;;3907:32;3948:33;3907:32;3948:33;:::i;:::-;4000:7;-1:-1:-1;4059:2:13;4044:18;;4031:32;4072:33;4031:32;4072:33;:::i;:::-;3539:805;;;;-1:-1:-1;4124:7:13;;4178:2;4163:18;;4150:32;;-1:-1:-1;4229:3:13;4214:19;;4201:33;;4281:3;4266:19;;4253:33;;-1:-1:-1;4333:3:13;4318:19;;;4305:33;;-1:-1:-1;3539:805:13;-1:-1:-1;;3539:805:13:o;5259:277::-;5326:6;5379:2;5367:9;5358:7;5354:23;5350:32;5347:52;;;5395:1;5392;5385:12;5347:52;5427:9;5421:16;5480:5;5473:13;5466:21;5459:5;5456:32;5446:60;;5502:1;5499;5492:12;5446:60;5525:5;5259:277;-1:-1:-1;;;5259:277:13:o;5955:245::-;6034:6;6042;6095:2;6083:9;6074:7;6070:23;6066:32;6063:52;;;6111:1;6108;6101:12;6063:52;-1:-1:-1;;6134:16:13;;6190:2;6175:18;;;6169:25;6134:16;;6169:25;;-1:-1:-1;5955:245:13:o;6205:184::-;6275:6;6328:2;6316:9;6307:7;6303:23;6299:32;6296:52;;;6344:1;6341;6334:12;6296:52;-1:-1:-1;6367:16:13;;6205:184;-1:-1:-1;6205:184:13:o;7694:::-;7746:77;7743:1;7736:88;7843:4;7840:1;7833:15;7867:4;7864:1;7857:15;7883:128;7950:9;;;7971:11;;;7968:37;;;7985:18;;:::i;:::-;7883:128;;;;:::o;8579:251::-;8649:6;8702:2;8690:9;8681:7;8677:23;8673:32;8670:52;;;8718:1;8715;8708:12;8670:52;8750:9;8744:16;8769:31;8794:5;8769:31;:::i;8835:274::-;8875:1;8901;8891:189;;8936:77;8933:1;8926:88;9037:4;9034:1;9027:15;9065:4;9062:1;9055:15;8891:189;-1:-1:-1;9094:9:13;;8835:274::o;9114:125::-;9179:9;;;9200:10;;;9197:36;;;9213:18;;:::i;9244:168::-;9317:9;;;9348;;9365:15;;;9359:22;;9345:37;9335:71;;9386:18;;:::i;11699:412::-;11828:3;11866:6;11860:13;11891:1;11901:129;11915:6;11912:1;11909:13;11901:129;;;12013:4;11997:14;;;11993:25;;11987:32;11974:11;;;11967:53;11930:12;11901:129;;;-1:-1:-1;12085:1:13;12049:16;;12074:13;;;-1:-1:-1;12049:16:13;11699:412;-1:-1:-1;11699:412:13:o
Swarm Source
ipfs://a95f33b4286ad5dea5afdaed301e181f75bbf44e00456839003044a4264ee0c5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.