More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,544,946 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap | 764601 | 3 mins ago | IN | 0 ETH | 0.00005676 | ||||
Swap | 764589 | 9 mins ago | IN | 0.00324072 ETH | 0.00002474 | ||||
Swap | 764588 | 9 mins ago | IN | 0 ETH | 0.00003528 | ||||
Swap | 764586 | 11 mins ago | IN | 0 ETH | 0.00001703 | ||||
Swap | 764553 | 30 mins ago | IN | 0.001 ETH | 0.00003988 | ||||
Swap | 764532 | 42 mins ago | IN | 0 ETH | 0.00002811 | ||||
Swap | 764526 | 45 mins ago | IN | 0 ETH | 0.00002982 | ||||
Swap | 764484 | 1 hr ago | IN | 0 ETH | 0.00005335 | ||||
Multicall | 764468 | 1 hr ago | IN | 0 ETH | 0.00002081 | ||||
Add Liquidity2 | 764462 | 1 hr ago | IN | 0.00153864 ETH | 0.00004222 | ||||
Swap | 764430 | 1 hr ago | IN | 0.0048 ETH | 0.00008671 | ||||
Swap | 764402 | 1 hr ago | IN | 0 ETH | 0.00002723 | ||||
Multicall | 764352 | 2 hrs ago | IN | 0 ETH | 0.00001913 | ||||
Swap | 764345 | 2 hrs ago | IN | 0 ETH | 0.00005797 | ||||
Add Liquidity2 | 764332 | 2 hrs ago | IN | 0.00591262 ETH | 0.00003881 | ||||
Swap | 764325 | 2 hrs ago | IN | 0 ETH | 0.00006074 | ||||
Swap | 764320 | 2 hrs ago | IN | 0.265 ETH | 0.0000537 | ||||
Burn Liquidity W... | 764317 | 2 hrs ago | IN | 0 ETH | 0.00003575 | ||||
Swap | 764314 | 2 hrs ago | IN | 0 ETH | 0.00000728 | ||||
Swap | 764313 | 2 hrs ago | IN | 0 ETH | 0.00007028 | ||||
Swap | 764283 | 2 hrs ago | IN | 0 ETH | 0.00008785 | ||||
Burn Liquidity S... | 764265 | 2 hrs ago | IN | 0 ETH | 0.00000442 | ||||
Swap | 764209 | 3 hrs ago | IN | 0 ETH | 0.00005952 | ||||
Swap | 764199 | 3 hrs ago | IN | 0.526 ETH | 0.00008618 | ||||
Multicall | 764165 | 3 hrs ago | IN | 0 ETH | 0.00001913 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
764589 | 9 mins ago | 0.00324072 ETH | ||||
764553 | 30 mins ago | 0.001 ETH | ||||
764535 | 40 mins ago | 0.00321718 ETH | ||||
764535 | 40 mins ago | 0.00321718 ETH | ||||
764485 | 1 hr ago | 0.05818585 ETH | ||||
764485 | 1 hr ago | 0.05818585 ETH | ||||
764467 | 1 hr ago | 0.00855117 ETH | ||||
764467 | 1 hr ago | 0.00855117 ETH | ||||
764462 | 1 hr ago | 0.00593828 ETH | ||||
764462 | 1 hr ago | 0.00593828 ETH | ||||
764462 | 1 hr ago | 0.00153864 ETH | ||||
764461 | 1 hr ago | 0.00369218 ETH | ||||
764461 | 1 hr ago | 0.00369218 ETH | ||||
764455 | 1 hr ago | 0.00492578 ETH | ||||
764455 | 1 hr ago | 0.00492578 ETH | ||||
764453 | 1 hr ago | 0.00880742 ETH | ||||
764453 | 1 hr ago | 0.00880742 ETH | ||||
764430 | 1 hr ago | 0.00048 ETH | ||||
764430 | 1 hr ago | 0.00096 ETH | ||||
764430 | 1 hr ago | 0.00336 ETH | ||||
764332 | 2 hrs ago | 0.00591262 ETH | ||||
764320 | 2 hrs ago | 0.053 ETH | ||||
764320 | 2 hrs ago | 0.212 ETH | ||||
764213 | 3 hrs ago | 0.04702507 ETH | ||||
764213 | 3 hrs ago | 0.04702507 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 Source Code Verified (Exact Match)
Contract Name:
RitsuRouter
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later // // __ __ // .----.|__| |_.-----.--.--. // | _|| | _|__ --| | | // |__| |__|____|_____|_____| // // // Welcome to the Ritsu Router! // // Ritsu is a based decentralized exchange on Taiko network. // pragma solidity ^0.8.0; interface IRouter { struct SwapStep { address pool; bytes data; address callback; bytes callbackData; } struct SwapPath { SwapStep[] steps; address tokenIn; uint amountIn; } struct SplitPermitParams { address token; uint approveAmount; uint deadline; uint8 v; bytes32 r; bytes32 s; } struct ArrayPermitParams { uint approveAmount; uint deadline; bytes signature; } } interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function withdraw(uint) external; } interface IStaking { function stake(uint amount, address to) external; function stake(address token, uint amount, address to) external; } interface IPoolFactory { function master() external view returns (address); function getDeployData() external view returns (bytes memory); function createPool(bytes calldata data) external returns (address pool); } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(msg.sender); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == msg.sender, "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract Rescuable is Ownable { /// @dev Rescues ERC20 tokens. function rescueERC20(address token, address to, uint256 amount) external onlyOwner { require(to != address(0) && to != token, "Invalid to"); uint balance = IERC20(token).balanceOf(address(this)); if (amount == 0) { TransferHelper.safeTransfer(token, to, balance); } else { require(amount <= balance, "Exceeds balance"); TransferHelper.safeTransfer(token, to, amount); } } /// @dev Rescues Ether. function rescueETH(address payable to, uint256 amount) external onlyOwner { if (amount == 0) { amount = address(this).balance; } TransferHelper.safeTransferETH(to, amount); } } /// @dev The ETH transfer has failed. error ETHTransferFailed(); /// @dev The ERC20 `transferFrom` has failed. error TransferFromFailed(); /// @dev The ERC20 `transfer` has failed. error TransferFailed(); /// @dev The ERC20 `approve` has failed. error ApproveFailed(); /// @dev Helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true / false. library TransferHelper { function safeApprove( address token, address to, uint value ) internal { // bytes4(keccak256(bytes("approve(address,uint256)"))); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ApproveFailed(); } } function safeTransfer( address token, address to, uint value ) internal { // bytes4(keccak256(bytes("transfer(address,uint256)"))); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert TransferFailed(); } } function safeTransferFrom( address token, address from, address to, uint value ) internal { // bytes4(keccak256(bytes("transferFrom(address,address,uint256)"))); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert TransferFromFailed(); } } function safeTransferETH(address to, uint value) internal { // solhint-disable-next-line avoid-low-level-calls (bool success, ) = to.call{value: value}(""); if (!success) { revert ETHTransferFailed(); } } } interface IERC20Base { function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transfer(address to, uint amount) external returns (bool); function transferFrom(address from, address to, uint amount) external returns (bool); event Approval(address indexed owner, address indexed spender, uint amount); event Transfer(address indexed from, address indexed to, uint amount); } interface IERC20 is IERC20Base { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } interface IERC20Permit is IERC20 { function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function nonces(address owner) external view returns (uint); function DOMAIN_SEPARATOR() external view returns (bytes32); } interface IERC20Permit2 is IERC20Permit { function permit2(address owner, address spender, uint amount, uint deadline, bytes calldata signature) external; } /// @title Interface for permit /// @notice Interface used by DAI/CHAI for permit interface IERC20PermitAllowed { /// @notice Approve the spender to spend some tokens via the holder signature /// @dev This is the permit interface used by DAI and CHAI /// @param holder The address of the token holder, the token owner /// @param spender The address of the token spender /// @param nonce The holder's nonce, increases at each call to permit /// @param expiry The timestamp at which the permit is no longer valid /// @param allowed Boolean that sets approval amount, true for type(uint256).max and false for 0 /// @param v Must produce valid secp256k1 signature from the holder along with `r` and `s` /// @param r Must produce valid secp256k1 signature from the holder along with `v` and `s` /// @param s Must produce valid secp256k1 signature from the holder along with `r` and `v` function permit( address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s ) external; } abstract contract SelfPermit { function selfPermit( address token, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) public payable { IERC20Permit(token).permit(msg.sender, address(this), value, deadline, v, r, s); } function selfPermitIfNecessary( address token, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external payable { if (IERC20(token).allowance(msg.sender, address(this)) < value) { selfPermit(token, value, deadline, v, r, s); } } function selfPermitAllowed( address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public payable { IERC20PermitAllowed(token).permit(msg.sender, address(this), nonce, expiry, true, v, r, s); } function selfPermitAllowedIfNecessary( address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external payable { if (IERC20(token).allowance(msg.sender, address(this)) < type(uint256).max) { selfPermitAllowed(token, nonce, expiry, v, r, s); } } function selfPermit2( address token, uint value, uint deadline, bytes calldata signature ) public payable { IERC20Permit2(token).permit2(msg.sender, address(this), value, deadline, signature); } function selfPermit2IfNecessary( address token, uint value, uint deadline, bytes calldata signature ) external payable { if (IERC20(token).allowance(msg.sender, address(this)) < value) { selfPermit2(token, value, deadline, signature); } } } /// @notice Helper utility that enables calling multiple local methods in a single call. /// @author Modified from Uniswap (https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol) /// License-Identifier: GPL-2.0-or-later abstract contract Multicall { function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) { results = new bytes[](data.length); for (uint i; i < data.length;) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } results[i] = result; // cannot realistically overflow on human timescales unchecked { ++i; } } } } interface IPool { struct TokenAmount { address token; uint amount; } /// @dev Returns the address of pool master. function master() external view returns (address); /// @dev Returns the pool type. function poolType() external view returns (uint16); /// @dev Returns the assets of the pool. function getAssets() external view returns (address[] memory assets); /// @dev Returns the swap fee of the pool. function getSwapFee(address sender, address tokenIn, address tokenOut, bytes calldata data) external view returns (uint24 swapFee); /// @dev Returns the protocol fee of the pool. function getProtocolFee() external view returns (uint24 protocolFee); /// @dev Mints liquidity. function mint( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (uint liquidity); /// @dev Burns liquidity. function burn( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (TokenAmount[] memory tokenAmounts); /// @dev Burns liquidity with single output token. function burnSingle( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (TokenAmount memory tokenAmount); /// @dev Swaps between tokens. function swap( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (TokenAmount memory tokenAmount); } interface IBasePool is IPool, IERC20Permit2 { function token0() external view returns (address); function token1() external view returns (address); function reserve0() external view returns (uint); function reserve1() external view returns (uint); function invariantLast() external view returns (uint); function getReserves() external view returns (uint, uint); function getAmountOut(address tokenIn, uint amountIn, address sender) external view returns (uint amountOut); function getAmountIn(address tokenOut, uint amountOut, address sender) external view returns (uint amountIn); event Mint( address indexed sender, uint amount0, uint amount1, uint liquidity, address indexed to ); event Burn( address indexed sender, uint amount0, uint amount1, uint liquidity, address indexed to ); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync( uint reserve0, uint reserve1 ); } error NotEnoughLiquidityMinted(); error TooLittleReceived(); error Expired(); /// @notice The router is a universal interface for users to access /// functions across different protocol parts in one place. /// /// It handles the allowances and transfers of tokens, and /// allows chained swaps/operations across multiple pools, with /// additional features like slippage protection and permit support. /// contract RitsuRouter is IRouter, SelfPermit, Multicall, Rescuable { struct TokenInput { address token; uint amount; } address public immutable wETH; address private constant NATIVE_ETH = address(0); mapping(address => mapping(address => bool)) public isPoolEntered; mapping(address => address[]) public enteredPools; modifier ensure(uint deadline) { // solhint-disable-next-line not-rely-on-time if (block.timestamp > deadline) { revert Expired(); } _; } constructor(address _wETH) { wETH = _wETH; } function enteredPoolsLength(address account) external view returns (uint) { return enteredPools[account].length; } function _transferFromSender(address token, address to, uint amount) private { if (token == NATIVE_ETH) { // Wrap native ETH to wETH. IWETH(wETH).deposit{value: amount}(); // Send wETH to the pool. IWETH(wETH).transfer(to, amount); } else { // Transfer tokens to the pool. TransferHelper.safeTransferFrom(token, msg.sender, to, amount); } } function _transferAndAddLiquidity( address pool, TokenInput[] calldata inputs, bytes calldata data, uint minLiquidity, address callback, bytes calldata callbackData ) private returns (uint liquidity) { // Send all input tokens to the pool. uint n = inputs.length; TokenInput memory input; for (uint i; i < n; ) { input = inputs[i]; _transferFromSender(input.token, pool, input.amount); unchecked { ++i; } } liquidity = IPool(pool).mint(data, msg.sender, callback, callbackData); if (liquidity < minLiquidity) { revert NotEnoughLiquidityMinted(); } } function _markPoolEntered(address pool) private { if (!isPoolEntered[pool][msg.sender]) { isPoolEntered[pool][msg.sender] = true; enteredPools[msg.sender].push(pool); } } function addLiquidity( address pool, TokenInput[] calldata inputs, bytes calldata data, uint minLiquidity, address callback, bytes calldata callbackData, address staking ) public payable returns (uint liquidity) { liquidity = _transferAndAddLiquidity( pool, inputs, data, minLiquidity, callback, callbackData ); if (staking != address(0)) { (,address stakingTo) = abi.decode(data, (address, address)); if (stakingTo != address(0)) { IStaking(staking).stake(liquidity, stakingTo); } } } function addLiquidity2( address pool, TokenInput[] calldata inputs, bytes calldata data, uint minLiquidity, address callback, bytes calldata callbackData, address staking ) external payable returns (uint liquidity) { liquidity = addLiquidity( pool, inputs, data, minLiquidity, callback, callbackData, staking ); _markPoolEntered(pool); } function addLiquidityWithPermit( address pool, TokenInput[] calldata inputs, bytes calldata data, uint minLiquidity, address callback, bytes calldata callbackData, SplitPermitParams[] memory permits, address staking ) public payable returns (uint liquidity) { // Approve all tokens via permit. uint n = permits.length; SplitPermitParams memory params; for (uint i; i < n; ) { params = permits[i]; IERC20Permit(params.token).permit( msg.sender, address(this), params.approveAmount, params.deadline, params.v, params.r, params.s ); unchecked { ++i; } } liquidity = _transferAndAddLiquidity( pool, inputs, data, minLiquidity, callback, callbackData ); if (staking != address(0)) { (,address stakingTo) = abi.decode(data, (address, address)); if (stakingTo != address(0)) { IStaking(staking).stake(liquidity, stakingTo); } } } function addLiquidityWithPermit2( address pool, TokenInput[] calldata inputs, bytes calldata data, uint minLiquidity, address callback, bytes calldata callbackData, SplitPermitParams[] memory permits, address staking ) public payable returns (uint liquidity) { liquidity = addLiquidityWithPermit( pool, inputs, data, minLiquidity, callback, callbackData, permits, staking ); _markPoolEntered(pool); } // Burn Liquidity function _transferAndBurnLiquidity( address pool, uint liquidity, bytes memory data, uint[] memory minAmounts, address callback, bytes calldata callbackData ) private returns (IPool.TokenAmount[] memory amounts) { IBasePool(pool).transferFrom(msg.sender, pool, liquidity); amounts = IPool(pool).burn(data, msg.sender, callback, callbackData); uint n = amounts.length; for (uint i; i < n; ) { IPool.TokenAmount memory tokenAmount = amounts[i]; if (tokenAmount.amount < minAmounts[i]) { revert TooLittleReceived(); } unchecked { ++i; } } } function burnLiquidity( address pool, uint liquidity, bytes calldata data, uint[] calldata minAmounts, address callback, bytes calldata callbackData ) external returns (IPool.TokenAmount[] memory amounts) { amounts = _transferAndBurnLiquidity( pool, liquidity, data, minAmounts, callback, callbackData ); } function burnLiquidityWithPermit( address pool, uint liquidity, bytes calldata data, uint[] calldata minAmounts, address callback, bytes calldata callbackData, ArrayPermitParams memory permit ) external returns (IPool.TokenAmount[] memory amounts) { // Approve liquidity via permit. IBasePool(pool).permit2( msg.sender, address(this), permit.approveAmount, permit.deadline, permit.signature ); amounts = _transferAndBurnLiquidity( pool, liquidity, data, minAmounts, callback, callbackData ); } // Burn Liquidity Single function _transferAndBurnLiquiditySingle( address pool, uint liquidity, bytes memory data, uint minAmount, address callback, bytes memory callbackData ) private returns (IPool.TokenAmount memory amountOut) { IBasePool(pool).transferFrom(msg.sender, pool, liquidity); amountOut = IPool(pool).burnSingle(data, msg.sender, callback, callbackData); if (amountOut.amount < minAmount) { revert TooLittleReceived(); } } function burnLiquiditySingle( address pool, uint liquidity, bytes memory data, uint minAmount, address callback, bytes memory callbackData ) external returns (IPool.TokenAmount memory amountOut) { amountOut = _transferAndBurnLiquiditySingle( pool, liquidity, data, minAmount, callback, callbackData ); } function burnLiquiditySingleWithPermit( address pool, uint liquidity, bytes memory data, uint minAmount, address callback, bytes memory callbackData, ArrayPermitParams calldata permit ) external returns (IPool.TokenAmount memory amountOut) { // Approve liquidity via permit. IBasePool(pool).permit2( msg.sender, address(this), permit.approveAmount, permit.deadline, permit.signature ); amountOut = _transferAndBurnLiquiditySingle( pool, liquidity, data, minAmount, callback, callbackData ); } // Swap function _swap( SwapPath[] memory paths, uint amountOutMin ) private returns (IPool.TokenAmount memory amountOut) { uint pathsLength = paths.length; SwapPath memory path; SwapStep memory step; IPool.TokenAmount memory tokenAmount; for (uint i; i < pathsLength; ) { path = paths[i]; // Prefund the first step. step = path.steps[0]; _transferFromSender(path.tokenIn, step.pool, path.amountIn); // Cache steps length. uint stepsLength = path.steps.length; uint j; while (true) { if (j == stepsLength - 1) { // Accumulate output amount at the last step. tokenAmount = IBasePool(step.pool).swap( step.data, msg.sender, step.callback, step.callbackData ); amountOut.token = tokenAmount.token; amountOut.amount += tokenAmount.amount; break; } else { // Swap and send tokens to the next step. tokenAmount = IBasePool(step.pool).swap( step.data, msg.sender, step.callback, step.callbackData ); // Cache the next step. unchecked { ++j; } step = path.steps[j]; } } unchecked { ++i; } } if (amountOut.amount < amountOutMin) { revert TooLittleReceived(); } } function swap( SwapPath[] memory paths, uint amountOutMin, uint deadline ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) { amountOut = _swap( paths, amountOutMin ); } function swapWithPermit( SwapPath[] memory paths, uint amountOutMin, uint deadline, SplitPermitParams calldata permit ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) { // Approve input tokens via permit. IERC20Permit(permit.token).permit( msg.sender, address(this), permit.approveAmount, permit.deadline, permit.v, permit.r, permit.s ); amountOut = _swap( paths, amountOutMin ); } /// @notice Wrapper function to allow pool deployment to be batched. function createPool(address _factory, bytes calldata data) external payable returns (address) { return IPoolFactory(_factory).createPool(data); } function _stake(address target, address token, uint amount) private { TransferHelper.safeTransferFrom(token, msg.sender, address(this), amount); if (IERC20(token).allowance(address(this), target) < amount) { /// @dev This can approve arbitrary contract, the router is not intended to store any funds. TransferHelper.safeApprove(token, target, type(uint).max); } } /// @dev Universal function to stake tokens to a target contract. function stake(address target, address token, uint amount, address to) external { _stake(target, token, amount); IStaking(target).stake(amount, to); } function stakeWithToken(address target, address token, uint amount, address to) external { _stake(target, token, amount); IStaking(target).stake(token, amount, to); } }
{ "viaIR": false, "optimizer": { "enabled": true, "runs": 200, "details": { "yul": false } }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApproveFailed","type":"error"},{"inputs":[],"name":"ETHTransferFailed","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[],"name":"NotEnoughLiquidityMinted","type":"error"},{"inputs":[],"name":"TooLittleReceived","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct RitsuRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct RitsuRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidity2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct RitsuRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct RitsuRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidityWithPermit2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquidity","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquiditySingle","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquiditySingleWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquidityWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"enteredPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enteredPoolsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isPoolEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2IfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowedIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"stakeWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swap","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams","name":"permit","type":"tuple"}],"name":"swapWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620038dc380380620038dc8339810160408190526200003491620000db565b6200003f3362000051565b6001600160a01b031660805262000108565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b620000bf81620000a1565b8114620000cb57600080fd5b50565b8051620000ae81620000b4565b600060208284031215620000f257620000f2600080fd5b6000620001008484620000ce565b949350505050565b6080516137aa62000132600039600081816104ba01528181611b630152611be901526137aa6000f3fe6080604052600436106101c25760003560e01c80637d10c9d6116100f7578063b956b3fb11610095578063f2fde38b11610064578063f2fde38b146104dc578063f3728508146104fc578063f3995c671461050f578063f44e537a1461052257600080fd5b8063b956b3fb1461044c578063c2e3140a14610482578063e84d494b14610495578063f2428621146104a857600080fd5b8063a4a78f0c116100d1578063a4a78f0c146103d9578063ac9650d8146103ec578063ad271fa31461040c578063b2118a8d1461042c57600080fd5b80637d10c9d6146103885780638da5cb5b146103a85780639dd41df2146103c657600080fd5b80635139b80c116101645780636291027c1161013e5780636291027c1461032d578063688ee44c1461034d5780636cc781cd14610360578063715018a61461037357600080fd5b80635139b80c146102e757806353c43f15146102fa578063621a9eb01461031a57600080fd5b80632cc4081e116101a05780632cc4081e1461023f578063353766c61461025f5780634659a4941461028c5780634f25b8581461029f57600080fd5b8063099a04e5146101c7578063131e0cc0146101e95780632b4abadb14610212575b600080fd5b3480156101d357600080fd5b506101e76101e2366004611e8b565b610542565b005b6101fc6101f7366004611f63565b610563565b6040516102099190612065565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611e8b565b610618565b604051610209919061207c565b61025261024d3660046123f7565b610650565b6040516102099190612484565b34801561026b57600080fd5b5061027f61027a366004612548565b610699565b60405161020991906126a7565b6101e761029a3660046126cc565b610792565b3480156102ab57600080fd5b506102da6102ba366004612756565b600160209081526000928352604080842090915290825290205460ff1681565b6040516102099190612791565b6101fc6102f5366004611f63565b610807565b34801561030657600080fd5b5061025261031536600461279f565b610826565b6101fc610328366004612961565b610853565b34801561033957600080fd5b506101e7610348366004612a8a565b610873565b6101e761035b366004612aee565b6108e4565b6101e761036e366004612aee565b61096f565b34801561037f57600080fd5b506101e76109de565b34801561039457600080fd5b506102526103a3366004612b8c565b6109f2565b3480156103b457600080fd5b506000546001600160a01b0316610232565b6102326103d4366004612c79565b610a98565b6101e76103e73660046126cc565b610b16565b6103ff6103fa366004612cd4565b610ba5565b6040516102099190612de5565b34801561041857600080fd5b5061027f610427366004612df6565b610cfa565b34801561043857600080fd5b506101e7610447366004612edc565b610d73565b34801561045857600080fd5b506101fc610467366004612f11565b6001600160a01b031660009081526002602052604090205490565b6101e76104903660046126cc565b610e7c565b6102526104a3366004612f47565b610f01565b3480156104b457600080fd5b506102327f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e857600080fd5b506101e76104f7366004612f11565b610fe0565b6101fc61050a366004612961565b61101a565b6101e761051d3660046126cc565b6111bb565b34801561052e57600080fd5b506101e761053d366004612a8a565b6111f3565b61054a61122e565b806000036105555750475b61055f8282611267565b5050565b60006105768b8b8b8b8b8b8b8b8b6112e9565b90506001600160a01b0382161561060a576000610595888a018a612756565b9150506001600160a01b0381161561060857604051637acb775760e01b81526001600160a01b03841690637acb7757906105d59085908590600401612fb9565b600060405180830381600087803b1580156105ef57600080fd5b505af1158015610603573d6000803e3d6000fd5b505050505b505b9a9950505050505050505050565b6002602052816000526040600020818154811061063457600080fd5b6000918252602090912001546001600160a01b03169150829050565b6040805180820190915260008082526020820152818042111561068657604051630407b05b60e31b815260040160405180910390fd5b61069085856113fe565b95945050505050565b805160208201516040808401519051630b00663360e21b81526060936001600160a01b038f1693632c0198cc936106da933393309390929091600401612fd4565b600060405180830381600087803b1580156106f457600080fd5b505af1158015610708573d6000803e3d6000fd5b505050506107838b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a9050611675565b9b9a5050505050505050505050565b6040516323f2ebc360e21b81526001600160a01b03871690638fcbaf0c906107cd90339030908a908a906001908b908b908b90600401613024565b600060405180830381600087803b1580156107e757600080fd5b505af11580156107fb573d6000803e3d6000fd5b50505050505050505050565b600061081b8b8b8b8b8b8b8b8b8b8b610563565b905061060a8b6117e9565b6040805180820190915260008082526020820152610848878787878787611866565b979650505050505050565b60006108688c8c8c8c8c8c8c8c8c8c8c61101a565b90506107838c6117e9565b61087e848484611987565b604051637acb775760e01b81526001600160a01b03851690637acb7757906108ac9085908590600401612fb9565b600060405180830381600087803b1580156108c657600080fd5b505af11580156108da573d6000803e3d6000fd5b5050505050505050565b604051636eb1769f60e11b815284906001600160a01b0387169063dd62ed3e90610914903390309060040161309b565b602060405180830381865afa158015610931573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095591906130b4565b101561096857610968858585858561096f565b5050505050565b604051630b00663360e21b81526001600160a01b03861690632c0198cc906109a5903390309089908990899089906004016130f8565b600060405180830381600087803b1580156109bf57600080fd5b505af11580156109d3573d6000803e3d6000fd5b505050505050505050565b6109e661122e565b6109f06000611a17565b565b60408051808201909152600080825260208201526001600160a01b038816632c0198cc333085356020870135610a2b6040890189613140565b6040518763ffffffff1660e01b8152600401610a4c969594939291906130f8565b600060405180830381600087803b158015610a6657600080fd5b505af1158015610a7a573d6000803e3d6000fd5b50505050610a8c888888888888611866565b98975050505050505050565b6040516313b8683f60e01b81526000906001600160a01b038516906313b8683f90610ac9908690869060040161319e565b6020604051808303816000875af1158015610ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0c91906131bb565b90505b9392505050565b604051636eb1769f60e11b8152600019906001600160a01b0388169063dd62ed3e90610b48903390309060040161309b565b602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8991906130b4565b1015610b9d57610b9d868686868686610792565b505050505050565b6060816001600160401b03811115610bbf57610bbf61208a565b604051908082528060200260200182016040528015610bf257816020015b6060815260200190600190039081610bdd5790505b50905060005b82811015610cf35760008030868685818110610c1657610c166131dc565b9050602002810190610c289190613140565b604051610c36929190613205565b600060405180830381855af49150503d8060008114610c71576040519150601f19603f3d011682016040523d82523d6000602084013e610c76565b606091505b509150915081610ccb57604481511015610c8f57600080fd5b60048101905080806020019051810190610ca9919061326a565b60405162461bcd60e51b8152600401610cc291906132a4565b60405180910390fd5b80848481518110610cde57610cde6131dc565b60209081029190910101525050600101610bf8565b5092915050565b606061060a8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a9150899050611675565b610d7b61122e565b6001600160a01b03821615801590610da55750826001600160a01b0316826001600160a01b031614155b610dc15760405162461bcd60e51b8152600401610cc2906132d9565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190610df090309060040161207c565b602060405180830381865afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3191906130b4565b905081600003610e4b57610e46848483611a67565b610e76565b80821115610e6b5760405162461bcd60e51b8152600401610cc29061330f565b610e76848484611a67565b50505050565b604051636eb1769f60e11b815285906001600160a01b0388169063dd62ed3e90610eac903390309060040161309b565b602060405180830381865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed91906130b4565b1015610b9d57610b9d8686868686866111bb565b60408051808201909152600080825260208201528280421115610f3757604051630407b05b60e31b815260040160405180910390fd5b610f446020840184612f11565b6001600160a01b031663d505accf333060208701356040880135610f6e60808a0160608b0161331f565b89608001358a60a001356040518863ffffffff1660e01b8152600401610f9a9796959493929190613340565b600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b50505050610fd686866113fe565b9695505050505050565b610fe861122e565b6001600160a01b03811661100e5760405162461bcd60e51b8152600401610cc29061339c565b61101781611a17565b50565b81516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b828110156111045785818151811061106d5761106d6131dc565b6020026020010151915081600001516001600160a01b031663d505accf333085602001518660400151876060015188608001518960a001516040518863ffffffff1660e01b81526004016110c79796959493929190613340565b600060405180830381600087803b1580156110e157600080fd5b505af11580156110f5573d6000803e3d6000fd5b50505050806001019050611053565b506111168e8e8e8e8e8e8e8e8e6112e9565b92506001600160a01b038416156111aa5760006111358b8d018d612756565b9150506001600160a01b038116156111a857604051637acb775760e01b81526001600160a01b03861690637acb7757906111759087908590600401612fb9565b600060405180830381600087803b15801561118f57600080fd5b505af11580156111a3573d6000803e3d6000fd5b505050505b505b50509b9a5050505050505050505050565b60405163d505accf60e01b81526001600160a01b0387169063d505accf906107cd90339030908a908a908a908a908a90600401613340565b6111fe848484611987565b60405163294091cd60e01b81526001600160a01b0385169063294091cd906108ac908690869086906004016133e6565b336112416000546001600160a01b031690565b6001600160a01b0316146109f05760405162461bcd60e51b8152600401610cc290613440565b6000826001600160a01b03168260405161128090613450565b60006040518083038185875af1925050503d80600081146112bd576040519150601f19603f3d011682016040523d82523d6000602084013e6112c2565b606091505b50509050806112e45760405163b12d13eb60e01b815260040160405180910390fd5b505050565b6040805180820190915260008082526020820181905290889060005b82811015611352578b8b8281811061131f5761131f6131dc565b90506040020180360381019061133591906134a2565b915061134a82600001518e8460200151611b53565b600101611305565b506040516301f3943560e11b81526001600160a01b038d16906303e7286a90611389908c908c9033908c908c908c906004016134c3565b6020604051808303816000875af11580156113a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cc91906130b4565b9250868310156113ef5760405163124ca15f60e11b815260040160405180910390fd5b50509998505050505050505050565b604080518082019091526000808252602082015282516040805160608082018352808252600060208084018290528385018290528451608081018652828152808201849052808601839052808401939093528451808601909552818552840152909160005b848110156116455787818151811061147d5761147d6131dc565b60200260200101519350836000015160008151811061149e5761149e6131dc565b602002602001015192506114bf846020015184600001518660400151611b53565b83515160005b6114d060018361351a565b810361158a5784600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611518949392919061352d565b60408051808303816000875af1158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a91906135aa565b80516001600160a01b03168952602080820151908a01805192965090916115829083906135cb565b90525061163b565b84600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016115cc949392919061352d565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e91906135aa565b93508060010190508560000151818151811061162c5761162c6131dc565b602002602001015194506114c5565b5050600101611463565b50858560200151101561166b5760405163c9f52c7160e01b815260040160405180910390fd5b5050505092915050565b6040516323b872dd60e01b81526060906001600160a01b038916906323b872dd906116a89033908c908c906004016135de565b6020604051808303816000875af11580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb9190613619565b5060405163f66eab5b60e01b81526001600160a01b0389169063f66eab5b90611720908990339089908990899060040161363a565b6000604051808303816000875af115801561173f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261176791908101906136f1565b805190915060005b818110156117dc57600083828151811061178b5761178b6131dc565b602002602001015190508782815181106117a7576117a76131dc565b6020026020010151816020015110156117d35760405163c9f52c7160e01b815260040160405180910390fd5b5060010161176f565b5050979650505050505050565b6001600160a01b038116600090815260016020908152604080832033845290915290205460ff16611017576001600160a01b031660008181526001602081815260408084203385528252808420805460ff1916841790556002825283208054928301815583529091200180546001600160a01b0319169091179055565b6040805180820182526000808252602082015290516323b872dd60e01b81526001600160a01b038816906323b872dd906118a89033908b908b906004016135de565b6020604051808303816000875af11580156118c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118eb9190613619565b506040516313d85e7560e11b81526001600160a01b038816906327b0bcea9061191e90889033908890889060040161352d565b60408051808303816000875af115801561193c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196091906135aa565b90508381602001511015610fd65760405163c9f52c7160e01b815260040160405180910390fd5b61199382333084611c6e565b604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e906119c3903090889060040161309b565b602060405180830381865afa1580156119e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0491906130b4565b10156112e4576112e48284600019611d5c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080846001600160a01b031663a9059cbb8585604051602401611a8c92919061372b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611ac59190613768565b6000604051808303816000865af19150503d8060008114611b02576040519150601f19603f3d011682016040523d82523d6000602084013e611b07565b606091505b5091509150811580611b355750805115801590611b35575080806020019051810190611b339190613619565b155b15610968576040516312171d8360e31b815260040160405180910390fd5b6001600160a01b038316611c66577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bbc57600080fd5b505af1158015611bd0573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250611c2391508590859060040161372b565b6020604051808303816000875af1158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e769190613619565b6112e4833384845b600080856001600160a01b03166323b872dd868686604051602401611c95939291906135de565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611cce9190613768565b6000604051808303816000865af19150503d8060008114611d0b576040519150601f19603f3d011682016040523d82523d6000602084013e611d10565b606091505b5091509150811580611d3e5750805115801590611d3e575080806020019051810190611d3c9190613619565b155b15610b9d57604051631e4e7d0960e21b815260040160405180910390fd5b600080846001600160a01b031663095ea7b38585604051602401611d8192919061372b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611dba9190613768565b6000604051808303816000865af19150503d8060008114611df7576040519150601f19603f3d011682016040523d82523d6000602084013e611dfc565b606091505b5091509150811580611e2a5750805115801590611e2a575080806020019051810190611e289190613619565b155b1561096857604051633e3f8f7360e01b815260040160405180910390fd5b60006001600160a01b0382165b92915050565b611e6481611e48565b811461101757600080fd5b8035611e5581611e5b565b80611e64565b8035611e5581611e7a565b60008060408385031215611ea157611ea1600080fd5b6000611ead8585611e6f565b9250506020611ebe85828601611e80565b9150509250929050565b60008083601f840112611edd57611edd600080fd5b5081356001600160401b03811115611ef757611ef7600080fd5b602083019150836040820283011115611f1257611f12600080fd5b9250929050565b60008083601f840112611f2e57611f2e600080fd5b5081356001600160401b03811115611f4857611f48600080fd5b602083019150836001820283011115611f1257611f12600080fd5b60008060008060008060008060008060e08b8d031215611f8557611f85600080fd5b6000611f918d8d611e6f565b9a505060208b01356001600160401b03811115611fb057611fb0600080fd5b611fbc8d828e01611ec8565b995099505060408b01356001600160401b03811115611fdd57611fdd600080fd5b611fe98d828e01611f19565b97509750506060611ffc8d828e01611e80565b955050608061200d8d828e01611e6f565b94505060a08b01356001600160401b0381111561202c5761202c600080fd5b6120388d828e01611f19565b935093505060c061204b8d828e01611e6f565b9150509295989b9194979a5092959850565b805b82525050565b60208101611e55828461205d565b61205f81611e48565b60208101611e558284612073565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b03821117156120c5576120c561208a565b6040525050565b60006120d760405190565b90506120e382826120a0565b919050565b60006001600160401b038211156121015761210161208a565b5060209081020190565b60006001600160401b038211156121245761212461208a565b601f19601f83011660200192915050565b82818337506000910152565b600061215461214f8461210b565b6120cc565b90508281526020810184848401111561216f5761216f600080fd5b61217a848285612135565b509392505050565b600082601f83011261219657612196600080fd5b81356121a6848260208601612141565b949350505050565b6000608082840312156121c3576121c3600080fd5b6121cd60806120cc565b905060006121db8484611e6f565b82525060208201356001600160401b038111156121fa576121fa600080fd5b61220684828501612182565b602083015250604061221a84828501611e6f565b60408301525060608201356001600160401b0381111561223c5761223c600080fd5b61224884828501612182565b60608301525092915050565b600061226261214f846120e8565b8381529050602080820190840283018581111561228157612281600080fd5b835b818110156122c15780356001600160401b038111156122a4576122a4600080fd5b8086016122b189826121ae565b8552505060209283019201612283565b5050509392505050565b600082601f8301126122df576122df600080fd5b81356121a6848260208601612254565b60006060828403121561230457612304600080fd5b61230e60606120cc565b905081356001600160401b0381111561232957612329600080fd5b612335848285016122cb565b825250602061234684848301611e6f565b602083015250604061235a84828501611e80565b60408301525092915050565b600061237461214f846120e8565b8381529050602080820190840283018581111561239357612393600080fd5b835b818110156122c15780356001600160401b038111156123b6576123b6600080fd5b8086016123c389826122ef565b8552505060209283019201612395565b600082601f8301126123e7576123e7600080fd5b81356121a6848260208601612366565b60008060006060848603121561240f5761240f600080fd5b83356001600160401b0381111561242857612428600080fd5b612434868287016123d3565b935050602061244586828701611e80565b925050604061245686828701611e80565b9150509250925092565b805160408301906124718482612073565b506020820151610e76602085018261205d565b60408101611e558284612460565b60008083601f8401126124a7576124a7600080fd5b5081356001600160401b038111156124c1576124c1600080fd5b602083019150836020820283011115611f1257611f12600080fd5b6000606082840312156124f1576124f1600080fd5b6124fb60606120cc565b905060006125098484611e80565b825250602061251a84848301611e80565b60208301525060408201356001600160401b0381111561253c5761253c600080fd5b61235a84828501612182565b60008060008060008060008060008060e08b8d03121561256a5761256a600080fd5b60006125768d8d611e6f565b9a505060206125878d828e01611e80565b99505060408b01356001600160401b038111156125a6576125a6600080fd5b6125b28d828e01611f19565b985098505060608b01356001600160401b038111156125d3576125d3600080fd5b6125df8d828e01612492565b965096505060806125f28d828e01611e6f565b94505060a08b01356001600160401b0381111561261157612611600080fd5b61261d8d828e01611f19565b935093505060c08b01356001600160401b0381111561263e5761263e600080fd5b61204b8d828e016124dc565b60006126568383612460565b505060400190565b6000612668825190565b80845260209384019383018060005b8381101561269c57815161268b888261264a565b975060208301925050600101612677565b509495945050505050565b60208082528101610b0f818461265e565b60ff8116611e64565b8035611e55816126b8565b60008060008060008060c087890312156126e8576126e8600080fd5b60006126f48989611e6f565b965050602061270589828a01611e80565b955050604061271689828a01611e80565b945050606061272789828a016126c1565b935050608061273889828a01611e80565b92505060a061274989828a01611e80565b9150509295509295509295565b6000806040838503121561276c5761276c600080fd5b60006127788585611e6f565b9250506020611ebe85828601611e6f565b80151561205f565b60208101611e558284612789565b60008060008060008060c087890312156127bb576127bb600080fd5b60006127c78989611e6f565b96505060206127d889828a01611e80565b95505060408701356001600160401b038111156127f7576127f7600080fd5b61280389828a01612182565b945050606061281489828a01611e80565b935050608061282589828a01611e6f565b92505060a08701356001600160401b0381111561284457612844600080fd5b61274989828a01612182565b600060c0828403121561286557612865600080fd5b61286f60c06120cc565b9050600061287d8484611e6f565b825250602061288e84848301611e80565b60208301525060406128a284828501611e80565b60408301525060606128b6848285016126c1565b60608301525060806128ca84828501611e80565b60808301525060a06128de84828501611e80565b60a08301525092915050565b60006128f861214f846120e8565b83815290506020810160c0840283018581111561291757612917600080fd5b835b818110156122c1578061292c8882612850565b84525060209092019160c001612919565b600082601f83011261295157612951600080fd5b81356121a68482602086016128ea565b60008060008060008060008060008060006101008c8e03121561298657612986600080fd5b60006129928e8e611e6f565b9b505060208c01356001600160401b038111156129b1576129b1600080fd5b6129bd8e828f01611ec8565b9a509a505060408c01356001600160401b038111156129de576129de600080fd5b6129ea8e828f01611f19565b985098505060606129fd8e828f01611e80565b9650506080612a0e8e828f01611e6f565b95505060a08c01356001600160401b03811115612a2d57612a2d600080fd5b612a398e828f01611f19565b945094505060c08c01356001600160401b03811115612a5a57612a5a600080fd5b612a668e828f0161293d565b92505060e0612a778e828f01611e6f565b9150509295989b509295989b9093969950565b60008060008060808587031215612aa357612aa3600080fd5b6000612aaf8787611e6f565b9450506020612ac087828801611e6f565b9350506040612ad187828801611e80565b9250506060612ae287828801611e6f565b91505092959194509250565b600080600080600060808688031215612b0957612b09600080fd5b6000612b158888611e6f565b9550506020612b2688828901611e80565b9450506040612b3788828901611e80565b93505060608601356001600160401b03811115612b5657612b56600080fd5b612b6288828901611f19565b92509250509295509295909350565b600060608284031215612b8657612b86600080fd5b50919050565b600080600080600080600060e0888a031215612baa57612baa600080fd5b6000612bb68a8a611e6f565b9750506020612bc78a828b01611e80565b96505060408801356001600160401b03811115612be657612be6600080fd5b612bf28a828b01612182565b9550506060612c038a828b01611e80565b9450506080612c148a828b01611e6f565b93505060a08801356001600160401b03811115612c3357612c33600080fd5b612c3f8a828b01612182565b92505060c08801356001600160401b03811115612c5e57612c5e600080fd5b612c6a8a828b01612b71565b91505092959891949750929550565b600080600060408486031215612c9157612c91600080fd5b6000612c9d8686611e6f565b93505060208401356001600160401b03811115612cbc57612cbc600080fd5b612cc886828701611f19565b92509250509250925092565b60008060208385031215612cea57612cea600080fd5b82356001600160401b03811115612d0357612d03600080fd5b612d0f85828601612492565b92509250509250929050565b60005b83811015612d36578181015183820152602001612d1e565b50506000910152565b6000612d49825190565b808452602084019350612d60818560208601612d1b565b601f19601f8201165b9093019392505050565b6000610b0f8383612d3f565b6000612d89825190565b80845260208401935083602082028501612da38560200190565b8060005b85811015612dd85784840389528151612dc08582612d73565b94506020830160209a909a0199925050600101612da7565b5091979650505050505050565b60208082528101610b0f8184612d7f565b600080600080600080600080600060c08a8c031215612e1757612e17600080fd5b6000612e238c8c611e6f565b9950506020612e348c828d01611e80565b98505060408a01356001600160401b03811115612e5357612e53600080fd5b612e5f8c828d01611f19565b975097505060608a01356001600160401b03811115612e8057612e80600080fd5b612e8c8c828d01612492565b95509550506080612e9f8c828d01611e6f565b93505060a08a01356001600160401b03811115612ebe57612ebe600080fd5b612eca8c828d01611f19565b92509250509295985092959850929598565b600080600060608486031215612ef457612ef4600080fd5b6000612f008686611e6f565b935050602061244586828701611e6f565b600060208284031215612f2657612f26600080fd5b60006121a68484611e6f565b600060c08284031215612b8657612b86600080fd5b6000806000806101208587031215612f6157612f61600080fd5b84356001600160401b03811115612f7a57612f7a600080fd5b612f86878288016123d3565b9450506020612f9787828801611e80565b9350506040612fa887828801611e80565b9250506060612ae287828801612f32565b60408101612fc7828561205d565b610b0f6020830184612073565b60a08101612fe28288612073565b612fef6020830187612073565b612ffc604083018661205d565b613009606083018561205d565b81810360808301526108488184612d3f565b60ff811661205f565b6101008101613033828b612073565b613040602083018a612073565b61304d604083018961205d565b61305a606083018861205d565b6130676080830187612789565b61307460a083018661301b565b61308160c083018561205d565b61308e60e083018461205d565b9998505050505050505050565b60408101612fc78285612073565b8051611e5581611e7a565b6000602082840312156130c9576130c9600080fd5b60006121a684846130a9565b81835260006020840193506130eb838584612135565b601f19601f840116612d69565b60a081016131068289612073565b6131136020830188612073565b613120604083018761205d565b61312d606083018661205d565b8181036080830152610a8c8184866130d5565b6000808335601e193685900301811261315b5761315b600080fd5b8084019250823591506001600160401b0382111561317b5761317b600080fd5b60208301925060018202360383131561319657613196600080fd5b509250929050565b60208082528101610b0c8184866130d5565b8051611e5581611e5b565b6000602082840312156131d0576131d0600080fd5b60006121a684846131b0565b634e487b7160e01b600052603260045260246000fd5b60006131ff838584612135565b50500190565b60006121a68284866131f2565b600061322061214f8461210b565b90508281526020810184848401111561323b5761323b600080fd5b61217a848285612d1b565b600082601f83011261325a5761325a600080fd5b81516121a6848260208601613212565b60006020828403121561327f5761327f600080fd5b81516001600160401b0381111561329857613298600080fd5b6121a684828501613246565b60208082528101610b0f8184612d3f565b600a815260006020820169496e76616c696420746f60b01b815291505b5060200190565b60208082528101611e55816132b5565b600f81526000602082016e457863656564732062616c616e636560881b815291506132d2565b60208082528101611e55816132e9565b60006020828403121561333457613334600080fd5b60006121a684846126c1565b60e0810161334e828a612073565b61335b6020830189612073565b613368604083018861205d565b613375606083018761205d565b613382608083018661301b565b61338f60a083018561205d565b610a8c60c083018461205d565b60208082528101611e5581602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201526564647265737360d01b604082015260600190565b606081016133f48286612073565b613401602083018561205d565b6121a66040830184612073565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910190815260006132d2565b60208082528101611e558161340e565b600081611e55565b60006040828403121561346d5761346d600080fd5b61347760406120cc565b905060006134858484611e6f565b825250602061349684848301611e80565b60208301525092915050565b6000604082840312156134b7576134b7600080fd5b60006121a68484613458565b608080825281016134d581888a6130d5565b90506134e46020830187612073565b6134f16040830186612073565b8181036060830152610a8c8184866130d5565b634e487b7160e01b600052601160045260246000fd5b81810381811115611e5557611e55613504565b6080808252810161353e8187612d3f565b905061354d6020830186612073565b61355a6040830185612073565b8181036060830152610fd68184612d3f565b60006040828403121561358157613581600080fd5b61358b60406120cc565b9050600061359984846131b0565b8252506020613496848483016130a9565b6000604082840312156135bf576135bf600080fd5b60006121a6848461356c565b80820180821115611e5557611e55613504565b606081016135ec8286612073565b6135f96020830185612073565b6121a6604083018461205d565b801515611e64565b8051611e5581613606565b60006020828403121561362e5761362e600080fd5b60006121a6848461360e565b6080808252810161364b8188612d3f565b905061365a6020830187612073565b6136676040830186612073565b81810360608301526108488184866130d5565b600061368861214f846120e8565b838152905060208101604084028301858111156136a7576136a7600080fd5b835b818110156122c157806136bc888261356c565b8452506020909201916040016136a9565b600082601f8301126136e1576136e1600080fd5b81516121a684826020860161367a565b60006020828403121561370657613706600080fd5b81516001600160401b0381111561371f5761371f600080fd5b6121a6848285016136cd565b604081016137398285612073565b610b0f602083018461205d565b6000613750825190565b61375e818560208601612d1b565b9290920192915050565b6000610b0f828461374656fea26469706673582212206246091a8465c230825966a4658b2e3a2e23c7467eb5a3219b93cb267d9e538c64736f6c63430008170033000000000000000000000000a51894664a773981c6c112c43ce576f315d5b1b6
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80637d10c9d6116100f7578063b956b3fb11610095578063f2fde38b11610064578063f2fde38b146104dc578063f3728508146104fc578063f3995c671461050f578063f44e537a1461052257600080fd5b8063b956b3fb1461044c578063c2e3140a14610482578063e84d494b14610495578063f2428621146104a857600080fd5b8063a4a78f0c116100d1578063a4a78f0c146103d9578063ac9650d8146103ec578063ad271fa31461040c578063b2118a8d1461042c57600080fd5b80637d10c9d6146103885780638da5cb5b146103a85780639dd41df2146103c657600080fd5b80635139b80c116101645780636291027c1161013e5780636291027c1461032d578063688ee44c1461034d5780636cc781cd14610360578063715018a61461037357600080fd5b80635139b80c146102e757806353c43f15146102fa578063621a9eb01461031a57600080fd5b80632cc4081e116101a05780632cc4081e1461023f578063353766c61461025f5780634659a4941461028c5780634f25b8581461029f57600080fd5b8063099a04e5146101c7578063131e0cc0146101e95780632b4abadb14610212575b600080fd5b3480156101d357600080fd5b506101e76101e2366004611e8b565b610542565b005b6101fc6101f7366004611f63565b610563565b6040516102099190612065565b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611e8b565b610618565b604051610209919061207c565b61025261024d3660046123f7565b610650565b6040516102099190612484565b34801561026b57600080fd5b5061027f61027a366004612548565b610699565b60405161020991906126a7565b6101e761029a3660046126cc565b610792565b3480156102ab57600080fd5b506102da6102ba366004612756565b600160209081526000928352604080842090915290825290205460ff1681565b6040516102099190612791565b6101fc6102f5366004611f63565b610807565b34801561030657600080fd5b5061025261031536600461279f565b610826565b6101fc610328366004612961565b610853565b34801561033957600080fd5b506101e7610348366004612a8a565b610873565b6101e761035b366004612aee565b6108e4565b6101e761036e366004612aee565b61096f565b34801561037f57600080fd5b506101e76109de565b34801561039457600080fd5b506102526103a3366004612b8c565b6109f2565b3480156103b457600080fd5b506000546001600160a01b0316610232565b6102326103d4366004612c79565b610a98565b6101e76103e73660046126cc565b610b16565b6103ff6103fa366004612cd4565b610ba5565b6040516102099190612de5565b34801561041857600080fd5b5061027f610427366004612df6565b610cfa565b34801561043857600080fd5b506101e7610447366004612edc565b610d73565b34801561045857600080fd5b506101fc610467366004612f11565b6001600160a01b031660009081526002602052604090205490565b6101e76104903660046126cc565b610e7c565b6102526104a3366004612f47565b610f01565b3480156104b457600080fd5b506102327f000000000000000000000000a51894664a773981c6c112c43ce576f315d5b1b681565b3480156104e857600080fd5b506101e76104f7366004612f11565b610fe0565b6101fc61050a366004612961565b61101a565b6101e761051d3660046126cc565b6111bb565b34801561052e57600080fd5b506101e761053d366004612a8a565b6111f3565b61054a61122e565b806000036105555750475b61055f8282611267565b5050565b60006105768b8b8b8b8b8b8b8b8b6112e9565b90506001600160a01b0382161561060a576000610595888a018a612756565b9150506001600160a01b0381161561060857604051637acb775760e01b81526001600160a01b03841690637acb7757906105d59085908590600401612fb9565b600060405180830381600087803b1580156105ef57600080fd5b505af1158015610603573d6000803e3d6000fd5b505050505b505b9a9950505050505050505050565b6002602052816000526040600020818154811061063457600080fd5b6000918252602090912001546001600160a01b03169150829050565b6040805180820190915260008082526020820152818042111561068657604051630407b05b60e31b815260040160405180910390fd5b61069085856113fe565b95945050505050565b805160208201516040808401519051630b00663360e21b81526060936001600160a01b038f1693632c0198cc936106da933393309390929091600401612fd4565b600060405180830381600087803b1580156106f457600080fd5b505af1158015610708573d6000803e3d6000fd5b505050506107838b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a9050611675565b9b9a5050505050505050505050565b6040516323f2ebc360e21b81526001600160a01b03871690638fcbaf0c906107cd90339030908a908a906001908b908b908b90600401613024565b600060405180830381600087803b1580156107e757600080fd5b505af11580156107fb573d6000803e3d6000fd5b50505050505050505050565b600061081b8b8b8b8b8b8b8b8b8b8b610563565b905061060a8b6117e9565b6040805180820190915260008082526020820152610848878787878787611866565b979650505050505050565b60006108688c8c8c8c8c8c8c8c8c8c8c61101a565b90506107838c6117e9565b61087e848484611987565b604051637acb775760e01b81526001600160a01b03851690637acb7757906108ac9085908590600401612fb9565b600060405180830381600087803b1580156108c657600080fd5b505af11580156108da573d6000803e3d6000fd5b5050505050505050565b604051636eb1769f60e11b815284906001600160a01b0387169063dd62ed3e90610914903390309060040161309b565b602060405180830381865afa158015610931573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095591906130b4565b101561096857610968858585858561096f565b5050505050565b604051630b00663360e21b81526001600160a01b03861690632c0198cc906109a5903390309089908990899089906004016130f8565b600060405180830381600087803b1580156109bf57600080fd5b505af11580156109d3573d6000803e3d6000fd5b505050505050505050565b6109e661122e565b6109f06000611a17565b565b60408051808201909152600080825260208201526001600160a01b038816632c0198cc333085356020870135610a2b6040890189613140565b6040518763ffffffff1660e01b8152600401610a4c969594939291906130f8565b600060405180830381600087803b158015610a6657600080fd5b505af1158015610a7a573d6000803e3d6000fd5b50505050610a8c888888888888611866565b98975050505050505050565b6040516313b8683f60e01b81526000906001600160a01b038516906313b8683f90610ac9908690869060040161319e565b6020604051808303816000875af1158015610ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0c91906131bb565b90505b9392505050565b604051636eb1769f60e11b8152600019906001600160a01b0388169063dd62ed3e90610b48903390309060040161309b565b602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8991906130b4565b1015610b9d57610b9d868686868686610792565b505050505050565b6060816001600160401b03811115610bbf57610bbf61208a565b604051908082528060200260200182016040528015610bf257816020015b6060815260200190600190039081610bdd5790505b50905060005b82811015610cf35760008030868685818110610c1657610c166131dc565b9050602002810190610c289190613140565b604051610c36929190613205565b600060405180830381855af49150503d8060008114610c71576040519150601f19603f3d011682016040523d82523d6000602084013e610c76565b606091505b509150915081610ccb57604481511015610c8f57600080fd5b60048101905080806020019051810190610ca9919061326a565b60405162461bcd60e51b8152600401610cc291906132a4565b60405180910390fd5b80848481518110610cde57610cde6131dc565b60209081029190910101525050600101610bf8565b5092915050565b606061060a8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a9150899050611675565b610d7b61122e565b6001600160a01b03821615801590610da55750826001600160a01b0316826001600160a01b031614155b610dc15760405162461bcd60e51b8152600401610cc2906132d9565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190610df090309060040161207c565b602060405180830381865afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3191906130b4565b905081600003610e4b57610e46848483611a67565b610e76565b80821115610e6b5760405162461bcd60e51b8152600401610cc29061330f565b610e76848484611a67565b50505050565b604051636eb1769f60e11b815285906001600160a01b0388169063dd62ed3e90610eac903390309060040161309b565b602060405180830381865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed91906130b4565b1015610b9d57610b9d8686868686866111bb565b60408051808201909152600080825260208201528280421115610f3757604051630407b05b60e31b815260040160405180910390fd5b610f446020840184612f11565b6001600160a01b031663d505accf333060208701356040880135610f6e60808a0160608b0161331f565b89608001358a60a001356040518863ffffffff1660e01b8152600401610f9a9796959493929190613340565b600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b50505050610fd686866113fe565b9695505050505050565b610fe861122e565b6001600160a01b03811661100e5760405162461bcd60e51b8152600401610cc29061339c565b61101781611a17565b50565b81516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b828110156111045785818151811061106d5761106d6131dc565b6020026020010151915081600001516001600160a01b031663d505accf333085602001518660400151876060015188608001518960a001516040518863ffffffff1660e01b81526004016110c79796959493929190613340565b600060405180830381600087803b1580156110e157600080fd5b505af11580156110f5573d6000803e3d6000fd5b50505050806001019050611053565b506111168e8e8e8e8e8e8e8e8e6112e9565b92506001600160a01b038416156111aa5760006111358b8d018d612756565b9150506001600160a01b038116156111a857604051637acb775760e01b81526001600160a01b03861690637acb7757906111759087908590600401612fb9565b600060405180830381600087803b15801561118f57600080fd5b505af11580156111a3573d6000803e3d6000fd5b505050505b505b50509b9a5050505050505050505050565b60405163d505accf60e01b81526001600160a01b0387169063d505accf906107cd90339030908a908a908a908a908a90600401613340565b6111fe848484611987565b60405163294091cd60e01b81526001600160a01b0385169063294091cd906108ac908690869086906004016133e6565b336112416000546001600160a01b031690565b6001600160a01b0316146109f05760405162461bcd60e51b8152600401610cc290613440565b6000826001600160a01b03168260405161128090613450565b60006040518083038185875af1925050503d80600081146112bd576040519150601f19603f3d011682016040523d82523d6000602084013e6112c2565b606091505b50509050806112e45760405163b12d13eb60e01b815260040160405180910390fd5b505050565b6040805180820190915260008082526020820181905290889060005b82811015611352578b8b8281811061131f5761131f6131dc565b90506040020180360381019061133591906134a2565b915061134a82600001518e8460200151611b53565b600101611305565b506040516301f3943560e11b81526001600160a01b038d16906303e7286a90611389908c908c9033908c908c908c906004016134c3565b6020604051808303816000875af11580156113a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cc91906130b4565b9250868310156113ef5760405163124ca15f60e11b815260040160405180910390fd5b50509998505050505050505050565b604080518082019091526000808252602082015282516040805160608082018352808252600060208084018290528385018290528451608081018652828152808201849052808601839052808401939093528451808601909552818552840152909160005b848110156116455787818151811061147d5761147d6131dc565b60200260200101519350836000015160008151811061149e5761149e6131dc565b602002602001015192506114bf846020015184600001518660400151611b53565b83515160005b6114d060018361351a565b810361158a5784600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611518949392919061352d565b60408051808303816000875af1158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a91906135aa565b80516001600160a01b03168952602080820151908a01805192965090916115829083906135cb565b90525061163b565b84600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016115cc949392919061352d565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e91906135aa565b93508060010190508560000151818151811061162c5761162c6131dc565b602002602001015194506114c5565b5050600101611463565b50858560200151101561166b5760405163c9f52c7160e01b815260040160405180910390fd5b5050505092915050565b6040516323b872dd60e01b81526060906001600160a01b038916906323b872dd906116a89033908c908c906004016135de565b6020604051808303816000875af11580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb9190613619565b5060405163f66eab5b60e01b81526001600160a01b0389169063f66eab5b90611720908990339089908990899060040161363a565b6000604051808303816000875af115801561173f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261176791908101906136f1565b805190915060005b818110156117dc57600083828151811061178b5761178b6131dc565b602002602001015190508782815181106117a7576117a76131dc565b6020026020010151816020015110156117d35760405163c9f52c7160e01b815260040160405180910390fd5b5060010161176f565b5050979650505050505050565b6001600160a01b038116600090815260016020908152604080832033845290915290205460ff16611017576001600160a01b031660008181526001602081815260408084203385528252808420805460ff1916841790556002825283208054928301815583529091200180546001600160a01b0319169091179055565b6040805180820182526000808252602082015290516323b872dd60e01b81526001600160a01b038816906323b872dd906118a89033908b908b906004016135de565b6020604051808303816000875af11580156118c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118eb9190613619565b506040516313d85e7560e11b81526001600160a01b038816906327b0bcea9061191e90889033908890889060040161352d565b60408051808303816000875af115801561193c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196091906135aa565b90508381602001511015610fd65760405163c9f52c7160e01b815260040160405180910390fd5b61199382333084611c6e565b604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e906119c3903090889060040161309b565b602060405180830381865afa1580156119e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0491906130b4565b10156112e4576112e48284600019611d5c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080846001600160a01b031663a9059cbb8585604051602401611a8c92919061372b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611ac59190613768565b6000604051808303816000865af19150503d8060008114611b02576040519150601f19603f3d011682016040523d82523d6000602084013e611b07565b606091505b5091509150811580611b355750805115801590611b35575080806020019051810190611b339190613619565b155b15610968576040516312171d8360e31b815260040160405180910390fd5b6001600160a01b038316611c66577f000000000000000000000000a51894664a773981c6c112c43ce576f315d5b1b66001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bbc57600080fd5b505af1158015611bd0573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000a51894664a773981c6c112c43ce576f315d5b1b616935063a9059cbb9250611c2391508590859060040161372b565b6020604051808303816000875af1158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e769190613619565b6112e4833384845b600080856001600160a01b03166323b872dd868686604051602401611c95939291906135de565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611cce9190613768565b6000604051808303816000865af19150503d8060008114611d0b576040519150601f19603f3d011682016040523d82523d6000602084013e611d10565b606091505b5091509150811580611d3e5750805115801590611d3e575080806020019051810190611d3c9190613619565b155b15610b9d57604051631e4e7d0960e21b815260040160405180910390fd5b600080846001600160a01b031663095ea7b38585604051602401611d8192919061372b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611dba9190613768565b6000604051808303816000865af19150503d8060008114611df7576040519150601f19603f3d011682016040523d82523d6000602084013e611dfc565b606091505b5091509150811580611e2a5750805115801590611e2a575080806020019051810190611e289190613619565b155b1561096857604051633e3f8f7360e01b815260040160405180910390fd5b60006001600160a01b0382165b92915050565b611e6481611e48565b811461101757600080fd5b8035611e5581611e5b565b80611e64565b8035611e5581611e7a565b60008060408385031215611ea157611ea1600080fd5b6000611ead8585611e6f565b9250506020611ebe85828601611e80565b9150509250929050565b60008083601f840112611edd57611edd600080fd5b5081356001600160401b03811115611ef757611ef7600080fd5b602083019150836040820283011115611f1257611f12600080fd5b9250929050565b60008083601f840112611f2e57611f2e600080fd5b5081356001600160401b03811115611f4857611f48600080fd5b602083019150836001820283011115611f1257611f12600080fd5b60008060008060008060008060008060e08b8d031215611f8557611f85600080fd5b6000611f918d8d611e6f565b9a505060208b01356001600160401b03811115611fb057611fb0600080fd5b611fbc8d828e01611ec8565b995099505060408b01356001600160401b03811115611fdd57611fdd600080fd5b611fe98d828e01611f19565b97509750506060611ffc8d828e01611e80565b955050608061200d8d828e01611e6f565b94505060a08b01356001600160401b0381111561202c5761202c600080fd5b6120388d828e01611f19565b935093505060c061204b8d828e01611e6f565b9150509295989b9194979a5092959850565b805b82525050565b60208101611e55828461205d565b61205f81611e48565b60208101611e558284612073565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b03821117156120c5576120c561208a565b6040525050565b60006120d760405190565b90506120e382826120a0565b919050565b60006001600160401b038211156121015761210161208a565b5060209081020190565b60006001600160401b038211156121245761212461208a565b601f19601f83011660200192915050565b82818337506000910152565b600061215461214f8461210b565b6120cc565b90508281526020810184848401111561216f5761216f600080fd5b61217a848285612135565b509392505050565b600082601f83011261219657612196600080fd5b81356121a6848260208601612141565b949350505050565b6000608082840312156121c3576121c3600080fd5b6121cd60806120cc565b905060006121db8484611e6f565b82525060208201356001600160401b038111156121fa576121fa600080fd5b61220684828501612182565b602083015250604061221a84828501611e6f565b60408301525060608201356001600160401b0381111561223c5761223c600080fd5b61224884828501612182565b60608301525092915050565b600061226261214f846120e8565b8381529050602080820190840283018581111561228157612281600080fd5b835b818110156122c15780356001600160401b038111156122a4576122a4600080fd5b8086016122b189826121ae565b8552505060209283019201612283565b5050509392505050565b600082601f8301126122df576122df600080fd5b81356121a6848260208601612254565b60006060828403121561230457612304600080fd5b61230e60606120cc565b905081356001600160401b0381111561232957612329600080fd5b612335848285016122cb565b825250602061234684848301611e6f565b602083015250604061235a84828501611e80565b60408301525092915050565b600061237461214f846120e8565b8381529050602080820190840283018581111561239357612393600080fd5b835b818110156122c15780356001600160401b038111156123b6576123b6600080fd5b8086016123c389826122ef565b8552505060209283019201612395565b600082601f8301126123e7576123e7600080fd5b81356121a6848260208601612366565b60008060006060848603121561240f5761240f600080fd5b83356001600160401b0381111561242857612428600080fd5b612434868287016123d3565b935050602061244586828701611e80565b925050604061245686828701611e80565b9150509250925092565b805160408301906124718482612073565b506020820151610e76602085018261205d565b60408101611e558284612460565b60008083601f8401126124a7576124a7600080fd5b5081356001600160401b038111156124c1576124c1600080fd5b602083019150836020820283011115611f1257611f12600080fd5b6000606082840312156124f1576124f1600080fd5b6124fb60606120cc565b905060006125098484611e80565b825250602061251a84848301611e80565b60208301525060408201356001600160401b0381111561253c5761253c600080fd5b61235a84828501612182565b60008060008060008060008060008060e08b8d03121561256a5761256a600080fd5b60006125768d8d611e6f565b9a505060206125878d828e01611e80565b99505060408b01356001600160401b038111156125a6576125a6600080fd5b6125b28d828e01611f19565b985098505060608b01356001600160401b038111156125d3576125d3600080fd5b6125df8d828e01612492565b965096505060806125f28d828e01611e6f565b94505060a08b01356001600160401b0381111561261157612611600080fd5b61261d8d828e01611f19565b935093505060c08b01356001600160401b0381111561263e5761263e600080fd5b61204b8d828e016124dc565b60006126568383612460565b505060400190565b6000612668825190565b80845260209384019383018060005b8381101561269c57815161268b888261264a565b975060208301925050600101612677565b509495945050505050565b60208082528101610b0f818461265e565b60ff8116611e64565b8035611e55816126b8565b60008060008060008060c087890312156126e8576126e8600080fd5b60006126f48989611e6f565b965050602061270589828a01611e80565b955050604061271689828a01611e80565b945050606061272789828a016126c1565b935050608061273889828a01611e80565b92505060a061274989828a01611e80565b9150509295509295509295565b6000806040838503121561276c5761276c600080fd5b60006127788585611e6f565b9250506020611ebe85828601611e6f565b80151561205f565b60208101611e558284612789565b60008060008060008060c087890312156127bb576127bb600080fd5b60006127c78989611e6f565b96505060206127d889828a01611e80565b95505060408701356001600160401b038111156127f7576127f7600080fd5b61280389828a01612182565b945050606061281489828a01611e80565b935050608061282589828a01611e6f565b92505060a08701356001600160401b0381111561284457612844600080fd5b61274989828a01612182565b600060c0828403121561286557612865600080fd5b61286f60c06120cc565b9050600061287d8484611e6f565b825250602061288e84848301611e80565b60208301525060406128a284828501611e80565b60408301525060606128b6848285016126c1565b60608301525060806128ca84828501611e80565b60808301525060a06128de84828501611e80565b60a08301525092915050565b60006128f861214f846120e8565b83815290506020810160c0840283018581111561291757612917600080fd5b835b818110156122c1578061292c8882612850565b84525060209092019160c001612919565b600082601f83011261295157612951600080fd5b81356121a68482602086016128ea565b60008060008060008060008060008060006101008c8e03121561298657612986600080fd5b60006129928e8e611e6f565b9b505060208c01356001600160401b038111156129b1576129b1600080fd5b6129bd8e828f01611ec8565b9a509a505060408c01356001600160401b038111156129de576129de600080fd5b6129ea8e828f01611f19565b985098505060606129fd8e828f01611e80565b9650506080612a0e8e828f01611e6f565b95505060a08c01356001600160401b03811115612a2d57612a2d600080fd5b612a398e828f01611f19565b945094505060c08c01356001600160401b03811115612a5a57612a5a600080fd5b612a668e828f0161293d565b92505060e0612a778e828f01611e6f565b9150509295989b509295989b9093969950565b60008060008060808587031215612aa357612aa3600080fd5b6000612aaf8787611e6f565b9450506020612ac087828801611e6f565b9350506040612ad187828801611e80565b9250506060612ae287828801611e6f565b91505092959194509250565b600080600080600060808688031215612b0957612b09600080fd5b6000612b158888611e6f565b9550506020612b2688828901611e80565b9450506040612b3788828901611e80565b93505060608601356001600160401b03811115612b5657612b56600080fd5b612b6288828901611f19565b92509250509295509295909350565b600060608284031215612b8657612b86600080fd5b50919050565b600080600080600080600060e0888a031215612baa57612baa600080fd5b6000612bb68a8a611e6f565b9750506020612bc78a828b01611e80565b96505060408801356001600160401b03811115612be657612be6600080fd5b612bf28a828b01612182565b9550506060612c038a828b01611e80565b9450506080612c148a828b01611e6f565b93505060a08801356001600160401b03811115612c3357612c33600080fd5b612c3f8a828b01612182565b92505060c08801356001600160401b03811115612c5e57612c5e600080fd5b612c6a8a828b01612b71565b91505092959891949750929550565b600080600060408486031215612c9157612c91600080fd5b6000612c9d8686611e6f565b93505060208401356001600160401b03811115612cbc57612cbc600080fd5b612cc886828701611f19565b92509250509250925092565b60008060208385031215612cea57612cea600080fd5b82356001600160401b03811115612d0357612d03600080fd5b612d0f85828601612492565b92509250509250929050565b60005b83811015612d36578181015183820152602001612d1e565b50506000910152565b6000612d49825190565b808452602084019350612d60818560208601612d1b565b601f19601f8201165b9093019392505050565b6000610b0f8383612d3f565b6000612d89825190565b80845260208401935083602082028501612da38560200190565b8060005b85811015612dd85784840389528151612dc08582612d73565b94506020830160209a909a0199925050600101612da7565b5091979650505050505050565b60208082528101610b0f8184612d7f565b600080600080600080600080600060c08a8c031215612e1757612e17600080fd5b6000612e238c8c611e6f565b9950506020612e348c828d01611e80565b98505060408a01356001600160401b03811115612e5357612e53600080fd5b612e5f8c828d01611f19565b975097505060608a01356001600160401b03811115612e8057612e80600080fd5b612e8c8c828d01612492565b95509550506080612e9f8c828d01611e6f565b93505060a08a01356001600160401b03811115612ebe57612ebe600080fd5b612eca8c828d01611f19565b92509250509295985092959850929598565b600080600060608486031215612ef457612ef4600080fd5b6000612f008686611e6f565b935050602061244586828701611e6f565b600060208284031215612f2657612f26600080fd5b60006121a68484611e6f565b600060c08284031215612b8657612b86600080fd5b6000806000806101208587031215612f6157612f61600080fd5b84356001600160401b03811115612f7a57612f7a600080fd5b612f86878288016123d3565b9450506020612f9787828801611e80565b9350506040612fa887828801611e80565b9250506060612ae287828801612f32565b60408101612fc7828561205d565b610b0f6020830184612073565b60a08101612fe28288612073565b612fef6020830187612073565b612ffc604083018661205d565b613009606083018561205d565b81810360808301526108488184612d3f565b60ff811661205f565b6101008101613033828b612073565b613040602083018a612073565b61304d604083018961205d565b61305a606083018861205d565b6130676080830187612789565b61307460a083018661301b565b61308160c083018561205d565b61308e60e083018461205d565b9998505050505050505050565b60408101612fc78285612073565b8051611e5581611e7a565b6000602082840312156130c9576130c9600080fd5b60006121a684846130a9565b81835260006020840193506130eb838584612135565b601f19601f840116612d69565b60a081016131068289612073565b6131136020830188612073565b613120604083018761205d565b61312d606083018661205d565b8181036080830152610a8c8184866130d5565b6000808335601e193685900301811261315b5761315b600080fd5b8084019250823591506001600160401b0382111561317b5761317b600080fd5b60208301925060018202360383131561319657613196600080fd5b509250929050565b60208082528101610b0c8184866130d5565b8051611e5581611e5b565b6000602082840312156131d0576131d0600080fd5b60006121a684846131b0565b634e487b7160e01b600052603260045260246000fd5b60006131ff838584612135565b50500190565b60006121a68284866131f2565b600061322061214f8461210b565b90508281526020810184848401111561323b5761323b600080fd5b61217a848285612d1b565b600082601f83011261325a5761325a600080fd5b81516121a6848260208601613212565b60006020828403121561327f5761327f600080fd5b81516001600160401b0381111561329857613298600080fd5b6121a684828501613246565b60208082528101610b0f8184612d3f565b600a815260006020820169496e76616c696420746f60b01b815291505b5060200190565b60208082528101611e55816132b5565b600f81526000602082016e457863656564732062616c616e636560881b815291506132d2565b60208082528101611e55816132e9565b60006020828403121561333457613334600080fd5b60006121a684846126c1565b60e0810161334e828a612073565b61335b6020830189612073565b613368604083018861205d565b613375606083018761205d565b613382608083018661301b565b61338f60a083018561205d565b610a8c60c083018461205d565b60208082528101611e5581602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201526564647265737360d01b604082015260600190565b606081016133f48286612073565b613401602083018561205d565b6121a66040830184612073565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910190815260006132d2565b60208082528101611e558161340e565b600081611e55565b60006040828403121561346d5761346d600080fd5b61347760406120cc565b905060006134858484611e6f565b825250602061349684848301611e80565b60208301525092915050565b6000604082840312156134b7576134b7600080fd5b60006121a68484613458565b608080825281016134d581888a6130d5565b90506134e46020830187612073565b6134f16040830186612073565b8181036060830152610a8c8184866130d5565b634e487b7160e01b600052601160045260246000fd5b81810381811115611e5557611e55613504565b6080808252810161353e8187612d3f565b905061354d6020830186612073565b61355a6040830185612073565b8181036060830152610fd68184612d3f565b60006040828403121561358157613581600080fd5b61358b60406120cc565b9050600061359984846131b0565b8252506020613496848483016130a9565b6000604082840312156135bf576135bf600080fd5b60006121a6848461356c565b80820180821115611e5557611e55613504565b606081016135ec8286612073565b6135f96020830185612073565b6121a6604083018461205d565b801515611e64565b8051611e5581613606565b60006020828403121561362e5761362e600080fd5b60006121a6848461360e565b6080808252810161364b8188612d3f565b905061365a6020830187612073565b6136676040830186612073565b81810360608301526108488184866130d5565b600061368861214f846120e8565b838152905060208101604084028301858111156136a7576136a7600080fd5b835b818110156122c157806136bc888261356c565b8452506020909201916040016136a9565b600082601f8301126136e1576136e1600080fd5b81516121a684826020860161367a565b60006020828403121561370657613706600080fd5b81516001600160401b0381111561371f5761371f600080fd5b6121a6848285016136cd565b604081016137398285612073565b610b0f602083018461205d565b6000613750825190565b61375e818560208601612d1b565b9290920192915050565b6000610b0f828461374656fea26469706673582212206246091a8465c230825966a4658b2e3a2e23c7467eb5a3219b93cb267d9e538c64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a51894664a773981c6c112c43ce576f315d5b1b6
-----Decoded View---------------
Arg [0] : _wETH (address): 0xA51894664A773981C6C112C43ce576f315d5b1B6
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a51894664a773981c6c112c43ce576f315d5b1b6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
LINEA | 28.99% | $3,204.72 | 793.6967 | $2,543,575.26 | |
LINEA | 20.96% | $0.9999 | 1,838,907.0047 | $1,838,723.11 | |
LINEA | 11.44% | $0.999572 | 1,004,198.2488 | $1,003,768.45 | |
LINEA | 4.80% | $3,310.44 | 127.1805 | $421,023.35 | |
LINEA | 4.58% | $3,813.18 | 105.2604 | $401,376.88 | |
LINEA | 1.13% | $0.000006 | 16,257,539,295.283 | $99,333.57 | |
LINEA | 0.95% | $96,329 | 0.8664 | $83,463.13 | |
LINEA | 0.52% | $0.999436 | 45,739.7304 | $45,713.93 | |
LINEA | 0.40% | $0.00957 | 3,621,133.0657 | $34,654.75 | |
LINEA | 0.14% | $1 | 12,402.8999 | $12,402.9 | |
LINEA | 0.11% | $0.394713 | 23,337.8403 | $9,211.75 | |
LINEA | 0.10% | $696.97 | 12.5078 | $8,717.53 | |
LINEA | 0.06% | $0.445344 | 12,532.3995 | $5,581.23 | |
LINEA | 0.03% | $36.01 | 73.632 | $2,651.49 | |
LINEA | 0.01% | $3,309.6 | 0.3973 | $1,314.94 | |
LINEA | <0.01% | $0.000197 | 1,343,154.3173 | $264.29 | |
LINEA | <0.01% | $3,469.5 | 0.0653 | $226.48 | |
LINEA | <0.01% | $0.000004 | 49,522,339.7333 | $205.52 | |
LINEA | <0.01% | $0.000021 | 6,477,900.3667 | $138.89 | |
LINEA | <0.01% | $0.994915 | 81.6971 | $81.28 | |
LINEA | <0.01% | $0.28392 | 83.9569 | $23.84 | |
LINEA | <0.01% | $0.086103 | 208.1976 | $17.93 | |
LINEA | <0.01% | $0.000001 | 11,378,683.0096 | $14.68 | |
LINEA | <0.01% | $0.001294 | 8,222.6649 | $10.64 | |
LINEA | <0.01% | $0.100663 | 34.9564 | $3.52 | |
LINEA | <0.01% | $0.058184 | 6.1344 | $0.3569 | |
LINEA | <0.01% | $3,311.87 | 0.00007182 | $0.2378 | |
SCROLL | 11.48% | $3,204.72 | 314.3422 | $1,007,378.39 | |
SCROLL | 6.90% | $0.999904 | 605,142.1537 | $605,084.06 | |
SCROLL | 2.88% | $0.999673 | 252,816.5646 | $252,733.86 | |
SCROLL | 1.86% | $3,812.75 | 42.7569 | $163,021.48 | |
SCROLL | 1.13% | $0.784092 | 126,551.5284 | $99,228.04 | |
SCROLL | 1.05% | $96,309.06 | 0.9537 | $91,848.44 | |
SCROLL | 0.24% | $0.999997 | 20,618.8638 | $20,618.8 | |
SCROLL | 0.20% | $3,556.93 | 4.9285 | $17,530.25 | |
SCROLL | 0.03% | $3,373 | 0.7852 | $2,648.5 | |
SCROLL | <0.01% | $0.093469 | 309.3619 | $28.92 | |
SCROLL | <0.01% | $3,301.58 | 0.00044355 | $1.46 | |
ETH | <0.01% | $3,213.94 | 0.0008524 | $2.74 | |
ZKSYNC | <0.01% | $3,213.94 | 0.0006775 | $2.18 | |
BSC | <0.01% | $697.04 | 0.00272596 | $1.9 | |
TAIKO | <0.01% | $1.01 | 0.1655 | $0.1673 | |
TAIKO | Ether (ETH) | <0.01% | $3,204.72 | 0.00000236 | $0.007567 |
[ 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.