More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x3deb270f636230c8cbf0982696983521182fc869a59e116829edb39d550510a3 | - | (pending) | 3 days ago | IN | 0 ETH | (Pending) | |||
0xee6768fcbf60bf3df708941dc43b53e3693653ad4224713d61a81358a9362c2c | - | (pending) | 3 days ago | IN | 0 ETH | (Pending) | |||
Swap | 9249398 | 1 min ago | IN | 0 ETH | 0.00001161 | ||||
Add Liquidity Wi... | 9249366 | 2 mins ago | IN | 0 ETH | 0.00001913 | ||||
Swap | 9249347 | 2 mins ago | IN | 0.001 ETH | 0.00001925 | ||||
Swap | 9249346 | 2 mins ago | IN | 0.00106 ETH | 0.00001788 | ||||
Swap | 9249333 | 3 mins ago | IN | 0.000003 ETH | 0.00001464 | ||||
Swap | 9249324 | 3 mins ago | IN | 0 ETH | 0.00001874 | ||||
Swap | 9249303 | 4 mins ago | IN | 0 ETH | 0.00003907 | ||||
Swap | 9249284 | 4 mins ago | IN | 0 ETH | 0.0000156 | ||||
Swap | 9249216 | 7 mins ago | IN | 0.0086 ETH | 0.00001698 | ||||
Swap | 9249180 | 8 mins ago | IN | 0.000507 ETH | 0.00002385 | ||||
Swap | 9249174 | 8 mins ago | IN | 0.00352617 ETH | 0.00001544 | ||||
Swap | 9249069 | 12 mins ago | IN | 0 ETH | 0.00001192 | ||||
Swap | 9249025 | 13 mins ago | IN | 0.0000011 ETH | 0.00001408 | ||||
Swap | 9248993 | 14 mins ago | IN | 0.001 ETH | 0.00002515 | ||||
Add Liquidity2 | 9248979 | 15 mins ago | IN | 0.00028949 ETH | 0.00001095 | ||||
Swap | 9248936 | 16 mins ago | IN | 0 ETH | 0.00001595 | ||||
Swap | 9248927 | 16 mins ago | IN | 0.01856945 ETH | 0.00001438 | ||||
Swap | 9248922 | 16 mins ago | IN | 0 ETH | 0.0000107 | ||||
Swap | 9248908 | 17 mins ago | IN | 0 ETH | 0.0000284 | ||||
Swap | 9248884 | 18 mins ago | IN | 0.099 ETH | 0.00002322 | ||||
Add Liquidity Wi... | 9248868 | 18 mins ago | IN | 0 ETH | 0.00002233 | ||||
Swap | 9248846 | 19 mins ago | IN | 0.015 ETH | 0.00001565 | ||||
Swap | 9248828 | 20 mins ago | IN | 0.015 ETH | 0.00004635 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
9249398 | 1 min ago | 0 ETH | ||||
9249398 | 1 min ago | 0 ETH | ||||
9249398 | 1 min ago | 0 ETH | ||||
9249366 | 2 mins ago | 0 ETH | ||||
9249366 | 2 mins ago | 0 ETH | ||||
9249366 | 2 mins ago | 0 ETH | ||||
9249366 | 2 mins ago | 0 ETH | ||||
9249347 | 2 mins ago | 0 ETH | ||||
9249347 | 2 mins ago | 0 ETH | ||||
9249347 | 2 mins ago | 0.001 ETH | ||||
9249346 | 2 mins ago | 0 ETH | ||||
9249346 | 2 mins ago | 0 ETH | ||||
9249346 | 2 mins ago | 0.00106 ETH | ||||
9249333 | 3 mins ago | 0 ETH | ||||
9249333 | 3 mins ago | 0 ETH | ||||
9249333 | 3 mins ago | 0.000003 ETH | ||||
9249324 | 3 mins ago | 0 ETH | ||||
9249324 | 3 mins ago | 0 ETH | ||||
9249303 | 4 mins ago | 0 ETH | ||||
9249303 | 4 mins ago | 0 ETH | ||||
9249303 | 4 mins ago | 0 ETH | ||||
9249303 | 4 mins ago | 0 ETH | ||||
9249303 | 4 mins ago | 0 ETH | ||||
9249303 | 4 mins ago | 0 ETH | ||||
9249303 | 4 mins ago | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
SyncSwapRouterV2
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 2000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later // ___ ___ ___ ___ ___ ___ // / /\ __ / /\ / /\ / /\ / /\ / /\ ___ // / /::\ | |\ / /::| / /::\ / /::\ / /:/_ / /::\ / /\ // /__/:/\:\ | |:| / /:|:| / /:/\:\ /__/:/\:\ / /:/ /\ / /:/\:\ / /::\ // _\_ \:\ \:\ | |:| / /:/|:|__ / /:/ \:\ _\_ \:\ \:\ / /:/ /:/_ / /::\ \:\ / /:/\:\ // /__/\ \:\ \:\ |__|:|__ /__/:/ |:| /\ /__/:/ \ \:\ /__/\ \:\ \:\ /__/:/ /:/ /\ /__/:/\:\_\:\ / /::\ \:\ // \ \:\ \:\_\/ / /::::\ \__\/ |:|/:/ \ \:\ \__\/ \ \:\ \:\_\/ \ \:\/:/ /:/ \__\/ \:\/:/ /__/:/\:\_\:\ // \ \:\_\:\ / /:/~~~~ | |:/:/ \ \:\ \ \:\_\:\ \ \::/ /:/ \__\::/ \__\/ \:\/:/ // \ \:\/:/ /__/:/ |__|::/ \ \:\ \ \:\/:/ \ \:\/:/ / /:/ \ \::/ // \ \::/ \__\/ /__/:/ \ \:\ \ \::/ \ \::/ /__/:/ \__\/ // \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ // // Welcome to the SyncSwap V2 Router! // pragma solidity ^0.8.0; interface IRouter { struct SwapStep { address pool; bytes data; address callback; bytes callbackData; bool useVault; } 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 vault. function vault() 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 ); } interface IVault { function wETH() external view returns (address); function reserves(address token) external view returns (uint reserve); function balanceOf(address token, address owner) external view returns (uint balance); function deposit(address token, address to) external payable returns (uint amount); function depositETH(address to) external payable returns (uint amount); function transferAndDeposit(address token, address to, uint amount) external payable returns (uint); function transfer(address token, address to, uint amount) external; function withdraw(address token, address to, uint amount) external; function withdrawAlternative(address token, address to, uint amount, uint8 mode) external; function withdrawETH(address to, uint amount) external; } 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 SyncSwapRouterV2 is IRouter, SelfPermit, Multicall, Rescuable { struct TokenInput { address token; uint amount; bool useVault; } address public immutable vault; 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 _vault, address _wETH) { vault = _vault; wETH = _wETH; } function enteredPoolsLength(address account) external view returns (uint) { return enteredPools[account].length; } function _transferFromSender(address token, address to, uint amount, bool useVault) private { if (useVault) { if (token == NATIVE_ETH) { // Deposit ETH to the vault. IVault(vault).deposit{value: amount}(token, to); } else { // Transfer tokens to the vault. TransferHelper.safeTransferFrom(token, msg.sender, vault, amount); // Notify the vault to deposit. IVault(vault).deposit(token, to); } } else { 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, input.useVault); 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, step.useVault); // 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 ); bool _useVault = step.useVault; // Cache the next step. unchecked { ++j; } step = path.steps[j]; if (!_useVault && step.useVault) { uint amount = IERC20(tokenAmount.token).balanceOf(address(this)); // Transfer tokens to the vault. TransferHelper.safeTransfer(tokenAmount.token, vault, amount); // Notify the vault to deposit. IVault(vault).deposit(tokenAmount.token, step.pool); } } } 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": 2000000, "details": { "yul": false } }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"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":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.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":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.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":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.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":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.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":"bool","name":"useVault","type":"bool"}],"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":"bool","name":"useVault","type":"bool"}],"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":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162004571380380620045718339810160408190526200003491620000e1565b6200003f3362000057565b6001600160a01b039182166080521660a05262000124565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b620000c581620000a7565b8114620000d157600080fd5b50565b8051620000b481620000ba565b60008060408385031215620000f957620000f9600080fd5b6000620001078585620000d4565b92505060206200011a85828601620000d4565b9150509250929050565b60805160a0516143f66200017b600039600081816104cc01528181612582015261263b01526000818161056601528181612076015281816120dc015281816124000152818161248901526124eb01526143f66000f3fe6080604052600436106101cd5760003560e01c8063a4a78f0c116100f7578063eb1432f011610095578063f44e537a11610064578063f44e537a14610521578063fb68908814610541578063fbfa77cf14610554578063fc31d54a1461058857600080fd5b8063eb1432f0146104a7578063f2428621146104ba578063f2fde38b146104ee578063f3995c671461050e57600080fd5b8063b2118a8d116100d1578063b2118a8d1461041e578063b956b3fb1461043e578063c2e3140a14610481578063d7570e451461049457600080fd5b8063a4a78f0c146103cb578063ac9650d8146103de578063ad271fa3146103fe57600080fd5b80636291027c1161016f5780637b2151e51161013e5780637b2151e51461035a5780637d10c9d61461036d5780638da5cb5b1461038d5780639dd41df2146103b857600080fd5b80636291027c146102ff578063688ee44c1461031f5780636cc781cd14610332578063715018a61461034557600080fd5b806339be5126116101ab57806339be5126146102575780634659a494146102775780634f25b8581461028a57806353c43f15146102d257600080fd5b8063099a04e5146101d25780632b4abadb146101f4578063353766c61461022a575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612960565b61059b565b005b34801561020057600080fd5b5061021461020f366004612960565b6105bc565b60405161022191906129ac565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612c28565b610601565b6040516102219190612dc7565b61026a610265366004612f76565b610720565b60405161022191906130a3565b6101f26102853660046130b1565b61090e565b34801561029657600080fd5b506102c56102a536600461313b565b600160209081526000928352604080842090915290825290205460ff1681565b6040516102219190613176565b3480156102de57600080fd5b506102f26102ed366004613184565b6109a9565b6040516102219190613237565b34801561030b57600080fd5b506101f261031a366004613245565b6109d6565b6101f261032d3660046132a9565b610a6d565b6101f26103403660046132a9565b610b1e565b34801561035157600080fd5b506101f2610bb3565b6102f26103683660046135a7565b610bc7565b34801561037957600080fd5b506102f261038836600461362f565b610ccc565b34801561039957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610214565b6102146103c636600461371f565b610d7f565b6101f26103d93660046130b1565b610e23565b6103f16103ec36600461377b565b610ef6565b60405161022191906138ab565b34801561040a57600080fd5b5061024a6104193660046138bc565b611066565b34801561042a57600080fd5b506101f26104393660046139a5565b6110ed565b34801561044a57600080fd5b5061026a6104593660046139f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b6101f261048f3660046130b1565b611277565b6102f26104a2366004613a16565b611322565b61026a6104b5366004613a65565b611384565b3480156104c657600080fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fa57600080fd5b506101f26105093660046139f5565b6113a3565b6101f261051c3660046130b1565b611404565b34801561052d57600080fd5b506101f261053c366004613245565b611462565b61026a61054f366004612f76565b6114c3565b34801561056057600080fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b61026a610596366004613a65565b6114e3565b6105a36115d7565b806000036105ae5750475b6105b88282611644565b5050565b600260205281600052604060002081815481106105d857600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b8051602082015160408084015190517f2c0198cc00000000000000000000000000000000000000000000000000000000815260609373ffffffffffffffffffffffffffffffffffffffff8f1693632c0198cc93610668933393309390929091600401613b50565b600060405180830381600087803b15801561068257600080fd5b505af1158015610696573d6000803e3d6000fd5b505050506107118b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a90506116ec565b9b9a5050505050505050505050565b81516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b828110156108175785818151811061077357610773613b97565b60200260200101519150816000015173ffffffffffffffffffffffffffffffffffffffff1663d505accf333085602001518660400151876060015188608001518960a001516040518863ffffffff1660e01b81526004016107da9796959493929190613bcf565b600060405180830381600087803b1580156107f457600080fd5b505af1158015610808573d6000803e3d6000fd5b50505050806001019050610759565b506108298e8e8e8e8e8e8e8e8e6118e3565b925073ffffffffffffffffffffffffffffffffffffffff8416156108fd5760006108558b8d018d61313b565b91505073ffffffffffffffffffffffffffffffffffffffff8116156108fb576040517f7acb775700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690637acb7757906108c89087908590600401613c2b565b600060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050505b505b50509b9a5050505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c9061096f90339030908a908a906001908b908b908b90600401613c46565b600060405180830381600087803b15801561098957600080fd5b505af115801561099d573d6000803e3d6000fd5b50505050505050505050565b60408051808201909152600080825260208201526109cb878787878787611a41565b979650505050505050565b6109e1848484611bc7565b6040517f7acb775700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690637acb775790610a359085908590600401613c2b565b600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b5050505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152849073ffffffffffffffffffffffffffffffffffffffff87169063dd62ed3e90610ac39033903090600401613cbd565b602060405180830381865afa158015610ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b049190613cd6565b1015610b1757610b178585858585610b1e565b5050505050565b6040517f2c0198cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632c0198cc90610b7a90339030908990899089908990600401613d38565b600060405180830381600087803b158015610b9457600080fd5b505af1158015610ba8573d6000803e3d6000fd5b505050505050505050565b610bbb6115d7565b610bc56000611c9b565b565b60408051808201909152600080825260208201528280421115610c16576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2360208401846139f5565b73ffffffffffffffffffffffffffffffffffffffff1663d505accf333060208701356040880135610c5a60808a0160608b01613d80565b89608001358a60a001356040518863ffffffff1660e01b8152600401610c869796959493929190613bcf565b600060405180830381600087803b158015610ca057600080fd5b505af1158015610cb4573d6000803e3d6000fd5b50505050610cc28686611d10565b9695505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8816632c0198cc333085356020870135610d126040890189613da1565b6040518763ffffffff1660e01b8152600401610d3396959493929190613d38565b600060405180830381600087803b158015610d4d57600080fd5b505af1158015610d61573d6000803e3d6000fd5b50505050610d73888888888888611a41565b98975050505050505050565b6040517f13b8683f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906313b8683f90610dd69086908690600401613e1e565b6020604051808303816000875af1158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e199190613e3b565b90505b9392505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90610e999033903090600401613cbd565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613cd6565b1015610eee57610eee86868686868661090e565b505050505050565b60608167ffffffffffffffff811115610f1157610f11612a57565b604051908082528060200260200182016040528015610f4457816020015b6060815260200190600190039081610f2f5790505b50905060005b8281101561105f5760008030868685818110610f6857610f68613b97565b9050602002810190610f7a9190613da1565b604051610f88929190613e6f565b600060405180830381855af49150503d8060008114610fc3576040519150601f19603f3d011682016040523d82523d6000602084013e610fc8565b606091505b50915091508161103757604481511015610fe157600080fd5b60048101905080806020019051810190610ffb9190613ed4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e9190613f0f565b60405180910390fd5b8084848151811061104a5761104a613b97565b60209081029190910101525050600101610f4a565b5092915050565b60606110df8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a91508990506116ec565b9a9950505050505050505050565b6110f56115d7565b73ffffffffffffffffffffffffffffffffffffffff82161580159061114657508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90613f57565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906370a08231906111d19030906004016129ac565b602060405180830381865afa1580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112129190613cd6565b90508160000361122c576112278484836121ae565b611271565b80821115611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90613f9b565b6112718484846121ae565b50505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e906112cd9033903090600401613cbd565b602060405180830381865afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190613cd6565b1015610eee57610eee868686868686611404565b60408051808201909152600080825260208201528180421115611371576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61137b8585611d10565b95945050505050565b60006113988b8b8b8b8b8b8b8b8b8b6114e3565b90506110df8b6122d5565b6113ab6115d7565b73ffffffffffffffffffffffffffffffffffffffff81166113f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90613fab565b61140181611c9b565b50565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9061096f90339030908a908a908a908a908a90600401613bcf565b61146d848484611bc7565b6040517f294091cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063294091cd90610a359086908690869060040161400c565b60006114d88c8c8c8c8c8c8c8c8c8c8c610720565b90506107118c6122d5565b60006114f68b8b8b8b8b8b8b8b8b6118e3565b905073ffffffffffffffffffffffffffffffffffffffff8216156110df576000611522888a018a61313b565b91505073ffffffffffffffffffffffffffffffffffffffff8116156115c8576040517f7acb775700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690637acb7757906115959085908590600401613c2b565b600060405180830381600087803b1580156115af57600080fd5b505af11580156115c3573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b336115f760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90614066565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161166a90614076565b60006040518083038185875af1925050503d80600081146116a7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ac565b606091505b50509050806116e7576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff8916906323b872dd906117459033908c908c9060040161407e565b6020604051808303816000875af1158015611764573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178891906140b1565b506040517ff66eab5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063f66eab5b906117e390899033908990899089906004016140d2565b6000604051808303816000875af1158015611802573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261184891908101906141d3565b805190915060005b818110156118d657600083828151811061186c5761186c613b97565b6020026020010151905087828151811061188857611888613b97565b6020026020010151816020015110156118cd576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611850565b5050979650505050505050565b60408051606081018252600080825260208201819052918101829052889060005b82811015611956578b8b8281811061191e5761191e613b97565b9050606002018036038101906119349190614260565b915061194e82600001518e846020015185604001516123a2565b600101611904565b506040517f03e7286a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16906303e7286a906119b3908c908c9033908c908c908c90600401614281565b6020604051808303816000875af11580156119d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f69190613cd6565b925086831015611a32576040517f249942be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509998505050505050505050565b6040805180820182526000808252602082015290517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906323b872dd90611aa99033908b908b9060040161407e565b6020604051808303816000875af1158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec91906140b1565b506040517f27b0bcea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906327b0bcea90611b459088903390889088906004016142c2565b60408051808303816000875af1158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b879190614301565b90508381602001511015610cc2576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bd3823330846126c0565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611c299030908890600401613cbd565b602060405180830381865afa158015611c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6a9190613cd6565b10156116e7576116e782847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6127e9565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082019091526000808252602082015282516040805160608082018352815260006020820181905291810191909152611da36040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016000151581525090565b604080518082019091526000808252602082015260005b8481101561216557878181518110611dd457611dd4613b97565b602002602001015193508360000151600081518110611df557611df5613b97565b60200260200101519250611e1b84602001518460000151866040015186608001516123a2565b83515160005b611e2c600183614351565b8103611f0057846000015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611e8194939291906142c2565b60408051808303816000875af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190614301565b805173ffffffffffffffffffffffffffffffffffffffff168952602080820151908a0180519296509091611ef8908390614364565b90525061215b565b846000015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611f4f94939291906142c2565b60408051808303816000875af1158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190614301565b608086015187518051929650600190930192909183908110611fb557611fb5613b97565b6020026020010151955080158015611fce575085608001515b156121555784516040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a08231906120299030906004016129ac565b602060405180830381865afa158015612046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206a9190613cd6565b905061209b86600001517f0000000000000000000000000000000000000000000000000000000000000000836121ae565b855187516040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263f9609f089261210f92600401613cbd565b6020604051808303816000875af115801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190613cd6565b50505b50611e21565b5050600101611dba565b5085856020015110156121a4576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505092915050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016121e0929190614377565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161222e91906143b4565b6000604051808303816000865af19150503d806000811461226b576040519150601f19603f3d011682016040523d82523d6000602084013e612270565b606091505b509150915081158061229e575080511580159061229e57508080602001905181019061229c91906140b1565b155b15610b17576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff166114015773ffffffffffffffffffffffffffffffffffffffff166000818152600160208181526040808420338552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841790556002825283208054928301815583529091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b80156125655773ffffffffffffffffffffffffffffffffffffffff8416612482576040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f9609f089084906124399088908890600401613cbd565b60206040518083038185885af1158015612457573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061247c9190613cd6565b50611271565b6124ae84337f0000000000000000000000000000000000000000000000000000000000000000856126c0565b6040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f9609f08906125229087908790600401613cbd565b6020604051808303816000875af1158015612541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190613cd6565b73ffffffffffffffffffffffffffffffffffffffff84166126b8577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125e857600080fd5b505af11580156125fc573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250612675915086908690600401614377565b6020604051808303816000875af1158015612694573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c91906140b1565b611271843385855b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016126f49392919061407e565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161274291906143b4565b6000604051808303816000865af19150503d806000811461277f576040519150601f19603f3d011682016040523d82523d6000602084013e612784565b606091505b50915091508115806127b257508051158015906127b25750808060200190518101906127b091906140b1565b155b15610eee576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3858560405160240161281b929190614377565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161286991906143b4565b6000604051808303816000865af19150503d80600081146128a6576040519150601f19603f3d011682016040523d82523d6000602084013e6128ab565b606091505b50915091508115806128d957508051158015906128d95750808060200190518101906128d791906140b1565b155b15610b17576040517f3e3f8f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82165b92915050565b61293981612910565b811461140157600080fd5b803561292a81612930565b80612939565b803561292a8161294f565b6000806040838503121561297657612976600080fd5b60006129828585612944565b925050602061299385828601612955565b9150509250929050565b6129a681612910565b82525050565b6020810161292a828461299d565b60008083601f8401126129cf576129cf600080fd5b50813567ffffffffffffffff8111156129ea576129ea600080fd5b602083019150836001820283011115612a0557612a05600080fd5b9250929050565b60008083601f840112612a2157612a21600080fd5b50813567ffffffffffffffff811115612a3c57612a3c600080fd5b602083019150836020820283011115612a0557612a05600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715612aca57612aca612a57565b6040525050565b6000612adc60405190565b9050612ae88282612a86565b919050565b600067ffffffffffffffff821115612b0757612b07612a57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011660200192915050565b82818337506000910152565b6000612b55612b5084612aed565b612ad1565b905082815260208101848484011115612b7057612b70600080fd5b612b7b848285612b36565b509392505050565b600082601f830112612b9757612b97600080fd5b8135612ba7848260208601612b42565b949350505050565b600060608284031215612bc457612bc4600080fd5b612bce6060612ad1565b90506000612bdc8484612955565b8252506020612bed84848301612955565b602083015250604082013567ffffffffffffffff811115612c1057612c10600080fd5b612c1c84828501612b83565b60408301525092915050565b60008060008060008060008060008060e08b8d031215612c4a57612c4a600080fd5b6000612c568d8d612944565b9a50506020612c678d828e01612955565b99505060408b013567ffffffffffffffff811115612c8757612c87600080fd5b612c938d828e016129ba565b985098505060608b013567ffffffffffffffff811115612cb557612cb5600080fd5b612cc18d828e01612a0c565b96509650506080612cd48d828e01612944565b94505060a08b013567ffffffffffffffff811115612cf457612cf4600080fd5b612d008d828e016129ba565b935093505060c08b013567ffffffffffffffff811115612d2257612d22600080fd5b612d2e8d828e01612baf565b9150509295989b9194979a5092959850565b806129a6565b80516040830190612d57848261299d565b5060208201516112716020850182612d40565b6000612d768383612d46565b505060400190565b6000612d88825190565b80845260209384019383018060005b83811015612dbc578151612dab8882612d6a565b975060208301925050600101612d97565b509495945050505050565b60208082528101610e1c8184612d7e565b60008083601f840112612ded57612ded600080fd5b50813567ffffffffffffffff811115612e0857612e08600080fd5b602083019150836060820283011115612a0557612a05600080fd5b600067ffffffffffffffff821115612e3d57612e3d612a57565b5060209081020190565b60ff8116612939565b803561292a81612e47565b600060c08284031215612e7057612e70600080fd5b612e7a60c0612ad1565b90506000612e888484612944565b8252506020612e9984848301612955565b6020830152506040612ead84828501612955565b6040830152506060612ec184828501612e50565b6060830152506080612ed584828501612955565b60808301525060a0612ee984828501612955565b60a08301525092915050565b6000612f03612b5084612e23565b83815290506020810160c08402830185811115612f2257612f22600080fd5b835b81811015612f485780612f378882612e5b565b84525060209092019160c001612f24565b5050509392505050565b600082601f830112612f6657612f66600080fd5b8135612ba7848260208601612ef5565b60008060008060008060008060008060006101008c8e031215612f9b57612f9b600080fd5b6000612fa78e8e612944565b9b505060208c013567ffffffffffffffff811115612fc757612fc7600080fd5b612fd38e828f01612dd8565b9a509a505060408c013567ffffffffffffffff811115612ff557612ff5600080fd5b6130018e828f016129ba565b985098505060606130148e828f01612955565b96505060806130258e828f01612944565b95505060a08c013567ffffffffffffffff81111561304557613045600080fd5b6130518e828f016129ba565b945094505060c08c013567ffffffffffffffff81111561307357613073600080fd5b61307f8e828f01612f52565b92505060e06130908e828f01612944565b9150509295989b509295989b9093969950565b6020810161292a8284612d40565b60008060008060008060c087890312156130cd576130cd600080fd5b60006130d98989612944565b96505060206130ea89828a01612955565b95505060406130fb89828a01612955565b945050606061310c89828a01612e50565b935050608061311d89828a01612955565b92505060a061312e89828a01612955565b9150509295509295509295565b6000806040838503121561315157613151600080fd5b600061315d8585612944565b925050602061299385828601612944565b8015156129a6565b6020810161292a828461316e565b60008060008060008060c087890312156131a0576131a0600080fd5b60006131ac8989612944565b96505060206131bd89828a01612955565b955050604087013567ffffffffffffffff8111156131dd576131dd600080fd5b6131e989828a01612b83565b94505060606131fa89828a01612955565b935050608061320b89828a01612944565b92505060a087013567ffffffffffffffff81111561322b5761322b600080fd5b61312e89828a01612b83565b6040810161292a8284612d46565b6000806000806080858703121561325e5761325e600080fd5b600061326a8787612944565b945050602061327b87828801612944565b935050604061328c87828801612955565b925050606061329d87828801612944565b91505092959194509250565b6000806000806000608086880312156132c4576132c4600080fd5b60006132d08888612944565b95505060206132e188828901612955565b94505060406132f288828901612955565b935050606086013567ffffffffffffffff81111561331257613312600080fd5b61331e888289016129ba565b92509250509295509295909350565b801515612939565b803561292a8161332d565b600060a0828403121561335557613355600080fd5b61335f60a0612ad1565b9050600061336d8484612944565b825250602082013567ffffffffffffffff81111561338d5761338d600080fd5b61339984828501612b83565b60208301525060406133ad84828501612944565b604083015250606082013567ffffffffffffffff8111156133d0576133d0600080fd5b6133dc84828501612b83565b60608301525060806133f084828501613335565b60808301525092915050565b600061340a612b5084612e23565b8381529050602080820190840283018581111561342957613429600080fd5b835b81811015612f4857803567ffffffffffffffff81111561344d5761344d600080fd5b80860161345a8982613340565b855250506020928301920161342b565b600082601f83011261347e5761347e600080fd5b8135612ba78482602086016133fc565b6000606082840312156134a3576134a3600080fd5b6134ad6060612ad1565b9050813567ffffffffffffffff8111156134c9576134c9600080fd5b6134d58482850161346a565b82525060206134e684848301612944565b6020830152506040612c1c84828501612955565b6000613508612b5084612e23565b8381529050602080820190840283018581111561352757613527600080fd5b835b81811015612f4857803567ffffffffffffffff81111561354b5761354b600080fd5b808601613558898261348e565b8552505060209283019201613529565b600082601f83011261357c5761357c600080fd5b8135612ba78482602086016134fa565b600060c082840312156135a1576135a1600080fd5b50919050565b60008060008061012085870312156135c1576135c1600080fd5b843567ffffffffffffffff8111156135db576135db600080fd5b6135e787828801613568565b94505060206135f887828801612955565b935050604061360987828801612955565b925050606061329d8782880161358c565b6000606082840312156135a1576135a1600080fd5b600080600080600080600060e0888a03121561364d5761364d600080fd5b60006136598a8a612944565b975050602061366a8a828b01612955565b965050604088013567ffffffffffffffff81111561368a5761368a600080fd5b6136968a828b01612b83565b95505060606136a78a828b01612955565b94505060806136b88a828b01612944565b93505060a088013567ffffffffffffffff8111156136d8576136d8600080fd5b6136e48a828b01612b83565b92505060c088013567ffffffffffffffff81111561370457613704600080fd5b6137108a828b0161361a565b91505092959891949750929550565b60008060006040848603121561373757613737600080fd5b60006137438686612944565b935050602084013567ffffffffffffffff81111561376357613763600080fd5b61376f868287016129ba565b92509250509250925092565b6000806020838503121561379157613791600080fd5b823567ffffffffffffffff8111156137ab576137ab600080fd5b6137b785828601612a0c565b92509250509250929050565b60005b838110156137de5781810151838201526020016137c6565b50506000910152565b60006137f1825190565b8084526020840193506138088185602086016137c3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8201165b9093019392505050565b6000610e1c83836137e7565b600061384f825190565b808452602084019350836020820285016138698560200190565b8060005b8581101561389e57848403895281516138868582613839565b94506020830160209a909a019992505060010161386d565b5091979650505050505050565b60208082528101610e1c8184613845565b600080600080600080600080600060c08a8c0312156138dd576138dd600080fd5b60006138e98c8c612944565b99505060206138fa8c828d01612955565b98505060408a013567ffffffffffffffff81111561391a5761391a600080fd5b6139268c828d016129ba565b975097505060608a013567ffffffffffffffff81111561394857613948600080fd5b6139548c828d01612a0c565b955095505060806139678c828d01612944565b93505060a08a013567ffffffffffffffff81111561398757613987600080fd5b6139938c828d016129ba565b92509250509295985092959850929598565b6000806000606084860312156139bd576139bd600080fd5b60006139c98686612944565b93505060206139da86828701612944565b92505060406139eb86828701612955565b9150509250925092565b600060208284031215613a0a57613a0a600080fd5b6000612ba78484612944565b600080600060608486031215613a2e57613a2e600080fd5b833567ffffffffffffffff811115613a4857613a48600080fd5b613a5486828701613568565b93505060206139da86828701612955565b60008060008060008060008060008060e08b8d031215613a8757613a87600080fd5b6000613a938d8d612944565b9a505060208b013567ffffffffffffffff811115613ab357613ab3600080fd5b613abf8d828e01612dd8565b995099505060408b013567ffffffffffffffff811115613ae157613ae1600080fd5b613aed8d828e016129ba565b97509750506060613b008d828e01612955565b9550506080613b118d828e01612944565b94505060a08b013567ffffffffffffffff811115613b3157613b31600080fd5b613b3d8d828e016129ba565b935093505060c0612d2e8d828e01612944565b60a08101613b5e828861299d565b613b6b602083018761299d565b613b786040830186612d40565b613b856060830185612d40565b81810360808301526109cb81846137e7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60ff81166129a6565b60e08101613bdd828a61299d565b613bea602083018961299d565b613bf76040830188612d40565b613c046060830187612d40565b613c116080830186613bc6565b613c1e60a0830185612d40565b610d7360c0830184612d40565b60408101613c398285612d40565b610e1c602083018461299d565b6101008101613c55828b61299d565b613c62602083018a61299d565b613c6f6040830189612d40565b613c7c6060830188612d40565b613c89608083018761316e565b613c9660a0830186613bc6565b613ca360c0830185612d40565b613cb060e0830184612d40565b9998505050505050505050565b60408101613c39828561299d565b805161292a8161294f565b600060208284031215613ceb57613ceb600080fd5b6000612ba78484613ccb565b8183526000602084019350613d0d838584612b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011661382f565b60a08101613d46828961299d565b613d53602083018861299d565b613d606040830187612d40565b613d6d6060830186612d40565b8181036080830152610d73818486613cf7565b600060208284031215613d9557613d95600080fd5b6000612ba78484612e50565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136859003018112613dda57613dda600080fd5b80840192508235915067ffffffffffffffff821115613dfb57613dfb600080fd5b602083019250600182023603831315613e1657613e16600080fd5b509250929050565b60208082528101610e19818486613cf7565b805161292a81612930565b600060208284031215613e5057613e50600080fd5b6000612ba78484613e30565b6000613e69838584612b36565b50500190565b6000612ba7828486613e5c565b6000613e8a612b5084612aed565b905082815260208101848484011115613ea557613ea5600080fd5b612b7b8482856137c3565b600082601f830112613ec457613ec4600080fd5b8151612ba7848260208601613e7c565b600060208284031215613ee957613ee9600080fd5b815167ffffffffffffffff811115613f0357613f03600080fd5b612ba784828501613eb0565b60208082528101610e1c81846137e7565b600a81526000602082017f496e76616c696420746f00000000000000000000000000000000000000000000815291505b5060200190565b6020808252810161292a81613f20565b600f81526000602082017f457863656564732062616c616e6365000000000000000000000000000000000081529150613f50565b6020808252810161292a81613f67565b6020808252810161292a81602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201527f6464726573730000000000000000000000000000000000000000000000000000604082015260600190565b6060810161401a828661299d565b6140276020830185612d40565b612ba7604083018461299d565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657291019081526000613f50565b6020808252810161292a81614034565b60008161292a565b6060810161408c828661299d565b614099602083018561299d565b612ba76040830184612d40565b805161292a8161332d565b6000602082840312156140c6576140c6600080fd5b6000612ba784846140a6565b608080825281016140e381886137e7565b90506140f2602083018761299d565b6140ff604083018661299d565b81810360608301526109cb818486613cf7565b60006040828403121561412757614127600080fd5b6141316040612ad1565b9050600061413f8484613e30565b825250602061415084848301613ccb565b60208301525092915050565b600061416a612b5084612e23565b8381529050602081016040840283018581111561418957614189600080fd5b835b81811015612f48578061419e8882614112565b84525060209092019160400161418b565b600082601f8301126141c3576141c3600080fd5b8151612ba784826020860161415c565b6000602082840312156141e8576141e8600080fd5b815167ffffffffffffffff81111561420257614202600080fd5b612ba7848285016141af565b60006060828403121561422357614223600080fd5b61422d6060612ad1565b9050600061423b8484612944565b825250602061424c84848301612955565b6020830152506040612c1c84828501613335565b60006060828403121561427557614275600080fd5b6000612ba7848461420e565b6080808252810161429381888a613cf7565b90506142a2602083018761299d565b6142af604083018661299d565b8181036060830152610d73818486613cf7565b608080825281016142d381876137e7565b90506142e2602083018661299d565b6142ef604083018561299d565b8181036060830152610cc281846137e7565b60006040828403121561431657614316600080fd5b6000612ba78484614112565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561292a5761292a614322565b8082018082111561292a5761292a614322565b60408101614385828561299d565b610e1c6020830184612d40565b600061439c825190565b6143aa8185602086016137c3565b9290920192915050565b6000610e1c828461439256fea2646970667358221220abda186ba79348904a82e9803641cea5a3717c462409cc365c71c62362c8071f64736f6c634300081700330000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c8063a4a78f0c116100f7578063eb1432f011610095578063f44e537a11610064578063f44e537a14610521578063fb68908814610541578063fbfa77cf14610554578063fc31d54a1461058857600080fd5b8063eb1432f0146104a7578063f2428621146104ba578063f2fde38b146104ee578063f3995c671461050e57600080fd5b8063b2118a8d116100d1578063b2118a8d1461041e578063b956b3fb1461043e578063c2e3140a14610481578063d7570e451461049457600080fd5b8063a4a78f0c146103cb578063ac9650d8146103de578063ad271fa3146103fe57600080fd5b80636291027c1161016f5780637b2151e51161013e5780637b2151e51461035a5780637d10c9d61461036d5780638da5cb5b1461038d5780639dd41df2146103b857600080fd5b80636291027c146102ff578063688ee44c1461031f5780636cc781cd14610332578063715018a61461034557600080fd5b806339be5126116101ab57806339be5126146102575780634659a494146102775780634f25b8581461028a57806353c43f15146102d257600080fd5b8063099a04e5146101d25780632b4abadb146101f4578063353766c61461022a575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612960565b61059b565b005b34801561020057600080fd5b5061021461020f366004612960565b6105bc565b60405161022191906129ac565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612c28565b610601565b6040516102219190612dc7565b61026a610265366004612f76565b610720565b60405161022191906130a3565b6101f26102853660046130b1565b61090e565b34801561029657600080fd5b506102c56102a536600461313b565b600160209081526000928352604080842090915290825290205460ff1681565b6040516102219190613176565b3480156102de57600080fd5b506102f26102ed366004613184565b6109a9565b6040516102219190613237565b34801561030b57600080fd5b506101f261031a366004613245565b6109d6565b6101f261032d3660046132a9565b610a6d565b6101f26103403660046132a9565b610b1e565b34801561035157600080fd5b506101f2610bb3565b6102f26103683660046135a7565b610bc7565b34801561037957600080fd5b506102f261038836600461362f565b610ccc565b34801561039957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610214565b6102146103c636600461371f565b610d7f565b6101f26103d93660046130b1565b610e23565b6103f16103ec36600461377b565b610ef6565b60405161022191906138ab565b34801561040a57600080fd5b5061024a6104193660046138bc565b611066565b34801561042a57600080fd5b506101f26104393660046139a5565b6110ed565b34801561044a57600080fd5b5061026a6104593660046139f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b6101f261048f3660046130b1565b611277565b6102f26104a2366004613a16565b611322565b61026a6104b5366004613a65565b611384565b3480156104c657600080fd5b506102147f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f81565b3480156104fa57600080fd5b506101f26105093660046139f5565b6113a3565b6101f261051c3660046130b1565b611404565b34801561052d57600080fd5b506101f261053c366004613245565b611462565b61026a61054f366004612f76565b6114c3565b34801561056057600080fd5b506102147f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b81565b61026a610596366004613a65565b6114e3565b6105a36115d7565b806000036105ae5750475b6105b88282611644565b5050565b600260205281600052604060002081815481106105d857600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b8051602082015160408084015190517f2c0198cc00000000000000000000000000000000000000000000000000000000815260609373ffffffffffffffffffffffffffffffffffffffff8f1693632c0198cc93610668933393309390929091600401613b50565b600060405180830381600087803b15801561068257600080fd5b505af1158015610696573d6000803e3d6000fd5b505050506107118b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a90506116ec565b9b9a5050505050505050505050565b81516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b828110156108175785818151811061077357610773613b97565b60200260200101519150816000015173ffffffffffffffffffffffffffffffffffffffff1663d505accf333085602001518660400151876060015188608001518960a001516040518863ffffffff1660e01b81526004016107da9796959493929190613bcf565b600060405180830381600087803b1580156107f457600080fd5b505af1158015610808573d6000803e3d6000fd5b50505050806001019050610759565b506108298e8e8e8e8e8e8e8e8e6118e3565b925073ffffffffffffffffffffffffffffffffffffffff8416156108fd5760006108558b8d018d61313b565b91505073ffffffffffffffffffffffffffffffffffffffff8116156108fb576040517f7acb775700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690637acb7757906108c89087908590600401613c2b565b600060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050505b505b50509b9a5050505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c9061096f90339030908a908a906001908b908b908b90600401613c46565b600060405180830381600087803b15801561098957600080fd5b505af115801561099d573d6000803e3d6000fd5b50505050505050505050565b60408051808201909152600080825260208201526109cb878787878787611a41565b979650505050505050565b6109e1848484611bc7565b6040517f7acb775700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690637acb775790610a359085908590600401613c2b565b600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b5050505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152849073ffffffffffffffffffffffffffffffffffffffff87169063dd62ed3e90610ac39033903090600401613cbd565b602060405180830381865afa158015610ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b049190613cd6565b1015610b1757610b178585858585610b1e565b5050505050565b6040517f2c0198cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632c0198cc90610b7a90339030908990899089908990600401613d38565b600060405180830381600087803b158015610b9457600080fd5b505af1158015610ba8573d6000803e3d6000fd5b505050505050505050565b610bbb6115d7565b610bc56000611c9b565b565b60408051808201909152600080825260208201528280421115610c16576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2360208401846139f5565b73ffffffffffffffffffffffffffffffffffffffff1663d505accf333060208701356040880135610c5a60808a0160608b01613d80565b89608001358a60a001356040518863ffffffff1660e01b8152600401610c869796959493929190613bcf565b600060405180830381600087803b158015610ca057600080fd5b505af1158015610cb4573d6000803e3d6000fd5b50505050610cc28686611d10565b9695505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8816632c0198cc333085356020870135610d126040890189613da1565b6040518763ffffffff1660e01b8152600401610d3396959493929190613d38565b600060405180830381600087803b158015610d4d57600080fd5b505af1158015610d61573d6000803e3d6000fd5b50505050610d73888888888888611a41565b98975050505050505050565b6040517f13b8683f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906313b8683f90610dd69086908690600401613e1e565b6020604051808303816000875af1158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e199190613e3b565b90505b9392505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90610e999033903090600401613cbd565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613cd6565b1015610eee57610eee86868686868661090e565b505050505050565b60608167ffffffffffffffff811115610f1157610f11612a57565b604051908082528060200260200182016040528015610f4457816020015b6060815260200190600190039081610f2f5790505b50905060005b8281101561105f5760008030868685818110610f6857610f68613b97565b9050602002810190610f7a9190613da1565b604051610f88929190613e6f565b600060405180830381855af49150503d8060008114610fc3576040519150601f19603f3d011682016040523d82523d6000602084013e610fc8565b606091505b50915091508161103757604481511015610fe157600080fd5b60048101905080806020019051810190610ffb9190613ed4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e9190613f0f565b60405180910390fd5b8084848151811061104a5761104a613b97565b60209081029190910101525050600101610f4a565b5092915050565b60606110df8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a91508990506116ec565b9a9950505050505050505050565b6110f56115d7565b73ffffffffffffffffffffffffffffffffffffffff82161580159061114657508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90613f57565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906370a08231906111d19030906004016129ac565b602060405180830381865afa1580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112129190613cd6565b90508160000361122c576112278484836121ae565b611271565b80821115611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90613f9b565b6112718484846121ae565b50505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e906112cd9033903090600401613cbd565b602060405180830381865afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190613cd6565b1015610eee57610eee868686868686611404565b60408051808201909152600080825260208201528180421115611371576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61137b8585611d10565b95945050505050565b60006113988b8b8b8b8b8b8b8b8b8b6114e3565b90506110df8b6122d5565b6113ab6115d7565b73ffffffffffffffffffffffffffffffffffffffff81166113f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90613fab565b61140181611c9b565b50565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9061096f90339030908a908a908a908a908a90600401613bcf565b61146d848484611bc7565b6040517f294091cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063294091cd90610a359086908690869060040161400c565b60006114d88c8c8c8c8c8c8c8c8c8c8c610720565b90506107118c6122d5565b60006114f68b8b8b8b8b8b8b8b8b6118e3565b905073ffffffffffffffffffffffffffffffffffffffff8216156110df576000611522888a018a61313b565b91505073ffffffffffffffffffffffffffffffffffffffff8116156115c8576040517f7acb775700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690637acb7757906115959085908590600401613c2b565b600060405180830381600087803b1580156115af57600080fd5b505af11580156115c3573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b336115f760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90614066565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161166a90614076565b60006040518083038185875af1925050503d80600081146116a7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ac565b606091505b50509050806116e7576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff8916906323b872dd906117459033908c908c9060040161407e565b6020604051808303816000875af1158015611764573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178891906140b1565b506040517ff66eab5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063f66eab5b906117e390899033908990899089906004016140d2565b6000604051808303816000875af1158015611802573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261184891908101906141d3565b805190915060005b818110156118d657600083828151811061186c5761186c613b97565b6020026020010151905087828151811061188857611888613b97565b6020026020010151816020015110156118cd576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611850565b5050979650505050505050565b60408051606081018252600080825260208201819052918101829052889060005b82811015611956578b8b8281811061191e5761191e613b97565b9050606002018036038101906119349190614260565b915061194e82600001518e846020015185604001516123a2565b600101611904565b506040517f03e7286a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16906303e7286a906119b3908c908c9033908c908c908c90600401614281565b6020604051808303816000875af11580156119d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f69190613cd6565b925086831015611a32576040517f249942be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509998505050505050505050565b6040805180820182526000808252602082015290517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906323b872dd90611aa99033908b908b9060040161407e565b6020604051808303816000875af1158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec91906140b1565b506040517f27b0bcea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906327b0bcea90611b459088903390889088906004016142c2565b60408051808303816000875af1158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b879190614301565b90508381602001511015610cc2576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bd3823330846126c0565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611c299030908890600401613cbd565b602060405180830381865afa158015611c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6a9190613cd6565b10156116e7576116e782847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6127e9565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082019091526000808252602082015282516040805160608082018352815260006020820181905291810191909152611da36040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016000151581525090565b604080518082019091526000808252602082015260005b8481101561216557878181518110611dd457611dd4613b97565b602002602001015193508360000151600081518110611df557611df5613b97565b60200260200101519250611e1b84602001518460000151866040015186608001516123a2565b83515160005b611e2c600183614351565b8103611f0057846000015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611e8194939291906142c2565b60408051808303816000875af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190614301565b805173ffffffffffffffffffffffffffffffffffffffff168952602080820151908a0180519296509091611ef8908390614364565b90525061215b565b846000015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611f4f94939291906142c2565b60408051808303816000875af1158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190614301565b608086015187518051929650600190930192909183908110611fb557611fb5613b97565b6020026020010151955080158015611fce575085608001515b156121555784516040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a08231906120299030906004016129ac565b602060405180830381865afa158015612046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206a9190613cd6565b905061209b86600001517f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b836121ae565b855187516040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169263f9609f089261210f92600401613cbd565b6020604051808303816000875af115801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190613cd6565b50505b50611e21565b5050600101611dba565b5085856020015110156121a4576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505092915050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016121e0929190614377565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161222e91906143b4565b6000604051808303816000865af19150503d806000811461226b576040519150601f19603f3d011682016040523d82523d6000602084013e612270565b606091505b509150915081158061229e575080511580159061229e57508080602001905181019061229c91906140b1565b155b15610b17576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff166114015773ffffffffffffffffffffffffffffffffffffffff166000818152600160208181526040808420338552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841790556002825283208054928301815583529091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b80156125655773ffffffffffffffffffffffffffffffffffffffff8416612482576040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169063f9609f089084906124399088908890600401613cbd565b60206040518083038185885af1158015612457573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061247c9190613cd6565b50611271565b6124ae84337f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b856126c0565b6040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169063f9609f08906125229087908790600401613cbd565b6020604051808303816000875af1158015612541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190613cd6565b73ffffffffffffffffffffffffffffffffffffffff84166126b8577f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125e857600080fd5b505af11580156125fc573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16935063a9059cbb9250612675915086908690600401614377565b6020604051808303816000875af1158015612694573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c91906140b1565b611271843385855b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016126f49392919061407e565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161274291906143b4565b6000604051808303816000865af19150503d806000811461277f576040519150601f19603f3d011682016040523d82523d6000602084013e612784565b606091505b50915091508115806127b257508051158015906127b25750808060200190518101906127b091906140b1565b155b15610eee576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3858560405160240161281b929190614377565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161286991906143b4565b6000604051808303816000865af19150503d80600081146128a6576040519150601f19603f3d011682016040523d82523d6000602084013e6128ab565b606091505b50915091508115806128d957508051158015906128d95750808060200190518101906128d791906140b1565b155b15610b17576040517f3e3f8f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82165b92915050565b61293981612910565b811461140157600080fd5b803561292a81612930565b80612939565b803561292a8161294f565b6000806040838503121561297657612976600080fd5b60006129828585612944565b925050602061299385828601612955565b9150509250929050565b6129a681612910565b82525050565b6020810161292a828461299d565b60008083601f8401126129cf576129cf600080fd5b50813567ffffffffffffffff8111156129ea576129ea600080fd5b602083019150836001820283011115612a0557612a05600080fd5b9250929050565b60008083601f840112612a2157612a21600080fd5b50813567ffffffffffffffff811115612a3c57612a3c600080fd5b602083019150836020820283011115612a0557612a05600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715612aca57612aca612a57565b6040525050565b6000612adc60405190565b9050612ae88282612a86565b919050565b600067ffffffffffffffff821115612b0757612b07612a57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011660200192915050565b82818337506000910152565b6000612b55612b5084612aed565b612ad1565b905082815260208101848484011115612b7057612b70600080fd5b612b7b848285612b36565b509392505050565b600082601f830112612b9757612b97600080fd5b8135612ba7848260208601612b42565b949350505050565b600060608284031215612bc457612bc4600080fd5b612bce6060612ad1565b90506000612bdc8484612955565b8252506020612bed84848301612955565b602083015250604082013567ffffffffffffffff811115612c1057612c10600080fd5b612c1c84828501612b83565b60408301525092915050565b60008060008060008060008060008060e08b8d031215612c4a57612c4a600080fd5b6000612c568d8d612944565b9a50506020612c678d828e01612955565b99505060408b013567ffffffffffffffff811115612c8757612c87600080fd5b612c938d828e016129ba565b985098505060608b013567ffffffffffffffff811115612cb557612cb5600080fd5b612cc18d828e01612a0c565b96509650506080612cd48d828e01612944565b94505060a08b013567ffffffffffffffff811115612cf457612cf4600080fd5b612d008d828e016129ba565b935093505060c08b013567ffffffffffffffff811115612d2257612d22600080fd5b612d2e8d828e01612baf565b9150509295989b9194979a5092959850565b806129a6565b80516040830190612d57848261299d565b5060208201516112716020850182612d40565b6000612d768383612d46565b505060400190565b6000612d88825190565b80845260209384019383018060005b83811015612dbc578151612dab8882612d6a565b975060208301925050600101612d97565b509495945050505050565b60208082528101610e1c8184612d7e565b60008083601f840112612ded57612ded600080fd5b50813567ffffffffffffffff811115612e0857612e08600080fd5b602083019150836060820283011115612a0557612a05600080fd5b600067ffffffffffffffff821115612e3d57612e3d612a57565b5060209081020190565b60ff8116612939565b803561292a81612e47565b600060c08284031215612e7057612e70600080fd5b612e7a60c0612ad1565b90506000612e888484612944565b8252506020612e9984848301612955565b6020830152506040612ead84828501612955565b6040830152506060612ec184828501612e50565b6060830152506080612ed584828501612955565b60808301525060a0612ee984828501612955565b60a08301525092915050565b6000612f03612b5084612e23565b83815290506020810160c08402830185811115612f2257612f22600080fd5b835b81811015612f485780612f378882612e5b565b84525060209092019160c001612f24565b5050509392505050565b600082601f830112612f6657612f66600080fd5b8135612ba7848260208601612ef5565b60008060008060008060008060008060006101008c8e031215612f9b57612f9b600080fd5b6000612fa78e8e612944565b9b505060208c013567ffffffffffffffff811115612fc757612fc7600080fd5b612fd38e828f01612dd8565b9a509a505060408c013567ffffffffffffffff811115612ff557612ff5600080fd5b6130018e828f016129ba565b985098505060606130148e828f01612955565b96505060806130258e828f01612944565b95505060a08c013567ffffffffffffffff81111561304557613045600080fd5b6130518e828f016129ba565b945094505060c08c013567ffffffffffffffff81111561307357613073600080fd5b61307f8e828f01612f52565b92505060e06130908e828f01612944565b9150509295989b509295989b9093969950565b6020810161292a8284612d40565b60008060008060008060c087890312156130cd576130cd600080fd5b60006130d98989612944565b96505060206130ea89828a01612955565b95505060406130fb89828a01612955565b945050606061310c89828a01612e50565b935050608061311d89828a01612955565b92505060a061312e89828a01612955565b9150509295509295509295565b6000806040838503121561315157613151600080fd5b600061315d8585612944565b925050602061299385828601612944565b8015156129a6565b6020810161292a828461316e565b60008060008060008060c087890312156131a0576131a0600080fd5b60006131ac8989612944565b96505060206131bd89828a01612955565b955050604087013567ffffffffffffffff8111156131dd576131dd600080fd5b6131e989828a01612b83565b94505060606131fa89828a01612955565b935050608061320b89828a01612944565b92505060a087013567ffffffffffffffff81111561322b5761322b600080fd5b61312e89828a01612b83565b6040810161292a8284612d46565b6000806000806080858703121561325e5761325e600080fd5b600061326a8787612944565b945050602061327b87828801612944565b935050604061328c87828801612955565b925050606061329d87828801612944565b91505092959194509250565b6000806000806000608086880312156132c4576132c4600080fd5b60006132d08888612944565b95505060206132e188828901612955565b94505060406132f288828901612955565b935050606086013567ffffffffffffffff81111561331257613312600080fd5b61331e888289016129ba565b92509250509295509295909350565b801515612939565b803561292a8161332d565b600060a0828403121561335557613355600080fd5b61335f60a0612ad1565b9050600061336d8484612944565b825250602082013567ffffffffffffffff81111561338d5761338d600080fd5b61339984828501612b83565b60208301525060406133ad84828501612944565b604083015250606082013567ffffffffffffffff8111156133d0576133d0600080fd5b6133dc84828501612b83565b60608301525060806133f084828501613335565b60808301525092915050565b600061340a612b5084612e23565b8381529050602080820190840283018581111561342957613429600080fd5b835b81811015612f4857803567ffffffffffffffff81111561344d5761344d600080fd5b80860161345a8982613340565b855250506020928301920161342b565b600082601f83011261347e5761347e600080fd5b8135612ba78482602086016133fc565b6000606082840312156134a3576134a3600080fd5b6134ad6060612ad1565b9050813567ffffffffffffffff8111156134c9576134c9600080fd5b6134d58482850161346a565b82525060206134e684848301612944565b6020830152506040612c1c84828501612955565b6000613508612b5084612e23565b8381529050602080820190840283018581111561352757613527600080fd5b835b81811015612f4857803567ffffffffffffffff81111561354b5761354b600080fd5b808601613558898261348e565b8552505060209283019201613529565b600082601f83011261357c5761357c600080fd5b8135612ba78482602086016134fa565b600060c082840312156135a1576135a1600080fd5b50919050565b60008060008061012085870312156135c1576135c1600080fd5b843567ffffffffffffffff8111156135db576135db600080fd5b6135e787828801613568565b94505060206135f887828801612955565b935050604061360987828801612955565b925050606061329d8782880161358c565b6000606082840312156135a1576135a1600080fd5b600080600080600080600060e0888a03121561364d5761364d600080fd5b60006136598a8a612944565b975050602061366a8a828b01612955565b965050604088013567ffffffffffffffff81111561368a5761368a600080fd5b6136968a828b01612b83565b95505060606136a78a828b01612955565b94505060806136b88a828b01612944565b93505060a088013567ffffffffffffffff8111156136d8576136d8600080fd5b6136e48a828b01612b83565b92505060c088013567ffffffffffffffff81111561370457613704600080fd5b6137108a828b0161361a565b91505092959891949750929550565b60008060006040848603121561373757613737600080fd5b60006137438686612944565b935050602084013567ffffffffffffffff81111561376357613763600080fd5b61376f868287016129ba565b92509250509250925092565b6000806020838503121561379157613791600080fd5b823567ffffffffffffffff8111156137ab576137ab600080fd5b6137b785828601612a0c565b92509250509250929050565b60005b838110156137de5781810151838201526020016137c6565b50506000910152565b60006137f1825190565b8084526020840193506138088185602086016137c3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8201165b9093019392505050565b6000610e1c83836137e7565b600061384f825190565b808452602084019350836020820285016138698560200190565b8060005b8581101561389e57848403895281516138868582613839565b94506020830160209a909a019992505060010161386d565b5091979650505050505050565b60208082528101610e1c8184613845565b600080600080600080600080600060c08a8c0312156138dd576138dd600080fd5b60006138e98c8c612944565b99505060206138fa8c828d01612955565b98505060408a013567ffffffffffffffff81111561391a5761391a600080fd5b6139268c828d016129ba565b975097505060608a013567ffffffffffffffff81111561394857613948600080fd5b6139548c828d01612a0c565b955095505060806139678c828d01612944565b93505060a08a013567ffffffffffffffff81111561398757613987600080fd5b6139938c828d016129ba565b92509250509295985092959850929598565b6000806000606084860312156139bd576139bd600080fd5b60006139c98686612944565b93505060206139da86828701612944565b92505060406139eb86828701612955565b9150509250925092565b600060208284031215613a0a57613a0a600080fd5b6000612ba78484612944565b600080600060608486031215613a2e57613a2e600080fd5b833567ffffffffffffffff811115613a4857613a48600080fd5b613a5486828701613568565b93505060206139da86828701612955565b60008060008060008060008060008060e08b8d031215613a8757613a87600080fd5b6000613a938d8d612944565b9a505060208b013567ffffffffffffffff811115613ab357613ab3600080fd5b613abf8d828e01612dd8565b995099505060408b013567ffffffffffffffff811115613ae157613ae1600080fd5b613aed8d828e016129ba565b97509750506060613b008d828e01612955565b9550506080613b118d828e01612944565b94505060a08b013567ffffffffffffffff811115613b3157613b31600080fd5b613b3d8d828e016129ba565b935093505060c0612d2e8d828e01612944565b60a08101613b5e828861299d565b613b6b602083018761299d565b613b786040830186612d40565b613b856060830185612d40565b81810360808301526109cb81846137e7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60ff81166129a6565b60e08101613bdd828a61299d565b613bea602083018961299d565b613bf76040830188612d40565b613c046060830187612d40565b613c116080830186613bc6565b613c1e60a0830185612d40565b610d7360c0830184612d40565b60408101613c398285612d40565b610e1c602083018461299d565b6101008101613c55828b61299d565b613c62602083018a61299d565b613c6f6040830189612d40565b613c7c6060830188612d40565b613c89608083018761316e565b613c9660a0830186613bc6565b613ca360c0830185612d40565b613cb060e0830184612d40565b9998505050505050505050565b60408101613c39828561299d565b805161292a8161294f565b600060208284031215613ceb57613ceb600080fd5b6000612ba78484613ccb565b8183526000602084019350613d0d838584612b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011661382f565b60a08101613d46828961299d565b613d53602083018861299d565b613d606040830187612d40565b613d6d6060830186612d40565b8181036080830152610d73818486613cf7565b600060208284031215613d9557613d95600080fd5b6000612ba78484612e50565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe136859003018112613dda57613dda600080fd5b80840192508235915067ffffffffffffffff821115613dfb57613dfb600080fd5b602083019250600182023603831315613e1657613e16600080fd5b509250929050565b60208082528101610e19818486613cf7565b805161292a81612930565b600060208284031215613e5057613e50600080fd5b6000612ba78484613e30565b6000613e69838584612b36565b50500190565b6000612ba7828486613e5c565b6000613e8a612b5084612aed565b905082815260208101848484011115613ea557613ea5600080fd5b612b7b8482856137c3565b600082601f830112613ec457613ec4600080fd5b8151612ba7848260208601613e7c565b600060208284031215613ee957613ee9600080fd5b815167ffffffffffffffff811115613f0357613f03600080fd5b612ba784828501613eb0565b60208082528101610e1c81846137e7565b600a81526000602082017f496e76616c696420746f00000000000000000000000000000000000000000000815291505b5060200190565b6020808252810161292a81613f20565b600f81526000602082017f457863656564732062616c616e6365000000000000000000000000000000000081529150613f50565b6020808252810161292a81613f67565b6020808252810161292a81602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201527f6464726573730000000000000000000000000000000000000000000000000000604082015260600190565b6060810161401a828661299d565b6140276020830185612d40565b612ba7604083018461299d565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657291019081526000613f50565b6020808252810161292a81614034565b60008161292a565b6060810161408c828661299d565b614099602083018561299d565b612ba76040830184612d40565b805161292a8161332d565b6000602082840312156140c6576140c6600080fd5b6000612ba784846140a6565b608080825281016140e381886137e7565b90506140f2602083018761299d565b6140ff604083018661299d565b81810360608301526109cb818486613cf7565b60006040828403121561412757614127600080fd5b6141316040612ad1565b9050600061413f8484613e30565b825250602061415084848301613ccb565b60208301525092915050565b600061416a612b5084612e23565b8381529050602081016040840283018581111561418957614189600080fd5b835b81811015612f48578061419e8882614112565b84525060209092019160400161418b565b600082601f8301126141c3576141c3600080fd5b8151612ba784826020860161415c565b6000602082840312156141e8576141e8600080fd5b815167ffffffffffffffff81111561420257614202600080fd5b612ba7848285016141af565b60006060828403121561422357614223600080fd5b61422d6060612ad1565b9050600061423b8484612944565b825250602061424c84848301612955565b6020830152506040612c1c84828501613335565b60006060828403121561427557614275600080fd5b6000612ba7848461420e565b6080808252810161429381888a613cf7565b90506142a2602083018761299d565b6142af604083018661299d565b8181036060830152610d73818486613cf7565b608080825281016142d381876137e7565b90506142e2602083018661299d565b6142ef604083018561299d565b8181036060830152610cc281846137e7565b60006040828403121561431657614316600080fd5b6000612ba78484614112565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561292a5761292a614322565b8082018082111561292a5761292a614322565b60408101614385828561299d565b610e1c6020830184612d40565b600061439c825190565b6143aa8185602086016137c3565b9290920192915050565b6000610e1c828461439256fea2646970667358221220abda186ba79348904a82e9803641cea5a3717c462409cc365c71c62362c8071f64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
-----Decoded View---------------
Arg [0] : _vault (address): 0x7160570BB153Edd0Ea1775EC2b2Ac9b65F1aB61B
Arg [1] : _wETH (address): 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b
Arg [1] : 000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
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.