ETH Price: $2,957.32 (+0.02%)

Contract

0x10b65E60ae95B2bD68BfCaE31E1100369Bd01818

Overview

ETH Balance

0.004290328074519745 ETH

ETH Value

$12.69 (@ $2,957.32/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Fill Quote Token...364234142026-01-24 15:08:257 hrs ago1769267305IN
0x10b65E60...69Bd01818
0 ETH0.000055840.04525
Fill Quote Eth T...361359882026-01-22 19:04:172 days ago1769108657IN
0x10b65E60...69Bd01818
0.0268 ETH0.000043350.04525
Fill Quote Token...359655962026-01-21 15:07:403 days ago1769008060IN
0x10b65E60...69Bd01818
0 ETH0.000010090.04525
Fill Quote Token...359655302026-01-21 15:07:113 days ago1769008031IN
0x10b65E60...69Bd01818
0 ETH0.000089980.04525
Fill Quote Token...359121302026-01-21 7:17:513 days ago1768979871IN
0x10b65E60...69Bd01818
0 ETH0.000056330.04525
Fill Quote Token...358712232026-01-21 1:23:583 days ago1768958638IN
0x10b65E60...69Bd01818
0 ETH0.000052520.04525
Fill Quote Token...352563652026-01-16 21:37:268 days ago1768599446IN
0x10b65E60...69Bd01818
0 ETH0.000020130.04525
Fill Quote Token...350496392026-01-15 14:21:199 days ago1768486879IN
0x10b65E60...69Bd01818
0 ETH0.000111180.04525
Fill Quote Token...350494482026-01-15 14:19:429 days ago1768486782IN
0x10b65E60...69Bd01818
0 ETH0.000090980.04525
Fill Quote Token...350493352026-01-15 14:18:539 days ago1768486733IN
0x10b65E60...69Bd01818
0 ETH0.000091540.04525
Fill Quote Token...348363682026-01-14 6:22:1710 days ago1768371737IN
0x10b65E60...69Bd01818
0 ETH0.000057350.04525
Fill Quote Token...341732422026-01-09 5:07:0915 days ago1767935229IN
0x10b65E60...69Bd01818
0 ETH0.000056030.04525
Fill Quote Token...339447142026-01-07 14:18:1317 days ago1767795493IN
0x10b65E60...69Bd01818
0 ETH0.000092710.04525
Fill Quote Eth T...339446272026-01-07 14:17:3617 days ago1767795456IN
0x10b65E60...69Bd01818
0.001608 ETH0.000052720.04525
Fill Quote Token...339304472026-01-07 12:25:1517 days ago1767788715IN
0x10b65E60...69Bd01818
0 ETH0.000055960.04525
Fill Quote Token...338752172026-01-07 3:51:3617 days ago1767757896IN
0x10b65E60...69Bd01818
0 ETH0.000091120.04525
Fill Quote Eth T...337952032026-01-06 15:29:1518 days ago1767713355IN
0x10b65E60...69Bd01818
0.000006 ETH0.000010390.04525
Fill Quote Token...335773992026-01-05 7:46:1519 days ago1767599175IN
0x10b65E60...69Bd01818
0 ETH0.000010360.04525
Fill Quote Token...333545272026-01-03 16:01:3021 days ago1767456090IN
0x10b65E60...69Bd01818
0 ETH0.000055910.04525
Fill Quote Token...331269732026-01-02 0:16:4922 days ago1767313009IN
0x10b65E60...69Bd01818
0 ETH0.000067380.04525
Fill Quote Token...330572422026-01-01 11:30:4523 days ago1767267045IN
0x10b65E60...69Bd01818
0 ETH0.000052410.04525
Fill Quote Token...325615882025-12-28 22:45:1827 days ago1766961918IN
0x10b65E60...69Bd01818
0 ETH0.000106880.04525
Fill Quote Token...325116762025-12-28 13:37:1827 days ago1766929038IN
0x10b65E60...69Bd01818
0 ETH0.00006410.04525
Fill Quote Token...323890432025-12-27 13:21:3028 days ago1766841690IN
0x10b65E60...69Bd01818
0 ETH0.000055610.04525
Fill Quote Token...323804992025-12-27 11:51:3028 days ago1766836290IN
0x10b65E60...69Bd01818
0 ETH0.000090920.04525
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
364234142026-01-24 15:08:257 hrs ago1769267305
0x10b65E60...69Bd01818
0.008121 ETH
364234142026-01-24 15:08:257 hrs ago1769267305
0x10b65E60...69Bd01818
0.00819062 ETH
361359882026-01-22 19:04:172 days ago1769108657
0x10b65E60...69Bd01818
0.0265722 ETH
361359882026-01-22 19:04:172 days ago1769108657
0x10b65E60...69Bd01818
0.0268 ETH
359655962026-01-21 15:07:403 days ago1769008060
0x10b65E60...69Bd01818
0.00051031 ETH
359655962026-01-21 15:07:403 days ago1769008060
0x10b65E60...69Bd01818
0.00051469 ETH
359655302026-01-21 15:07:113 days ago1769008031
0x10b65E60...69Bd01818
0.00079289 ETH
359655302026-01-21 15:07:113 days ago1769008031
0x10b65E60...69Bd01818
0.00079969 ETH
359121302026-01-21 7:17:513 days ago1768979871
0x10b65E60...69Bd01818
0.02405318 ETH
359121302026-01-21 7:17:513 days ago1768979871
0x10b65E60...69Bd01818
0.02425939 ETH
358712232026-01-21 1:23:583 days ago1768958638
0x10b65E60...69Bd01818
0.00296892 ETH
358712232026-01-21 1:23:583 days ago1768958638
0x10b65E60...69Bd01818
0.00299438 ETH
352563652026-01-16 21:37:268 days ago1768599446
0x10b65E60...69Bd01818
0.0006156 ETH
352563652026-01-16 21:37:268 days ago1768599446
0x10b65E60...69Bd01818
0.00062087 ETH
350496392026-01-15 14:21:199 days ago1768486879
0x10b65E60...69Bd01818
0.00102826 ETH
350496392026-01-15 14:21:199 days ago1768486879
0x10b65E60...69Bd01818
0.00103708 ETH
350494482026-01-15 14:19:429 days ago1768486782
0x10b65E60...69Bd01818
0.00172073 ETH
350494482026-01-15 14:19:429 days ago1768486782
0x10b65E60...69Bd01818
0.00173548 ETH
350493352026-01-15 14:18:539 days ago1768486733
0x10b65E60...69Bd01818
0.00447689 ETH
350493352026-01-15 14:18:539 days ago1768486733
0x10b65E60...69Bd01818
0.00451527 ETH
341732422026-01-09 5:07:0915 days ago1767935229
0x10b65E60...69Bd01818
0.01149076 ETH
341732422026-01-09 5:07:0915 days ago1767935229
0x10b65E60...69Bd01818
0.01158927 ETH
339447142026-01-07 14:18:1317 days ago1767795493
0x10b65E60...69Bd01818
0.00160048 ETH
339446272026-01-07 14:17:3617 days ago1767795456
0x10b65E60...69Bd01818
0.00159433 ETH
339446272026-01-07 14:17:3617 days ago1767795456
0x10b65E60...69Bd01818
0.001608 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RainbowRouter

Compiler Version
v0.8.11+commit.d7f03943

ZkSolc Version
v1.5.0

Optimization Enabled:
Yes with Mode 3

Other Settings:
default evmVersion, MIT license
/*

                                                            ▐██▒           ███
                                            ,╓, ▄▄  ,▄▄▄,   .▄▄. ,╓, ▄▄▄   ██▌ ▄▄▄     ,▄▄▄,  ,╓╓   ╓╓   ,╓
                                            ██████ ███▀▀██⌐ ▐██⌐ ███▀▀███⌐ ████▀▀███ ╓██▀▀▀██▄`██▌ ▐██▌ ▐██
                                            ███    ▄▄█████▌ ▐██⌐ ██▌  ▐██▌ ██▌   ║██⌐███   ▓██ ╙██▄█▌██▄██⌐
                                            ██▌   ▐██▄▄███▌,▐██⌐ ██▌  ▐██▌ ███▓▄▄███ ╙██▄▄▄██▀  ║███¬╙███▌
                                            ╙╙└    ╙╙▀╙─╙▀▀└"╙╙` ╙╙└   ╙╙" ╙╙`╙╙▀▀└    ╙╙▀▀╙`    ╙╙└  ╙╙╙
                                            

        
                                            _," _   _"""ⁿ=-,  _
                                            ⌠            _    __"=.__
                                            ▐░......   _  _          "=._
                                            ▐░░░░░░░░░░░░░░░░.           "= _
                                            ╚╩╩╩╩╩╩δφφφφ░░░░░░░░░░░          >__
                                            ▐░░░░░░░░__ _ ╙╙╚╩φφ░░░░░░░        ^=_
                                            ▐░░░░░░░░░░░░░░░,░  `╙╠φ░░░░░░░       ⁿ
                                            ▐░░░░░░░░░░░░░░░░░░░░._ `╚Åφ░░░░░       " _
                                            ╚╠╠╠╠╠╠╠╬╬╬▒▒φ░░░░░░░░░░░░  ╙╠░░░░░       "
                                            ╚╝╝╝╝╝╝╝╬╬╬╠╢╬╠╬╠╬▒░░░░░░░░░░ "╚φ░░░░       ½_
                                            ▐░░░░░░░░░░;░╙╙╝╬╠╬╠╠▒▒░░░░░░░░_ ╚φ░░░░      "_
                                            ╚▒φφφ░░░░░░░░░░░░-╙╚╬╠╠╠╬▒░░░░░░░ `╠▒░░░░      ,
                                            ╞╬╬╬╠╠╠╬╬╬╬▒φ▒░░░░░░░╙╚╬╬╠╬▒▒░░░░░ .╙╠░░░░      ≥
                                            _▒░░░ΓΓ╙╙╙╚╩╬╠╬╠▒▒░░░░░░╙╬╬╠╬▒▒░░░░░' ╠▒░░░░     ≥
                                            `╙ⁿⁿ≈≈σ╓░ '╙╙╚╬╠╬▒░░░░░░╙╬╬╠╬▒░░░░░  ╠▒░░░░     [
                                                        _╙Θ░ ░╙╠╠╬╬▒░░░░░╬╠╠╠▒▒░░░░  ╠▒░░░░    '_
                                                        _╙φ░'╙╠╠╬▒░░░░░╟╠╠╠▒░░░░░ _╠▒░░░     ░_
                                                            _`φ ░╚╬╠╠▒░░░░║╠╠╠▒░░░░░.`╠░░░░     [
                                                            _╚░⌡╚╠╬╬▒░░░░╠╠╠╬▒░░░░░ ╠▒░░░░    ░
                                                                _╙░⌡╚╠╠╬▒░░░"▒╠╠╬▒░░░░ ⌠╠░░░░    ⌡_
                                                                ╠ ░╠╠╠╬▒░░░║╠╬╠╬▒░░░ _╠▒░░░     Γ
                                                                ▐░░░╠╠╠▒░░░╟╠╠╠╬▒░░░░ ╠▒░░░░    [
                                                                _░.░╠╠╠▒░░░▐╬╠╠╬▒░░░░[╠╬░░░░    │
                                                                _╙φ░╠╠╠╬▒░░▐╬╬╠╬╬▒░░░[╠╬░░░░  ░≥_
                                                                    ____ ____  __ _______ ____


    /$$$$$$                                           /$$$$$$                                                                /$$                        
    /$$__  $$                                         /$$__  $$                                                              | $$                        
    | $$  \__/ /$$  /$$  /$$  /$$$$$$   /$$$$$$       | $$  \ $$  /$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$  /$$$$$$    /$$$$$$   /$$$$$$ 
    |  $$$$$$ | $$ | $$ | $$ |____  $$ /$$__  $$      | $$$$$$$$ /$$__  $$ /$$__  $$ /$$__  $$ /$$__  $$ /$$__  $$ |____  $$|_  $$_/   /$$__  $$ /$$__  $$
    \____  $$| $$ | $$ | $$  /$$$$$$$| $$  \ $$      | $$__  $$| $$  \ $$| $$  \ $$| $$  \__/| $$$$$$$$| $$  \ $$  /$$$$$$$  | $$    | $$  \ $$| $$  \__/
    /$$  \ $$| $$ | $$ | $$ /$$__  $$| $$  | $$      | $$  | $$| $$  | $$| $$  | $$| $$      | $$_____/| $$  | $$ /$$__  $$  | $$ /$$| $$  | $$| $$      
    |  $$$$$$/|  $$$$$/$$$$/|  $$$$$$$| $$$$$$$/      | $$  | $$|  $$$$$$$|  $$$$$$$| $$      |  $$$$$$$|  $$$$$$$|  $$$$$$$  |  $$$$/|  $$$$$$/| $$      
    \______/  \_____/\___/  \_______/| $$____/       |__/  |__/ \____  $$ \____  $$|__/       \_______/ \____  $$ \_______/   \___/   \______/ |__/      
                                    | $$                       /$$  \ $$ /$$  \ $$                     /$$  \ $$                                        
                                    | $$                      |  $$$$$$/|  $$$$$$/                    |  $$$$$$/                                        
                                    |__/                       \______/  \______/                      \______/                                         
                
     
*/

//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "@rari-capital/solmate/src/utils/SafeTransferLib.sol";
import "@rari-capital/solmate/src/tokens/ERC20.sol";
import "./routers/BaseAggregator.sol";

/// @title Rainbow swap aggregator contract
contract RainbowRouter is BaseAggregator {
    /// @dev The address that is the current owner of this contract
    address public owner;

    /// @dev Event emitted when the owner changes
    event OwnerChanged(address indexed newOwner, address indexed oldOwner);

    /// @dev Event emitted when a swap target gets added
    event SwapTargetAdded(address indexed target);

    /// @dev Event emitted when a swap target gets removed
    event SwapTargetRemoved(address indexed target);

    /// @dev Event emitted when token fees are withdrawn
    event TokenWithdrawn(
        address indexed token,
        address indexed target,
        uint256 amount
    );

    /// @dev Event emitted when ETH fees are withdrawn
    event EthWithdrawn(address indexed target, uint256 amount);

    /// @dev modifier that ensures only the owner is allowed to call a specific method
    modifier onlyOwner() {
        require(msg.sender == owner, "ONLY_OWNER");
        _;
    }

    constructor() {
        owner = msg.sender;
        status = 1;
    }

    /// @dev We don't want to accept any ETH, except refunds from aggregators
    /// or the owner (for testing purposes), which can also withdraw
    /// This is done by evaluating the value of status, which is set to 2
    /// only during swaps due to the "nonReentrant" modifier
    receive() external payable {
        require(status == 2 || msg.sender == owner, "NO_RECEIVE");
    }

    /// @dev method to add or remove swap targets from swapTargets
    /// This is required so we only approve "trusted" swap targets
    /// to transfer tokens out of this contract
    /// @param target address of the swap target to add
    /// @param add flag to add or remove the swap target
    function updateSwapTargets(address target, bool add) external onlyOwner {
        swapTargets[target] = add;
        if (add) {
            emit SwapTargetAdded(target);
        } else {
            emit SwapTargetRemoved(target);
        }
    }

    /// @dev method to withdraw ERC20 tokens (from the fees)
    /// @param token address of the token to withdraw
    /// @param to address that's receiving the tokens
    /// @param amount amount of tokens to withdraw
    function withdrawToken(
        address token,
        address to,
        uint256 amount
    ) external onlyOwner {
        require(to != address(0), "ZERO_ADDRESS");
        SafeTransferLib.safeTransfer(ERC20(token), to, amount);
        emit TokenWithdrawn(token, to, amount);
    }

    /// @dev method to withdraw ETH (from the fees)
    /// @param to address that's receiving the ETH
    /// @param amount amount of ETH to withdraw
    function withdrawEth(address to, uint256 amount) external onlyOwner {
        require(to != address(0), "ZERO_ADDRESS");
        SafeTransferLib.safeTransferETH(to, amount);
        emit EthWithdrawn(to, amount);
    }

    /// @dev Transfers ownership of the contract to a new account (`newOwner`).
    /// @param newOwner address of the new owner
    /// Can only be called by the current owner.
    function transferOwnership(address newOwner) external virtual onlyOwner {
        require(newOwner != address(0), "ZERO_ADDRESS");
        require(newOwner != owner, "SAME_OWNER");
        address previousOwner = owner;
        owner = newOwner;
        emit OwnerChanged(newOwner, previousOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 7 of 13 : IERC20PermitAllowed.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

/// @title Interface for permit
/// @notice Interface used by DAI/CHAI for permit
interface IERC20PermitAllowed {
    /// @notice Approve the spender to spend some tokens via the holder signature
    /// @dev This is the permit interface used by DAI and CHAI
    /// @param holder The address of the token holder, the token owner
    /// @param spender The address of the token spender
    /// @param nonce The holder's nonce, increases at each call to permit
    /// @param expiry The timestamp at which the permit is no longer valid
    /// @param allowed Boolean that sets approval amount, true for type(uint256).max and false for 0
    /// @param v Must produce valid secp256k1 signature from the holder along with `r` and `s`
    /// @param r Must produce valid secp256k1 signature from the holder along with `v` and `s`
    /// @param s Must produce valid secp256k1 signature from the holder along with `r` and `v`
    function permit(
        address holder,
        address spender,
        uint256 nonce,
        uint256 expiry,
        bool allowed,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@uniswap/v3-periphery/contracts/interfaces/external/IERC20PermitAllowed.sol";

interface IDAI is IERC20Metadata, IERC20PermitAllowed {
    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function version() external view returns (string memory);
}

//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";

interface IERC2612 is IERC20Metadata, IERC20Permit {
    function _nonces(address owner) external view returns (uint256);

    function version() external view returns (string memory);
}

//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;

import "./IERC2612.sol";

interface IERC2612Extension is IERC2612 {
    function _nonces(address owner) external view returns (uint256);

    function version() external view returns (string memory);
}

//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

/// @title Weth Interface
/// @dev this interface is only used for testing purposes
interface IWETH is IERC20Metadata {
    function deposit() external payable;

    function withdraw(uint256) external;
}

File 12 of 13 : PermitHelper.sol
//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "../interfaces/IERC2612.sol";
import "../interfaces/IDAI.sol";

/// @title PermitHelper
/// @dev Helper methods for using ERC20 Permit (ERC2612 or DAI/CHAI like)
library PermitHelper {
    struct Permit {
        uint256 value;
        uint256 nonce;
        uint256 deadline;
        bool isDaiStylePermit;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    /// @dev permit method helper that will handle both known implementations
    // DAI vs ERC2612 tokens
    /// @param permitData bytes containing the encoded permit signature
    /// @param tokenAddress address of the token that will be permitted
    /// @param holder address that holds the tokens to be permitted
    /// @param spender address that will be permitted to spend the tokens
    function permit(
        Permit memory permitData,
        address tokenAddress,
        address holder,
        address spender
    ) internal {
        if (permitData.isDaiStylePermit) {
            IDAI(tokenAddress).permit(
                holder,
                spender,
                permitData.nonce,
                permitData.deadline,
                true,
                permitData.v,
                permitData.r,
                permitData.s
            );
        } else {
            IERC2612(tokenAddress).permit(
                holder,
                spender,
                permitData.value,
                permitData.deadline,
                permitData.v,
                permitData.r,
                permitData.s
            );
        }
    }
}

//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;

import "@rari-capital/solmate/src/utils/SafeTransferLib.sol";
import "@rari-capital/solmate/src/tokens/ERC20.sol";
import "../libraries/PermitHelper.sol";

/// @title Rainbow base aggregator contract
contract BaseAggregator {
    /// @dev Used to prevent re-entrancy
    uint256 internal status;

    /// @dev Set of allowed swapTargets.
    mapping(address => bool) public swapTargets;

    /// @dev modifier that prevents reentrancy attacks on specific methods
    modifier nonReentrant() {
        // On the first call to nonReentrant, status will be 1
        require(status != 2, "NON_REENTRANT");

        // Any calls to nonReentrant after this point will fail
        status = 2;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        status = 1;
    }

    /// @dev modifier that ensures only approved targets can be called
    modifier onlyApprovedTarget(address target) {
        require(swapTargets[target], "TARGET_NOT_AUTH");
        _;
    }

    /** EXTERNAL **/

    /// @param buyTokenAddress the address of token that the user should receive
    /// @param target the address of the aggregator contract that will exec the swap
    /// @param swapCallData the calldata that will be passed to the aggregator contract
    /// @param feeAmount the amount of ETH that we will take as a fee
    function fillQuoteEthToToken(
        address buyTokenAddress,
        address payable target,
        bytes calldata swapCallData,
        uint256 feeAmount
    ) external payable nonReentrant onlyApprovedTarget(target) {
        // 1 - Get the initial balances
        uint256 initialTokenBalance = ERC20(buyTokenAddress).balanceOf(
            address(this)
        );
        uint256 initialEthAmount = address(this).balance - msg.value;
        uint256 sellAmount = msg.value - feeAmount;

        // 2 - Call the encoded swap function call on the contract at `target`,
        // passing along any ETH attached to this function call to cover protocol fees
        // minus our fees, which are kept in this contract
        (bool success, bytes memory res) = target.call{value: sellAmount}(
            swapCallData
        );

        // Get the revert message of the call and revert with it if the call failed
        if (!success) {
            assembly {
                let returndata_size := mload(res)
                revert(add(32, res), returndata_size)
            }
        }

        // 3 - Make sure we received the tokens
        {
            uint256 finalTokenBalance = ERC20(buyTokenAddress).balanceOf(
                address(this)
            );
            require(initialTokenBalance < finalTokenBalance, "NO_TOKENS");
        }

        // 4 - Send the received tokens back to the user
        SafeTransferLib.safeTransfer(
            ERC20(buyTokenAddress),
            msg.sender,
            ERC20(buyTokenAddress).balanceOf(address(this)) -
                initialTokenBalance
        );

        // 5 - Return the remaining ETH to the user (if any)
        {
            uint256 finalEthAmount = address(this).balance - feeAmount;
            if (finalEthAmount > initialEthAmount) {
                SafeTransferLib.safeTransferETH(
                    msg.sender,
                    finalEthAmount - initialEthAmount
                );
            }
        }
    }

    /// @param sellTokenAddress the address of token that the user is selling
    /// @param buyTokenAddress the address of token that the user should receive
    /// @param target the address of the aggregator contract that will exec the swap
    /// @param swapCallData the calldata that will be passed to the aggregator contract
    /// @param sellAmount the amount of tokens that the user is selling
    /// @param feeAmount the amount of the tokens to sell that we will take as a fee
    function fillQuoteTokenToToken(
        address sellTokenAddress,
        address buyTokenAddress,
        address payable target,
        bytes calldata swapCallData,
        uint256 sellAmount,
        uint256 feeAmount
    ) external payable nonReentrant onlyApprovedTarget(target) {
        _fillQuoteTokenToToken(
            sellTokenAddress,
            buyTokenAddress,
            target,
            swapCallData,
            sellAmount,
            feeAmount
        );
    }

    /// @dev method that executes ERC20 to ERC20 token swaps with the ability to take a fee from the input
    // and accepts a signature to use permit, so the user doesn't have to make an previous approval transaction
    /// @param sellTokenAddress the address of token that the user is selling
    /// @param buyTokenAddress the address of token that the user should receive
    /// @param target the address of the aggregator contract that will exec the swap
    /// @param swapCallData the calldata that will be passed to the aggregator contract
    /// @param sellAmount the amount of tokens that the user is selling
    /// @param feeAmount the amount of the tokens to sell that we will take as a fee
    /// @param permitData struct containing the value, nonce, deadline, v, r and s values of the permit data
    function fillQuoteTokenToTokenWithPermit(
        address sellTokenAddress,
        address buyTokenAddress,
        address payable target,
        bytes calldata swapCallData,
        uint256 sellAmount,
        uint256 feeAmount,
        PermitHelper.Permit calldata permitData
    ) external payable nonReentrant onlyApprovedTarget(target) {
        // 1 - Apply permit
        PermitHelper.permit(
            permitData,
            sellTokenAddress,
            msg.sender,
            address(this)
        );

        //2 - Call fillQuoteTokenToToken
        _fillQuoteTokenToToken(
            sellTokenAddress,
            buyTokenAddress,
            target,
            swapCallData,
            sellAmount,
            feeAmount
        );
    }

    /// @dev method that executes ERC20 to ETH token swaps with the ability to take a fee from the output
    /// @param sellTokenAddress the address of token that the user is selling
    /// @param target the address of the aggregator contract that will exec the swap
    /// @param swapCallData the calldata that will be passed to the aggregator contract
    /// @param sellAmount the amount of tokens that the user is selling
    /// @param feePercentageBasisPoints the amount of ETH that we will take as a fee in 1e18 basis points (basis points with 4 decimals plus 14 extra decimals of precision)
    function fillQuoteTokenToEth(
        address sellTokenAddress,
        address payable target,
        bytes calldata swapCallData,
        uint256 sellAmount,
        uint256 feePercentageBasisPoints
    ) external payable nonReentrant onlyApprovedTarget(target) {
        _fillQuoteTokenToEth(
            sellTokenAddress,
            target,
            swapCallData,
            sellAmount,
            feePercentageBasisPoints
        );
    }

    /// @dev method that executes ERC20 to ETH token swaps with the ability to take a fee from the output
    // and accepts a signature to use permit, so the user doesn't have to make an previous approval transaction
    /// @param sellTokenAddress the address of token that the user is selling
    /// @param target the address of the aggregator contract that will exec the swap
    /// @param swapCallData the calldata that will be passed to the aggregator contract
    /// @param sellAmount the amount of tokens that the user is selling
    /// @param feePercentageBasisPoints the amount of ETH that we will take as a fee in 1e18 basis points (basis points with 4 decimals plus 14 extra decimals of precision)
    /// @param permitData struct containing the amount, nonce, deadline, v, r and s values of the permit data
    function fillQuoteTokenToEthWithPermit(
        address sellTokenAddress,
        address payable target,
        bytes calldata swapCallData,
        uint256 sellAmount,
        uint256 feePercentageBasisPoints,
        PermitHelper.Permit calldata permitData
    ) external payable nonReentrant onlyApprovedTarget(target) {
        // 1 - Apply permit
        PermitHelper.permit(
            permitData,
            sellTokenAddress,
            msg.sender,
            address(this)
        );

        // 2 - call fillQuoteTokenToEth
        _fillQuoteTokenToEth(
            sellTokenAddress,
            target,
            swapCallData,
            sellAmount,
            feePercentageBasisPoints
        );
    }

    /** INTERNAL **/

    /// @dev internal method that executes ERC20 to ETH token swaps with the ability to take a fee from the output
    function _fillQuoteTokenToEth(
        address sellTokenAddress,
        address payable target,
        bytes calldata swapCallData,
        uint256 sellAmount,
        uint256 feePercentageBasisPoints
    ) internal {
        // 1 - Get the initial ETH amount
        uint256 initialEthAmount = address(this).balance - msg.value;

        // 2 - Move the tokens to this contract
        // NOTE: This implicitly assumes that the the necessary approvals have been granted
        // from msg.sender to the BaseAggregator
        SafeTransferLib.safeTransferFrom(
            ERC20(sellTokenAddress),
            msg.sender,
            address(this),
            sellAmount
        );

        // 3 - Approve the aggregator's contract to swap the tokens
        SafeTransferLib.safeApprove(
            ERC20(sellTokenAddress),
            target,
            sellAmount
        );

        // 4 - Call the encoded swap function call on the contract at `target`,
        // passing along any ETH attached to this function call to cover protocol fees.
        (bool success, bytes memory res) = target.call{value: msg.value}(
            swapCallData
        );

        // Get the revert message of the call and revert with it if the call failed
        if (!success) {
            assembly {
                let returndata_size := mload(res)
                revert(add(32, res), returndata_size)
            }
        }

        // 5 - Check that the tokens were fully spent during the swap
        uint256 allowance = ERC20(sellTokenAddress).allowance(
            address(this),
            target
        );
        require(allowance == 0, "ALLOWANCE_NOT_ZERO");

        // 6 - Subtract the fees and send the rest to the user
        // Fees will be held in this contract
        uint256 finalEthAmount = address(this).balance;
        uint256 ethDiff = finalEthAmount - initialEthAmount;

        require(ethDiff > 0, "NO_ETH_BACK");

        if (feePercentageBasisPoints > 0) {
            uint256 fees = (ethDiff * feePercentageBasisPoints) / 1e18;
            uint256 amountMinusFees = ethDiff - fees;
            SafeTransferLib.safeTransferETH(msg.sender, amountMinusFees);
            // when there's no fee, 1inch sends the funds directly to the user
            // we check to prevent sending 0 ETH in that case
        } else if (ethDiff > 0) {
            SafeTransferLib.safeTransferETH(msg.sender, ethDiff);
        }
    }

    /// @dev internal method that executes ERC20 to ERC20 token swaps with the ability to take a fee from the input
    function _fillQuoteTokenToToken(
        address sellTokenAddress,
        address buyTokenAddress,
        address payable target,
        bytes calldata swapCallData,
        uint256 sellAmount,
        uint256 feeAmount
    ) internal {
        // 1 - Get the initial output token balance
        uint256 initialOutputTokenAmount = ERC20(buyTokenAddress).balanceOf(
            address(this)
        );

        // 2 - Move the tokens to this contract (which includes our fees)
        // NOTE: This implicitly assumes that the the necessary approvals have been granted
        // from msg.sender to the BaseAggregator
        SafeTransferLib.safeTransferFrom(
            ERC20(sellTokenAddress),
            msg.sender,
            address(this),
            sellAmount
        );

        // 3 - Approve the aggregator's contract to swap the tokens if needed
        SafeTransferLib.safeApprove(
            ERC20(sellTokenAddress),
            target,
            sellAmount - feeAmount
        );

        // 4 - Call the encoded swap function call on the contract at `target`,
        // passing along any ETH attached to this function call to cover protocol fees.
        (bool success, bytes memory res) = target.call{value: msg.value}(
            swapCallData
        );

        // Get the revert message of the call and revert with it if the call failed
        if (!success) {
            assembly {
                let returndata_size := mload(res)
                revert(add(32, res), returndata_size)
            }
        }

        // 5 - Check that the tokens were fully spent during the swap
        uint256 allowance = ERC20(sellTokenAddress).allowance(
            address(this),
            target
        );
        require(allowance == 0, "ALLOWANCE_NOT_ZERO");

        // 6 - Make sure we received the tokens
        uint256 finalOutputTokenAmount = ERC20(buyTokenAddress).balanceOf(
            address(this)
        );
        require(initialOutputTokenAmount < finalOutputTokenAmount, "NO_TOKENS");

        // 7 - Send tokens to the user
        SafeTransferLib.safeTransfer(
            ERC20(buyTokenAddress),
            msg.sender,
            finalOutputTokenAmount - initialOutputTokenAmount
        );
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "mode": "3"
  },
  "outputSelection": {
    "*": {
      "*": [
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"}],"name":"SwapTargetAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"}],"name":"SwapTargetRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"buyTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"fillQuoteEthToToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feePercentageBasisPoints","type":"uint256"}],"name":"fillQuoteTokenToEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feePercentageBasisPoints","type":"uint256"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"isDaiStylePermit","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct PermitHelper.Permit","name":"permitData","type":"tuple"}],"name":"fillQuoteTokenToEthWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address","name":"buyTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"fillQuoteTokenToToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address","name":"buyTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"isDaiStylePermit","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct PermitHelper.Permit","name":"permitData","type":"tuple"}],"name":"fillQuoteTokenToTokenWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapTargets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"add","type":"bool"}],"name":"updateSwapTargets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

9c4d535b000000000000000000000000000000000000000000000000000000000000000001000431d326fb5fd792e3c076f5c13175fe72a8f932aeb4262b639182a5036000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x0004000000000002000e00000000000200000000030100190000006004300270000003ea0340019700030000003103550002000000010355000003ea0040019d0000008005000039000000400050043f00000001022001900000006c0000c13d000000040230008c0000007c0000413d000000000201043b000000e002200270000003f10420009c000000890000a13d000003f20420009c000000b20000213d000003f60420009c000002940000613d000003f70420009c000001700000613d000003f80220009c00000a280000c13d000000a40230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d000b00040020003d0000000b04100360000000000404043b000c00000004001d000004020440009c00000a280000213d0000000c022000290000002402200039000000000232004b00000a280000213d0000008402100370000000000202043b0000006401100370000000000301043b000000000100041a000000020110008c000002c90000613d000a00000003001d000800000002001d0000000201000039000000000010041b0000000d0100002900000000001004350000000101000039000900000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b0000000002000416000700000001001d000000000121004b000004c50000813d000004230100004100000000001004350000001101000039000000040010043f000004180100004100000fa6000104300000000001000416000000000101004b00000a280000c13d0000000201000039000000000201041a000003eb022001970000000003000411000000000232019f000000000021041b0000000101000039000000000010041b000000200100003900000100001004430000012000000443000003ec0100004100000fa50001042e000000000103004b00000a280000c13d000000000100041a000000020110008c000000870000613d0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000000f30000c13d000000000100001900000fa50001042e000003f90420009c000000d50000a13d000003fa0420009c0000024d0000613d000003fb0420009c000001210000613d000003fc0220009c00000a280000c13d000000240230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000401100370000000000101043b000003ed0210009c00000a280000213d00000000001004350000000101000039000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff011001900000000001000019000000010100c039000000400200043d0000000000120435000003ea0120009c000003ea02008041000000400120021000000420011001c700000fa50001042e000003f30420009c0000029d0000613d000003f40420009c000001aa0000613d000003f50220009c00000a280000c13d000000240230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000401100370000000000501043b000003ed0150009c00000a280000213d0000000201000039000000000201041a000003ed032001970000000006000411000000000336004b000002d30000c13d000000000305004b000001170000613d000000000365004b000002f30000c13d000003ee01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000040101000041000000c40010043f000003f00100004100000fa600010430000003fd0420009c000000fd0000613d000003fe0220009c00000a280000c13d000000440230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002401100370000000000301043b0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000002d30000c13d0000000e05000029000000000105004b000001170000613d0000000001000414000000040250008c000002eb0000c13d0000008001000039000003550000013d000003ee01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f000003ef01000041000000c40010043f000003f00100004100000fa600010430000000640230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004401100370000000000801043b0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000002d30000c13d0000000d06000029000000000106004b000002dd0000c13d000003ee01000041000000800010043f0000002001000039000000840010043f0000000c01000039000000a40010043f0000042b01000041000000c40010043f000003f00100004100000fa600010430000000c40230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000c00000002001d000003ed0220009c00000a280000213d0000006402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d000a00040020003d0000000a04100360000000000404043b000b00000004001d000004020440009c00000a280000213d0000000b022000290000002402200039000000000232004b00000a280000213d000000a402100370000000000202043b000800000002001d0000008401100370000000000101043b000900000001001d000000000100041a000000020110008c000002c90000613d0000000201000039000000000010041b0000000c0100002900000000001004350000000101000039000700000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d000000400300043d00000417010000410000000001130436000500000001001d0000000001000410000003ed02100197000600000003001d0000000401300039000400000002001d000000000021043500000000010004140000000d02000029000000040220008c000004710000c13d0000000103000031000004a00000013d000000440230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002401100370000000000201043b000000000102004b0000000001000019000000010100c039000d00000002001d000000000112004b00000a280000c13d0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000002d30000c13d0000000e0100002900000000001004350000000101000039000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000201041a0000042c022001970000000d022001af000000000021041b000000400100043d000003ea0210009c000003ea0100804100000040011002100000000d0200006b000003630000613d0000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000413011001c70000800d0200003900000002030000390000041e040000410000036c0000013d000e00000005001d000001840230008c00000a280000413d0000000402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000c00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d0000000404200039000000000441034f000000000404043b000b00000004001d000004020440009c00000a280000213d0000002404200039000a00000004001d0000000b02400029000000000232004b00000a280000213d0000006402100370000000000302043b0000008401100370000000000201043b000000000100041a000000020110008c000002c90000613d000900000003001d000700000002001d0000000201000039000000000010041b0000000c0100002900000000001004350000000101000039000800000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d000000a40100008a0000000001100031000004040210009c00000a280000213d000000e00110008c00000a280000413d000000400100043d000004050210009c00000a870000213d000000e002100039000000400020043f0000000202000367000000a403200370000000000303043b000500000003001d0000000003310436000000c404200370000000000404043b000400000004001d00000000004304350000004003100039000000e404200370000000000404043b000600000004001d00000000004304350000010403200370000000000303043b000000000403004b0000000004000019000000010400c039000000000443004b00000a280000c13d000000600410003900000000003404350000012404200370000000000404043b000300000004001d000000ff0440008c00000a280000213d0000008004100039000000030500002900000000005404350000014404200370000000000504043b000000a004100039000200000005001d0000000000540435000000c0011000390000016402200370000000000202043b000100000002001d0000000000210435000004060100004100000000001004390000000d010000290000000400100443000000000103004b000006110000c13d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000c40130003900000001020000290000000000210435000000a401300039000000020200002900000000002104350000008401300039000000030200002900000000002104350000006401300039000000060200002900000000002104350000004401300039000000050200002900000000002104350000000001000410000003ed01100197000000240230003900000000001204350000040a0100004100000000001304350000000001000411000003ed01100197000600000003001d0000000402300039000000000012043500000000010004140000000d02000029000000040220008c000008930000c13d0000000103000031000008a60000013d000000840230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d000b00040020003d0000000b04100360000000000404043b000c00000004001d000004020440009c00000a280000213d0000000c022000290000002402200039000000000232004b00000a280000213d0000006401100370000000000201043b000000000100041a000000020110008c000002c90000613d000a00000002001d0000000201000039000000000010041b0000000d0100002900000000001004350000000101000039000900000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d000000400300043d00000417010000410000000001130436000700000001001d0000000001000410000003ed02100197000800000003001d0000000401300039000600000002001d000000000021043500000000010004140000000e02000029000000040220008c0000038d0000c13d0000000103000031000003bc0000013d0000000001000416000000000101004b00000a280000c13d0000000201000039000000000101041a000003ed01100197000000800010043f0000041f0100004100000fa50001042e000001a40230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000c00000002001d000003ed0220009c00000a280000213d0000006402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d0000000404200039000000000441034f000000000404043b000b00000004001d000004020440009c00000a280000213d0000002404200039000a00000004001d0000000b02400029000000000232004b00000a280000213d0000008402100370000000000202043b000900000002001d000000a401100370000000000101043b000800000001001d000000000100041a000000020110008c000003750000c13d000003ee01000041000000800010043f0000002001000039000000840010043f0000000d01000039000000a40010043f0000042501000041000000c40010043f000003f00100004100000fa600010430000003ee01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000042801000041000000c40010043f000003f00100004100000fa6000104300000041b01000041000000800010043f000000840060043f000000a40080043f00000000010004140000000e07000029000000040270008c000002ff0000c13d00000001020000390000008001000039000000800400043d000000000040043500000001030000310000032a0000013d000003ea0210009c000003ea01008041000000c001100210000000000203004b000d00000003001d000003480000c13d00000000020500190000034c0000013d000003eb02200197000000000252019f000000000021041b0000000001000414000003ea0210009c000003ea01008041000000c001100210000003ff011001c70000800d02000039000000030300003900000400040000410000036d0000013d000c00000008001d000003ea0210009c000003ea01008041000000c00110021000000429011001c700000000020700190fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000003150000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000003110000c13d000000000605004b000003230000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f0003000000010355000000400100043d00000000040004330000000e070000290000000d060000290000000c08000029000000010440008c000000000400001900000001040060390000001f0530008c00000000050000190000000105002039000000000303004b00000000030000190000000103006039000000010220019000000e1b0000613d000000000254016f000000000223019f000000010220019000000e1b0000613d0000000000810435000003ea0210009c000003ea0100804100000040011002100000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000426011001c70000800d0200003900000003030000390000042a0400004100000000050700190000036d0000013d00000413011001c70000800902000039000000000405001900000000050000190fa40f9a0000040f00030000000103550000006001100270000103ea0010019d000000400100043d000000010220019000000b660000613d0000000e050000290000000d030000290000000000310435000003ea0210009c000003ea0100804100000040011002100000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000426011001c70000800d02000039000000020300003900000427040000410000036d0000013d0000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000413011001c70000800d0200003900000002030000390000041d040000410000000e050000290fa40f9a0000040f000000010120019000000a280000613d000000400100043d000003ea0210009c000003ea01008041000000400110021000000fa50001042e0000000201000039000000000010041b0000000c0100002900000000001004350000000101000039000700000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000004090000c13d000000400100043d0000004402100039000004240300004100000e1d0000013d0000000803000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000709000029000003a90000613d000000000601034f0000000807000029000000006806043c0000000007870436000000000897004b000003a50000c13d000000000604004b000003b80000613d0000000505500210000000000651034f00000008055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000102200190000004da0000613d0000001f013000390000042d021001970000000801200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040130009c00000a280000213d000000200130008c00000a280000413d00000008010000290000000001010433000800000001001d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b0000000002000416000700000001001d000000000121004b000000660000413d0000000a0120006c000000660000413d000000400100043d0000000c040000290000001f0240018f0000000b030000290000002003300039000000020330036700000005044002720000000504400210000003f20000613d0000000005410019000000000603034f0000000007010019000000006806043c0000000007870436000000000857004b000003ee0000c13d000000000502004b000004000000613d000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000c02100029000000000002043500000000020004140000000d03000029000000040330008c0000071b0000c13d00000001020000390000000103000031000007b30000013d000000c40100008a0000000001100031000004040210009c00000a280000213d000000e00110008c00000a280000413d000000400100043d000004050210009c00000a870000213d000000e002100039000000400020043f0000000202000367000000c403200370000000000303043b000500000003001d0000000003310436000000e404200370000000000404043b000400000004001d000000000043043500000040031000390000010404200370000000000404043b000600000004001d00000000004304350000012403200370000000000303043b000000000403004b0000000004000019000000010400c039000000000443004b00000a280000c13d000000600410003900000000003404350000014404200370000000000404043b000300000004001d000000ff0440008c00000a280000213d0000008004100039000000030500002900000000005404350000016404200370000000000504043b000000a004100039000200000005001d0000000000540435000000c0011000390000018402200370000000000202043b000100000002001d0000000000210435000004060100004100000000001004390000000e010000290000000400100443000000000103004b000006410000c13d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000c40130003900000001020000290000000000210435000000a401300039000000020200002900000000002104350000008401300039000000030200002900000000002104350000006401300039000000060200002900000000002104350000004401300039000000050200002900000000002104350000040a0100004100000000001304350000000001000411000003ed01100197000000040230003900000000001204350000000001000410000003ed02100197000600000003001d0000002401300039000500000002001d000000000021043500000000010004140000000e02000029000000040220008c000009e90000c13d0000000103000031000009fc0000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000005090000290000048d0000613d000000000601034f0000000607000029000000006806043c0000000007870436000000000897004b000004890000c13d000000000604004b0000049c0000613d0000000505500210000000000651034f00000006055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000102200190000004e90000613d0000001f013000390000042d021001970000000601200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040230009c00000a280000213d000000200230008c00000a280000413d00000006020000290000000002020433000600000002001d0000004402100039000000090400002900000000004204350000002402100039000000000400041000000000004204350000040d02000041000000000021043500000004021000390000000004000411000000000042043500000000020004140000000e04000029000000040440008c000005c30000c13d000000010200003900000000010104330000000000100435000005ed0000013d000000400100043d00000044021000390000000a0300002900000000003204350000002402100039000000000300041000000000003204350000040d02000041000000000021043500000004021000390000000003000411000000000032043500000000020004140000000e03000029000000040330008c0000050a0000c13d0000000102000039000000000101043300000000001004350000000103000031000005340000013d000000400200043d0000001f0430018f0000000505300272000004e60000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000004e20000c13d000000000604004b000004f70000c13d000005040000013d000000400200043d0000001f0430018f0000000505300272000004f50000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000004f10000c13d000000000604004b000005040000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000006001300210000003ea0320009c000003ea020080410000004002200210000000000112019f00000fa600010430000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000005230000613d000000000601034f0000000007000019000000006806043c000000000907004b00000000078704360000051f0000c13d000000000605004b000005310000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000600001900000001060060390000001f0130008c00000000070000190000000107002039000000000103004b00000000080000190000000108006039000000400100043d00000024041000390000000405100039000000010220019000000b380000613d000000000276016f000000000228019f000000010220019000000b380000613d000004100200004100000000002104350000000d0200002900000000002504350000000a02000029000000000024043500000000020004140000000e04000029000000040440008c000005540000c13d0000000102000039000000000101043300000000001004350000057e0000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f00000005044002720000056d0000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000005690000c13d000000000605004b0000057b0000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000c050000290000001f0250018f0000000b040000290000002004400039000000020440036700000005055002720000059d0000613d00000005065002100000000006610019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b000005990000c13d000000000602004b000005ac0000613d0000000505500210000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000c02100029000000000002043500000000020004140000000d04000029000000040440008c0000067d0000613d0000000c04000029000003ea0340009c000003ea040080410000006003400210000003ea0410009c000003ea010080410000004001100210000000000131019f000003ea0320009c000003ea02008041000000c002200210000000000112019f0000000002000416000000000202004b000006720000c13d0000000d02000029000006770000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000005dc0000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000005d80000c13d000000000605004b000005ea0000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0430008c00000000040000190000000104002039000000000503004b00000000050000190000000105006039000000010220019000000c360000613d000000000141016f000000000115019f000000010110019000000c360000613d0000000902000029000000080120006c000000660000413d0000000902000029000000080220006a000000400100043d000000240410003900000000002404350000041002000041000000000021043500000004021000390000000c04000029000000000042043500000000020004140000000e04000029000000040440008c0000072c0000c13d000000010200003900000000010104330000000000100435000007560000013d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000e40130003900000001020000290000000000210435000000c40130003900000002020000290000000000210435000000a401300039000000030200002900000000002104350000008401300039000000010200003900000000002104350000006401300039000000060200002900000000002104350000004401300039000000040200002900000000002104350000000001000410000003ed0110019700000024023000390000000000120435000004080100004100000000001304350000000001000411000003ed01100197000600000003001d0000000402300039000000000012043500000000010004140000000d02000029000000040220008c000008af0000c13d0000000103000031000008c20000013d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000e40130003900000001020000290000000000210435000000c40130003900000002020000290000000000210435000000a40130003900000003020000290000000000210435000000840130003900000001020000390000000000210435000000640130003900000006020000290000000000210435000000440130003900000004020000290000000000210435000004080100004100000000001304350000000001000411000003ed01100197000000040230003900000000001204350000000001000410000003ed02100197000600000003001d0000002401300039000500000002001d000000000021043500000000010004140000000e02000029000000040220008c00000a060000c13d000000010300003100000a190000013d00000413011001c7000080090200003900000000030004160000000d0400002900000000050000190fa40f9a0000040f000900000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b000006f10000c13d000000600100003900000080020000390000000904000029000000010440019000000ef20000613d000000400400043d00000024014000390000000d02000029000000000021043500000414010000410000000001140436000c00000001001d0000000001000410000003ed01100197000d00000004001d0000000402400039000000000012043500000000010004140000000e02000029000000040220008c000006c30000613d0000000d03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c09000029000006b00000613d000000000601034f0000000d07000029000000006806043c0000000007870436000000000897004b000006ac0000c13d000000000604004b000006bf0000613d0000000505500210000000000651034f0000000d055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f000300000001035500000001022001900000079a0000613d0000001f013000390000042d021001970000000d01200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040230009c00000a280000213d000000200230008c00000a280000413d0000000d020000290000000002020433000000000202004b00000cdd0000c13d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d00000000030004160000000702300069000000000101043b000000000321004b000000660000413d000000000321004b00000b500000c13d000000400100043d00000044021000390000041c03000041000000000032043500000024021000390000000b0300003900000e200000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0430018f00000000023104360000000305000367000000050630027200000005066002100000070c0000613d0000000007620019000000000805034f0000000009020019000000008a08043c0000000009a90436000000000a79004b000007080000c13d000000000704004b000006810000613d000000000565034f00000000066200190000000304400210000000000706043300000000074701cf000000000747022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000474019f0000000000460435000006810000013d0000000c04000029000003ea0340009c000003ea040080410000006003400210000003ea0410009c000003ea010080410000004001100210000000000131019f000003ea0320009c000003ea02008041000000c002200210000000000112019f00000000030004160000000a0230006c000007a90000c13d0000000d02000029000007ae0000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000007450000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000007410000c13d000000000605004b000007530000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000b050000290000001f0250018f0000000a040000290000002004400039000000020440036700000005055002720000000505500210000007750000613d0000000006510019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b000007710000c13d000000000602004b000007830000613d000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000b02100029000000000002043500000000020004140000000c04000029000000040440008c000009000000613d00000000030004160000000b05000029000003ea0450009c000003ea050080410000006004500210000003ea0510009c000003ea010080410000004001100210000000000141019f000003ea0420009c000003ea02008041000000c002200210000000000112019f000000000203004b000008f60000c13d0000000c02000029000008fa0000013d000000400200043d0000001f0430018f0000000505300272000007a60000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000007a20000c13d000000000604004b000005040000613d000004f70000013d0000000a0330006a00000413011001c700008009020000390000000d0400002900000000050000190fa40f9a0000040f00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b000007b80000c13d00000060010000390000008004000039000007e20000013d0000001f013000390000042d011001970000003f011000390000042d04100197000000400100043d0000000004410019000000000514004b00000000050000190000000105004039000004020640009c00000a870000213d000000010550019000000a870000c13d000000400040043f0000001f0530018f000000000431043600000003060003670000000507300272000007d30000613d00000005087002100000000008840019000000000906034f000000000a040019000000009b09043c000000000aba0436000000000b8a004b000007cf0000c13d000000000805004b000007e20000613d0000000507700210000000000676034f00000000077400190000000305500210000000000807043300000000085801cf000000000858022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000585019f000000000057043500000001022001900000088f0000613d000000400200043d00000417010000410000000001120436000c00000001001d000d00000002001d00000004012000390000000602000029000000000021043500000000010004140000000e02000029000000040220008c0000081f0000613d0000000d03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c090000290000080c0000613d000000000601034f0000000d07000029000000006806043c0000000007870436000000000897004b000008080000c13d000000000604004b0000081b0000613d0000000505500210000000000651034f0000000d055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000102200190000009da0000613d0000001f013000390000042d011001970000000d04100029000000000214004b00000000020000190000000102004039000c00000004001d000004020440009c00000a870000213d000000010220019000000a870000c13d0000000c02000029000000400020043f000004040230009c00000a280000213d000000200230008c00000a280000413d0000000c0200002900000004022000390000000d040000290000000004040433000000080440006b00000aba0000813d00000417040000410000000c050000290000000004450436000d00000004001d0000000604000029000000000042043500000000020004140000000e04000029000000040440008c000008710000613d0000000c03000029000003ea0130009c000003ea0100004100000000010340190000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000418011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000d090000290000085c0000613d000000000601034f0000000c07000029000000006806043c0000000007870436000000000897004b000008580000c13d000000000604004b0000086b0000613d0000000505500210000000000651034f0000000c055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000b6c0000613d0000001f0130003900000419011001970000000c02100029000000000112004b00000000010000190000000101004039000004020420009c00000a870000213d000000010110019000000a870000c13d000000400020043f000000200130008c00000a280000413d0000000c010000290000000001010433000000080410006c000000660000413d000000080110006a000000240420003900000000001404350000041b01000041000000000012043500000004012000390000000004000411000000000041043500000000010004140000000e04000029000000040440008c00000d140000c13d0000000001020433000000000010043500000d3f0000013d000003ea0240009c000003ea04008041000000400240021000000ef50000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f0000040b011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000a2a0000613d0000001f013000390000042d021001970000000601200029000000000221004b00000000020000190000000102004039000004020410009c000008ca0000a13d00000a870000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000409011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000a390000613d0000001f013000390000042d021001970000000601200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040130009c00000a280000213d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b0000000002000416000600000001001d000000000121004b000000660000413d000000400100043d0000004402100039000000090300002900000000003204350000002402100039000000000300041000000000003204350000040d02000041000000000021043500000004021000390000000003000411000000000032043500000000020004140000000d03000029000000040330008c00000aee0000c13d000000010200003900000000010104330000000000100435000000010300003100000b180000013d00000413011001c700008009020000390000000c0400002900000000050000190fa40f9a0000040f000700000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b000009050000c13d000000600100003900000080020000390000092f0000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0430018f000000000231043600000003050003670000000506300272000009200000613d00000005076002100000000007720019000000000805034f0000000009020019000000008a08043c0000000009a90436000000000a79004b0000091c0000c13d000000000704004b0000092f0000613d0000000506600210000000000565034f00000000066200190000000304400210000000000706043300000000074701cf000000000747022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000474019f00000000004604350000000704000029000000010440019000000ef20000613d000000400400043d00000024014000390000000c02000029000000000021043500000414010000410000000001140436000b00000001001d000c00000004001d00000004014000390000000402000029000000000021043500000000010004140000000e02000029000000040220008c000009700000613d0000000c03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000b090000290000095d0000613d000000000601034f0000000c07000029000000006806043c0000000007870436000000000897004b000009590000c13d000000000604004b0000096c0000613d0000000505500210000000000651034f0000000c055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000a8d0000613d0000001f013000390000042d011001970000000c04100029000000000214004b00000000020000190000000102004039000e00000004001d000004020440009c00000a870000213d000000010220019000000a870000c13d0000000e02000029000000400020043f000000200230008c00000a280000413d0000000e0200002900000004022000390000000c040000290000000004040433000000000404004b00000ade0000c13d00000417040000410000000e050000290000000004450436000c00000004001d0000000404000029000000000042043500000000020004140000000d04000029000000040440008c000009c00000613d0000000e03000029000003ea0130009c000003ea0100004100000000010340190000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c09000029000009ab0000613d000000000601034f0000000e07000029000000006806043c0000000007870436000000000897004b000009a70000c13d000000000604004b000009ba0000613d0000000505500210000000000651034f0000000e055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000c4f0000613d0000001f0130003900000419011001970000000e01100029000004020210009c00000a870000213d000000400010043f000000200230008c00000a280000413d000000240210003900000004041000390000000e050000290000000005050433000000060650006c00000efb0000a13d0000041b06000041000000000061043500000000060004110000000000640435000000060450006a000000000042043500000000020004140000000d04000029000000040440008c00000de10000c13d00000001020000390000000001010433000000000010043500000e0b0000013d000000400200043d0000001f0430018f00000005053002720000000505500210000009e60000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000009e20000c13d000000000604004b000005040000613d000004f80000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f0000040b011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000a9c0000613d0000001f013000390000042d011001970000000602100029000000000112004b00000000010000190000000101004039000600000002001d000004020220009c00000a220000a13d00000a870000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000409011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000aab0000613d0000001f013000390000042d011001970000000602100029000000000112004b00000000010000190000000101004039000600000002001d000004020220009c00000a870000213d000000010110019000000a870000c13d0000000601000029000000400010043f000004040130009c00000a480000a13d000000000100001900000fa600010430000000400200043d0000001f0430018f0000000505300272000000050550021000000a360000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000a320000c13d000000000604004b000005040000613d000004f80000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000a450000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000a410000c13d000000000604004b000005040000613d000004f80000013d000004170100004100000006020000290000000001120436000400000001001d00000004012000390000000502000029000000000021043500000000010004140000000d02000029000000040220008c00000a820000613d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000000040900002900000a6f0000613d000000000601034f0000000607000029000000006806043c0000000007870436000000000897004b00000a6b0000c13d000000000604004b00000a7e0000613d0000000505500210000000000651034f00000006055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000b410000613d0000001f013000390000042d011001970000000601100029000004020210009c00000ac50000a13d000004230100004100000000001004350000004101000039000000040010043f000004180100004100000fa600010430000000400200043d0000001f0430018f000000050530027200000a990000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000a950000c13d000000000604004b000005040000613d000004f70000013d000000400200043d0000001f0430018f000000050530027200000aa80000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000aa40000c13d000000000604004b000005040000613d000004f70000013d000000400200043d0000001f0430018f000000050530027200000ab70000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000ab30000c13d000000000604004b000005040000613d000004f70000013d000003ee010000410000000c0300002900000000001304350000002001000039000000000012043500000044013000390000041a0200004100000000002104350000002401300039000000090200003900000ae80000013d000000400010043f000000200230008c00000a280000413d00000006020000290000000002020433000600000002001d0000004402100039000000090400002900000000004204350000002402100039000000000400041000000000004204350000040d02000041000000000021043500000004021000390000000004000411000000000042043500000000020004140000000e04000029000000040440008c00000be80000c13d00000001020000390000000001010433000000000010043500000c120000013d000003ee010000410000000e03000029000000000013043500000020010000390000000000120435000000440130003900000415020000410000000000210435000000240130003900000012020000390000000000210435000003ea0130009c000003ea0300804100000040013002100000040e011001c700000fa600010430000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000b070000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000b030000c13d000000000605004b00000b150000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000600001900000001060060390000001f0130008c00000000070000190000000107002039000000000103004b00000000080000190000000108006039000000400100043d00000024041000390000000405100039000000010220019000000b380000613d000000000276016f000000000228019f000000010220019000000b380000613d000004100200004100000000002104350000000c0200002900000000002504350000000902000029000000000024043500000000020004140000000d04000029000000040440008c00000b7b0000c13d00000001020000390000000001010433000000000010043500000ba50000013d000003ee020000410000000000210435000000200200003900000000002504350000001402000039000000000024043500000044021000390000040f0300004100000e250000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000b4d0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000b490000c13d000000000604004b000005040000613d000004f80000013d0000000003210049000000080100006b00000c3d0000c13d00000000010004140000000002000411000000040220008c00000f960000613d000003ea0210009c000003ea01008041000000c00110021000000413011001c70000800902000039000000000400041100000000050000190fa40f9a0000040f00000000030100190000006003300270000103ea0030019d0003000000010355000000010120019000000f960000c13d000000400100043d0000004402100039000004220300004100000000003204350000002402100039000000130300003900000e200000013d000000400200043d0000001f0430018f000000050530027200000b780000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000b740000c13d000000000604004b000005040000613d000004f70000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000b940000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000b900000c13d000000000605004b00000ba20000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000b050000290000001f0250018f0000000a0400002900000002044003670000000505500272000000050550021000000bc30000613d0000000006510019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b00000bbf0000c13d000000000602004b00000bd10000613d000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000b02100029000000000002043500000000020004140000000c04000029000000040440008c00000c690000613d0000000b04000029000003ea0340009c000003ea040080410000006003400210000003ea0410009c000003ea010080410000004001100210000000000131019f000003ea0320009c000003ea02008041000000c002200210000000000112019f0000000002000416000000000202004b00000c5e0000c13d0000000c0200002900000c630000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000c010000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000bfd0000c13d000000000605004b00000c0f0000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0430008c00000000040000190000000104002039000000000503004b00000000050000190000000105006039000000010220019000000c360000613d000000000141016f000000000115019f000000010110019000000c360000613d0000000802000029000000090120006b000000660000413d00000008020000290000000902200069000000400100043d000000240410003900000000002404350000041002000041000000000021043500000004021000390000000c04000029000000000042043500000000020004140000000e04000029000000040440008c00000d6e0000c13d00000001020000390000000001010433000000000010043500000d980000013d000000400100043d00000044021000390000040f0300004100000000003204350000002402100039000000140300003900000e200000013d0000042e21300129000000080110006c000000660000413d00000008213000b9000004161210012a000000000123004b000000660000413d00000000010004140000000004000411000000040440008c00000f960000613d000003ea0410009c000003ea01008041000000c001100210000000000423004b00000f8b0000c13d000000000200041100000f900000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000c5b0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000c570000c13d000000000604004b000005040000613d000004f80000013d00000413011001c7000080090200003900000000030004160000000c0400002900000000050000190fa40f9a0000040f000800000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b00000ce30000c13d00000060010000390000000802000029000000010220019000000d0f0000613d000000400400043d00000024014000390000000c02000029000000000021043500000414010000410000000001140436000c00000001001d0000000001000410000003ed01100197000e00000004001d0000000402400039000000000012043500000000010004140000000d02000029000000040220008c00000cae0000613d0000000e03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c0900002900000c9b0000613d000000000601034f0000000e07000029000000006806043c0000000007870436000000000897004b00000c970000c13d000000000604004b00000caa0000613d0000000505500210000000000651034f0000000e055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000e2b0000613d0000001f013000390000042d021001970000000e01200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040230009c00000a280000213d000000200230008c00000a280000413d0000000e020000290000000002020433000000000202004b00000cdd0000c13d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d00000000030004160000000602300069000000000101043b000000000321004b000000660000413d000000000321004b000006ea0000613d0000000003210049000000070100006b00000f400000c13d00000000010004140000000002000411000000040220008c00000b570000c13d00000f960000013d0000004402100039000004150300004100000000003204350000002402100039000000120300003900000e200000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0230018f0000000004310436000e00000004001d0000000304000367000000050530027200000cff0000613d00000005065002100000000e080000290000000006680019000000000704034f000000007907043c0000000008980436000000000968004b00000cfb0000c13d000000000602004b00000c6c0000613d0000000505500210000000000454034f0000000e055000290000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f000000000025043500000c6c0000013d0000000e03000029000003ea0230009c000003ea03008041000000400230021000000ef50000013d000003ea0320009c000003ea020080410000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9a0000040f000900000002001d00000000020100190000006002200270000003ea03200197000000200230008c000000200200003900000000020340190000001f0420018f000000050220027200000d2e0000613d000000000501034f0000000006000019000000005705043c000000000806004b000000000676043600000d2a0000c13d000000000504004b00000d3c0000613d00000003044002100000000502200210000000000502043300000000054501cf000000000545022f000000000621034f000000000606043b0000010004400089000000000646022f00000000044601cf000000000454019f0000000000420435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0230008c00000000020000190000000102002039000000000303004b000000000300001900000001030060390000000904000029000000010440019000000e1a0000613d000000000121016f000000000113019f000000010110019000000e1a0000613d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000201043b0000000a0120006c000000660000413d000000000300041600000007013000690000000a0220006a000000000312004b00000f960000a13d00000000040004140000000003000411000000040330008c00000f960000613d0000000003120049000003ea0140009c000003ea04008041000000c00140021000000b5a0000013d000000000001042f000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000d870000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000d830000c13d000000000605004b00000d950000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000b050000290000001f0250018f0000000a0400002900000002044003670000000505500272000000050550021000000db60000613d0000000006510019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b00000db20000c13d000000000602004b00000dc40000613d000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000b02100029000000000002043500000000020004140000000c04000029000000040440008c00000e440000613d00000000030004160000000b05000029000003ea0450009c000003ea050080410000006004500210000003ea0510009c000003ea010080410000004001100210000000000141019f000003ea0420009c000003ea02008041000000c002200210000000000112019f000000000203004b00000e3a0000c13d0000000c0200002900000e3e0000013d00000044021000390000041203000041000000000032043500000024021000390000000e0300003900000e200000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000dfa0000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000df60000c13d000000000605004b00000e080000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0430008c00000000040000190000000104002039000000000303004b00000000030000190000000103006039000000010220019000000e1a0000613d000000000141016f000000000113019f000000010110019000000f960000c13d000000400100043d00000044021000390000042103000041000000000032043500000024021000390000000f030000390000000000320435000003ee020000410000000000210435000000040210003900000020030000390000000000320435000003ea0210009c000003ea0100804100000040011002100000040e011001c700000fa600010430000000400200043d0000001f0430018f000000050530027200000e370000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000e330000c13d000000000604004b000005040000613d000004f70000013d00000413011001c700008009020000390000000c0400002900000000050000190fa40f9a0000040f000700000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b00000f040000c13d000000600100003900000080020000390000000704000029000000010440019000000ef20000613d000000400400043d00000024014000390000000c02000029000000000021043500000414010000410000000001140436000b00000001001d000c00000004001d00000004014000390000000502000029000000000021043500000000010004140000000e02000029000000040220008c00000e890000613d0000000c03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000b0900002900000e760000613d000000000601034f0000000c07000029000000006806043c0000000007870436000000000897004b00000e720000c13d000000000604004b00000e850000613d0000000505500210000000000651034f0000000c055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000f2e0000613d0000001f013000390000042d011001970000000c04100029000000000214004b00000000020000190000000102004039000b00000004001d000004020440009c00000a870000213d000000010220019000000a870000c13d0000000b02000029000000400020043f000000200230008c00000a280000413d0000000b0200002900000004022000390000000c040000290000000004040433000000000404004b00000f3d0000c13d00000417040000410000000b050000290000000004450436000e00000004001d0000000504000029000000000042043500000000020004140000000d04000029000000040440008c00000ed80000613d0000000b03000029000003ea0130009c000003ea0100004100000000010340190000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000ec30000613d000000000601034f0000000b07000029000000006806043c00000000078704360000000e0870006c00000ebf0000c13d000000000604004b00000ed20000613d0000000505500210000000000651034f0000000b055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000f510000613d0000001f0130003900000419011001970000000b01100029000004020210009c00000a870000213d000000400010043f000000200230008c00000a280000413d000000240210003900000004041000390000000b050000290000000005050433000000060650006c00000efb0000a13d0000041b06000041000000000061043500000000060004110000000000640435000000060450006a000000000042043500000000020004140000000d04000029000000040440008c00000f600000c13d00000001020000390000000001010433000000000010043500000f8a0000013d000003ea0320009c000003ea0200804100000040022002100000000001010433000003ea0310009c000003ea010080410000006001100210000000000121019f00000fa600010430000003ee030000410000000000310435000000200300003900000000003404350000000903000039000000000032043500000044021000390000041a0300004100000e250000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0430018f000000000231043600000003050003670000000506300272000000050660021000000f1f0000613d0000000007620019000000000805034f0000000009020019000000008a08043c0000000009a90436000000000a79004b00000f1b0000c13d000000000704004b00000e480000613d000000000565034f00000000066200190000000304400210000000000706043300000000074701cf000000000747022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000474019f000000000046043500000e480000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000f3a0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000f360000c13d000000000604004b000005040000613d000004f80000013d000003ee010000410000000b0300002900000ae00000013d0000042e21300129000000070110006c000000660000413d00000007213000b9000004161210012a000000000123004b000000660000413d00000000010004140000000004000411000000040440008c00000f960000613d000003ea0410009c000003ea01008041000000c001100210000000000423004b00000f8b0000c13d00000c4d0000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000f5d0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000f590000c13d000000000604004b000005040000613d000004f80000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000f790000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000f750000c13d000000000605004b00000f870000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f0003000000010355000000000100043300000e0b0000013d000000000323004900000413011001c70000800902000039000000000400041100000000050000190fa40f9a0000040f00030000000103550000006001100270000103ea0010019d000000010120019000000b650000613d0000000101000039000000000010041b000003700000013d000000000001042f00000f9d002104210000000102000039000000000001042d0000000002000019000000000001042d00000fa2002104230000000102000039000000000001042d0000000002000019000000000001042d00000fa40000043200000fa50001042e00000fa600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff08c379a0000000000000000000000000000000000000000000000000000000004e4f5f52454345495645000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000b0480bbc00000000000000000000000000000000000000000000000000000000b0480bbd00000000000000000000000000000000000000000000000000000000b309383800000000000000000000000000000000000000000000000000000000f2fde38b000000000000000000000000000000000000000000000000000000008da5cb5b0000000000000000000000000000000000000000000000000000000097bbda0e00000000000000000000000000000000000000000000000000000000999b6464000000000000000000000000000000000000000000000000000000003c2b9a7c000000000000000000000000000000000000000000000000000000003c2b9a7d0000000000000000000000000000000000000000000000000000000055e4b7be0000000000000000000000000000000000000000000000000000000083c4a19d0000000000000000000000000000000000000000000000000000000001e33667000000000000000000000000000000000000000000000000000000001b9a91a40200000000000000000000000000000000000000000000800000000000000000b532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c53414d455f4f574e455200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff02000000000000000000000000000000000000400000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff1f1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000008fcbaf0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104000000000000000000000000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3923b872dd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000005452414e534645525f46524f4d5f4641494c4544000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000415050524f56455f4641494c45440000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000414c4c4f57414e43455f4e4f545f5a45524f00000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000070a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffe04e4f5f544f4b454e530000000000000000000000000000000000000000000000a9059cbb000000000000000000000000000000000000000000000000000000004e4f5f4554485f4241434b000000000000000000000000000000000000000000393b8be3e26787f19285ecd039dfd80bc6507828750f4d50367e6efe2524695cb907822409611d127ab6a64611591b98e03a6a85ade4f258bae26b7c1efdfeaf000000000000000000000000000000000000002000000080000000000000000000000000000000000000000000000000000000200000000000000000000000005452414e534645525f4641494c454400000000000000000000000000000000004554485f5452414e534645525f4641494c4544000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000005441524745545f4e4f545f4155544800000000000000000000000000000000004e4f4e5f5245454e5452414e540000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000008455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b4f4e4c595f4f574e45520000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000008210728e7c071f615b840ee026032693858fbcd5e5359e67e438c890f59e56205a45524f5f414444524553530000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000a477bf07e6873b2ec363e5ddff43ebf9ef5b19bfabde2e0e43ddbdb51dbf443

Block Transaction Gas Used Reward
view all blocks produced

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