ETH Price: $2,956.36 (+0.24%)

Contract

0x754b274AecC065Cb3a13Beb8C405F1ECC5D8E3b9

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Deposit282435442026-01-24 2:53:4012 hrs ago1769223220IN
Dyson Finance: Router
0 ETH0.000008820.03684218
Deposit282435282026-01-24 2:53:0812 hrs ago1769223188IN
Dyson Finance: Router
0 ETH0.000008990.03684253
Deposit282435172026-01-24 2:52:4612 hrs ago1769223166IN
Dyson Finance: Router
0 ETH0.000008990.03684275
Deposit282435062026-01-24 2:52:2412 hrs ago1769223144IN
Dyson Finance: Router
0 ETH0.0000090.03684187
Deposit282434982026-01-24 2:52:0412 hrs ago1769223124IN
Dyson Finance: Router
0 ETH0.000008990.03684309
Multicall282434572026-01-24 2:50:4212 hrs ago1769223042IN
Dyson Finance: Router
0 ETH0.000014620.03668746
Deposit282306602026-01-23 18:45:4220 hrs ago1769193942IN
Dyson Finance: Router
0 ETH0.000009920.03863165
Withdraw ETH282306482026-01-23 18:45:1820 hrs ago1769193918IN
Dyson Finance: Router
0 ETH0.000004840.03908838
Deposit To Gauge282226942026-01-23 13:54:1825 hrs ago1769176458IN
Dyson Finance: Router
0 ETH0.000006650.03902283
Stake Dyson282226812026-01-23 13:53:5025 hrs ago1769176430IN
Dyson Finance: Router
0 ETH0.000006670.03881038
Multicall282084012026-01-23 5:09:3634 hrs ago1769144976IN
Dyson Finance: Router
0 ETH0.000006350.03942438
Deposit281990292026-01-22 23:50:5039 hrs ago1769125850IN
Dyson Finance: Router
0 ETH0.000008560.03686512
Deposit ETH281989802026-01-22 23:49:0839 hrs ago1769125748IN
Dyson Finance: Router
0.0112 ETH0.000008190.03676279
Deposit ETH281989612026-01-22 23:48:3039 hrs ago1769125710IN
Dyson Finance: Router
0.0112 ETH0.000008170.03676296
Deposit ETH281989512026-01-22 23:48:1039 hrs ago1769125690IN
Dyson Finance: Router
0.0112 ETH0.000008190.0367627
Deposit ETH281989402026-01-22 23:47:4839 hrs ago1769125668IN
Dyson Finance: Router
0.0112 ETH0.000008190.0367621
Deposit ETH281989282026-01-22 23:47:2439 hrs ago1769125644IN
Dyson Finance: Router
0.0112 ETH0.000008190.03676154
Deposit ETH281842762026-01-22 15:35:082 days ago1769096108IN
Dyson Finance: Router
0.015 ETH0.000008590.03860102
Withdraw ETH281842612026-01-22 15:34:382 days ago1769096078IN
Dyson Finance: Router
0 ETH0.000004260.03926321
Multicall281587252026-01-22 1:14:322 days ago1769044472IN
Dyson Finance: Router
0 ETH0.000013250.03658841
Deposit ETH281414842026-01-21 15:21:403 days ago1769008900IN
Dyson Finance: Router
0.015 ETH0.00000860.03860142
Withdraw ETH281414722026-01-21 15:21:163 days ago1769008876IN
Dyson Finance: Router
0 ETH0.000004260.03925962
Multicall281120912026-01-20 22:46:563 days ago1768949216IN
Dyson Finance: Router
0 ETH0.000005710.03958358
Deposit ETH280976372026-01-20 14:35:304 days ago1768919730IN
Dyson Finance: Router
0.0105 ETH0.000008190.03676287
Deposit ETH280976242026-01-20 14:35:044 days ago1768919704IN
Dyson Finance: Router
0.0105 ETH0.000008180.0367633
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
282435442026-01-24 2:53:4012 hrs ago1769223220
Dyson Finance: Router
0 ETH
282435442026-01-24 2:53:4012 hrs ago1769223220
Dyson Finance: Router
0 ETH
282435282026-01-24 2:53:0812 hrs ago1769223188
Dyson Finance: Router
0 ETH
282435282026-01-24 2:53:0812 hrs ago1769223188
Dyson Finance: Router
0 ETH
282435172026-01-24 2:52:4612 hrs ago1769223166
Dyson Finance: Router
0 ETH
282435172026-01-24 2:52:4612 hrs ago1769223166
Dyson Finance: Router
0 ETH
282435062026-01-24 2:52:2412 hrs ago1769223144
Dyson Finance: Router
0 ETH
282435062026-01-24 2:52:2412 hrs ago1769223144
Dyson Finance: Router
0 ETH
282434982026-01-24 2:52:0412 hrs ago1769223124
Dyson Finance: Router
0 ETH
282434982026-01-24 2:52:0412 hrs ago1769223124
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
Dyson Finance: Router
0 ETH
282434572026-01-24 2:50:4212 hrs ago1769223042
Dyson Finance: Router
0 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-3.0-only

import "interface/IPair.sol";
import "interface/IWETH.sol";
import "interface/IFactory.sol";
import "interface/IERC20Permit.sol";
import "interface/IGauge.sol";
import "interface/IERC20.sol";
import "interface/IsDYSON.sol";
import "./lib/SqrtMath.sol";
import "./lib/TransferHelper.sol";

/// @title Router contract for all Pair contracts
/// @notice Users are expected to swap, deposit and withdraw via this contract
/// @dev IMPORTANT: Fund stuck or send to this contract is free for grab as `pair` param
/// in each swap functions is passed in and not validated so everyone can implement their
/// own `pair` contract and transfer the fund away.
contract Router {
    using SqrtMath for *;
    using TransferHelper for address;

    uint private constant MAX_FEE_RATIO = 2**64;
    address public immutable WETH;
    address public immutable DYSON_FACTORY;
    address public immutable sDYSON;
    address public immutable DYSON;
    bytes32 public immutable CODE_HASH;

    address public owner;

    event TransferOwnership(address newOwner);

    constructor(address _WETH, address _owner, address _factory, address _sDYSON, address _DYSON) {
        require(_owner != address(0), "owner cannot be zero");
        require(_WETH != address(0), "invalid WETH");
        WETH = _WETH;
        owner = _owner;
        DYSON_FACTORY = _factory;
        sDYSON = _sDYSON;
        DYSON = _DYSON;
        CODE_HASH = IFactory(DYSON_FACTORY).getInitCodeHash();
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "forbidden");
        _;
    }

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'identical addresses');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'zero address');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, bytes32 initCodeHash, address tokenA, address tokenB, uint id) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1, id)), //salt
                initCodeHash
            )))));
    }

    function transferOwnership(address _owner) external onlyOwner {
        require(_owner != address(0), "owner cannot be zero");
        owner = _owner;

        emit TransferOwnership(_owner);
    }

    /// @notice Allow another address to transfer token from this contract
    /// @param tokenAddress Address of token to approve
    /// @param contractAddress Address to grant allowance
    /// @param enable True to enable allowance. False otherwise.
    function rely(address tokenAddress, address contractAddress, bool enable) onlyOwner external {
        tokenAddress.safeApprove(contractAddress, enable ? type(uint).max : 0);
    }

    /// @notice rescue token stucked in this contract
    /// @param tokenAddress Address of token to be rescued
    /// @param to Address that will receive token
    /// @param amount Amount of token to be rescued
    function rescueERC20(address tokenAddress, address to, uint256 amount) onlyOwner external {
        tokenAddress.safeTransfer(to, amount);
    }

    /// @notice This contract can only receive ETH coming from WETH contract,
    /// i.e., when it withdraws from WETH
    receive() external payable {
        require(msg.sender == WETH);
    }

    function _swap(address tokenIn, address tokenOut, uint index, address to, uint input, uint minOutput) internal returns (uint output) {
        address pair = pairFor(DYSON_FACTORY, CODE_HASH, tokenIn, tokenOut, index);
        (address token0,) = sortTokens(tokenIn, tokenOut);
        if(tokenIn == token0)
            output = IPair(pair).swap0in(to, input, minOutput);
        else
            output = IPair(pair).swap1in(to, input, minOutput);
    }

    function unwrapAndSendETH(address to, uint amount) internal {
        IWETH(WETH).withdraw(amount);
        to.safeTransferETH(amount);
    }

    /// @notice Swap tokenIn for tokenOut
    /// @param tokenIn Address of spent token
    /// @param tokenOut Address of received token
    /// @param index Number of pair instance
    /// @param to Address that will receive tokenOut
    /// @param input Amount of tokenIn to swap
    /// @param minOutput Minimum of tokenOut expected to receive
    /// @return output Amount of tokenOut received
    function swap(address tokenIn, address tokenOut, uint index, address to, uint input, uint minOutput) external returns (uint output) {
        tokenIn.safeTransferFrom(msg.sender, address(this), input);
        output = _swap(tokenIn, tokenOut, index, to, input, minOutput);
    }

    /// @notice Swap ETH for tokenOut
    /// @param tokenOut Address of received token
    /// @param index Number of pair instance
    /// @param to Address that will receive tokenOut
    /// @param minOutput Minimum of token1 expected to receive
    /// @return output Amount of tokenOut received
    function swapETHIn(address tokenOut, uint index, address to, uint minOutput) external payable returns (uint output) {
        IWETH(WETH).deposit{value: msg.value}();
        return _swap(WETH, tokenOut, index, to, msg.value, minOutput);
    }

    /// @notice Swap tokenIn for ETH
    /// @param tokenIn Address of spent token
    /// @param index Number of pair instance
    /// @param to Address that will receive ETH
    /// @param input Amount of tokenIn to swap
    /// @param minOutput Minimum of ETH expected to receive
    /// @return output Amount of ETH received
    function swapETHOut(address tokenIn, uint index, address to, uint input, uint minOutput) external returns (uint output) {
        tokenIn.safeTransferFrom(msg.sender, address(this), input);
        output = _swap(tokenIn, WETH, index, address(this), input, minOutput);
        unwrapAndSendETH(to, output);
    }

    /// @notice Swap tokenIn for tokenOut with multiple hops
    /// @param tokens Array of swapping tokens
    /// @param indexes Array of pair instance
    /// @param to Address that will receive tokenOut
    /// @param input Amount of tokenIn to swap
    /// @param minOutput Minimum of tokenOut expected to receive
    /// @return output Amount of tokenOut received
    function swapWithMultiHops(address[] calldata tokens, uint[] calldata indexes, address to, uint input, uint minOutput) external returns (uint output) {
        unchecked {
        uint indexesLength = indexes.length;
        require(indexesLength > 0 && tokens.length == indexesLength + 1, "invalid input array length");
        tokens[0].safeTransferFrom(msg.sender, address(this), input);
        uint nextInputAmount = input;
        uint i = 1;
        for(;i < indexesLength; ++i)
            nextInputAmount = _swap(tokens[i-1], tokens[i], indexes[i-1], address(this), nextInputAmount, 0);
        output = _swap(tokens[i-1], tokens[i], indexes[i-1], to, nextInputAmount, minOutput);
        }
    }

    /// @notice Swap ETH for tokenOut with multiple hops
    /// tokens[0] must be WETH
    /// @param tokens Array of swapping tokens
    /// @param indexes Array of pair instance
    /// @param to Address that will receive tokenOut
    /// @param minOutput Minimum of tokenOut expected to receive
    /// @return output Amount of tokenOut received
    function swapETHInWithMultiHops(address[] calldata tokens, uint[] calldata indexes, address to, uint minOutput) external payable returns (uint output) {
        unchecked {
        uint indexesLength = indexes.length;
        require(indexesLength > 0 && tokens.length == indexesLength + 1, "invalid input array length");
        require(tokens[0] == WETH, "first token must be WETH");
        IWETH(WETH).deposit{value: msg.value}();
        uint nextInputAmount = msg.value;
        uint i = 1;
        for(;i < indexesLength; ++i)
            nextInputAmount = _swap(tokens[i-1], tokens[i], indexes[i-1], address(this), nextInputAmount, 0);
        output = _swap(tokens[i-1], tokens[i], indexes[i-1], to, nextInputAmount, minOutput);
        }
    }

    /// @notice Swap tokenIn for ETH with multiple hops
    /// tokens[tokens.length - 1] must be WETH
    /// @param tokens Array of swapping tokens
    /// @param indexes Array of pair instance
    /// @param to Address that will receive ETH
    /// @param input Amount of tokenIn to swap
    /// @param minOutput Minimum of ETH expected to receive
    /// @return output Amount of ETH received
    function swapETHOutWithMultiHops(address[] calldata tokens, uint[] calldata indexes, address to, uint input, uint minOutput) external returns (uint output) {
        unchecked {
        uint indexesLength = indexes.length;
        require(indexesLength > 0 && tokens.length == indexesLength + 1, "invalid input array length");
        require(tokens[indexesLength] == WETH, "last token must be WETH");
        tokens[0].safeTransferFrom(msg.sender, address(this), input);
        uint nextInputAmount = input;
        uint i = 1;
        for(;i < indexesLength; ++i)
            nextInputAmount = _swap(tokens[i-1], tokens[i], indexes[i-1], address(this), nextInputAmount, 0);
        output = _swap(tokens[i-1], tokens[i], indexes[i-1], address(this), nextInputAmount, minOutput);
        unwrapAndSendETH(to, output);
        }
    }

    function _deposit(address tokenIn, address tokenOut, uint index, address to, uint input, uint minOutput, uint time) internal returns (uint output) {
        address pair = pairFor(DYSON_FACTORY, CODE_HASH, tokenIn, tokenOut, index);
        (address token0,) = sortTokens(tokenIn, tokenOut);
        if(tokenIn == token0)
            output = IPair(pair).deposit0(to, input, minOutput, time);
        else
            output = IPair(pair).deposit1(to, input, minOutput, time);
    }

    /// @notice Deposit tokenIn
    /// @param tokenIn Address of spent token
    /// @param tokenOut Address of received token
    /// @param index Number of pair instance
    /// @param to Address that will receive Pair note
    /// @param input Amount of tokenIn to deposit
    /// @param minOutput Minimum amount of tokenOut expected to receive if the swap is perfromed
    /// @param time Lock time
    /// @return output Amount of tokenOut received if the swap is performed
    function deposit(address tokenIn, address tokenOut, uint index, address to, uint input, uint minOutput, uint time) external returns (uint output) {
        tokenIn.safeTransferFrom(msg.sender, address(this), input);
        output = _deposit(tokenIn, tokenOut, index, to, input, minOutput, time);
    }

    /// @notice Deposit ETH
    /// @param tokenOut Address of received token
    /// @param index Number of pair instance
    /// @param to Address that will receive Pair note
    /// @param minOutput Minimum amount of tokenOut expected to receive if the swap is perfromed
    /// @param time Lock time
    /// @return output Amount of tokenOut received if the swap is performed
    function depositETH(address tokenOut, uint index, address to, uint minOutput, uint time) external payable returns (uint output) {
        IWETH(WETH).deposit{value: msg.value}();
        return _deposit(WETH, tokenOut, index, to, msg.value, minOutput, time);
    }

    /// @notice Withdrw Pair note.
    /// @param pair `Pair` contract address
    /// @param index Index of the note to withdraw
    /// @param to Address that will receive either token0 or token1
    /// @return token0Amt Amount of token0 withdrawn
    /// @return token1Amt Amount of token1 withdrawn
    function withdraw(address pair, uint index, address to) external returns (uint token0Amt, uint token1Amt) {
        return IPair(pair).withdrawFrom(msg.sender, index, to);
    }

    /// @notice Withdraw multiple Pair notes.
    /// User who call this function must set approval for all position of each pair in advance
    /// @param pairs array of `Pair` contract addresses
    /// @param indexes array of index of the note to withdraw
    /// @param tos array of address that will receive either token0 or token1
    /// @return token0Amounts array of amount of token0 withdrawn
    /// @return token1Amounts array of amount of token1 withdrawn
    function withdrawMultiPositions(address[] calldata pairs, uint[] calldata indexes, address[] calldata tos) external returns (uint[] memory token0Amounts, uint[] memory token1Amounts) {
        uint pairLength = pairs.length;
        require(pairLength == indexes.length && pairLength == tos.length, "invalid input array length");
        uint[] memory _token0Amounts = new uint[](pairLength);
        uint[] memory _token1Amounts = new uint[](pairLength);
        unchecked {
            for (uint i = 0; i < pairLength; ++i) {
                (uint token0Amount, uint token1Amount) = IPair(pairs[i]).withdrawFrom(msg.sender, indexes[i], tos[i]);
                _token0Amounts[i] = token0Amount;
                _token1Amounts[i] = token1Amount;
            }
        }
        (token0Amounts, token1Amounts) = (_token0Amounts, _token1Amounts);
    }

    /// @notice Withdrw Pair note and if either token0 or token1 withdrawn is WETH, withdraw from WETH and send ETH to receiver.
    /// User who signs the withdraw signature must be the one who calls this function
    /// @param pair `Pair` contract address
    /// @param index Index of the note to withdraw
    /// @param to Address that will receive either token0 or token1
    /// @return token0Amt Amount of token0 withdrawn
    /// @return token1Amt Amount of token1 withdrawn
    function withdrawETH(address pair, uint index, address to) external returns (uint token0Amt, uint token1Amt) {
        (token0Amt, token1Amt) = IPair(pair).withdrawFrom(msg.sender, index, address(this));
        address token0 = IPair(pair).token0();
        address token = token0Amt > 0 ? token0 : IPair(pair).token1();
        uint amount = token0Amt > 0 ? token0Amt : token1Amt;
        if (token == WETH)
            unwrapAndSendETH(to, amount);
        else
            token.safeTransfer(to, amount);
    }

    /// @notice Deposit sDYSON to gauge
    /// @param gauge `Gauge` contract address
    /// @param amount Amount of sDYSON to deposit
    /// @param to Address that owns the position of this deposit
    function depositToGauge(address gauge, uint amount, address to) external {
        require(gauge != address(0), "invalid gauge");
        require(amount > 0, "invalid amount");
        sDYSON.safeTransferFrom(msg.sender, address(this), amount);
        IGauge(gauge).deposit(amount, to);
    }

    /// @notice Stake DYSON to sDYSON
    /// @param to Address that owns the position of this stake
    /// @param amount Amount of DYSON to stake
    /// @param lockDuration Lock duration
    function stakeDyson(address to, uint amount, uint lockDuration) external returns (uint sDYSONAmount) {
        require(amount > 0, "invalid amount");
        DYSON.safeTransferFrom(msg.sender, address(this), amount);
        sDYSONAmount = IsDYSON(sDYSON).stake(to, amount, lockDuration);
    }

    /// @notice Permits this contract to spend a given token from msg.sender
    /// The owner is always msg.sender and the spender is always address(this).
    /// @param token The address of the token spent
    /// @param value The amount that can be spent of token
    /// @param deadline A timestamp, the current blocktime must be less than or equal to this timestamp
    /// @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 v and r
    function selfPermit(
        address token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        IERC20Permit(token).permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    /// @notice Set approval for all position of a pair
    /// User who signs the approval signature must be the one who calls this function
    /// @param pair `Pair` contract address
    /// @param approved True to approve, false to revoke
    /// @param deadline Deadline when the signature expires
    /// @param sig Signature
    function setApprovalForAllWithSig(address pair, bool approved, uint deadline, bytes calldata sig) public {
		IPair(pair).setApprovalForAllWithSig(msg.sender, address(this), approved, deadline, sig);
    }

    /// @notice Multi delegatecall without supporting payable
    /// @param data Array of bytes of function calldata to be delegatecalled
    function multicall(bytes[] calldata data) public returns (bytes[] memory results) {
        uint dataLength = data.length;
        results = new bytes[](dataLength);
        for (uint256 i = 0; i < dataLength; ++i) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;
        }
    }

    /// @notice Calculate the price of token1 in token0
    /// Formula:
    /// amount1 = amount0 * reserve1 * sqrt(1-fee0) / reserve0 / sqrt(1-fee1)
    /// which can be transformed to:
    /// amount1 = sqrt( amount0**2 * (1-fee0) / (1-fee1) ) * reserve1 / reserve0
    /// @param pair `Pair` contract address
    /// @param token0Amt Amount of token0
    /// @return token1Amt Amount of token1
    function fairPrice(address pair, uint token0Amt) external view returns (uint token1Amt) {
        (uint reserve0, uint reserve1) = IPair(pair).getReserves();
        (uint64 _fee0, uint64 _fee1) = IPair(pair).getFeeRatio();
        return (token0Amt**2 * (MAX_FEE_RATIO - _fee0) / (MAX_FEE_RATIO - _fee1)).sqrt() * reserve1 / reserve0;
    }

}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IPair {
    event Swap(address indexed sender, bool indexed isSwap0, uint amountIn, uint amountOut, address indexed to);
    event FeeCollected(uint token0Amt, uint token1Amt);
    event Deposit(address indexed user, bool indexed isToken0, uint index, uint amountIn, uint token0Amt, uint token1Amt, uint due);
    event Withdraw(address indexed user, bool indexed isToken0, uint index, uint amountOut);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    struct Note {
        uint token0Amt;
        uint token1Amt;
        uint due;
    }

    function nonces() external view returns (uint);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getFeeRatio() external view returns(uint64 _feeRatio0, uint64 _feeRatio1);
    function getReserves() external view returns (uint reserve0, uint reserve1);
    function deposit0(address to, uint input, uint minOutput, uint time) external returns (uint output);
    function deposit1(address to, uint input, uint minOutput, uint time) external returns (uint output);
    function swap0in(address to, uint input, uint minOutput) external returns (uint output);
    function swap1in(address to, uint input, uint minOutput) external returns (uint output);
    function withdraw(uint index, address to) external returns (uint token0Amt, uint token1Amt);
    function halfLife() external view returns (uint64);
    function calcNewFeeRatio(uint64 _oldFeeRatio, uint _elapsedTime) external view returns (uint64 _newFeeRatio);
    function feeTo() external view returns (address);
    function initialize(address _token0, address _token1) external;
    function collectFee() external;
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function WITHDRAW_TYPEHASH() external pure returns (bytes32);
    function factory() external view returns (address);
    function farm() external view returns (address);
    function basis() external view returns (uint);
    function noteCount(address user) external view returns (uint);
    function notes(address user, uint index) external view returns (Note memory);
    function getPremium(uint time) external view returns (uint premium);
    function setBasis(uint _basis) external;
    function setHalfLife(uint64 _halfLife) external;
    function setFarm(address _farm) external;
    function setFeeTo(address _feeTo) external;
    function rescueERC20(address tokenAddress, address to, uint256 amount) external;
    function setApprovalForAllWithSig(address owner, address operator, bool approved, uint deadline, bytes calldata sig) external;
    function setApprovalForAll(address operator, bool approved) external;
    function operatorApprovals(address owner, address operator) external view returns (bool);
    function withdrawFrom(address from, uint index, address to) external returns (uint token0Amts, uint token1Amts);
}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT
import "interface/IERC20.sol";

interface IWETH is IERC20 {
    function deposit() external payable;
    function withdraw(uint) external;
}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IFactory {
    event PairCreated(address indexed token0, address indexed token1, uint id, address pair, uint);
    event GaugeCreated(address indexed poolId, address gauge);
    event BribeCreated(address indexed gauge, address bribe);

    function controller() external returns (address);
    function pendingController() external returns (address);
    function permissionless() external returns (bool);
    function getPairCount(address token0, address token1) external view returns (uint);
    function getPair(address token0, address token1, uint id) external view returns (address);
    function allPairs(uint id) external view returns (address);
    function allPairsLength() external view returns (uint);
    function getInitCodeHash() external pure returns (bytes32);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function createGauge(address farm, address sgov, address poolId, uint weight, uint base, uint slope) external returns (address gauge);
    function createBribe(address gauge) external returns (address bribe);
    function setController(address _controller) external;
    function becomeController() external;
    function open2public() external;
}

File 5 of 10 : IERC20Permit.sol
pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IGauge {
    event TransferOwnership(address newOwner);
    event Deposit(address indexed user, uint indexed week, uint amount);
    event ApplyWithdrawal(address indexed user, uint indexed week, uint amount);
    event Withdraw(address indexed user, uint amount);

    struct Checkpoint {
        uint week;
        uint amount;
    }

    function farm() external view returns (address);
    function SGOV() external view returns (address);
    function poolId() external view returns (address);
    function genesis() external view returns (uint);
    function weight() external view returns (uint);
    function totalSupply() external view returns (uint);
    function base() external view returns (uint);
    function slope() external view returns (uint);
    function thisWeek() external view returns (uint);
    function owner() external view returns (address);
    function numCheckpoints(address account) external view returns (uint);
    function checkpoints(address account, uint index) external view returns (uint week, uint amount);
    function pendingWithdrawal(address account) external view returns (uint);
    function weekToWithdraw(address account) external view returns (uint);
    function transferOwnership(address _owner) external;
    function rescueERC20(address tokenAddress, address to, uint256 amount) external;
    function setParams(uint _weight, uint _base, uint _slope) external;
    function balanceOf(address account) external view returns (uint);
    function balanceOfAt(address account, uint week) external view returns (uint);
    function totalSupplyAt(uint week) external view returns (uint);
    function tick() external;
    function nextRewardRate() external view returns (uint newRewardRate);
    function deposit(uint amount, address to) external;
    function applyWithdrawal(uint amount) external;
    function withdraw() external returns (uint amount);
    function bonus(address user) external view returns (uint _bonus);
}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    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 value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

File 8 of 10 : IsDYSON.sol
pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IsDYSON {
    event TransferOwnership(address newOwner);
    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint amount);
    event Stake(address indexed vaultOwner, address indexed depositor, uint amount, uint sDysonAmount, uint time);
    event Restake(address indexed vaultOwner, uint index, uint dysonAmountAdded, uint sDysonAmountAdded, uint time);
    event Unstake(address indexed vaultOwner, address indexed receiver, uint amount, uint sDysonAmount);
    event Migrate(address indexed vaultOwner, uint index);

    struct Vault {
        uint dysonAmount;
        uint sDysonAmount;
        uint unlockTime;
    }

    function initialRate() external view returns (uint);
    function initialTime() external view returns (uint);
    function stakingRate(uint lockDuration) external view returns (uint rate);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external view returns (bytes32);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function decimals() external view returns (uint8);
    function Dyson() external view returns (address);
    function owner() external view returns (address);
    function migration() external view returns (address);
    function totalSupply() external view returns (uint);
    function currentModel() external view returns (address);
    function balanceOf(address account) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function vaults(address vaultOwner, uint index) external view returns (uint dysonAmount, uint sDysonAmount, uint unlockTime);
    function vaultCount(address vaultOwner) external view returns (uint);
    function dysonAmountStaked(address account) external view returns (uint);
    function votingPower(address account) external view returns (uint);
    function nonces(address account) external view returns (uint);
    function transferOwnership(address _owner) external;
    function mint(address to, uint amount) external returns (bool);
    function burn(uint amount) external returns (bool);
    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);
    function getStakingRate(uint lockDuration) external view returns (uint rate);
    function setStakingRateModel(address newModel) external;
    function setMigration(address _migration) external;
    function stake(address to, uint amount, uint lockDuration) external returns (uint sDysonAmount);
    function restake(uint index, uint amount, uint lockDuration) external returns (uint sDysonAmountAdded);
    function unstake(address to, uint index, uint sDysonAmount) external returns (uint amount);
    function migrate(uint index) external;
    function rescueERC20(address tokenAddress, address to, uint256 amount) external;
    function permit(address _owner, address _spender, uint256 _amount, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s) external;
}

File 9 of 10 : SqrtMath.sol
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-2.0

//https://github.com/Gaussian-Process/solidity-sqrt/blob/main/src/FixedPointMathLib.sol
library SqrtMath {
    function sqrt(uint256 x) internal pure returns (uint256 z) {
        assembly {
            // This segment is to get a reasonable initial estimate for the Babylonian method.
            // If the initial estimate is bad, the number of correct bits increases ~linearly
            // each iteration instead of ~quadratically.
            // The idea is to get z*z*y within a small factor of x.
            // More iterations here gets y in a tighter range. Currently, we will have
            // y in [256, 256*2^16). We ensure y>= 256 so that the relative difference
            // between y and y+1 is small. If x < 256 this is not possible, but those cases
            // are easy enough to verify exhaustively.
            z := 181 // The 'correct' value is 1, but this saves a multiply later
            let y := x
            // Note that we check y>= 2^(k + 8) but shift right by k bits each branch,
            // this is to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }
            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8),
            // and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of x, or about 20bps.

            // The estimate sqrt(x) = (181/1024) * (x+1) is off by a factor of ~2.83 both when x=1
            // and when x = 256 or 1/256. In the worst case, this needs seven Babylonian iterations.
            z := shr(18, mul(z, add(y, 65536))) // A multiply is saved from the initial z := 181

            // Run the Babylonian method seven times. This should be enough given initial estimate.
            // Possibly with a quadratic/cubic polynomial above we could get 4-6.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // See https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division.
            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This check ensures we return floor.
            // The solmate implementation assigns zRoundDown := div(x, z) first, but
            // since this case is rare, we choose to save gas on the assignment and
            // repeat division in the rare case.
            // If you don't care whether floor or ceil is returned, you can skip this.
            if lt(div(x, z), z) {
                z := div(x, z)
            }
        }
    }
}

pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-2.0

library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: approve failed');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transfer failed');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transferFrom failed');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'transferHelper: ETH transfer failed');
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "interface/=src/interface/",
    "util/=src/util/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_sDYSON","type":"address"},{"internalType":"address","name":"_DYSON","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"inputs":[],"name":"CODE_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DYSON","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DYSON_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"depositETH","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"gauge","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"depositToGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"token0Amt","type":"uint256"}],"name":"fairPrice","outputs":[{"internalType":"uint256","name":"token1Amt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sDYSON","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"setApprovalForAllWithSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDuration","type":"uint256"}],"name":"stakeDyson","outputs":[{"internalType":"uint256","name":"sDYSONAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"name":"swapETHIn","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"name":"swapETHInWithMultiHops","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"name":"swapETHOut","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"name":"swapETHOutWithMultiHops","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"name":"swapWithMultiHops","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"token0Amt","type":"uint256"},{"internalType":"uint256","name":"token1Amt","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawETH","outputs":[{"internalType":"uint256","name":"token0Amt","type":"uint256"},{"internalType":"uint256","name":"token1Amt","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"address[]","name":"tos","type":"address[]"}],"name":"withdrawMultiPositions","outputs":[{"internalType":"uint256[]","name":"token0Amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"token1Amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101206040523480156200001257600080fd5b506040516200315c3803806200315c83398101604081905262000035916200019d565b6001600160a01b038416620000915760405162461bcd60e51b815260206004820152601460248201527f6f776e65722063616e6e6f74206265207a65726f00000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b038516620000d85760405162461bcd60e51b815260206004820152600c60248201526b0d2dcecc2d8d2c840ae8aa8960a31b604482015260640162000088565b6001600160a01b03858116608052600080546001600160a01b03191686831617905583811660a081905283821660c05290821660e05260408051635431927d60e01b81529051635431927d916004808201926020929091908290030181865afa1580156200014a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017091906200020d565b6101005250620002279350505050565b80516001600160a01b03811681146200019857600080fd5b919050565b600080600080600060a08688031215620001b657600080fd5b620001c18662000180565b9450620001d16020870162000180565b9350620001e16040870162000180565b9250620001f16060870162000180565b9150620002016080870162000180565b90509295509295909350565b6000602082840312156200022057600080fd5b5051919050565b60805160a05160c05160e05161010051612e72620002ea6000396000818161021e0152818161190c0152611e1801526000818161050901526109fe0152600081816104d501528181610a53015261114d015260008181610272015281816118eb0152611df701526000818161019501528181610441015281816105d9015281816106810152818161082701528181610afa0152818161134e015281816113b70152818161142e01528181611847015281816118be0152611bad0152612e726000f3fe6080604052600436106101855760003560e01c80638865305b116100d1578063d29f14091161008a578063f2fde38b11610064578063f2fde38b1461052b578063f3995c671461054b578063f5eacc2f1461056b578063fecc1b9f1461058b57600080fd5b8063d29f1409146104a3578063e14e8526146104c3578063e4021087146104f757600080fd5b80638865305b146103cf5780638da5cb5b146103e2578063ac9650d814610402578063ad5c46481461042f578063b2118a8d14610463578063c58b6a101461048357600080fd5b8063687a0b101161013e5780636d48058e116101185780636d48058e1461034f5780637129b6401461036f5780637c8d5f3b1461038f57806380500d20146103af57600080fd5b8063687a0b10146102cc57806369328dec146102ec5780636d3a957c1461032157600080fd5b806301c838fe146101c65780630cd19cbe146101ec5780630dff11651461020c57806312713bd214610240578063429d9b1d14610260578063505ce69e146102ac57600080fd5b366101c157336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101bf57600080fd5b005b600080fd5b6101d96101d436600461234f565b61059e565b6040519081526020015b60405180910390f35b3480156101f857600080fd5b506101d96102073660046123da565b61080a565b34801561021857600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561024c57600080fd5b506101d961025b36600461242c565b610864565b34801561026c57600080fd5b506102947f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e3565b3480156102b857600080fd5b506101d96102c7366004612458565b6109af565b3480156102d857600080fd5b506101d96102e736600461248d565b610ac8565b3480156102f857600080fd5b5061030c610307366004612522565b610cef565b604080519283526020830191909152016101e3565b34801561032d57600080fd5b5061034161033c366004612564565b610d78565b6040516101e3929190612638565b34801561035b57600080fd5b506101d961036a36600461248d565b610f8b565b34801561037b57600080fd5b506101d961038a36600461265d565b611089565b34801561039b57600080fd5b506101bf6103aa366004612522565b6110b9565b3480156103bb57600080fd5b5061030c6103ca366004612522565b6111dc565b6101d96103dd3660046123da565b6113b3565b3480156103ee57600080fd5b50600054610294906001600160a01b031681565b34801561040e57600080fd5b5061042261041d3660046126c2565b611462565b6040516101e39190612753565b34801561043b57600080fd5b506102947f000000000000000000000000000000000000000000000000000000000000000081565b34801561046f57600080fd5b506101bf61047e3660046127b5565b6115b9565b34801561048f57600080fd5b506101bf61049e366004612804565b6115fc565b3480156104af57600080fd5b506101d96104be366004612844565b61164b565b3480156104cf57600080fd5b506102947f000000000000000000000000000000000000000000000000000000000000000081565b34801561050357600080fd5b506102947f000000000000000000000000000000000000000000000000000000000000000081565b34801561053757600080fd5b506101bf6105463660046128b2565b61167d565b34801561055757600080fd5b506101bf6105663660046128d6565b611748565b34801561057757600080fd5b506101bf61058636600461291e565b6117d4565b6101d96105993660046129bc565b611843565b60008380158015906105b257506001810187145b6105d75760405162461bcd60e51b81526004016105ce90612a04565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168888600081811061061457610614612a3b565b905060200201602081019061062991906128b2565b6001600160a01b03161461067f5760405162461bcd60e51b815260206004820152601860248201527f666972737420746f6b656e206d7573742062652057455448000000000000000060448201526064016105ce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b503493506001925050505b828110156107845761077a8a8a6001840381811061071957610719612a3b565b905060200201602081019061072e91906128b2565b8b8b8481811061074057610740612a3b565b905060200201602081019061075591906128b2565b8a8a6001860381811061076a5761076a612a3b565b90506020020135308660006118e3565b91506001016106f9565b6107fc8a8a6001840381811061079c5761079c612a3b565b90506020020160208101906107b191906128b2565b8b8b848181106107c3576107c3612a3b565b90506020020160208101906107d891906128b2565b8a8a600186038181106107ed576107ed612a3b565b9050602002013589868a6118e3565b9a9950505050505050505050565b60006108216001600160a01b038716333086611a67565b61084f867f0000000000000000000000000000000000000000000000000000000000000000873087876118e3565b905061085b8482611b97565b95945050505050565b6000806000846001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa1580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190612a51565b91509150600080866001600160a01b03166359362b886040518163ffffffff1660e01b81526004016040805180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109329190612a8c565b9092509050838361098e6109536001600160401b038516600160401b612ad5565b61096a6001600160401b038716600160401b612ad5565b61097560028c612bcc565b61097f9190612bdb565b6109899190612bf2565b611c29565b6109989190612bdb565b6109a29190612bf2565b9450505050505b92915050565b60008083116109f15760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ce565b610a266001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086611a67565b604051630c51b88f60e01b81526001600160a01b03858116600483015260248201859052604482018490527f00000000000000000000000000000000000000000000000000000000000000001690630c51b88f906064016020604051808303816000875af1158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac09190612c14565b949350505050565b6000848015801590610adc57506001810188145b610af85760405162461bcd60e51b81526004016105ce90612a04565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316898983818110610b3457610b34612a3b565b9050602002016020810190610b4991906128b2565b6001600160a01b031614610b9f5760405162461bcd60e51b815260206004820152601760248201527f6c61737420746f6b656e206d757374206265205745544800000000000000000060448201526064016105ce565b610bde3330868c8c6000818110610bb857610bb8612a3b565b9050602002016020810190610bcd91906128b2565b6001600160a01b0316929190611a67565b8360015b82811015610c5d57610c538b8b60018403818110610c0257610c02612a3b565b9050602002016020810190610c1791906128b2565b8c8c84818110610c2957610c29612a3b565b9050602002016020810190610c3e91906128b2565b8b8b6001860381811061076a5761076a612a3b565b9150600101610be2565b610cd58b8b60018403818110610c7557610c75612a3b565b9050602002016020810190610c8a91906128b2565b8c8c84818110610c9c57610c9c612a3b565b9050602002016020810190610cb191906128b2565b8b8b60018603818110610cc657610cc6612a3b565b9050602002013530868a6118e3565b9350610ce18785611b97565b505050979650505050505050565b60405163e162402f60e01b8152336004820152602481018390526001600160a01b038281166044830152600091829186169063e162402f9060640160408051808303816000875af1158015610d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6c9190612a51565b91509150935093915050565b606080868581148015610d8a57508084145b610da65760405162461bcd60e51b81526004016105ce90612a04565b6000816001600160401b03811115610dc057610dc0612c2d565b604051908082528060200260200182016040528015610de9578160200160208202803683370190505b5090506000826001600160401b03811115610e0657610e06612c2d565b604051908082528060200260200182016040528015610e2f578160200160208202803683370190505b50905060005b83811015610f7a576000808d8d84818110610e5257610e52612a3b565b9050602002016020810190610e6791906128b2565b6001600160a01b031663e162402f338e8e87818110610e8857610e88612a3b565b905060200201358d8d88818110610ea157610ea1612a3b565b9050602002016020810190610eb691906128b2565b60405160e085901b6001600160e01b03191681526001600160a01b0393841660048201526024810192909252909116604482015260640160408051808303816000875af1158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f9190612a51565b9150915081858481518110610f4657610f46612a3b565b60200260200101818152505080848481518110610f6557610f65612a3b565b60209081029190910101525050600101610e35565b50909a909950975050505050505050565b6000848015801590610f9f57506001810188145b610fbb5760405162461bcd60e51b81526004016105ce90612a04565b610fd43330868c8c6000818110610bb857610bb8612a3b565b8360015b8281101561100257610ff88b8b60018403818110610c0257610c02612a3b565b9150600101610fd8565b61107a8b8b6001840381811061101a5761101a612a3b565b905060200201602081019061102f91906128b2565b8c8c8481811061104157611041612a3b565b905060200201602081019061105691906128b2565b8b8b6001860381811061106b5761106b612a3b565b905060200201358a868a6118e3565b9b9a5050505050505050505050565b60006110a06001600160a01b038816333086611a67565b6110ae8787878787876118e3565b979650505050505050565b6001600160a01b0383166110ff5760405162461bcd60e51b815260206004820152600d60248201526c696e76616c696420676175676560981b60448201526064016105ce565b600082116111405760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ce565b6111756001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611a67565b604051636e553f6560e01b8152600481018390526001600160a01b038281166024830152841690636e553f6590604401600060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b50505050505050565b60405163e162402f60e01b81523360048201526024810183905230604482015260009081906001600160a01b0386169063e162402f9060640160408051808303816000875af1158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190612a51565b80925081935050506000856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190612c43565b9050600080841161133557866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113309190612c43565b611337565b815b90506000808511611348578361134a565b845b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036113945761138f8682611b97565b6113a8565b6113a86001600160a01b0383168783611cd4565b505050935093915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561141057600080fd5b505af1158015611424573d6000803e3d6000fd5b50505050506114587f0000000000000000000000000000000000000000000000000000000000000000878787348888611def565b9695505050505050565b606081806001600160401b0381111561147d5761147d612c2d565b6040519080825280602002602001820160405280156114b057816020015b606081526020019060019003908161149b5790505b50915060005b818110156115b157600080308787858181106114d4576114d4612a3b565b90506020028101906114e69190612c60565b6040516114f4929190612ca6565b600060405180830381855af49150503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b5091509150816115805760448151101561154d57600080fd5b600481019050808060200190518101906115679190612cb6565b60405162461bcd60e51b81526004016105ce9190612d57565b8085848151811061159357611593612a3b565b60200260200101819052505050806115aa90612d6a565b90506114b6565b505092915050565b6000546001600160a01b031633146115e35760405162461bcd60e51b81526004016105ce90612d83565b6115f76001600160a01b0384168383611cd4565b505050565b6000546001600160a01b031633146116265760405162461bcd60e51b81526004016105ce90612d83565b6115f7828261163657600061163a565b6000195b6001600160a01b0386169190611f82565b60006116626001600160a01b038916333087611a67565b61167188888888888888611def565b98975050505050505050565b6000546001600160a01b031633146116a75760405162461bcd60e51b81526004016105ce90612d83565b6001600160a01b0381166116f45760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b60448201526064016105ce565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b60405163d505accf60e01b8152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b0387169063d505accf9060e401600060405180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b50505050505050505050565b604051631edfa7eb60e21b81526001600160a01b03861690637b7e9fac9061180a90339030908990899089908990600401612da6565b600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156118a057600080fd5b505af11580156118b4573d6000803e3d6000fd5b505050505061085b7f000000000000000000000000000000000000000000000000000000000000000086868634875b6000806119337f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8a612096565b90506000611941898961215c565b509050806001600160a01b0316896001600160a01b0316036119de5760405163a9d9db4d60e01b81526001600160a01b038781166004830152602482018790526044820186905283169063a9d9db4d906064016020604051808303816000875af11580156119b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d79190612c14565b9250611a5b565b6040516353d56bf560e01b81526001600160a01b03878116600483015260248201879052604482018690528316906353d56bf5906064016020604051808303816000875af1158015611a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a589190612c14565b92505b50509695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691611acb9190612e03565b6000604051808303816000865af19150503d8060008114611b08576040519150601f19603f3d011682016040523d82523d6000602084013e611b0d565b606091505b5091509150818015611b37575080511580611b37575080806020019051810190611b379190612e1f565b611b8f5760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a207472616e7366657246726f6d206661696044820152621b195960ea1b60648201526084016105ce565b505050505050565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bf957600080fd5b505af1158015611c0d573d6000803e3d6000fd5b50611c25925050506001600160a01b0383168261222a565b5050565b60b581600160881b8110611c425760409190911b9060801c5b69010000000000000000008110611c5e5760209190911b9060401c5b650100000000008110611c765760109190911b9060201c5b63010000008110611c8c5760089190911b9060101c5b62010000010260121c80820401600190811c80830401811c80830401811c80830401811c80830401811c80830401811c80830401901c808204811115611ccf5781045b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691611d309190612e03565b6000604051808303816000865af19150503d8060008114611d6d576040519150601f19603f3d011682016040523d82523d6000602084013e611d72565b606091505b5091509150818015611d9c575080511580611d9c575080806020019051810190611d9c9190612e1f565b611de85760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c65640060448201526064016105ce565b5050505050565b600080611e3f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008b8b8b612096565b90506000611e4d8a8a61215c565b509050806001600160a01b03168a6001600160a01b031603611ef157604051633851850760e21b81526001600160a01b03888116600483015260248201889052604482018790526064820186905283169063e146141c906084016020604051808303816000875af1158015611ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eea9190612c14565b9250611f75565b60405163186b30c760e11b81526001600160a01b0388811660048301526024820188905260448201879052606482018690528316906330d6618e906084016020604051808303816000875af1158015611f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f729190612c14565b92505b5050979650505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691611fde9190612e03565b6000604051808303816000865af19150503d806000811461201b576040519150601f19603f3d011682016040523d82523d6000602084013e612020565b606091505b509150915081801561204a57508051158061204a57508080602001905181019061204a9190612e1f565b611de85760405162461bcd60e51b815260206004820152601e60248201527f7472616e7366657248656c7065723a20617070726f7665206661696c6564000060448201526064016105ce565b60008060006120a5868661215c565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015260488101879052919350915088906068016040516020818303038152906040528051906020012088604051602001612138939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f19818403018152919052805160209091012098975050505050505050565b600080826001600160a01b0316846001600160a01b0316036121b65760405162461bcd60e51b81526020600482015260136024820152726964656e746963616c2061646472657373657360681b60448201526064016105ce565b826001600160a01b0316846001600160a01b0316106121d65782846121d9565b83835b90925090506001600160a01b0382166122235760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016105ce565b9250929050565b604080516000808252602082019092526001600160a01b0384169083906040516122549190612e03565b60006040518083038185875af1925050503d8060008114612291576040519150601f19603f3d011682016040523d82523d6000602084013e612296565b606091505b50509050806115f75760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a20455448207472616e73666572206661696044820152621b195960ea1b60648201526084016105ce565b60008083601f84011261230557600080fd5b5081356001600160401b0381111561231c57600080fd5b6020830191508360208260051b850101111561222357600080fd5b6001600160a01b038116811461234c57600080fd5b50565b6000806000806000806080878903121561236857600080fd5b86356001600160401b038082111561237f57600080fd5b61238b8a838b016122f3565b909850965060208901359150808211156123a457600080fd5b506123b189828a016122f3565b90955093505060408701356123c581612337565b80925050606087013590509295509295509295565b600080600080600060a086880312156123f257600080fd5b85356123fd81612337565b945060208601359350604086013561241481612337565b94979396509394606081013594506080013592915050565b6000806040838503121561243f57600080fd5b823561244a81612337565b946020939093013593505050565b60008060006060848603121561246d57600080fd5b833561247881612337565b95602085013595506040909401359392505050565b600080600080600080600060a0888a0312156124a857600080fd5b87356001600160401b03808211156124bf57600080fd5b6124cb8b838c016122f3565b909950975060208a01359150808211156124e457600080fd5b506124f18a828b016122f3565b909650945050604088013561250581612337565b969995985093969295946060840135945060809093013592915050565b60008060006060848603121561253757600080fd5b833561254281612337565b925060208401359150604084013561255981612337565b809150509250925092565b6000806000806000806060878903121561257d57600080fd5b86356001600160401b038082111561259457600080fd5b6125a08a838b016122f3565b909850965060208901359150808211156125b957600080fd5b6125c58a838b016122f3565b909650945060408901359150808211156125de57600080fd5b506125eb89828a016122f3565b979a9699509497509295939492505050565b600081518084526020808501945080840160005b8381101561262d57815187529582019590820190600101612611565b509495945050505050565b60408152600061264b60408301856125fd565b828103602084015261085b81856125fd565b60008060008060008060c0878903121561267657600080fd5b863561268181612337565b9550602087013561269181612337565b94506040870135935060608701356126a881612337565b9598949750929560808101359460a0909101359350915050565b600080602083850312156126d557600080fd5b82356001600160401b038111156126eb57600080fd5b6126f7858286016122f3565b90969095509350505050565b60005b8381101561271e578181015183820152602001612706565b50506000910152565b6000815180845261273f816020860160208601612703565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156127a857603f19888603018452612796858351612727565b9450928501929085019060010161277a565b5092979650505050505050565b6000806000606084860312156127ca57600080fd5b83356127d581612337565b925060208401356127e581612337565b929592945050506040919091013590565b801515811461234c57600080fd5b60008060006060848603121561281957600080fd5b833561282481612337565b9250602084013561283481612337565b91506040840135612559816127f6565b600080600080600080600060e0888a03121561285f57600080fd5b873561286a81612337565b9650602088013561287a81612337565b955060408801359450606088013561289181612337565b9699959850939660808101359560a0820135955060c0909101359350915050565b6000602082840312156128c457600080fd5b81356128cf81612337565b9392505050565b60008060008060008060c087890312156128ef57600080fd5b86356128fa81612337565b95506020870135945060408701359350606087013560ff811681146126a857600080fd5b60008060008060006080868803121561293657600080fd5b853561294181612337565b94506020860135612951816127f6565b93506040860135925060608601356001600160401b038082111561297457600080fd5b818801915088601f83011261298857600080fd5b81358181111561299757600080fd5b8960208285010111156129a957600080fd5b9699959850939650602001949392505050565b600080600080608085870312156129d257600080fd5b84356129dd81612337565b93506020850135925060408501356129f481612337565b9396929550929360600135925050565b6020808252601a908201527f696e76616c696420696e707574206172726179206c656e677468000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008060408385031215612a6457600080fd5b505080516020909101519092909150565b80516001600160401b0381168114611ccf57600080fd5b60008060408385031215612a9f57600080fd5b612aa883612a75565b9150612ab660208401612a75565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156109a9576109a9612abf565b600181815b80851115612b23578160001904821115612b0957612b09612abf565b80851615612b1657918102915b93841c9390800290612aed565b509250929050565b600082612b3a575060016109a9565b81612b47575060006109a9565b8160018114612b5d5760028114612b6757612b83565b60019150506109a9565b60ff841115612b7857612b78612abf565b50506001821b6109a9565b5060208310610133831016604e8410600b8410161715612ba6575081810a6109a9565b612bb08383612ae8565b8060001904821115612bc457612bc4612abf565b029392505050565b60006128cf60ff841683612b2b565b80820281158282048414176109a9576109a9612abf565b600082612c0f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c2657600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612c5557600080fd5b81516128cf81612337565b6000808335601e19843603018112612c7757600080fd5b8301803591506001600160401b03821115612c9157600080fd5b60200191503681900382131561222357600080fd5b8183823760009101908152919050565b600060208284031215612cc857600080fd5b81516001600160401b0380821115612cdf57600080fd5b818401915084601f830112612cf357600080fd5b815181811115612d0557612d05612c2d565b604051601f8201601f19908116603f01168101908382118183101715612d2d57612d2d612c2d565b81604052828152876020848701011115612d4657600080fd5b6110ae836020830160208801612703565b6020815260006128cf6020830184612727565b600060018201612d7c57612d7c612abf565b5060010190565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b6001600160a01b0387811682528616602082015284151560408201526060810184905260a06080820181905281018290526000828460c0840137600060c0848401015260c0601f19601f8501168301019050979650505050505050565b60008251612e15818460208701612703565b9190910192915050565b600060208284031215612e3157600080fd5b81516128cf816127f656fea2646970667358221220b600e17299239c5f8fc5ec116dce94c4a7936e2f959c0bdb7dcca49f4625ad3364736f6c63430008110033000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f0000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a000000000000000000000000ecd30c099c222abffdaf3e2a3d2455fc8e8c739e000000000000000000000000e3a39d3668c929421d3bef4f00e0cdbf42afd57d00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b83

Deployed Bytecode

0x6080604052600436106101855760003560e01c80638865305b116100d1578063d29f14091161008a578063f2fde38b11610064578063f2fde38b1461052b578063f3995c671461054b578063f5eacc2f1461056b578063fecc1b9f1461058b57600080fd5b8063d29f1409146104a3578063e14e8526146104c3578063e4021087146104f757600080fd5b80638865305b146103cf5780638da5cb5b146103e2578063ac9650d814610402578063ad5c46481461042f578063b2118a8d14610463578063c58b6a101461048357600080fd5b8063687a0b101161013e5780636d48058e116101185780636d48058e1461034f5780637129b6401461036f5780637c8d5f3b1461038f57806380500d20146103af57600080fd5b8063687a0b10146102cc57806369328dec146102ec5780636d3a957c1461032157600080fd5b806301c838fe146101c65780630cd19cbe146101ec5780630dff11651461020c57806312713bd214610240578063429d9b1d14610260578063505ce69e146102ac57600080fd5b366101c157336001600160a01b037f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16146101bf57600080fd5b005b600080fd5b6101d96101d436600461234f565b61059e565b6040519081526020015b60405180910390f35b3480156101f857600080fd5b506101d96102073660046123da565b61080a565b34801561021857600080fd5b506101d97f5732d698e38d6b60fe8360cbe25cbfdd2a1de322fc5da7b8e028ef32976f470181565b34801561024c57600080fd5b506101d961025b36600461242c565b610864565b34801561026c57600080fd5b506102947f000000000000000000000000ecd30c099c222abffdaf3e2a3d2455fc8e8c739e81565b6040516001600160a01b0390911681526020016101e3565b3480156102b857600080fd5b506101d96102c7366004612458565b6109af565b3480156102d857600080fd5b506101d96102e736600461248d565b610ac8565b3480156102f857600080fd5b5061030c610307366004612522565b610cef565b604080519283526020830191909152016101e3565b34801561032d57600080fd5b5061034161033c366004612564565b610d78565b6040516101e3929190612638565b34801561035b57600080fd5b506101d961036a36600461248d565b610f8b565b34801561037b57600080fd5b506101d961038a36600461265d565b611089565b34801561039b57600080fd5b506101bf6103aa366004612522565b6110b9565b3480156103bb57600080fd5b5061030c6103ca366004612522565b6111dc565b6101d96103dd3660046123da565b6113b3565b3480156103ee57600080fd5b50600054610294906001600160a01b031681565b34801561040e57600080fd5b5061042261041d3660046126c2565b611462565b6040516101e39190612753565b34801561043b57600080fd5b506102947f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f81565b34801561046f57600080fd5b506101bf61047e3660046127b5565b6115b9565b34801561048f57600080fd5b506101bf61049e366004612804565b6115fc565b3480156104af57600080fd5b506101d96104be366004612844565b61164b565b3480156104cf57600080fd5b506102947f000000000000000000000000e3a39d3668c929421d3bef4f00e0cdbf42afd57d81565b34801561050357600080fd5b506102947f00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b8381565b34801561053757600080fd5b506101bf6105463660046128b2565b61167d565b34801561055757600080fd5b506101bf6105663660046128d6565b611748565b34801561057757600080fd5b506101bf61058636600461291e565b6117d4565b6101d96105993660046129bc565b611843565b60008380158015906105b257506001810187145b6105d75760405162461bcd60e51b81526004016105ce90612a04565b60405180910390fd5b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b03168888600081811061061457610614612a3b565b905060200201602081019061062991906128b2565b6001600160a01b03161461067f5760405162461bcd60e51b815260206004820152601860248201527f666972737420746f6b656e206d7573742062652057455448000000000000000060448201526064016105ce565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b503493506001925050505b828110156107845761077a8a8a6001840381811061071957610719612a3b565b905060200201602081019061072e91906128b2565b8b8b8481811061074057610740612a3b565b905060200201602081019061075591906128b2565b8a8a6001860381811061076a5761076a612a3b565b90506020020135308660006118e3565b91506001016106f9565b6107fc8a8a6001840381811061079c5761079c612a3b565b90506020020160208101906107b191906128b2565b8b8b848181106107c3576107c3612a3b565b90506020020160208101906107d891906128b2565b8a8a600186038181106107ed576107ed612a3b565b9050602002013589868a6118e3565b9a9950505050505050505050565b60006108216001600160a01b038716333086611a67565b61084f867f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f873087876118e3565b905061085b8482611b97565b95945050505050565b6000806000846001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa1580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190612a51565b91509150600080866001600160a01b03166359362b886040518163ffffffff1660e01b81526004016040805180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109329190612a8c565b9092509050838361098e6109536001600160401b038516600160401b612ad5565b61096a6001600160401b038716600160401b612ad5565b61097560028c612bcc565b61097f9190612bdb565b6109899190612bf2565b611c29565b6109989190612bdb565b6109a29190612bf2565b9450505050505b92915050565b60008083116109f15760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ce565b610a266001600160a01b037f00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b8316333086611a67565b604051630c51b88f60e01b81526001600160a01b03858116600483015260248201859052604482018490527f000000000000000000000000e3a39d3668c929421d3bef4f00e0cdbf42afd57d1690630c51b88f906064016020604051808303816000875af1158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac09190612c14565b949350505050565b6000848015801590610adc57506001810188145b610af85760405162461bcd60e51b81526004016105ce90612a04565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b0316898983818110610b3457610b34612a3b565b9050602002016020810190610b4991906128b2565b6001600160a01b031614610b9f5760405162461bcd60e51b815260206004820152601760248201527f6c61737420746f6b656e206d757374206265205745544800000000000000000060448201526064016105ce565b610bde3330868c8c6000818110610bb857610bb8612a3b565b9050602002016020810190610bcd91906128b2565b6001600160a01b0316929190611a67565b8360015b82811015610c5d57610c538b8b60018403818110610c0257610c02612a3b565b9050602002016020810190610c1791906128b2565b8c8c84818110610c2957610c29612a3b565b9050602002016020810190610c3e91906128b2565b8b8b6001860381811061076a5761076a612a3b565b9150600101610be2565b610cd58b8b60018403818110610c7557610c75612a3b565b9050602002016020810190610c8a91906128b2565b8c8c84818110610c9c57610c9c612a3b565b9050602002016020810190610cb191906128b2565b8b8b60018603818110610cc657610cc6612a3b565b9050602002013530868a6118e3565b9350610ce18785611b97565b505050979650505050505050565b60405163e162402f60e01b8152336004820152602481018390526001600160a01b038281166044830152600091829186169063e162402f9060640160408051808303816000875af1158015610d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6c9190612a51565b91509150935093915050565b606080868581148015610d8a57508084145b610da65760405162461bcd60e51b81526004016105ce90612a04565b6000816001600160401b03811115610dc057610dc0612c2d565b604051908082528060200260200182016040528015610de9578160200160208202803683370190505b5090506000826001600160401b03811115610e0657610e06612c2d565b604051908082528060200260200182016040528015610e2f578160200160208202803683370190505b50905060005b83811015610f7a576000808d8d84818110610e5257610e52612a3b565b9050602002016020810190610e6791906128b2565b6001600160a01b031663e162402f338e8e87818110610e8857610e88612a3b565b905060200201358d8d88818110610ea157610ea1612a3b565b9050602002016020810190610eb691906128b2565b60405160e085901b6001600160e01b03191681526001600160a01b0393841660048201526024810192909252909116604482015260640160408051808303816000875af1158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f9190612a51565b9150915081858481518110610f4657610f46612a3b565b60200260200101818152505080848481518110610f6557610f65612a3b565b60209081029190910101525050600101610e35565b50909a909950975050505050505050565b6000848015801590610f9f57506001810188145b610fbb5760405162461bcd60e51b81526004016105ce90612a04565b610fd43330868c8c6000818110610bb857610bb8612a3b565b8360015b8281101561100257610ff88b8b60018403818110610c0257610c02612a3b565b9150600101610fd8565b61107a8b8b6001840381811061101a5761101a612a3b565b905060200201602081019061102f91906128b2565b8c8c8481811061104157611041612a3b565b905060200201602081019061105691906128b2565b8b8b6001860381811061106b5761106b612a3b565b905060200201358a868a6118e3565b9b9a5050505050505050505050565b60006110a06001600160a01b038816333086611a67565b6110ae8787878787876118e3565b979650505050505050565b6001600160a01b0383166110ff5760405162461bcd60e51b815260206004820152600d60248201526c696e76616c696420676175676560981b60448201526064016105ce565b600082116111405760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ce565b6111756001600160a01b037f000000000000000000000000e3a39d3668c929421d3bef4f00e0cdbf42afd57d16333085611a67565b604051636e553f6560e01b8152600481018390526001600160a01b038281166024830152841690636e553f6590604401600060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b50505050505050565b60405163e162402f60e01b81523360048201526024810183905230604482015260009081906001600160a01b0386169063e162402f9060640160408051808303816000875af1158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190612a51565b80925081935050506000856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190612c43565b9050600080841161133557866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113309190612c43565b611337565b815b90506000808511611348578361134a565b845b90507f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b0316826001600160a01b0316036113945761138f8682611b97565b6113a8565b6113a86001600160a01b0383168783611cd4565b505050935093915050565b60007f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561141057600080fd5b505af1158015611424573d6000803e3d6000fd5b50505050506114587f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f878787348888611def565b9695505050505050565b606081806001600160401b0381111561147d5761147d612c2d565b6040519080825280602002602001820160405280156114b057816020015b606081526020019060019003908161149b5790505b50915060005b818110156115b157600080308787858181106114d4576114d4612a3b565b90506020028101906114e69190612c60565b6040516114f4929190612ca6565b600060405180830381855af49150503d806000811461152f576040519150601f19603f3d011682016040523d82523d6000602084013e611534565b606091505b5091509150816115805760448151101561154d57600080fd5b600481019050808060200190518101906115679190612cb6565b60405162461bcd60e51b81526004016105ce9190612d57565b8085848151811061159357611593612a3b565b60200260200101819052505050806115aa90612d6a565b90506114b6565b505092915050565b6000546001600160a01b031633146115e35760405162461bcd60e51b81526004016105ce90612d83565b6115f76001600160a01b0384168383611cd4565b505050565b6000546001600160a01b031633146116265760405162461bcd60e51b81526004016105ce90612d83565b6115f7828261163657600061163a565b6000195b6001600160a01b0386169190611f82565b60006116626001600160a01b038916333087611a67565b61167188888888888888611def565b98975050505050505050565b6000546001600160a01b031633146116a75760405162461bcd60e51b81526004016105ce90612d83565b6001600160a01b0381166116f45760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b60448201526064016105ce565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b60405163d505accf60e01b8152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b0387169063d505accf9060e401600060405180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b50505050505050505050565b604051631edfa7eb60e21b81526001600160a01b03861690637b7e9fac9061180a90339030908990899089908990600401612da6565b600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505050505050565b60007f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156118a057600080fd5b505af11580156118b4573d6000803e3d6000fd5b505050505061085b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f86868634875b6000806119337f000000000000000000000000ecd30c099c222abffdaf3e2a3d2455fc8e8c739e7f5732d698e38d6b60fe8360cbe25cbfdd2a1de322fc5da7b8e028ef32976f47018a8a8a612096565b90506000611941898961215c565b509050806001600160a01b0316896001600160a01b0316036119de5760405163a9d9db4d60e01b81526001600160a01b038781166004830152602482018790526044820186905283169063a9d9db4d906064016020604051808303816000875af11580156119b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d79190612c14565b9250611a5b565b6040516353d56bf560e01b81526001600160a01b03878116600483015260248201879052604482018690528316906353d56bf5906064016020604051808303816000875af1158015611a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a589190612c14565b92505b50509695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691611acb9190612e03565b6000604051808303816000865af19150503d8060008114611b08576040519150601f19603f3d011682016040523d82523d6000602084013e611b0d565b606091505b5091509150818015611b37575080511580611b37575080806020019051810190611b379190612e1f565b611b8f5760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a207472616e7366657246726f6d206661696044820152621b195960ea1b60648201526084016105ce565b505050505050565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bf957600080fd5b505af1158015611c0d573d6000803e3d6000fd5b50611c25925050506001600160a01b0383168261222a565b5050565b60b581600160881b8110611c425760409190911b9060801c5b69010000000000000000008110611c5e5760209190911b9060401c5b650100000000008110611c765760109190911b9060201c5b63010000008110611c8c5760089190911b9060101c5b62010000010260121c80820401600190811c80830401811c80830401811c80830401811c80830401811c80830401811c80830401901c808204811115611ccf5781045b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691611d309190612e03565b6000604051808303816000865af19150503d8060008114611d6d576040519150601f19603f3d011682016040523d82523d6000602084013e611d72565b606091505b5091509150818015611d9c575080511580611d9c575080806020019051810190611d9c9190612e1f565b611de85760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c65640060448201526064016105ce565b5050505050565b600080611e3f7f000000000000000000000000ecd30c099c222abffdaf3e2a3d2455fc8e8c739e7f5732d698e38d6b60fe8360cbe25cbfdd2a1de322fc5da7b8e028ef32976f47018b8b8b612096565b90506000611e4d8a8a61215c565b509050806001600160a01b03168a6001600160a01b031603611ef157604051633851850760e21b81526001600160a01b03888116600483015260248201889052604482018790526064820186905283169063e146141c906084016020604051808303816000875af1158015611ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eea9190612c14565b9250611f75565b60405163186b30c760e11b81526001600160a01b0388811660048301526024820188905260448201879052606482018690528316906330d6618e906084016020604051808303816000875af1158015611f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f729190612c14565b92505b5050979650505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691611fde9190612e03565b6000604051808303816000865af19150503d806000811461201b576040519150601f19603f3d011682016040523d82523d6000602084013e612020565b606091505b509150915081801561204a57508051158061204a57508080602001905181019061204a9190612e1f565b611de85760405162461bcd60e51b815260206004820152601e60248201527f7472616e7366657248656c7065723a20617070726f7665206661696c6564000060448201526064016105ce565b60008060006120a5868661215c565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015260488101879052919350915088906068016040516020818303038152906040528051906020012088604051602001612138939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f19818403018152919052805160209091012098975050505050505050565b600080826001600160a01b0316846001600160a01b0316036121b65760405162461bcd60e51b81526020600482015260136024820152726964656e746963616c2061646472657373657360681b60448201526064016105ce565b826001600160a01b0316846001600160a01b0316106121d65782846121d9565b83835b90925090506001600160a01b0382166122235760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016105ce565b9250929050565b604080516000808252602082019092526001600160a01b0384169083906040516122549190612e03565b60006040518083038185875af1925050503d8060008114612291576040519150601f19603f3d011682016040523d82523d6000602084013e612296565b606091505b50509050806115f75760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a20455448207472616e73666572206661696044820152621b195960ea1b60648201526084016105ce565b60008083601f84011261230557600080fd5b5081356001600160401b0381111561231c57600080fd5b6020830191508360208260051b850101111561222357600080fd5b6001600160a01b038116811461234c57600080fd5b50565b6000806000806000806080878903121561236857600080fd5b86356001600160401b038082111561237f57600080fd5b61238b8a838b016122f3565b909850965060208901359150808211156123a457600080fd5b506123b189828a016122f3565b90955093505060408701356123c581612337565b80925050606087013590509295509295509295565b600080600080600060a086880312156123f257600080fd5b85356123fd81612337565b945060208601359350604086013561241481612337565b94979396509394606081013594506080013592915050565b6000806040838503121561243f57600080fd5b823561244a81612337565b946020939093013593505050565b60008060006060848603121561246d57600080fd5b833561247881612337565b95602085013595506040909401359392505050565b600080600080600080600060a0888a0312156124a857600080fd5b87356001600160401b03808211156124bf57600080fd5b6124cb8b838c016122f3565b909950975060208a01359150808211156124e457600080fd5b506124f18a828b016122f3565b909650945050604088013561250581612337565b969995985093969295946060840135945060809093013592915050565b60008060006060848603121561253757600080fd5b833561254281612337565b925060208401359150604084013561255981612337565b809150509250925092565b6000806000806000806060878903121561257d57600080fd5b86356001600160401b038082111561259457600080fd5b6125a08a838b016122f3565b909850965060208901359150808211156125b957600080fd5b6125c58a838b016122f3565b909650945060408901359150808211156125de57600080fd5b506125eb89828a016122f3565b979a9699509497509295939492505050565b600081518084526020808501945080840160005b8381101561262d57815187529582019590820190600101612611565b509495945050505050565b60408152600061264b60408301856125fd565b828103602084015261085b81856125fd565b60008060008060008060c0878903121561267657600080fd5b863561268181612337565b9550602087013561269181612337565b94506040870135935060608701356126a881612337565b9598949750929560808101359460a0909101359350915050565b600080602083850312156126d557600080fd5b82356001600160401b038111156126eb57600080fd5b6126f7858286016122f3565b90969095509350505050565b60005b8381101561271e578181015183820152602001612706565b50506000910152565b6000815180845261273f816020860160208601612703565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156127a857603f19888603018452612796858351612727565b9450928501929085019060010161277a565b5092979650505050505050565b6000806000606084860312156127ca57600080fd5b83356127d581612337565b925060208401356127e581612337565b929592945050506040919091013590565b801515811461234c57600080fd5b60008060006060848603121561281957600080fd5b833561282481612337565b9250602084013561283481612337565b91506040840135612559816127f6565b600080600080600080600060e0888a03121561285f57600080fd5b873561286a81612337565b9650602088013561287a81612337565b955060408801359450606088013561289181612337565b9699959850939660808101359560a0820135955060c0909101359350915050565b6000602082840312156128c457600080fd5b81356128cf81612337565b9392505050565b60008060008060008060c087890312156128ef57600080fd5b86356128fa81612337565b95506020870135945060408701359350606087013560ff811681146126a857600080fd5b60008060008060006080868803121561293657600080fd5b853561294181612337565b94506020860135612951816127f6565b93506040860135925060608601356001600160401b038082111561297457600080fd5b818801915088601f83011261298857600080fd5b81358181111561299757600080fd5b8960208285010111156129a957600080fd5b9699959850939650602001949392505050565b600080600080608085870312156129d257600080fd5b84356129dd81612337565b93506020850135925060408501356129f481612337565b9396929550929360600135925050565b6020808252601a908201527f696e76616c696420696e707574206172726179206c656e677468000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008060408385031215612a6457600080fd5b505080516020909101519092909150565b80516001600160401b0381168114611ccf57600080fd5b60008060408385031215612a9f57600080fd5b612aa883612a75565b9150612ab660208401612a75565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156109a9576109a9612abf565b600181815b80851115612b23578160001904821115612b0957612b09612abf565b80851615612b1657918102915b93841c9390800290612aed565b509250929050565b600082612b3a575060016109a9565b81612b47575060006109a9565b8160018114612b5d5760028114612b6757612b83565b60019150506109a9565b60ff841115612b7857612b78612abf565b50506001821b6109a9565b5060208310610133831016604e8410600b8410161715612ba6575081810a6109a9565b612bb08383612ae8565b8060001904821115612bc457612bc4612abf565b029392505050565b60006128cf60ff841683612b2b565b80820281158282048414176109a9576109a9612abf565b600082612c0f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c2657600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612c5557600080fd5b81516128cf81612337565b6000808335601e19843603018112612c7757600080fd5b8301803591506001600160401b03821115612c9157600080fd5b60200191503681900382131561222357600080fd5b8183823760009101908152919050565b600060208284031215612cc857600080fd5b81516001600160401b0380821115612cdf57600080fd5b818401915084601f830112612cf357600080fd5b815181811115612d0557612d05612c2d565b604051601f8201601f19908116603f01168101908382118183101715612d2d57612d2d612c2d565b81604052828152876020848701011115612d4657600080fd5b6110ae836020830160208801612703565b6020815260006128cf6020830184612727565b600060018201612d7c57612d7c612abf565b5060010190565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b6001600160a01b0387811682528616602082015284151560408201526060810184905260a06080820181905281018290526000828460c0840137600060c0848401015260c0601f19601f8501168301019050979650505050505050565b60008251612e15818460208701612703565b9190910192915050565b600060208284031215612e3157600080fd5b81516128cf816127f656fea2646970667358221220b600e17299239c5f8fc5ec116dce94c4a7936e2f959c0bdb7dcca49f4625ad3364736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f0000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a000000000000000000000000ecd30c099c222abffdaf3e2a3d2455fc8e8c739e000000000000000000000000e3a39d3668c929421d3bef4f00e0cdbf42afd57d00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b83

-----Decoded View---------------
Arg [0] : _WETH (address): 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f
Arg [1] : _owner (address): 0x7e6d097A7D948454eA253d3610bD93bB9c508B3a
Arg [2] : _factory (address): 0xecD30C099c222AbffDaf3E2A3d2455FC8e8c739E
Arg [3] : _sDYSON (address): 0xe3A39d3668C929421d3bEF4F00E0cDbf42AFd57D
Arg [4] : _DYSON (address): 0x65e413F21BF468Fed23996A8E701dD67FDf22B83

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f
Arg [1] : 0000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a
Arg [2] : 000000000000000000000000ecd30c099c222abffdaf3e2a3d2455fc8e8c739e
Arg [3] : 000000000000000000000000e3a39d3668c929421d3bef4f00e0cdbf42afd57d
Arg [4] : 00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b83


Block Transaction Gas Used Reward
view all blocks sequenced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Router serves as an entry point for swapping, depositing, and withdrawing on pairs and gauges and sDysn. It helps users handle WETH wrap/unwrap issues and prevents token approval for multiple pairs. Users can deposit dual investments, swap, boost, and stake DYSON.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.