Source Code
Latest 25 from a total of 3,087,470 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap | 4152230 | 1 hr ago | IN | 0 ETH | 0.00004224 | ||||
| Burn Liquidity | 4144353 | 16 hrs ago | IN | 0 ETH | 0.00000767 | ||||
| Swap | 4144055 | 16 hrs ago | IN | 0.07692308 ETH | 0.00003901 | ||||
| Swap | 4143367 | 17 hrs ago | IN | 0.07692308 ETH | 0.00016162 | ||||
| Swap | 4142413 | 19 hrs ago | IN | 0 ETH | 0.0000405 | ||||
| Swap | 4141608 | 21 hrs ago | IN | 0 ETH | 0.00005498 | ||||
| Swap | 4141602 | 21 hrs ago | IN | 0 ETH | 0.00004362 | ||||
| Swap | 4141571 | 21 hrs ago | IN | 0 ETH | 0.00003924 | ||||
| Swap | 4141508 | 21 hrs ago | IN | 0 ETH | 0.00004082 | ||||
| Swap | 4141028 | 22 hrs ago | IN | 0.0018 ETH | 0.00003852 | ||||
| Swap | 4140936 | 22 hrs ago | IN | 0.07692308 ETH | 0.00003928 | ||||
| Swap | 4140917 | 22 hrs ago | IN | 0.07692308 ETH | 0.00003929 | ||||
| Swap | 4138195 | 27 hrs ago | IN | 0.07692308 ETH | 0.00003929 | ||||
| Swap | 4137616 | 28 hrs ago | IN | 0.07692308 ETH | 0.00003902 | ||||
| Swap | 4136997 | 29 hrs ago | IN | 0.001 ETH | 0.00011414 | ||||
| Swap | 4136990 | 29 hrs ago | IN | 0.00103051 ETH | 0.00002063 | ||||
| Swap | 4136975 | 29 hrs ago | IN | 0.00105114 ETH | 0.00002063 | ||||
| Swap | 4136821 | 30 hrs ago | IN | 0 ETH | 0.00001223 | ||||
| Swap | 4136817 | 30 hrs ago | IN | 0 ETH | 0.00000515 | ||||
| Burn Liquidity | 4136789 | 30 hrs ago | IN | 0 ETH | 0.00000768 | ||||
| Swap | 4136475 | 30 hrs ago | IN | 0.07692308 ETH | 0.00003901 | ||||
| Swap | 4135627 | 32 hrs ago | IN | 0 ETH | 0.00004054 | ||||
| Swap | 4130561 | 42 hrs ago | IN | 0.07692308 ETH | 0.00004258 | ||||
| Burn Liquidity | 4129952 | 43 hrs ago | IN | 0 ETH | 0.00000733 | ||||
| Swap | 4128877 | 45 hrs ago | IN | 0 ETH | 0.00004072 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 4144055 | 16 hrs ago | 0.07692308 ETH | ||||
| 4143367 | 17 hrs ago | 0.07692308 ETH | ||||
| 4141028 | 22 hrs ago | 0.0018 ETH | ||||
| 4140936 | 22 hrs ago | 0.07692308 ETH | ||||
| 4140917 | 22 hrs ago | 0.07692308 ETH | ||||
| 4138195 | 27 hrs ago | 0.07692308 ETH | ||||
| 4137616 | 28 hrs ago | 0.07692308 ETH | ||||
| 4136997 | 29 hrs ago | 0.001 ETH | ||||
| 4136990 | 29 hrs ago | 0.0011 ETH | ||||
| 4136975 | 29 hrs ago | 0.00118044 ETH | ||||
| 4136475 | 30 hrs ago | 0.07692308 ETH | ||||
| 4130561 | 42 hrs ago | 0.07692308 ETH | ||||
| 4128717 | 45 hrs ago | 0.07692308 ETH | ||||
| 4128704 | 45 hrs ago | 0.07692308 ETH | ||||
| 4128684 | 45 hrs ago | 0.07692308 ETH | ||||
| 4128301 | 46 hrs ago | 0.07692308 ETH | ||||
| 4127863 | 47 hrs ago | 0.07692308 ETH | ||||
| 4120252 | 2 days ago | 0.07692308 ETH | ||||
| 4117919 | 2 days ago | 0.07692308 ETH | ||||
| 4115435 | 2 days ago | 0.07692308 ETH | ||||
| 4115432 | 2 days ago | 0.07692308 ETH | ||||
| 4115413 | 2 days ago | 0.07692308 ETH | ||||
| 4115377 | 2 days ago | 0.07692308 ETH | ||||
| 4115226 | 2 days ago | 0.07692308 ETH | ||||
| 4115223 | 2 days ago | 0.07692308 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
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
Contract ABI
API[{"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
Loading...
Loading
Net Worth in USD
$2,103,218.92
Net Worth in ETH
Token Allocations
ETH
41.45%
USDC
30.06%
USDT
14.25%
Others
14.24%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| LINEA | 24.01% | $2,958.86 | 170.6442 | $504,911.34 | |
| LINEA | 17.63% | $0.999523 | 370,889.9413 | $370,713.03 | |
| LINEA | 9.90% | $0.998481 | 208,571.9256 | $208,255.1 | |
| LINEA | 3.83% | $3,624.34 | 22.2357 | $80,589.6 | |
| LINEA | 1.69% | $3,162.33 | 11.2498 | $35,575.53 | |
| LINEA | 1.30% | $0.995729 | 27,451.7798 | $27,334.53 | |
| LINEA | 0.99% | $0.000003 | 7,572,105,229.9638 | $20,823.29 | |
| LINEA | 0.81% | $89,170 | 0.1912 | $17,047.74 | |
| LINEA | 0.25% | $890.65 | 5.8729 | $5,230.66 | |
| LINEA | 0.14% | $0.998857 | 2,904.8039 | $2,901.48 | |
| LINEA | 0.09% | $0.000398 | 4,508,653.4117 | $1,793.59 | |
| LINEA | 0.08% | $0.127264 | 14,047.2296 | $1,787.71 | |
| LINEA | 0.04% | $12.1 | 71.6027 | $866.39 | |
| LINEA | 0.03% | $0.183824 | 3,847.6381 | $707.29 | |
| LINEA | 0.02% | $3,125.77 | 0.1642 | $513.23 | |
| LINEA | <0.01% | $0.000008 | 12,332,196.5874 | $96.93 | |
| LINEA | <0.01% | $1 | 89.712 | $89.8 | |
| LINEA | <0.01% | $0.000005 | 8,223,487.8933 | $37.01 | |
| LINEA | <0.01% | <$0.000001 | 98,034,789.539 | $30.71 | |
| LINEA | <0.01% | $0.000001 | 16,628,622.8056 | $11.56 | |
| LINEA | <0.01% | $0.044655 | 207.6066 | $9.27 | |
| LINEA | <0.01% | $3,315.79 | 0.00264336 | $8.76 | |
| LINEA | <0.01% | $0.000179 | 37,373.5542 | $6.68 | |
| LINEA | <0.01% | $0.012689 | 416.9507 | $5.29 | |
| LINEA | <0.01% | $0.026857 | 58.7632 | $1.58 | |
| SCROLL | 17.44% | $2,958.22 | 124.0236 | $366,888.83 | |
| SCROLL | 12.43% | $0.9997 | 261,590.0583 | $261,511.58 | |
| SCROLL | 4.34% | $0.998432 | 91,506.3734 | $91,362.9 | |
| SCROLL | 1.95% | $3,622.9 | 11.3243 | $41,026.62 | |
| SCROLL | 1.12% | $89,219.34 | 0.2635 | $23,508.43 | |
| SCROLL | 0.77% | $0.07545 | 214,478.6139 | $16,182.41 | |
| SCROLL | 0.65% | $3,419.49 | 3.9966 | $13,666.5 | |
| SCROLL | 0.43% | $0.998875 | 9,088.0656 | $9,077.84 | |
| SCROLL | 0.03% | $3,214.41 | 0.1913 | $615.06 | |
| SCROLL | <0.01% | $3,583.71 | 0.00254834 | $9.13 | |
| SCROLL | <0.01% | $0.000079 | 21,136.4997 | $1.67 | |
| SCROLL | <0.01% | $3,148.43 | 0.00044562 | $1.4 | |
| ETH | <0.01% | $2,958.22 | 0.0053524 | $15.83 | |
| BSC | <0.01% | $891.06 | 0.00272596 | $2.43 | |
| TAIKO | <0.01% | $0.998712 | 0.1655 | $0.1653 | |
| TAIKO | <0.01% | $2,958.86 | 0.0000054 | $0.015974 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.