ETH Price: $3,125.25 (-0.36%)

Contract

0xDa00199e60355a667605264d82F24e0d8D6F61a5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Multihop Batch S...127188542021-06-27 22:48:531239 days ago1624834133IN
0xDa00199e...d8D6F61a5
0 ETH0.0027151616
Multihop Batch S...121879202021-04-06 18:52:391321 days ago1617735159IN
0xDa00199e...d8D6F61a5
0.0204 ETH0.05089998161
Multihop Batch S...121030172021-03-24 17:46:251334 days ago1616607985IN
0xDa00199e...d8D6F61a5
0.15 ETH0.08785856206.8
Multihop Batch S...120317892021-03-13 18:09:201345 days ago1615658960IN
0xDa00199e...d8D6F61a5
0.64269836 ETH0.04284509194
Multihop Batch S...120303402021-03-13 13:01:161345 days ago1615640476IN
0xDa00199e...d8D6F61a5
0.32736942 ETH0.03211275156
Multihop Batch S...120303072021-03-13 12:53:561345 days ago1615640036IN
0xDa00199e...d8D6F61a5
0 ETH0.06804906161
Multihop Batch S...120302792021-03-13 12:46:311345 days ago1615639591IN
0xDa00199e...d8D6F61a5
0 ETH0.02614838144.00000145
Multihop Batch S...120302212021-03-13 12:36:051345 days ago1615638965IN
0xDa00199e...d8D6F61a5
0 ETH0.02996565165.00000023
Multihop Batch S...120292002021-03-13 8:47:491345 days ago1615625269IN
0xDa00199e...d8D6F61a5
0.35626882 ETH0.02120265103
Multihop Batch S...120280412021-03-13 4:37:241346 days ago1615610244IN
0xDa00199e...d8D6F61a5
0.66286501 ETH0.09174192160
Multihop Batch S...120280092021-03-13 4:31:141346 days ago1615609874IN
0xDa00199e...d8D6F61a5
0 ETH0.07210623129.8
Multihop Batch S...120276252021-03-13 2:59:511346 days ago1615604391IN
0xDa00199e...d8D6F61a5
0 ETH0.02451087135
Multihop Batch S...120276052021-03-13 2:53:481346 days ago1615604028IN
0xDa00199e...d8D6F61a5
0 ETH0.05224332120
Multihop Batch S...120275802021-03-13 2:46:391346 days ago1615603599IN
0xDa00199e...d8D6F61a5
0 ETH0.02404874149
Multihop Batch S...120267862021-03-12 23:51:381346 days ago1615593098IN
0xDa00199e...d8D6F61a5
0 ETH0.0895466130
Multihop Batch S...120266202021-03-12 23:17:451346 days ago1615591065IN
0xDa00199e...d8D6F61a5
1.27726053 ETH0.03842562175
Multihop Batch S...120264912021-03-12 22:50:191346 days ago1615589419IN
0xDa00199e...d8D6F61a5
2 ETH0.07793819151
Multihop Batch S...120263622021-03-12 22:20:471346 days ago1615587647IN
0xDa00199e...d8D6F61a5
0 ETH0.07526004177
Multihop Batch S...120261772021-03-12 21:41:061346 days ago1615585266IN
0xDa00199e...d8D6F61a5
0.5 ETH0.03492888148
Multihop Batch S...120258182021-03-12 20:21:381346 days ago1615580498IN
0xDa00199e...d8D6F61a5
1 ETH0.10308200
Multihop Batch S...120258182021-03-12 20:21:381346 days ago1615580498IN
0xDa00199e...d8D6F61a5
1 ETH0.11181673181
Multihop Batch S...120247482021-03-12 16:30:551346 days ago1615566655IN
0xDa00199e...d8D6F61a5
0 ETH0.11711296178
Multihop Batch S...120247342021-03-12 16:27:251346 days ago1615566445IN
0xDa00199e...d8D6F61a5
0 ETH0.18093295275
Multihop Batch S...120247112021-03-12 16:22:291346 days ago1615566149IN
0xDa00199e...d8D6F61a5
1.84071477 ETH0.12744424170
Multihop Batch S...120246992021-03-12 16:20:131346 days ago1615566013IN
0xDa00199e...d8D6F61a5
0 ETH0.10361638196.8
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
127188542021-06-27 22:48:531239 days ago1624834133
0xDa00199e...d8D6F61a5
0.03196872 ETH
127188542021-06-27 22:48:531239 days ago1624834133
0xDa00199e...d8D6F61a5
0.03196872 ETH
121879202021-04-06 18:52:391321 days ago1617735159
0xDa00199e...d8D6F61a5
0.0204 ETH
121030172021-03-24 17:46:251334 days ago1616607985
0xDa00199e...d8D6F61a5
0.15 ETH
120317892021-03-13 18:09:201345 days ago1615658960
0xDa00199e...d8D6F61a5
0.00353392 ETH
120317892021-03-13 18:09:201345 days ago1615658960
0xDa00199e...d8D6F61a5
0.00353392 ETH
120317892021-03-13 18:09:201345 days ago1615658960
0xDa00199e...d8D6F61a5
0.64269836 ETH
120303402021-03-13 13:01:161345 days ago1615640476
0xDa00199e...d8D6F61a5
0.06605822 ETH
120303402021-03-13 13:01:161345 days ago1615640476
0xDa00199e...d8D6F61a5
0.06605822 ETH
120303402021-03-13 13:01:161345 days ago1615640476
0xDa00199e...d8D6F61a5
0.32736942 ETH
120302792021-03-13 12:46:311345 days ago1615639591
0xDa00199e...d8D6F61a5
0.90905408 ETH
120302792021-03-13 12:46:311345 days ago1615639591
0xDa00199e...d8D6F61a5
0.90905408 ETH
120302212021-03-13 12:36:051345 days ago1615638965
0xDa00199e...d8D6F61a5
0.4708906 ETH
120302212021-03-13 12:36:051345 days ago1615638965
0xDa00199e...d8D6F61a5
0.4708906 ETH
120292002021-03-13 8:47:491345 days ago1615625269
0xDa00199e...d8D6F61a5
0.00139681 ETH
120292002021-03-13 8:47:491345 days ago1615625269
0xDa00199e...d8D6F61a5
0.00139681 ETH
120292002021-03-13 8:47:491345 days ago1615625269
0xDa00199e...d8D6F61a5
0.35626882 ETH
120280412021-03-13 4:37:241346 days ago1615610244
0xDa00199e...d8D6F61a5
0.66286501 ETH
120280092021-03-13 4:31:141346 days ago1615609874
0xDa00199e...d8D6F61a5
1.13873232 ETH
120280092021-03-13 4:31:141346 days ago1615609874
0xDa00199e...d8D6F61a5
1.13873232 ETH
120276252021-03-13 2:59:511346 days ago1615604391
0xDa00199e...d8D6F61a5
0.4734919 ETH
120276252021-03-13 2:59:511346 days ago1615604391
0xDa00199e...d8D6F61a5
0.4734919 ETH
120276052021-03-13 2:53:481346 days ago1615604028
0xDa00199e...d8D6F61a5
2.39177215 ETH
120276052021-03-13 2:53:481346 days ago1615604028
0xDa00199e...d8D6F61a5
2.39177215 ETH
120275802021-03-13 2:46:391346 days ago1615603599
0xDa00199e...d8D6F61a5
0.51580872 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ExchangeProxy

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-20
*/

pragma solidity 0.5.12;
pragma experimental ABIEncoderV2;


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address _payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface PoolInterface {
    function swapExactAmountIn(address, address, uint, address, uint, uint) external returns (uint, uint);
    function swapExactAmountOut(address, address, uint, address, uint, uint) external returns (uint, uint);
    function calcInGivenOut(uint, uint, uint, uint, uint, uint) external pure returns (uint);
    function calcOutGivenIn(uint, uint, uint, uint, uint, uint) external pure returns (uint);
    function getDenormalizedWeight(address) external view returns (uint);
    function getBalance(address) external view returns (uint);
    function getSwapFee() external view returns (uint);
    function gulp(address) external;
}

interface TokenInterface {
    function balanceOf(address) external view returns (uint);
    function allowance(address, address) external view returns (uint);
    function approve(address, uint) external returns (bool);
    function transfer(address, uint) external returns (bool);
    function transferFrom(address, address, uint) external returns (bool);
    function deposit() external payable;
    function withdraw(uint) external;
}

interface RegistryInterface {
    function getBestPoolsWithLimit(address, address, uint) external view returns (address[] memory);
}

contract ExchangeProxy is Ownable {

    using SafeMath for uint256;

    struct Pool {
        address pool;
        uint    tokenBalanceIn;
        uint    tokenWeightIn;
        uint    tokenBalanceOut;
        uint    tokenWeightOut;
        uint    swapFee;
        uint    effectiveLiquidity;
    }

    struct Swap {
        address pool;
        address tokenIn;
        address tokenOut;
        uint    swapAmount; // tokenInAmount / tokenOutAmount
        uint    limitReturnAmount; // minAmountOut / maxAmountIn
        uint    maxPrice;
    }

    TokenInterface weth;
    RegistryInterface registry;
    address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    uint private constant BONE = 10**18;

    constructor(address _weth) public {
        weth = TokenInterface(_weth);
    }

    function setRegistry(address _registry) external onlyOwner {
        registry = RegistryInterface(_registry);
    }

    function batchSwapExactIn(
        Swap[] memory swaps,
        TokenInterface tokenIn,
        TokenInterface tokenOut,
        uint totalAmountIn,
        uint minTotalAmountOut
    )
    public payable
    returns (uint totalAmountOut)
    {
        transferFromAll(tokenIn, totalAmountIn);

        for (uint i = 0; i < swaps.length; i++) {
            Swap memory swap = swaps[i];
            TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn);
            PoolInterface pool = PoolInterface(swap.pool);

            if (SwapTokenIn.allowance(address(this), swap.pool) > 0) {
                safeApprove(SwapTokenIn, swap.pool, 0);
            }
            safeApprove(SwapTokenIn, swap.pool, swap.swapAmount);

            (uint tokenAmountOut,) = pool.swapExactAmountIn(
                msg.sender,
                swap.tokenIn,
                swap.swapAmount,
                swap.tokenOut,
                swap.limitReturnAmount,
                swap.maxPrice
            );
            totalAmountOut = tokenAmountOut.add(totalAmountOut);
        }

        require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT");

        transferAll(tokenOut, totalAmountOut);
        transferAll(tokenIn, getBalance(tokenIn));
    }

    function batchSwapExactOut(
        Swap[] memory swaps,
        TokenInterface tokenIn,
        TokenInterface tokenOut,
        uint maxTotalAmountIn
    )
    public payable
    returns (uint totalAmountIn)
    {
        transferFromAll(tokenIn, maxTotalAmountIn);

        for (uint i = 0; i < swaps.length; i++) {
            Swap memory swap = swaps[i];
            TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn);
            PoolInterface pool = PoolInterface(swap.pool);

            if (SwapTokenIn.allowance(address(this), swap.pool) > 0) {
                safeApprove(SwapTokenIn, swap.pool, 0);
            }
            safeApprove(SwapTokenIn, swap.pool, swap.limitReturnAmount);

            (uint tokenAmountIn,) = pool.swapExactAmountOut(
                msg.sender,
                swap.tokenIn,
                swap.limitReturnAmount,
                swap.tokenOut,
                swap.swapAmount,
                swap.maxPrice
            );
            totalAmountIn = tokenAmountIn.add(totalAmountIn);
            pool.gulp(swap.tokenIn);
        }
        require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN");

        transferAll(tokenOut, getBalance(tokenOut));
        transferAll(tokenIn, getBalance(tokenIn));

    }

    function multihopBatchSwapExactIn(
        Swap[][] memory swapSequences,
        TokenInterface tokenIn,
        TokenInterface tokenOut,
        uint totalAmountIn,
        uint minTotalAmountOut
    )
    public payable
    returns (uint totalAmountOut)
    {

        transferFromAll(tokenIn, totalAmountIn);

        for (uint i = 0; i < swapSequences.length; i++) {
            uint tokenAmountOut;
            for (uint k = 0; k < swapSequences[i].length; k++) {
                Swap memory swap = swapSequences[i][k];
                TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn);
                if (k == 1) {
                    // Makes sure that on the second swap the output of the first was used
                    // so there is not intermediate token leftover
                    swap.swapAmount = tokenAmountOut;
                }

                PoolInterface pool = PoolInterface(swap.pool);
                if (SwapTokenIn.allowance(address(this), swap.pool) > 0) {
                    safeApprove(SwapTokenIn, swap.pool, 0);
                }
                safeApprove(SwapTokenIn, swap.pool, swap.swapAmount);

                (tokenAmountOut,) = pool.swapExactAmountIn(
                    msg.sender,
                    swap.tokenIn,
                    swap.swapAmount,
                    swap.tokenOut,
                    swap.limitReturnAmount,
                    swap.maxPrice
                );
            }
            // This takes the amountOut of the last swap
            totalAmountOut = tokenAmountOut.add(totalAmountOut);
        }

        require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT");

        transferAll(tokenOut, totalAmountOut);
        transferAll(tokenIn, getBalance(tokenIn));

    }

    function multihopBatchSwapExactOut(
        Swap[][] memory swapSequences,
        TokenInterface tokenIn,
        TokenInterface tokenOut,
        uint maxTotalAmountIn
    )
    public payable
    returns (uint totalAmountIn)
    {

        transferFromAll(tokenIn, maxTotalAmountIn);

        for (uint i = 0; i < swapSequences.length; i++) {
            uint tokenAmountInFirstSwap;
            // Specific code for a simple swap and a multihop (2 swaps in sequence)
            if (swapSequences[i].length == 1) {
                Swap memory swap = swapSequences[i][0];
                TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn);

                PoolInterface pool = PoolInterface(swap.pool);
                if (SwapTokenIn.allowance(address(this), swap.pool) > 0) {
                    safeApprove(SwapTokenIn, swap.pool, 0);
                }
                safeApprove(SwapTokenIn, swap.pool, swap.limitReturnAmount);

                (tokenAmountInFirstSwap,) = pool.swapExactAmountOut(
                    msg.sender,
                    swap.tokenIn,
                    swap.limitReturnAmount,
                    swap.tokenOut,
                    swap.swapAmount,
                    swap.maxPrice
                );
                pool.gulp(swap.tokenIn);
            } else {
                // Consider we are swapping A -> B and B -> C. The goal is to buy a given amount
                // of token C. But first we need to buy B with A so we can then buy C with B
                // To get the exact amount of C we then first need to calculate how much B we'll need:
                uint intermediateTokenAmount; // This would be token B as described above
                Swap memory secondSwap = swapSequences[i][1];
                PoolInterface poolSecondSwap = PoolInterface(secondSwap.pool);
                intermediateTokenAmount = poolSecondSwap.calcInGivenOut(
                    poolSecondSwap.getBalance(secondSwap.tokenIn),
                    poolSecondSwap.getDenormalizedWeight(secondSwap.tokenIn),
                    poolSecondSwap.getBalance(secondSwap.tokenOut),
                    poolSecondSwap.getDenormalizedWeight(secondSwap.tokenOut),
                    secondSwap.swapAmount,
                    poolSecondSwap.getSwapFee()
                );

                //// Buy intermediateTokenAmount of token B with A in the first pool
                Swap memory firstSwap = swapSequences[i][0];
                TokenInterface FirstSwapTokenIn = TokenInterface(firstSwap.tokenIn);
                PoolInterface poolFirstSwap = PoolInterface(firstSwap.pool);
                if (FirstSwapTokenIn.allowance(address(this), firstSwap.pool) < uint(-1)) {
                    safeApprove(FirstSwapTokenIn, firstSwap.pool, uint(-1));
                }

                (tokenAmountInFirstSwap,) = poolFirstSwap.swapExactAmountOut(
                    msg.sender,
                    firstSwap.tokenIn,
                    firstSwap.limitReturnAmount,
                    firstSwap.tokenOut,
                    intermediateTokenAmount, // This is the amount of token B we need
                    firstSwap.maxPrice
                );
                poolFirstSwap.gulp(firstSwap.tokenIn);

                //// Buy the final amount of token C desired
                TokenInterface SecondSwapTokenIn = TokenInterface(secondSwap.tokenIn);
                if (SecondSwapTokenIn.allowance(address(this), secondSwap.pool) < uint(-1)) {
                    safeApprove(SecondSwapTokenIn, secondSwap.pool, uint(-1));
                }

                poolSecondSwap.swapExactAmountOut(
                    msg.sender,
                    secondSwap.tokenIn,
                    secondSwap.limitReturnAmount,
                    secondSwap.tokenOut,
                    secondSwap.swapAmount,
                    secondSwap.maxPrice
                );
                poolSecondSwap.gulp(secondSwap.tokenIn);
            }
            totalAmountIn = tokenAmountInFirstSwap.add(totalAmountIn);
        }

        require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN");

        transferAll(tokenOut, getBalance(tokenOut));
        transferAll(tokenIn, getBalance(tokenIn));

    }


    function transferFromAll(TokenInterface token, uint amount) internal returns(bool) {
        if (isETH(token)) {
            weth.deposit.value(msg.value)();
        } else {
            //            require(token.transferFrom(msg.sender, address(this), amount), "ERR_TRANSFER_FAILED");
            safeTransferFrom(token, msg.sender, address(this), amount);
        }
    }

    function getBalance(TokenInterface token) internal view returns (uint) {
        if (isETH(token)) {
            return weth.balanceOf(address(this));
        } else {
            return token.balanceOf(address(this));
        }
    }

    function transferAll(TokenInterface token, uint amount) internal returns(bool) {
        if (amount == 0) {
            return true;
        }

        if (isETH(token)) {
            weth.withdraw(amount);
            (bool xfer,) = msg.sender.call.value(amount)("");
            require(xfer, "ERR_ETH_FAILED");
        } else {
            //            require(token.transfer(msg.sender, amount), "ERR_TRANSFER_FAILED");
            safeTransfer(token, msg.sender, amount);
        }
    }

    function isETH(TokenInterface token) internal pure returns(bool) {
        return (address(token) == ETH_ADDRESS);
    }

    function safeTransfer(TokenInterface token, address to , uint256 amount) internal {
        bytes memory data = abi.encodeWithSelector(token.transfer.selector, to, amount);
        bytes memory returndata = functionCall(address(token), data, "low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "not succeed");
        }
    }

    function safeTransferFrom(TokenInterface token, address from, address to , uint256 amount) internal {
        bytes memory data = abi.encodeWithSelector(token.transferFrom.selector, from, to, amount);
        bytes memory returndata = functionCall(address(token), data, "low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "not succeed");
        }
    }

    function safeApprove(TokenInterface token, address to , uint256 amount) internal {
        bytes memory data = abi.encodeWithSelector(token.approve.selector, to, amount);
        bytes memory returndata = functionCall(address(token), data, "low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "not succeed");
        }
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.call(data);// value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"}],"name":"batchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"}],"name":"batchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"}],"name":"multihopBatchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"}],"name":"multihopBatchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200221a3803806200221a8339810160408190526200003491620000d0565b6000620000496001600160e01b03620000b916565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b039290921691909117905562000125565b3390565b8051620000ca816200010b565b92915050565b600060208284031215620000e357600080fd5b6000620000f18484620000bd565b949350505050565b60006001600160a01b038216620000ca565b6200011681620000f9565b81146200012257600080fd5b50565b6120e580620001356000396000f3fe6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100ec5780638f32d59b1461010e578063a91ee0dc14610130578063e2b3974614610150578063f2fde38b1461016357610086565b80632db5813414610088578063715018a6146100b157806386b2ecc4146100c65780638743ad58146100d9575b005b61009b610096366004611b0e565b610183565b6040516100a89190611f6c565b60405180910390f35b3480156100bd57600080fd5b506100866103e8565b61009b6100d4366004611a0a565b610456565b61009b6100e7366004611b47565b610d3c565b3480156100f857600080fd5b50610101610f2f565b6040516100a89190611e09565b34801561011a57600080fd5b50610123610f3e565b6040516100a89190611edd565b34801561013c57600080fd5b5061008661014b3660046119ec565b610f62565b61009b61015e366004611a82565b610fa8565b34801561016f57600080fd5b5061008661017e3660046119ec565b6111a0565b600061018f84836111d0565b5060005b8551811015610395576101a461177d565b8682815181106101b057fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906101f89030908690600401611e25565b60206040518083038186803b15801561021057600080fd5b505afa158015610224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102489190810190611ba0565b111561025e5761025e8284600001516000611260565b6102718284600001518560800151611260565b6000816001600160a01b0316634d128b773386602001518760800151886040015189606001518a60a001516040518763ffffffff1660e01b81526004016102bd96959493929190611e40565b6040805180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061030e9190810190611bbe565b509050610321818763ffffffff61132f16565b6020850151604051631185197d60e31b81529197506001600160a01b03841691638c28cbe89161035391600401611e09565b600060405180830381600087803b15801561036d57600080fd5b505af1158015610381573d6000803e3d6000fd5b505060019096019550610193945050505050565b50818111156103bf5760405162461bcd60e51b81526004016103b690611f3c565b60405180910390fd5b6103d1836103cc8561135b565b611423565b506103df846103cc8661135b565b50949350505050565b6103f0610f3e565b61040c5760405162461bcd60e51b81526004016103b690611f4c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061046284836111d0565b5060005b855181101561039557600086828151811061047d57fe5b6020026020010151516001141561067e5761049661177d565b8783815181106104a257fe5b60200260200101516000815181106104b657fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906104fe9030908690600401611e25565b60206040518083038186803b15801561051657600080fd5b505afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061054e9190810190611ba0565b1115610564576105648284600001516000611260565b6105778284600001518560800151611260565b60208301516080840151604080860151606087015160a08801519251634d128b7760e01b81526001600160a01b03871695634d128b77956105c095339592949193600401611e40565b6040805180830381600087803b1580156105d957600080fd5b505af11580156105ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106119190810190611bbe565b506020840151604051631185197d60e31b81529195506001600160a01b03831691638c28cbe89161064491600401611e09565b600060405180830381600087803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b50505050505050610d21565b600061068861177d565b88848151811061069457fe5b60200260200101516001815181106106a857fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916106ef91600401611e09565b60206040518083038186803b15801561070757600080fd5b505afa15801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061073f9190810190611ba0565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161076f9190600401611e09565b60206040518083038186803b15801561078757600080fd5b505afa15801561079b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107bf9190810190611ba0565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916107ef9190600401611e09565b60206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061083f9190810190611ba0565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce69161086f9190600401611e09565b60206040518083038186803b15801561088757600080fd5b505afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108bf9190810190611ba0565b8760600151876001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156108fd57600080fd5b505afa158015610911573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109359190810190611ba0565b6040518763ffffffff1660e01b815260040161095696959493929190611f7a565b60206040518083038186803b15801561096e57600080fd5b505afa158015610982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109a69190810190611ba0565b92506109b061177d565b8a86815181106109bc57fe5b60200260200101516000815181106109d057fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e90610a199030908690600401611e25565b60206040518083038186803b158015610a3157600080fd5b505afa158015610a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a699190810190611ba0565b1015610a8057610a80828460000151600019611260565b806001600160a01b0316634d128b77338560200151866080015187604001518b8960a001516040518763ffffffff1660e01b8152600401610ac696959493929190611e40565b6040805180830381600087803b158015610adf57600080fd5b505af1158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b179190810190611bbe565b506020840151604051631185197d60e31b81529198506001600160a01b03831691638c28cbe891610b4a91600401611e09565b600060405180830381600087803b158015610b6457600080fd5b505af1158015610b78573d6000803e3d6000fd5b5050505060208501518551604051636eb1769f60e11b8152600019916001600160a01b0384169163dd62ed3e91610bb491309190600401611e25565b60206040518083038186803b158015610bcc57600080fd5b505afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c049190810190611ba0565b1015610c1b57610c1b818760000151600019611260565b6020860151608087015160408089015160608a015160a08b01519251634d128b7760e01b81526001600160a01b038b1695634d128b7795610c6495339592949193600401611e40565b6040805180830381600087803b158015610c7d57600080fd5b505af1158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cb59190810190611bbe565b50506020860151604051631185197d60e31b81526001600160a01b03871691638c28cbe891610ce79190600401611e09565b600060405180830381600087803b158015610d0157600080fd5b505af1158015610d15573d6000803e3d6000fd5b50505050505050505050505b610d31818463ffffffff61132f16565b925050600101610466565b6000610d4885846111d0565b5060005b8651811015610eec57610d5d61177d565b878281518110610d6957fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90610db19030908690600401611e25565b60206040518083038186803b158015610dc957600080fd5b505afa158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e019190810190611ba0565b1115610e1757610e178284600001516000611260565b610e2a8284600001518560600151611260565b6000816001600160a01b031663255de7bb3386602001518760600151886040015189608001518a60a001516040518763ffffffff1660e01b8152600401610e7696959493929190611e40565b6040805180830381600087803b158015610e8f57600080fd5b505af1158015610ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ec79190810190611bbe565b509050610eda818763ffffffff61132f16565b95505060019093019250610d4c915050565b5081811015610f0d5760405162461bcd60e51b81526004016103b690611f2c565b610f178482611423565b50610f25856103cc8761135b565b5095945050505050565b6000546001600160a01b031690565b600080546001600160a01b0316610f5361152f565b6001600160a01b031614905090565b610f6a610f3e565b610f865760405162461bcd60e51b81526004016103b690611f4c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fb485846111d0565b5060005b8651811015610eec576000805b888381518110610fd157fe5b60200260200101515181101561118457610fe961177d565b898481518110610ff557fe5b6020026020010151828151811061100857fe5b60200260200101519050600081602001519050826001141561102c57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e9061105f9030908690600401611e25565b60206040518083038186803b15801561107757600080fd5b505afa15801561108b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110af9190810190611ba0565b11156110c5576110c58284600001516000611260565b6110d88284600001518560600151611260565b60208301516060840151604080860151608087015160a0880151925163255de7bb60e01b81526001600160a01b0387169563255de7bb9561112195339592949193600401611e40565b6040805180830381600087803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111729190810190611bbe565b5094505060019092019150610fc59050565b50611195818463ffffffff61132f16565b925050600101610fb8565b6111a8610f3e565b6111c45760405162461bcd60e51b81526004016103b690611f4c565b6111cd81611533565b50565b60006111db836115b4565b1561124e57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561123057600080fd5b505af1158015611244573d6000803e3d6000fd5b505050505061125a565b61125a833330856115d9565b92915050565b60405160609063095ea7b360e01b9061127f9085908590602401611ec2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060606112ee8583604051806040016040528060158152602001741b1bddcb5b195d995b0818d85b1b0819985a5b1959605a1b8152506116ab565b805190915015611328578080602001905161130c9190810190611b82565b6113285760405162461bcd60e51b81526004016103b690611f0c565b5050505050565b6000828201838110156113545760405162461bcd60e51b81526004016103b690611f1c565b9392505050565b6000611366826115b4565b156113f2576001546040516370a0823160e01b81526001600160a01b03909116906370a082319061139b903090600401611e17565b60206040518083038186803b1580156113b357600080fd5b505afa1580156113c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113eb9190810190611ba0565b905061141e565b6040516370a0823160e01b81526001600160a01b038316906370a082319061139b903090600401611e17565b919050565b6000816114325750600161125a565b61143b836115b4565b1561152457600154604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90611470908590600401611f6c565b600060405180830381600087803b15801561148a57600080fd5b505af115801561149e573d6000803e3d6000fd5b505050506000336001600160a01b0316836040516114bb90611dfe565b60006040518083038185875af1925050503d80600081146114f8576040519150601f19603f3d011682016040523d82523d6000602084013e6114fd565b606091505b505090508061151e5760405162461bcd60e51b81526004016103b690611f5c565b5061125a565b61125a8333846116c0565b3390565b6001600160a01b0381166115595760405162461bcd60e51b81526004016103b690611efc565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b6040516060906323b872dd60e01b906115fa90869086908690602401611e9a565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060606116698683604051806040016040528060158152602001741b1bddcb5b195d995b0818d85b1b0819985a5b1959605a1b8152506116ab565b8051909150156116a357808060200190516116879190810190611b82565b6116a35760405162461bcd60e51b81526004016103b690611f0c565b505050505050565b60606116b88484846116df565b949350505050565b60405160609063a9059cbb60e01b9061127f9085908590602401611ec2565b606060006060856001600160a01b0316856040516116fd9190611df2565b6000604051808303816000865af19150503d806000811461173a576040519150601f19603f3d011682016040523d82523d6000602084013e61173f565b606091505b509150915081156117535791506113549050565b8051156117635780518082602001fd5b8360405162461bcd60e51b81526004016103b69190611eeb565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b803561125a81612073565b600082601f8301126117ea57600080fd5b81356117fd6117f882611fd6565b611faf565b81815260209384019390925082018360005b8381101561183b57813586016118258882611845565b845250602092830192919091019060010161180f565b5050505092915050565b600082601f83011261185657600080fd5b81356118646117f882611fd6565b915081818352602084019350602081019050838560c084028201111561188957600080fd5b60005b8381101561183b578161189f888261193f565b84525060209092019160c0919091019060010161188c565b600082601f8301126118c857600080fd5b81356118d66117f882611fd6565b915081818352602084019350602081019050838560c08402820111156118fb57600080fd5b60005b8381101561183b5781611911888261193f565b84525060209092019160c091909101906001016118fe565b805161125a81612087565b803561125a81612090565b600060c0828403121561195157600080fd5b61195b60c0611faf565b9050600061196984846117ce565b825250602061197a848483016117ce565b602083015250604061198e848285016117ce565b60408301525060606119a2848285016119d6565b60608301525060806119b6848285016119d6565b60808301525060a06119ca848285016119d6565b60a08301525092915050565b803561125a81612099565b805161125a81612099565b6000602082840312156119fe57600080fd5b60006116b884846117ce565b60008060008060808587031215611a2057600080fd5b843567ffffffffffffffff811115611a3757600080fd5b611a43878288016117d9565b9450506020611a5487828801611934565b9350506040611a6587828801611934565b9250506060611a76878288016119d6565b91505092959194509250565b600080600080600060a08688031215611a9a57600080fd5b853567ffffffffffffffff811115611ab157600080fd5b611abd888289016117d9565b9550506020611ace88828901611934565b9450506040611adf88828901611934565b9350506060611af0888289016119d6565b9250506080611b01888289016119d6565b9150509295509295909350565b60008060008060808587031215611b2457600080fd5b843567ffffffffffffffff811115611b3b57600080fd5b611a43878288016118b7565b600080600080600060a08688031215611b5f57600080fd5b853567ffffffffffffffff811115611b7657600080fd5b611abd888289016118b7565b600060208284031215611b9457600080fd5b60006116b88484611929565b600060208284031215611bb257600080fd5b60006116b884846119e1565b60008060408385031215611bd157600080fd5b6000611bdd85856119e1565b9250506020611bee858286016119e1565b9150509250929050565b611c018161202e565b82525050565b611c0181612004565b611c018161200f565b6000611c2482611ff7565b611c2e818561141e565b9350611c3e818560208601612039565b9290920192915050565b6000611c5382611ff7565b611c5d8185611ffb565b9350611c6d818560208601612039565b611c7681612069565b9093019392505050565b6000611c8d602683611ffb565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611cd5600b83611ffb565b6a1b9bdd081cdd58d8d9595960aa1b815260200192915050565b6000611cfc601b83611ffb565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611d35600d83611ffb565b6c11549497d31253525517d3d555609a1b815260200192915050565b6000611d5e600c83611ffb565b6b22a9292fa624a6a4aa2fa4a760a11b815260200192915050565b6000611d86602083611ffb565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000611dbf600e83611ffb565b6d11549497d1551217d1905253115160921b815260200192915050565b600061125a60008361141e565b611c018161202b565b60006113548284611c19565b600061125a82611ddc565b6020810161125a8284611c07565b6020810161125a8284611bf8565b60408101611e338285611bf8565b6113546020830184611c07565b60c08101611e4e8289611bf8565b611e5b6020830188611c07565b611e686040830187611de9565b611e756060830186611c07565b611e826080830185611de9565b611e8f60a0830184611de9565b979650505050505050565b60608101611ea88286611c07565b611eb56020830185611c07565b6116b86040830184611de9565b60408101611ed08285611c07565b6113546020830184611de9565b6020810161125a8284611c10565b602080825281016113548184611c48565b6020808252810161125a81611c80565b6020808252810161125a81611cc8565b6020808252810161125a81611cef565b6020808252810161125a81611d28565b6020808252810161125a81611d51565b6020808252810161125a81611d79565b6020808252810161125a81611db2565b6020810161125a8284611de9565b60c08101611f888289611de9565b611f956020830188611de9565b611fa26040830187611de9565b611e756060830186611de9565b60405181810167ffffffffffffffff81118282101715611fce57600080fd5b604052919050565b600067ffffffffffffffff821115611fed57600080fd5b5060209081020190565b5190565b90815260200190565b600061125a8261201f565b151590565b600061125a82612004565b6001600160a01b031690565b90565b600061125a82612014565b60005b8381101561205457818101518382015260200161203c565b83811115612063576000848401525b50505050565b601f01601f191690565b61207c81612004565b81146111cd57600080fd5b61207c8161200f565b61207c81612014565b61207c8161202b56fea365627a7a723158201a8b20dd4a4ab2b5aecf0615ae3a9eac9de34ee2511bb6df5076cc3ac742a0ea6c6578706572696d656e74616cf564736f6c634300050c0040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106100865760003560e01c80638da5cb5b116100595780638da5cb5b146100ec5780638f32d59b1461010e578063a91ee0dc14610130578063e2b3974614610150578063f2fde38b1461016357610086565b80632db5813414610088578063715018a6146100b157806386b2ecc4146100c65780638743ad58146100d9575b005b61009b610096366004611b0e565b610183565b6040516100a89190611f6c565b60405180910390f35b3480156100bd57600080fd5b506100866103e8565b61009b6100d4366004611a0a565b610456565b61009b6100e7366004611b47565b610d3c565b3480156100f857600080fd5b50610101610f2f565b6040516100a89190611e09565b34801561011a57600080fd5b50610123610f3e565b6040516100a89190611edd565b34801561013c57600080fd5b5061008661014b3660046119ec565b610f62565b61009b61015e366004611a82565b610fa8565b34801561016f57600080fd5b5061008661017e3660046119ec565b6111a0565b600061018f84836111d0565b5060005b8551811015610395576101a461177d565b8682815181106101b057fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906101f89030908690600401611e25565b60206040518083038186803b15801561021057600080fd5b505afa158015610224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102489190810190611ba0565b111561025e5761025e8284600001516000611260565b6102718284600001518560800151611260565b6000816001600160a01b0316634d128b773386602001518760800151886040015189606001518a60a001516040518763ffffffff1660e01b81526004016102bd96959493929190611e40565b6040805180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061030e9190810190611bbe565b509050610321818763ffffffff61132f16565b6020850151604051631185197d60e31b81529197506001600160a01b03841691638c28cbe89161035391600401611e09565b600060405180830381600087803b15801561036d57600080fd5b505af1158015610381573d6000803e3d6000fd5b505060019096019550610193945050505050565b50818111156103bf5760405162461bcd60e51b81526004016103b690611f3c565b60405180910390fd5b6103d1836103cc8561135b565b611423565b506103df846103cc8661135b565b50949350505050565b6103f0610f3e565b61040c5760405162461bcd60e51b81526004016103b690611f4c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061046284836111d0565b5060005b855181101561039557600086828151811061047d57fe5b6020026020010151516001141561067e5761049661177d565b8783815181106104a257fe5b60200260200101516000815181106104b657fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906104fe9030908690600401611e25565b60206040518083038186803b15801561051657600080fd5b505afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061054e9190810190611ba0565b1115610564576105648284600001516000611260565b6105778284600001518560800151611260565b60208301516080840151604080860151606087015160a08801519251634d128b7760e01b81526001600160a01b03871695634d128b77956105c095339592949193600401611e40565b6040805180830381600087803b1580156105d957600080fd5b505af11580156105ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106119190810190611bbe565b506020840151604051631185197d60e31b81529195506001600160a01b03831691638c28cbe89161064491600401611e09565b600060405180830381600087803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b50505050505050610d21565b600061068861177d565b88848151811061069457fe5b60200260200101516001815181106106a857fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916106ef91600401611e09565b60206040518083038186803b15801561070757600080fd5b505afa15801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061073f9190810190611ba0565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161076f9190600401611e09565b60206040518083038186803b15801561078757600080fd5b505afa15801561079b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107bf9190810190611ba0565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916107ef9190600401611e09565b60206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061083f9190810190611ba0565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce69161086f9190600401611e09565b60206040518083038186803b15801561088757600080fd5b505afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108bf9190810190611ba0565b8760600151876001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156108fd57600080fd5b505afa158015610911573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109359190810190611ba0565b6040518763ffffffff1660e01b815260040161095696959493929190611f7a565b60206040518083038186803b15801561096e57600080fd5b505afa158015610982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109a69190810190611ba0565b92506109b061177d565b8a86815181106109bc57fe5b60200260200101516000815181106109d057fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e90610a199030908690600401611e25565b60206040518083038186803b158015610a3157600080fd5b505afa158015610a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a699190810190611ba0565b1015610a8057610a80828460000151600019611260565b806001600160a01b0316634d128b77338560200151866080015187604001518b8960a001516040518763ffffffff1660e01b8152600401610ac696959493929190611e40565b6040805180830381600087803b158015610adf57600080fd5b505af1158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b179190810190611bbe565b506020840151604051631185197d60e31b81529198506001600160a01b03831691638c28cbe891610b4a91600401611e09565b600060405180830381600087803b158015610b6457600080fd5b505af1158015610b78573d6000803e3d6000fd5b5050505060208501518551604051636eb1769f60e11b8152600019916001600160a01b0384169163dd62ed3e91610bb491309190600401611e25565b60206040518083038186803b158015610bcc57600080fd5b505afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c049190810190611ba0565b1015610c1b57610c1b818760000151600019611260565b6020860151608087015160408089015160608a015160a08b01519251634d128b7760e01b81526001600160a01b038b1695634d128b7795610c6495339592949193600401611e40565b6040805180830381600087803b158015610c7d57600080fd5b505af1158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cb59190810190611bbe565b50506020860151604051631185197d60e31b81526001600160a01b03871691638c28cbe891610ce79190600401611e09565b600060405180830381600087803b158015610d0157600080fd5b505af1158015610d15573d6000803e3d6000fd5b50505050505050505050505b610d31818463ffffffff61132f16565b925050600101610466565b6000610d4885846111d0565b5060005b8651811015610eec57610d5d61177d565b878281518110610d6957fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90610db19030908690600401611e25565b60206040518083038186803b158015610dc957600080fd5b505afa158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e019190810190611ba0565b1115610e1757610e178284600001516000611260565b610e2a8284600001518560600151611260565b6000816001600160a01b031663255de7bb3386602001518760600151886040015189608001518a60a001516040518763ffffffff1660e01b8152600401610e7696959493929190611e40565b6040805180830381600087803b158015610e8f57600080fd5b505af1158015610ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ec79190810190611bbe565b509050610eda818763ffffffff61132f16565b95505060019093019250610d4c915050565b5081811015610f0d5760405162461bcd60e51b81526004016103b690611f2c565b610f178482611423565b50610f25856103cc8761135b565b5095945050505050565b6000546001600160a01b031690565b600080546001600160a01b0316610f5361152f565b6001600160a01b031614905090565b610f6a610f3e565b610f865760405162461bcd60e51b81526004016103b690611f4c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fb485846111d0565b5060005b8651811015610eec576000805b888381518110610fd157fe5b60200260200101515181101561118457610fe961177d565b898481518110610ff557fe5b6020026020010151828151811061100857fe5b60200260200101519050600081602001519050826001141561102c57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e9061105f9030908690600401611e25565b60206040518083038186803b15801561107757600080fd5b505afa15801561108b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110af9190810190611ba0565b11156110c5576110c58284600001516000611260565b6110d88284600001518560600151611260565b60208301516060840151604080860151608087015160a0880151925163255de7bb60e01b81526001600160a01b0387169563255de7bb9561112195339592949193600401611e40565b6040805180830381600087803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111729190810190611bbe565b5094505060019092019150610fc59050565b50611195818463ffffffff61132f16565b925050600101610fb8565b6111a8610f3e565b6111c45760405162461bcd60e51b81526004016103b690611f4c565b6111cd81611533565b50565b60006111db836115b4565b1561124e57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561123057600080fd5b505af1158015611244573d6000803e3d6000fd5b505050505061125a565b61125a833330856115d9565b92915050565b60405160609063095ea7b360e01b9061127f9085908590602401611ec2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060606112ee8583604051806040016040528060158152602001741b1bddcb5b195d995b0818d85b1b0819985a5b1959605a1b8152506116ab565b805190915015611328578080602001905161130c9190810190611b82565b6113285760405162461bcd60e51b81526004016103b690611f0c565b5050505050565b6000828201838110156113545760405162461bcd60e51b81526004016103b690611f1c565b9392505050565b6000611366826115b4565b156113f2576001546040516370a0823160e01b81526001600160a01b03909116906370a082319061139b903090600401611e17565b60206040518083038186803b1580156113b357600080fd5b505afa1580156113c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113eb9190810190611ba0565b905061141e565b6040516370a0823160e01b81526001600160a01b038316906370a082319061139b903090600401611e17565b919050565b6000816114325750600161125a565b61143b836115b4565b1561152457600154604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90611470908590600401611f6c565b600060405180830381600087803b15801561148a57600080fd5b505af115801561149e573d6000803e3d6000fd5b505050506000336001600160a01b0316836040516114bb90611dfe565b60006040518083038185875af1925050503d80600081146114f8576040519150601f19603f3d011682016040523d82523d6000602084013e6114fd565b606091505b505090508061151e5760405162461bcd60e51b81526004016103b690611f5c565b5061125a565b61125a8333846116c0565b3390565b6001600160a01b0381166115595760405162461bcd60e51b81526004016103b690611efc565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b6040516060906323b872dd60e01b906115fa90869086908690602401611e9a565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060606116698683604051806040016040528060158152602001741b1bddcb5b195d995b0818d85b1b0819985a5b1959605a1b8152506116ab565b8051909150156116a357808060200190516116879190810190611b82565b6116a35760405162461bcd60e51b81526004016103b690611f0c565b505050505050565b60606116b88484846116df565b949350505050565b60405160609063a9059cbb60e01b9061127f9085908590602401611ec2565b606060006060856001600160a01b0316856040516116fd9190611df2565b6000604051808303816000865af19150503d806000811461173a576040519150601f19603f3d011682016040523d82523d6000602084013e61173f565b606091505b509150915081156117535791506113549050565b8051156117635780518082602001fd5b8360405162461bcd60e51b81526004016103b69190611eeb565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b803561125a81612073565b600082601f8301126117ea57600080fd5b81356117fd6117f882611fd6565b611faf565b81815260209384019390925082018360005b8381101561183b57813586016118258882611845565b845250602092830192919091019060010161180f565b5050505092915050565b600082601f83011261185657600080fd5b81356118646117f882611fd6565b915081818352602084019350602081019050838560c084028201111561188957600080fd5b60005b8381101561183b578161189f888261193f565b84525060209092019160c0919091019060010161188c565b600082601f8301126118c857600080fd5b81356118d66117f882611fd6565b915081818352602084019350602081019050838560c08402820111156118fb57600080fd5b60005b8381101561183b5781611911888261193f565b84525060209092019160c091909101906001016118fe565b805161125a81612087565b803561125a81612090565b600060c0828403121561195157600080fd5b61195b60c0611faf565b9050600061196984846117ce565b825250602061197a848483016117ce565b602083015250604061198e848285016117ce565b60408301525060606119a2848285016119d6565b60608301525060806119b6848285016119d6565b60808301525060a06119ca848285016119d6565b60a08301525092915050565b803561125a81612099565b805161125a81612099565b6000602082840312156119fe57600080fd5b60006116b884846117ce565b60008060008060808587031215611a2057600080fd5b843567ffffffffffffffff811115611a3757600080fd5b611a43878288016117d9565b9450506020611a5487828801611934565b9350506040611a6587828801611934565b9250506060611a76878288016119d6565b91505092959194509250565b600080600080600060a08688031215611a9a57600080fd5b853567ffffffffffffffff811115611ab157600080fd5b611abd888289016117d9565b9550506020611ace88828901611934565b9450506040611adf88828901611934565b9350506060611af0888289016119d6565b9250506080611b01888289016119d6565b9150509295509295909350565b60008060008060808587031215611b2457600080fd5b843567ffffffffffffffff811115611b3b57600080fd5b611a43878288016118b7565b600080600080600060a08688031215611b5f57600080fd5b853567ffffffffffffffff811115611b7657600080fd5b611abd888289016118b7565b600060208284031215611b9457600080fd5b60006116b88484611929565b600060208284031215611bb257600080fd5b60006116b884846119e1565b60008060408385031215611bd157600080fd5b6000611bdd85856119e1565b9250506020611bee858286016119e1565b9150509250929050565b611c018161202e565b82525050565b611c0181612004565b611c018161200f565b6000611c2482611ff7565b611c2e818561141e565b9350611c3e818560208601612039565b9290920192915050565b6000611c5382611ff7565b611c5d8185611ffb565b9350611c6d818560208601612039565b611c7681612069565b9093019392505050565b6000611c8d602683611ffb565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611cd5600b83611ffb565b6a1b9bdd081cdd58d8d9595960aa1b815260200192915050565b6000611cfc601b83611ffb565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611d35600d83611ffb565b6c11549497d31253525517d3d555609a1b815260200192915050565b6000611d5e600c83611ffb565b6b22a9292fa624a6a4aa2fa4a760a11b815260200192915050565b6000611d86602083611ffb565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000611dbf600e83611ffb565b6d11549497d1551217d1905253115160921b815260200192915050565b600061125a60008361141e565b611c018161202b565b60006113548284611c19565b600061125a82611ddc565b6020810161125a8284611c07565b6020810161125a8284611bf8565b60408101611e338285611bf8565b6113546020830184611c07565b60c08101611e4e8289611bf8565b611e5b6020830188611c07565b611e686040830187611de9565b611e756060830186611c07565b611e826080830185611de9565b611e8f60a0830184611de9565b979650505050505050565b60608101611ea88286611c07565b611eb56020830185611c07565b6116b86040830184611de9565b60408101611ed08285611c07565b6113546020830184611de9565b6020810161125a8284611c10565b602080825281016113548184611c48565b6020808252810161125a81611c80565b6020808252810161125a81611cc8565b6020808252810161125a81611cef565b6020808252810161125a81611d28565b6020808252810161125a81611d51565b6020808252810161125a81611d79565b6020808252810161125a81611db2565b6020810161125a8284611de9565b60c08101611f888289611de9565b611f956020830188611de9565b611fa26040830187611de9565b611e756060830186611de9565b60405181810167ffffffffffffffff81118282101715611fce57600080fd5b604052919050565b600067ffffffffffffffff821115611fed57600080fd5b5060209081020190565b5190565b90815260200190565b600061125a8261201f565b151590565b600061125a82612004565b6001600160a01b031690565b90565b600061125a82612014565b60005b8381101561205457818101518382015260200161203c565b83811115612063576000848401525b50505050565b601f01601f191690565b61207c81612004565b81146111cd57600080fd5b61207c8161200f565b61207c81612014565b61207c8161202b56fea365627a7a723158201a8b20dd4a4ab2b5aecf0615ae3a9eac9de34ee2511bb6df5076cc3ac742a0ea6c6578706572696d656e74616cf564736f6c634300050c0040

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

000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


Deployed Bytecode Sourcemap

10300:13345:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12587:1299;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8293:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8293:140:0;;;:::i;15717:4325::-;;;;;;;;;:::i;11298:1281::-;;;;;;;;;:::i;7482:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7482:79:0;;;:::i;:::-;;;;;;;;7848:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7848:94:0;;;:::i;:::-;;;;;;;;11173:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11173:117:0;;;;;;;;:::i;13894:1815::-;;;;;;;;;:::i;8588:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8588:109:0;;;;;;;;:::i;12587:1299::-;12784:18;12820:42;12836:7;12845:16;12820:15;:42::i;:::-;-1:-1:-1;12880:6:0;12875:825;12896:5;:12;12892:1;:16;12875:825;;;12930:16;;:::i;:::-;12949:5;12955:1;12949:8;;;;;;;;;;;;;;;;;;;13016:12;;;;13079:9;;13110:47;;-1:-1:-1;;;13110:47:0;;12949:8;;-1:-1:-1;13016:12:0;;12972:26;;-1:-1:-1;;;;;13110:21:0;;;;;:47;;13140:4;;13079:9;;13110:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13110:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13110:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13110:47:0;;;;;;;;;:51;13106:130;;;13182:38;13194:11;13207:4;:9;;;13218:1;13182:11;:38::i;:::-;13250:59;13262:11;13275:4;:9;;;13286:4;:22;;;13250:11;:59::i;:::-;13327:18;13350:4;-1:-1:-1;;;;;13350:23:0;;13392:10;13421:4;:12;;;13452:4;:22;;;13493:4;:13;;;13525:4;:15;;;13559:4;:13;;;13350:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13350:237:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13350:237:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13350:237:0;;;;;;;;;-1:-1:-1;13326:261:0;-1:-1:-1;13618:32:0;13326:261;13636:13;13618:32;:17;:32;:::i;:::-;13675:12;;;;13665:23;;-1:-1:-1;;;13665:23:0;;13602:48;;-1:-1:-1;;;;;;13665:9:0;;;;;:23;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13665:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;12910:3:0;;;;;-1:-1:-1;12875:825:0;;-1:-1:-1;;;;;12875:825:0;;;13735:16;13718:13;:33;;13710:58;;;;-1:-1:-1;;;13710:58:0;;;;;;;;;;;;;;;;;13781:43;13793:8;13803:20;13814:8;13803:10;:20::i;:::-;13781:11;:43::i;:::-;;13835:41;13847:7;13856:19;13867:7;13856:10;:19::i;13835:41::-;;12587:1299;;;;;;:::o;8293:140::-;7694:9;:7;:9::i;:::-;7686:54;;;;-1:-1:-1;;;7686:54:0;;;;;;;;;8392:1;8376:6;;8355:40;;-1:-1:-1;;;;;8376:6:0;;;;8355:40;;8392:1;;8355:40;8423:1;8406:19;;-1:-1:-1;;;;;;8406:19:0;;;8293:140::o;15717:4325::-;15932:18;15970:42;15986:7;15995:16;15970:15;:42::i;:::-;-1:-1:-1;16030:6:0;16025:3829;16046:13;:20;16042:1;:24;16025:3829;;;16088:27;16219:13;16233:1;16219:16;;;;;;;;;;;;;;:23;16246:1;16219:28;16215:3556;;;16268:16;;:::i;:::-;16287:13;16301:1;16287:16;;;;;;;;;;;;;;16304:1;16287:19;;;;;;;;;;;;;;;;;;;16369:12;;;;16438:9;;16471:47;;-1:-1:-1;;;16471:47:0;;16287:19;;-1:-1:-1;16369:12:0;;16325:26;;-1:-1:-1;;;;;16471:21:0;;;;;:47;;16501:4;;16438:9;;16471:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16471:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16471:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16471:47:0;;;;;;;;;:51;16467:138;;;16547:38;16559:11;16572:4;:9;;;16583:1;16547:11;:38::i;:::-;16623:59;16635:11;16648:4;:9;;;16659:4;:22;;;16623:11;:59::i;:::-;16810:12;;;;16845:22;;;;16890:13;;;;;16926:15;;;;16964:13;;;;16731:265;;-1:-1:-1;;;16731:265:0;;-1:-1:-1;;;;;16731:23:0;;;;;:265;;16777:10;;16810:12;;16845:22;;16731:265;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16731:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16731:265:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16731:265:0;;;;;;;;;-1:-1:-1;17025:12:0;;;;17015:23;;-1:-1:-1;;;17015:23:0;;16703:293;;-1:-1:-1;;;;;;17015:9:0;;;;;:23;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17015:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17015:23:0;;;;16215:3556;;;;;;17375:28;17466:22;;:::i;:::-;17491:13;17505:1;17491:16;;;;;;;;;;;;;;17508:1;17491:19;;;;;;;;;;;;;;;;;;;17574:15;;17713:18;;;;17687:45;;-1:-1:-1;;;17687:45:0;;17491:19;;-1:-1:-1;;;;;;17635:29:0;;;;;;;17687:25;;:45;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17687:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17687:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17687:45:0;;;;;;;;;17792:18;;;;17755:56;;-1:-1:-1;;;17755:56:0;;-1:-1:-1;;;;;17755:36:0;;;;;:56;;17792:18;17755:56;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17755:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17755:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17755:56:0;;;;;;;;;17860:19;;;;;17834:46;;-1:-1:-1;;;17834:46:0;;-1:-1:-1;;;;;17834:25:0;;;;;:46;;17860:19;17834:46;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17834:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17834:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17834:46:0;;;;;;;;;17940:19;;;;;17903:57;;-1:-1:-1;;;17903:57:0;;-1:-1:-1;;;;;17903:36:0;;;;;:57;;17940:19;17903:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17903:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17903:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17903:57:0;;;;;;;;;17983:10;:21;;;18027:14;-1:-1:-1;;;;;18027:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18027:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18027:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18027:27:0;;;;;;;;;17635:438;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17635:438:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17635:438:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17635:438:0;;;;;;;;;17609:464;;18180:21;;:::i;:::-;18204:13;18218:1;18204:16;;;;;;;;;;;;;;18221:1;18204:19;;;;;;;;;;;;;;;;;;;18291:17;;;;18372:14;;18410:57;;-1:-1:-1;;;18410:57:0;;18204:19;;-1:-1:-1;18291:17:0;;-1:-1:-1;;18475:2:0;-1:-1:-1;;;;;18410:26:0;;;;;:57;;18445:4;;18372:14;;18410:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18410:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18410:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18410:57:0;;;;;;;;;:68;18406:172;;;18503:55;18515:16;18533:9;:14;;;-1:-1:-1;;18503:11:0;:55::i;:::-;18626:13;-1:-1:-1;;;;;18626:32:0;;18681:10;18714:9;:17;;;18754:9;:27;;;18804:9;:18;;;18845:23;18932:9;:18;;;18626:343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18626:343:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18626:343:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18626:343:0;;;;;;;;;-1:-1:-1;19007:17:0;;;;18988:37;;-1:-1:-1;;;18988:37:0;;18598:371;;-1:-1:-1;;;;;;18988:18:0;;;;;:37;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18988:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;19158:18:0;;;;19243:15;;19200:59;;-1:-1:-1;;;19200:59:0;;-1:-1:-1;;19267:2:0;-1:-1:-1;;;;;19200:27:0;;;;;:59;;19236:4;;19243:15;19200:59;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19200:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19200:59:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19200:59:0;;;;;;;;;:70;19196:176;;;19295:57;19307:17;19326:10;:15;;;-1:-1:-1;;19295:11:0;:57::i;:::-;19481:18;;;;19522:28;;;;19573:19;;;;;19615:21;;;;19659:19;;;;19392:305;;-1:-1:-1;;;19392:305:0;;-1:-1:-1;;;;;19392:33:0;;;;;:305;;19448:10;;19481:18;;19522:28;;19392:305;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19392:305:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19392:305:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19392:305:0;;;;;;;;;-1:-1:-1;;19736:18:0;;;;19716:39;;-1:-1:-1;;;19716:39:0;;-1:-1:-1;;;;;19716:19:0;;;;;:39;;19736:18;19716:39;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19716:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19716:39:0;;;;16215:3556;;;;;;;;19801:41;:22;19828:13;19801:41;:26;:41;:::i;:::-;19785:57;-1:-1:-1;;16068:3:0;;16025:3829;;11298:1281;11524:19;11561:39;11577:7;11586:13;11561:15;:39::i;:::-;-1:-1:-1;11618:6:0;11613:783;11634:5;:12;11630:1;:16;11613:783;;;11668:16;;:::i;:::-;11687:5;11693:1;11687:8;;;;;;;;;;;;;;;;;;;11754:12;;;;11817:9;;11848:47;;-1:-1:-1;;;11848:47:0;;11687:8;;-1:-1:-1;11754:12:0;;11710:26;;-1:-1:-1;;;;;11848:21:0;;;;;:47;;11878:4;;11817:9;;11848:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11848:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11848:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;11848:47:0;;;;;;;;;:51;11844:130;;;11920:38;11932:11;11945:4;:9;;;11956:1;11920:11;:38::i;:::-;11988:52;12000:11;12013:4;:9;;;12024:4;:15;;;11988:11;:52::i;:::-;12058:19;12082:4;-1:-1:-1;;;;;12082:22:0;;12123:10;12152:4;:12;;;12183:4;:15;;;12217:4;:13;;;12249:4;:22;;;12290:4;:13;;;12082:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12082:236:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12082:236:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12082:236:0;;;;;;;;;-1:-1:-1;12057:261:0;-1:-1:-1;12350:34:0;12057:261;12369:14;12350:34;:18;:34;:::i;:::-;12333:51;-1:-1:-1;;11648:3:0;;;;;-1:-1:-1;11613:783:0;;-1:-1:-1;;11613:783:0;;;12434:17;12416:14;:35;;12408:61;;;;-1:-1:-1;;;12408:61:0;;;;;;;;;12482:37;12494:8;12504:14;12482:11;:37::i;:::-;;12530:41;12542:7;12551:19;12562:7;12551:10;:19::i;12530:41::-;;11298:1281;;;;;;;:::o;7482:79::-;7520:7;7547:6;-1:-1:-1;;;;;7547:6:0;7482:79;:::o;7848:94::-;7888:4;7928:6;;-1:-1:-1;;;;;7928:6:0;7912:12;:10;:12::i;:::-;-1:-1:-1;;;;;7912:22:0;;7905:29;;7848:94;:::o;11173:117::-;7694:9;:7;:9::i;:::-;7686:54;;;;-1:-1:-1;;;7686:54:0;;;;;;;;;11243:8;:39;;-1:-1:-1;;;;;;11243:39:0;-1:-1:-1;;;;;11243:39:0;;;;;;;;;;11173:117::o;13894:1815::-;14138:19;14177:39;14193:7;14202:13;14177:15;:39::i;:::-;-1:-1:-1;14234:6:0;14229:1295;14250:13;:20;14246:1;:24;14229:1295;;;14292:19;;14326:1063;14347:13;14361:1;14347:16;;;;;;;;;;;;;;:23;14343:1;:27;14326:1063;;;14396:16;;:::i;:::-;14415:13;14429:1;14415:16;;;;;;;;;;;;;;14432:1;14415:19;;;;;;;;;;;;;;14396:38;;14453:26;14497:4;:12;;;14453:57;;14533:1;14538;14533:6;14529:247;;;14724:15;;;:32;;;14529:247;14831:9;;14864:47;;-1:-1:-1;;;14864:47:0;;14796:18;;-1:-1:-1;;;;;14864:21:0;;;;;:47;;14894:4;;14831:9;;14864:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14864:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14864:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;14864:47:0;;;;;;;;;:51;14860:138;;;14940:38;14952:11;14965:4;:9;;;14976:1;14940:11;:38::i;:::-;15016:52;15028:11;15041:4;:9;;;15052:4;:15;;;15016:11;:52::i;:::-;15187:12;;;;15222:15;;;;15260:13;;;;;15296:22;;;;15341:13;;;;15109:264;;-1:-1:-1;;;15109:264:0;;-1:-1:-1;;;;;15109:22:0;;;;;:264;;15154:10;;15187:12;;15222:15;;15109:264;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15109:264:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15109:264:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15109:264:0;;;;;;;;;-1:-1:-1;15089:284:0;-1:-1:-1;;14372:3:0;;;;;-1:-1:-1;14326:1063:0;;-1:-1:-1;14326:1063:0;;-1:-1:-1;15478:34:0;:14;15497;15478:34;:18;:34;:::i;:::-;15461:51;-1:-1:-1;;14272:3:0;;14229:1295;;8588:109;7694:9;:7;:9::i;:::-;7686:54;;;;-1:-1:-1;;;7686:54:0;;;;;;;;;8661:28;8680:8;8661:18;:28::i;:::-;8588:109;:::o;20052:382::-;20129:4;20150:12;20156:5;20150;:12::i;:::-;20146:281;;;20179:4;;;;;;;;;-1:-1:-1;;;;;20179:4:0;-1:-1:-1;;;;;20179:12:0;;20198:9;20179:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20179:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20179:31:0;;;;;20146:281;;;20357:58;20374:5;20381:10;20401:4;20408:6;20357:16;:58::i;:::-;20052:382;;;;:::o;22166:392::-;22278:58;;22258:17;;-1:-1:-1;;;22301:22:0;22278:58;;22325:2;;22329:6;;22278:58;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22278:58:0;;;;-1:-1:-1;;;;;22278:58:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22278:58:0;22258:78;;22347:23;22373:59;22394:5;22402:4;22373:59;;;;;;;;;;;;;-1:-1:-1;;;22373:59:0;;;:12;:59::i;:::-;22447:17;;22347:85;;-1:-1:-1;22447:21:0;22443:108;;22504:10;22493:30;;;;;;;;;;;;;;22485:54;;;;-1:-1:-1;;;22485:54:0;;;;;;;;;22166:392;;;;;:::o;896:181::-;954:7;986:5;;;1010:6;;;;1002:46;;;;-1:-1:-1;;;1002:46:0;;;;;;;;;1068:1;896:181;-1:-1:-1;;;896:181:0:o;20442:240::-;20507:4;20528:12;20534:5;20528;:12::i;:::-;20524:151;;;20564:4;;:29;;-1:-1:-1;;;20564:29:0;;-1:-1:-1;;;;;20564:4:0;;;;:14;;:29;;20587:4;;20564:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20564:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20564:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20564:29:0;;;;;;;;;20557:36;;;;20524:151;20633:30;;-1:-1:-1;;;20633:30:0;;-1:-1:-1;;;;;20633:15:0;;;;;:30;;20657:4;;20633:30;;;;20524:151;20442:240;;;:::o;20690:506::-;20763:4;20784:11;20780:55;;-1:-1:-1;20819:4:0;20812:11;;20780:55;20851:12;20857:5;20851;:12::i;:::-;20847:342;;;20880:4;;:21;;-1:-1:-1;;;20880:21:0;;-1:-1:-1;;;;;20880:4:0;;;;:13;;:21;;20894:6;;20880:21;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20880:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20880:21:0;;;;20917:9;20931:10;-1:-1:-1;;;;;20931:15:0;20953:6;20931:33;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20916:48:0;;;20987:4;20979:31;;;;-1:-1:-1;;;20979:31:0;;;;;;;;;20847:342;;;;21138:39;21151:5;21158:10;21170:6;21138:12;:39::i;6272:99::-;6353:10;6272:99;:::o;8803:229::-;-1:-1:-1;;;;;8877:22:0;;8869:73;;;;-1:-1:-1;;;8869:73:0;;;;;;;;;8979:6;;;8958:38;;-1:-1:-1;;;;;8958:38:0;;;;8979:6;;;8958:38;;;9007:6;:17;;-1:-1:-1;;;;;;9007:17:0;-1:-1:-1;;;;;9007:17:0;;;;;;;;;;8803:229::o;21204:122::-;-1:-1:-1;;;;;21288:29:0;;10990:42;21288:29;21204:122;;;:::o;21736:422::-;21867:69;;21847:17;;-1:-1:-1;;;21890:27:0;21867:69;;21919:4;;21925:2;;21929:6;;21867:69;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21867:69:0;;;;-1:-1:-1;;;;;21867:69:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;21867:69:0;21847:89;;21947:23;21973:59;21994:5;22002:4;21973:59;;;;;;;;;;;;;-1:-1:-1;;;21973:59:0;;;:12;:59::i;:::-;22047:17;;21947:85;;-1:-1:-1;22047:21:0;22043:108;;22104:10;22093:30;;;;;;;;;;;;;;22085:54;;;;-1:-1:-1;;;22085:54:0;;;;;;;;;21736:422;;;;;;:::o;22566:193::-;22669:12;22701:50;22724:6;22732:4;22738:12;22701:22;:50::i;:::-;22694:57;22566:193;-1:-1:-1;;;;22566:193:0:o;21334:394::-;21447:59;;21427:17;;-1:-1:-1;;;21470:23:0;21447:59;;21495:2;;21499:6;;21447:59;;;;22767:837;22880:12;22906;22920:23;22947:6;-1:-1:-1;;;;;22947:11:0;22959:4;22947:17;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;22905:59:0;;;;23006:7;23002:595;;;23037:10;-1:-1:-1;23030:17:0;;-1:-1:-1;23030:17:0;23002:595;23151:17;;:21;23147:439;;23414:10;23408:17;23475:15;23462:10;23458:2;23454:19;23447:44;23362:148;23557:12;23550:20;;-1:-1:-1;;;23550:20:0;;;;;;;;;10300:13345;;;;;;;;;;-1:-1:-1;;;;;10300:13345:0;;;;;;-1:-1:-1;;;;;10300:13345:0;;;;;;-1:-1:-1;;;;;10300:13345:0;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;180:792;;335:3;328:4;320:6;316:17;312:27;302:2;;353:1;350;343:12;302:2;390:6;377:20;412:118;427:102;522:6;427:102;;;412:118;;;558:21;;;602:4;590:17;;;;403:127;;-1:-1;615:14;;590:17;710:1;695:271;720:6;717:1;714:13;695:271;;;803:3;790:17;782:6;778:30;827:75;898:3;886:10;827:75;;;815:88;;-1:-1;926:4;917:14;;;;945;;;;;742:1;735:9;695:271;;;699:14;295:677;;;;;;;;1016:750;;1146:3;1139:4;1131:6;1127:17;1123:27;1113:2;;1164:1;1161;1154:12;1113:2;1201:6;1188:20;1223:93;1238:77;1308:6;1238:77;;1223:93;1214:102;;1333:5;1358:6;1351:5;1344:21;1388:4;1380:6;1376:17;1366:27;;1410:4;1405:3;1401:14;1394:21;;1463:6;1510:3;1502:4;1494:6;1490:17;1485:3;1481:27;1478:36;1475:2;;;1527:1;1524;1517:12;1475:2;1552:1;1537:223;1562:6;1559:1;1556:13;1537:223;;;1620:3;1642:54;1692:3;1680:10;1642:54;;;1630:67;;-1:-1;1720:4;1711:14;;;;1748:4;1739:14;;;;;1584:1;1577:9;1537:223;;1810:758;;1944:3;1937:4;1929:6;1925:17;1921:27;1911:2;;1962:1;1959;1952:12;1911:2;1999:6;1986:20;2021:97;2036:81;2110:6;2036:81;;2021:97;2012:106;;2135:5;2160:6;2153:5;2146:21;2190:4;2182:6;2178:17;2168:27;;2212:4;2207:3;2203:14;2196:21;;2265:6;2312:3;2304:4;2296:6;2292:17;2287:3;2283:27;2280:36;2277:2;;;2329:1;2326;2319:12;2277:2;2354:1;2339:223;2364:6;2361:1;2358:13;2339:223;;;2422:3;2444:54;2494:3;2482:10;2444:54;;;2432:67;;-1:-1;2522:4;2513:14;;;;2550:4;2541:14;;;;;2386:1;2379:9;2339:223;;2576:128;2651:13;;2669:30;2651:13;2669:30;;2711:174;2800:20;;2825:55;2800:20;2825:55;;2924:1066;;3030:4;3018:9;3013:3;3009:19;3005:30;3002:2;;;3048:1;3045;3038:12;3002:2;3066:20;3081:4;3066:20;;;3057:29;-1:-1;3136:1;3167:49;3212:3;3192:9;3167:49;;;3143:74;;-1:-1;3281:2;3314:49;3359:3;3335:22;;;3314:49;;;3307:4;3300:5;3296:16;3289:75;3238:137;3429:2;3462:49;3507:3;3498:6;3487:9;3483:22;3462:49;;;3455:4;3448:5;3444:16;3437:75;3385:138;3579:2;3612:49;3657:3;3648:6;3637:9;3633:22;3612:49;;;3605:4;3598:5;3594:16;3587:75;3533:140;3736:3;3770:49;3815:3;3806:6;3795:9;3791:22;3770:49;;;3763:4;3756:5;3752:16;3745:75;3683:148;3885:3;3919:49;3964:3;3955:6;3944:9;3940:22;3919:49;;;3912:4;3905:5;3901:16;3894:75;3841:139;2996:994;;;;;3997:130;4064:20;;4089:33;4064:20;4089:33;;4134:134;4212:13;;4230:33;4212:13;4230:33;;4275:241;;4379:2;4367:9;4358:7;4354:23;4350:32;4347:2;;;4395:1;4392;4385:12;4347:2;4430:1;4447:53;4492:7;4472:9;4447:53;;4523:917;;;;;4785:3;4773:9;4764:7;4760:23;4756:33;4753:2;;;4802:1;4799;4792:12;4753:2;4837:31;;4888:18;4877:30;;4874:2;;;4920:1;4917;4910:12;4874:2;4940:116;5048:7;5039:6;5028:9;5024:22;4940:116;;;4930:126;;4816:246;5093:2;5111:75;5178:7;5169:6;5158:9;5154:22;5111:75;;;5101:85;;5072:120;5223:2;5241:75;5308:7;5299:6;5288:9;5284:22;5241:75;;;5231:85;;5202:120;5353:2;5371:53;5416:7;5407:6;5396:9;5392:22;5371:53;;;5361:63;;5332:98;4747:693;;;;;;;;5447:1043;;;;;;5726:3;5714:9;5705:7;5701:23;5697:33;5694:2;;;5743:1;5740;5733:12;5694:2;5778:31;;5829:18;5818:30;;5815:2;;;5861:1;5858;5851:12;5815:2;5881:116;5989:7;5980:6;5969:9;5965:22;5881:116;;;5871:126;;5757:246;6034:2;6052:75;6119:7;6110:6;6099:9;6095:22;6052:75;;;6042:85;;6013:120;6164:2;6182:75;6249:7;6240:6;6229:9;6225:22;6182:75;;;6172:85;;6143:120;6294:2;6312:53;6357:7;6348:6;6337:9;6333:22;6312:53;;;6302:63;;6273:98;6402:3;6421:53;6466:7;6457:6;6446:9;6442:22;6421:53;;;6411:63;;6381:99;5688:802;;;;;;;;;6497:875;;;;;6738:3;6726:9;6717:7;6713:23;6709:33;6706:2;;;6755:1;6752;6745:12;6706:2;6790:31;;6841:18;6830:30;;6827:2;;;6873:1;6870;6863:12;6827:2;6893:95;6980:7;6971:6;6960:9;6956:22;6893:95;;7379:1001;;;;;;7637:3;7625:9;7616:7;7612:23;7608:33;7605:2;;;7654:1;7651;7644:12;7605:2;7689:31;;7740:18;7729:30;;7726:2;;;7772:1;7769;7762:12;7726:2;7792:95;7879:7;7870:6;7859:9;7855:22;7792:95;;8387:257;;8499:2;8487:9;8478:7;8474:23;8470:32;8467:2;;;8515:1;8512;8505:12;8467:2;8550:1;8567:61;8620:7;8600:9;8567:61;;8651:263;;8766:2;8754:9;8745:7;8741:23;8737:32;8734:2;;;8782:1;8779;8772:12;8734:2;8817:1;8834:64;8890:7;8870:9;8834:64;;8921:399;;;9053:2;9041:9;9032:7;9028:23;9024:32;9021:2;;;9069:1;9066;9059:12;9021:2;9104:1;9121:64;9177:7;9157:9;9121:64;;;9111:74;;9083:108;9222:2;9240:64;9296:7;9287:6;9276:9;9272:22;9240:64;;;9230:74;;9201:109;9015:305;;;;;;9327:142;9418:45;9457:5;9418:45;;;9413:3;9406:58;9400:69;;;9476:113;9559:24;9577:5;9559:24;;9596:104;9673:21;9688:5;9673:21;;9707:356;;9835:38;9867:5;9835:38;;;9885:88;9966:6;9961:3;9885:88;;;9878:95;;9978:52;10023:6;10018:3;10011:4;10004:5;10000:16;9978:52;;;10042:16;;;;;9815:248;-1:-1;;9815:248;10070:347;;10182:39;10215:5;10182:39;;;10233:71;10297:6;10292:3;10233:71;;;10226:78;;10309:52;10354:6;10349:3;10342:4;10335:5;10331:16;10309:52;;;10382:29;10404:6;10382:29;;;10373:39;;;;10162:255;-1:-1;;;10162:255;10425:465;;10585:67;10649:2;10644:3;10585:67;;;10685:66;10665:87;;-1:-1;;;10781:2;10772:12;;10765:88;10881:2;10872:12;;10571:319;-1:-1;;10571:319;10899:364;;11059:67;11123:2;11118:3;11059:67;;;-1:-1;;;11139:87;;11254:2;11245:12;;11045:218;-1:-1;;11045:218;11272:364;;11432:67;11496:2;11491:3;11432:67;;;11532:66;11512:87;;11627:2;11618:12;;11418:218;-1:-1;;11418:218;11645:364;;11805:67;11869:2;11864:3;11805:67;;;-1:-1;;;11885:87;;12000:2;11991:12;;11791:218;-1:-1;;11791:218;12018:364;;12178:67;12242:2;12237:3;12178:67;;;-1:-1;;;12258:87;;12373:2;12364:12;;12164:218;-1:-1;;12164:218;12391:364;;12551:67;12615:2;12610:3;12551:67;;;12651:66;12631:87;;12746:2;12737:12;;12537:218;-1:-1;;12537:218;12764:364;;12924:67;12988:2;12983:3;12924:67;;;-1:-1;;;13004:87;;13119:2;13110:12;;12910:218;-1:-1;;12910:218;13137:296;;13314:83;13395:1;13390:3;13314:83;;13441:113;13524:24;13542:5;13524:24;;13561:262;;13705:93;13794:3;13785:6;13705:93;;13830:370;;14028:147;14171:3;14028:147;;14207:213;14325:2;14310:18;;14339:71;14314:9;14383:6;14339:71;;14427:229;14553:2;14538:18;;14567:79;14542:9;14619:6;14567:79;;14663:340;14817:2;14802:18;;14831:79;14806:9;14883:6;14831:79;;;14921:72;14989:2;14978:9;14974:18;14965:6;14921:72;;15010:787;15276:3;15261:19;;15291:79;15265:9;15343:6;15291:79;;;15381:72;15449:2;15438:9;15434:18;15425:6;15381:72;;;15464;15532:2;15521:9;15517:18;15508:6;15464:72;;;15547;15615:2;15604:9;15600:18;15591:6;15547:72;;;15630:73;15698:3;15687:9;15683:19;15674:6;15630:73;;;15714;15782:3;15771:9;15767:19;15758:6;15714:73;;;15247:550;;;;;;;;;;15804:435;15978:2;15963:18;;15992:71;15967:9;16036:6;15992:71;;;16074:72;16142:2;16131:9;16127:18;16118:6;16074:72;;;16157;16225:2;16214:9;16210:18;16201:6;16157:72;;16246:324;16392:2;16377:18;;16406:71;16381:9;16450:6;16406:71;;;16488:72;16556:2;16545:9;16541:18;16532:6;16488:72;;16577:201;16689:2;16674:18;;16703:65;16678:9;16741:6;16703:65;;16785:301;16923:2;16937:47;;;16908:18;;16998:78;16908:18;17062:6;16998:78;;17093:407;17284:2;17298:47;;;17269:18;;17359:131;17269:18;17359:131;;17507:407;17698:2;17712:47;;;17683:18;;17773:131;17683:18;17773:131;;17921:407;18112:2;18126:47;;;18097:18;;18187:131;18097:18;18187:131;;18335:407;18526:2;18540:47;;;18511:18;;18601:131;18511:18;18601:131;;18749:407;18940:2;18954:47;;;18925:18;;19015:131;18925:18;19015:131;;19163:407;19354:2;19368:47;;;19339:18;;19429:131;19339:18;19429:131;;19577:407;19768:2;19782:47;;;19753:18;;19843:131;19753:18;19843:131;;19991:213;20109:2;20094:18;;20123:71;20098:9;20167:6;20123:71;;20211:771;20469:3;20454:19;;20484:71;20458:9;20528:6;20484:71;;;20566:72;20634:2;20623:9;20619:18;20610:6;20566:72;;;20649;20717:2;20706:9;20702:18;20693:6;20649:72;;;20732;20800:2;20789:9;20785:18;20776:6;20732:72;;20989:256;21051:2;21045:9;21077:17;;;21152:18;21137:34;;21173:22;;;21134:62;21131:2;;;21209:1;21206;21199:12;21131:2;21225;21218:22;21029:216;;-1:-1;21029:216;21252:342;;21449:18;21441:6;21438:30;21435:2;;;21481:1;21478;21471:12;21435:2;-1:-1;21516:4;21504:17;;;21569:15;;21372:222;22253:121;22340:12;;22311:63;22664:163;22767:19;;;22816:4;22807:14;;22760:67;22835:91;;22897:24;22915:5;22897:24;;22933:85;22999:13;22992:21;;22975:43;23025:113;;23109:24;23127:5;23109:24;;23145:121;-1:-1;;;;;23207:54;;23190:76;23273:72;23335:5;23318:27;23352:129;;23439:37;23470:5;23439:37;;23732:268;23797:1;23804:101;23818:6;23815:1;23812:13;23804:101;;;23885:11;;;23879:18;23866:11;;;23859:39;23840:2;23833:10;23804:101;;;23920:6;23917:1;23914:13;23911:2;;;23985:1;23976:6;23971:3;23967:16;23960:27;23911:2;23781:219;;;;;24008:97;24096:2;24076:14;-1:-1;;24072:28;;24056:49;24113:117;24182:24;24200:5;24182:24;;;24175:5;24172:35;24162:2;;24221:1;24218;24211:12;24237:111;24303:21;24318:5;24303:21;;24355:161;24446:46;24486:5;24446:46;;24523:117;24592:24;24610:5;24592:24;

Swarm Source

bzzr://1a8b20dd4a4ab2b5aecf0615ae3a9eac9de34ee2511bb6df5076cc3ac742a0ea

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
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.