S Price: $0.48789 (+0.10%)
    /

    Contract

    0xcE623B19B2598980E85f93B064799eec500104b2

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo0 S

    S Value

    $0.00

    Multichain Info

    No addresses found
    Age:24H
    Reset Filter

    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount

    There are no matching entries

    Update your filters to view other transactions

    Parent Transaction Hash Block Age From To Amount
    View All Internal Transactions
    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    OffchainExchange

    Compiler Version
    v0.8.13+commit.abaa5c0e

    Optimization Enabled:
    Yes with 800 runs

    Other Settings:
    default evmVersion
    File 1 of 32 : OffchainExchange.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
    import "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol";
    import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
    import "./interfaces/engine/IProductEngine.sol";
    import "./libraries/MathSD21x18.sol";
    import "./common/Constants.sol";
    import "./libraries/MathHelper.sol";
    import "./libraries/RiskHelper.sol";
    import "./libraries/Logger.sol";
    import "./interfaces/IOffchainExchange.sol";
    import "./EndpointGated.sol";
    import "./common/Errors.sol";
    import "./interfaces/engine/ISpotEngine.sol";
    import "./interfaces/engine/IPerpEngine.sol";
    contract OffchainExchange is
    IOffchainExchange,
    EndpointGated,
    EIP712Upgradeable
    {
    using MathSD21x18 for int128;
    IClearinghouse internal clearinghouse;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 32 : OwnableUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
    pragma solidity ^0.8.0;
    import "../utils/ContextUpgradeable.sol";
    import "../proxy/utils/Initializable.sol";
    /**
    * @dev Contract module which provides a basic access control mechanism, where
    * there is an account (an owner) that can be granted exclusive access to
    * specific functions.
    *
    * By default, the owner account will be the one that deploys the contract. This
    * can later be changed with {transferOwnership}.
    *
    * This module is used through inheritance. It will make available the modifier
    * `onlyOwner`, which can be applied to your functions to restrict their use to
    * the owner.
    */
    abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 32 : Initializable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/utils/Initializable.sol)
    pragma solidity ^0.8.2;
    import "../../utils/AddressUpgradeable.sol";
    /**
    * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
    * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
    * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
    * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
    *
    * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
    * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
    * case an upgrade adds a module that needs to be initialized.
    *
    * For example:
    *
    * [.hljs-theme-light.nopadding]
    * ```
    * contract MyToken is ERC20Upgradeable {
    * function initialize() initializer public {
    * __ERC20_init("MyToken", "MTK");
    * }
    * }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 32 : AddressUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Address.sol)
    pragma solidity ^0.8.1;
    /**
    * @dev Collection of functions related to the address type
    */
    library AddressUpgradeable {
    /**
    * @dev Returns true if `account` is a contract.
    *
    * [IMPORTANT]
    * ====
    * It is unsafe to assume that an address for which this function returns
    * false is an externally-owned account (EOA) and not a contract.
    *
    * Among others, `isContract` will return false for the following
    * types of addresses:
    *
    * - an externally-owned account
    * - a contract in construction
    * - an address where a contract will be created
    * - an address where a contract lived, but was destroyed
    * ====
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 32 : ContextUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
    pragma solidity ^0.8.0;
    import "../proxy/utils/Initializable.sol";
    /**
    * @dev Provides information about the current execution context, including the
    * sender of the transaction and its data. While these are generally available
    * via msg.sender and msg.data, they should not be accessed in such a direct
    * manner, since when dealing with meta-transactions the account sending and
    * paying for execution may not be the actual sender (as far as an application
    * is concerned).
    *
    * This contract is only required for intermediate, library-like contracts.
    */
    abstract contract ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }
    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
    return msg.sender;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 32 : draft-EIP712Upgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/draft-EIP712.sol)
    pragma solidity ^0.8.0;
    // EIP-712 is Final as of 2022-08-11. This file is deprecated.
    import "./EIP712Upgradeable.sol";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 32 : ECDSAUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/ECDSA.sol)
    pragma solidity ^0.8.0;
    import "../StringsUpgradeable.sol";
    /**
    * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
    *
    * These functions can be used to verify that a message was signed by the holder
    * of the private keys of a given address.
    */
    library ECDSAUpgradeable {
    enum RecoverError {
    NoError,
    InvalidSignature,
    InvalidSignatureLength,
    InvalidSignatureS,
    InvalidSignatureV // Deprecated in v4.8
    }
    function _throwError(RecoverError error) private pure {
    if (error == RecoverError.NoError) {
    return; // no error: do nothing
    } else if (error == RecoverError.InvalidSignature) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 32 : EIP712Upgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/EIP712.sol)
    pragma solidity ^0.8.0;
    import "./ECDSAUpgradeable.sol";
    import "../../proxy/utils/Initializable.sol";
    /**
    * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
    *
    * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
    * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
    * they need in their contracts using a combination of `abi.encode` and `keccak256`.
    *
    * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
    * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
    * ({_hashTypedDataV4}).
    *
    * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
    * the chain id to protect against replay attacks on an eventual fork of the chain.
    *
    * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
    * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
    *
    * _Available since v3.4._
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 32 : MathUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/Math.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Standard math utilities missing in the Solidity language.
    */
    library MathUpgradeable {
    enum Rounding {
    Down, // Toward negative infinity
    Up, // Toward infinity
    Zero // Toward zero
    }
    /**
    * @dev Returns the largest of two numbers.
    */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
    return a > b ? a : b;
    }
    /**
    * @dev Returns the smallest of two numbers.
    */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 32 : StringsUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Strings.sol)
    pragma solidity ^0.8.0;
    import "./math/MathUpgradeable.sol";
    /**
    * @dev String operations.
    */
    library StringsUpgradeable {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;
    /**
    * @dev Converts a `uint256` to its ASCII `string` decimal representation.
    */
    function toString(uint256 value) internal pure returns (string memory) {
    unchecked {
    uint256 length = MathUpgradeable.log10(value) + 1;
    string memory buffer = new string(length);
    uint256 ptr;
    /// @solidity memory-safe-assembly
    assembly {
    ptr := add(buffer, add(32, length))
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 32 : IERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Interface of the ERC20 standard as defined in the EIP.
    */
    interface IERC20 {
    /**
    * @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);
    /**
    * @dev Returns the amount of tokens in existence.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 32 : ECDSA.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/ECDSA.sol)
    pragma solidity ^0.8.0;
    import "../Strings.sol";
    /**
    * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
    *
    * These functions can be used to verify that a message was signed by the holder
    * of the private keys of a given address.
    */
    library ECDSA {
    enum RecoverError {
    NoError,
    InvalidSignature,
    InvalidSignatureLength,
    InvalidSignatureS,
    InvalidSignatureV // Deprecated in v4.8
    }
    function _throwError(RecoverError error) private pure {
    if (error == RecoverError.NoError) {
    return; // no error: do nothing
    } else if (error == RecoverError.InvalidSignature) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 32 : Math.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/Math.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Standard math utilities missing in the Solidity language.
    */
    library Math {
    enum Rounding {
    Down, // Toward negative infinity
    Up, // Toward infinity
    Zero // Toward zero
    }
    /**
    * @dev Returns the largest of two numbers.
    */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
    return a > b ? a : b;
    }
    /**
    * @dev Returns the smallest of two numbers.
    */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 32 : Strings.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Strings.sol)
    pragma solidity ^0.8.0;
    import "./math/Math.sol";
    /**
    * @dev String operations.
    */
    library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;
    /**
    * @dev Converts a `uint256` to its ASCII `string` decimal representation.
    */
    function toString(uint256 value) internal pure returns (string memory) {
    unchecked {
    uint256 length = Math.log10(value) + 1;
    string memory buffer = new string(length);
    uint256 ptr;
    /// @solidity memory-safe-assembly
    assembly {
    ptr := add(buffer, add(32, length))
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 32 : Constants.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    /// @dev Each clearinghouse has a unique quote product
    uint32 constant QUOTE_PRODUCT_ID = 0;
    /// @dev Fees account
    bytes32 constant FEES_ACCOUNT = bytes32(0);
    bytes32 constant X_ACCOUNT = 0x0000000000000000000000000000000000000000000000000000000000000001;
    string constant DEFAULT_REFERRAL_CODE = "-1";
    uint128 constant MINIMUM_LIQUIDITY = 10**3;
    int128 constant ONE = 10**18;
    uint8 constant MAX_DECIMALS = 18;
    int128 constant TAKER_SEQUENCER_FEE = 0; // $0.00
    int128 constant SLOW_MODE_FEE = 1000000; // $1
    int128 constant FAST_WITHDRAWAL_FEE_RATE = 1_000_000_000_000_000; // 0.1%
    int128 constant LIQUIDATION_FEE = 1e18; // $1
    int128 constant HEALTHCHECK_FEE = 1e18; // $1
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 32 : Errors.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    // Trying to take an action on vertex when
    string constant ERR_REQUIRES_DEPOSIT = "RS";
    // ERC20 Transfer failed
    string constant ERR_TRANSFER_FAILED = "TF";
    // Unauthorized
    string constant ERR_UNAUTHORIZED = "U";
    // Invalid product
    string constant ERR_INVALID_PRODUCT = "IP";
    // Subaccount health too low
    string constant ERR_SUBACCT_HEALTH = "SH";
    // Not liquidatable
    string constant ERR_NOT_LIQUIDATABLE = "NL";
    // Liquidator health too low
    string constant ERR_NOT_LIQUIDATABLE_INITIAL = "NLI";
    // Liquidatee has positive initial health
    string constant ERR_LIQUIDATED_TOO_MUCH = "LTM";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 32 : EndpointGated.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
    import "./interfaces/IEndpoint.sol";
    import "./interfaces/IEndpointGated.sol";
    import "./libraries/MathSD21x18.sol";
    import "./common/Constants.sol";
    import "hardhat/console.sol";
    abstract contract EndpointGated is OwnableUpgradeable, IEndpointGated {
    address private endpoint;
    function setEndpoint(address _endpoint) internal onlyOwner {
    endpoint = _endpoint;
    }
    function getEndpoint() public view returns (address) {
    return endpoint;
    }
    function getOracleTime() internal view returns (uint128) {
    return IEndpoint(endpoint).getTime();
    }
    modifier onlyEndpoint() {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 32 : IClearinghouse.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "./IClearinghouseEventEmitter.sol";
    import "../engine/IProductEngine.sol";
    import "../IEndpoint.sol";
    import "../IEndpointGated.sol";
    import "../../libraries/RiskHelper.sol";
    interface IClearinghouse is IClearinghouseEventEmitter, IEndpointGated {
    function addEngine(
    address engine,
    address offchainExchange,
    IProductEngine.EngineType engineType
    ) external;
    function registerProduct(uint32 productId) external;
    function transferQuote(IEndpoint.TransferQuote calldata tx) external;
    function depositCollateral(IEndpoint.DepositCollateral calldata tx)
    external;
    function withdrawCollateral(
    bytes32 sender,
    uint32 productId,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 32 : IClearinghouseEventEmitter.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    interface IClearinghouseEventEmitter {
    /// @notice Emitted during initialization
    event ClearinghouseInitialized(address endpoint, address quote);
    /// @notice Emitted when collateral is modified for a subaccount
    event ModifyCollateral(
    int128 amount,
    bytes32 indexed subaccount,
    uint32 productId
    );
    event Liquidation(
    bytes32 indexed liquidatorSubaccount,
    bytes32 indexed liquidateeSubaccount,
    uint32 productId,
    bool isEncodedSpread,
    int128 amount,
    int128 amountQuote
    );
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 32 : IPerpEngine.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "./IProductEngine.sol";
    import "../../libraries/RiskHelper.sol";
    interface IPerpEngine is IProductEngine {
    event FundingPayment(
    uint32 productId,
    uint128 dt,
    int128 openInterest,
    int128 payment
    );
    struct State {
    int128 cumulativeFundingLongX18;
    int128 cumulativeFundingShortX18;
    int128 availableSettle;
    int128 openInterest;
    }
    struct Balance {
    int128 amount;
    int128 vQuoteBalance;
    int128 lastCumulativeFundingX18;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 32 : IProductEngine.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    import "../clearinghouse/IClearinghouse.sol";
    import "../../libraries/RiskHelper.sol";
    interface IProductEngine {
    event AddProduct(uint32 productId);
    enum EngineType {
    SPOT,
    PERP
    }
    enum HealthType {
    INITIAL,
    MAINTENANCE,
    PNL
    }
    struct ProductDelta {
    uint32 productId;
    bytes32 subaccount;
    int128 amountDelta;
    int128 vQuoteDelta;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 32 : ISpotEngine.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "./IProductEngine.sol";
    import "../../libraries/RiskHelper.sol";
    interface ISpotEngine is IProductEngine {
    event InterestPayment(
    uint32 productId,
    uint128 dt,
    int128 depositRateMultiplierX18,
    int128 borrowRateMultiplierX18,
    int128 feeAmount
    );
    struct Config {
    address token;
    int128 interestInflectionUtilX18;
    int128 interestFloorX18;
    int128 interestSmallCapX18;
    int128 interestLargeCapX18;
    }
    struct State {
    int128 cumulativeDepositsMultiplierX18;
    int128 cumulativeBorrowsMultiplierX18;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 32 : IEndpoint.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "./clearinghouse/IClearinghouse.sol";
    interface IEndpoint {
    event SubmitTransactions();
    // events that we parse transactions into
    enum TransactionType {
    LiquidateSubaccount,
    DepositCollateral,
    WithdrawCollateral,
    SpotTick,
    UpdatePrice,
    SettlePnl,
    MatchOrders,
    DepositInsurance,
    ExecuteSlowMode,
    MintLp,
    BurnLp,
    SwapAMM,
    MatchOrderAMM,
    DumpFees,
    ClaimSequencerFees,
    PerpTick,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 32 : IEndpointGated.sol
    1
    2
    3
    4
    5
    6
    7
    8
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.13;
    import "./IEndpoint.sol";
    interface IEndpointGated {
    function getEndpoint() external view returns (address endpoint);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 25 of 32 : IOffchainExchange.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "./clearinghouse/IClearinghouse.sol";
    interface IOffchainExchange {
    event FillOrder(
    uint32 indexed productId,
    // original order information
    bytes32 indexed digest,
    bytes32 indexed subaccount,
    int128 priceX18,
    int128 amount,
    uint64 expiration,
    uint64 nonce,
    // whether this order is taking or making
    bool isTaker,
    // amount paid in fees (in quote)
    int128 feeAmount,
    // change in this subaccount's base balance from this fill
    int128 baseDelta,
    // change in this subaccount's quote balance from this fill
    int128 quoteDelta
    );
    event CloseIsolatedSubaccount(
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 32 : Logger.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.0;
    import "@openzeppelin/contracts/utils/Strings.sol";
    import "./MathHelper.sol";
    library Logger {
    event VertexEVMLog(string message);
    function log(string memory message) internal {
    emit VertexEVMLog(message);
    }
    function log(int128 value) internal {
    log(MathHelper.int2str(value));
    }
    function log(string memory message, int128 value) internal {
    log(string.concat(message, " ", MathHelper.int2str(value)));
    }
    function log(string memory message, uint128 value) internal {
    log(string.concat(message, " ", MathHelper.uint2str(value)));
    }
    // function log(string memory message, uint32 value) internal {
    // log(message, uint128(value));
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 27 of 32 : MathHelper.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "./MathSD21x18.sol";
    /// @title MathHelper
    /// @dev Provides basic math functions
    library MathHelper {
    using MathSD21x18 for int128;
    /// @notice Returns market id for two given product ids
    function max(int128 a, int128 b) internal pure returns (int128) {
    return a > b ? a : b;
    }
    function min(int128 a, int128 b) internal pure returns (int128) {
    return a < b ? a : b;
    }
    function abs(int128 val) internal pure returns (int128) {
    return val < 0 ? -val : val;
    }
    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(int128 y) internal pure returns (int128 z) {
    require(y >= 0, "ds-math-sqrt-non-positive");
    if (y > 3) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 28 of 32 : MathSD21x18.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "prb-math/contracts/PRBMathSD59x18.sol";
    library MathSD21x18 {
    using PRBMathSD59x18 for int256;
    int128 private constant ONE_X18 = 1000000000000000000;
    int128 private constant MIN_X18 = -0x80000000000000000000000000000000;
    int128 private constant MAX_X18 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
    string private constant ERR_OVERFLOW = "OF";
    string private constant ERR_DIV_BY_ZERO = "DBZ";
    function fromInt(int128 x) internal pure returns (int128) {
    unchecked {
    int256 result = int256(x) * ONE_X18;
    require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
    return int128(result);
    }
    }
    function mulDiv(
    int128 x,
    int128 y,
    int128 z
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 32 : RiskHelper.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import "./MathSD21x18.sol";
    import "../interfaces/engine/IProductEngine.sol";
    import "../common/Constants.sol";
    import "../common/Errors.sol";
    import "./MathHelper.sol";
    /// @title RiskHelper
    /// @dev Provides basic math functions
    library RiskHelper {
    using MathSD21x18 for int128;
    struct RiskStore {
    // these weights are all
    // between 0 and 2
    // these integers are the real
    // weights times 1e9
    int32 longWeightInitial;
    int32 shortWeightInitial;
    int32 longWeightMaintenance;
    int32 shortWeightMaintenance;
    int128 priceX18;
    }
    struct Risk {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 30 of 32 : console.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.4.22 <0.9.0;
    library console {
    address constant CONSOLE_ADDRESS =
    0x000000000000000000636F6e736F6c652e6c6f67;
    function _sendLogPayloadImplementation(bytes memory payload) internal view {
    address consoleAddress = CONSOLE_ADDRESS;
    /// @solidity memory-safe-assembly
    assembly {
    pop(
    staticcall(
    gas(),
    consoleAddress,
    add(payload, 32),
    mload(payload),
    0,
    0
    )
    )
    }
    }
    function _castToPure(
    function(bytes memory) internal view fnIn
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 31 of 32 : PRBMath.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: Unlicense
    pragma solidity >=0.8.4;
    /// @notice Emitted when the result overflows uint256.
    error PRBMath__MulDivFixedPointOverflow(uint256 prod1);
    /// @notice Emitted when the result overflows uint256.
    error PRBMath__MulDivOverflow(uint256 prod1, uint256 denominator);
    /// @notice Emitted when one of the inputs is type(int256).min.
    error PRBMath__MulDivSignedInputTooSmall();
    /// @notice Emitted when the intermediary absolute result overflows int256.
    error PRBMath__MulDivSignedOverflow(uint256 rAbs);
    /// @notice Emitted when the input is MIN_SD59x18.
    error PRBMathSD59x18__AbsInputTooSmall();
    /// @notice Emitted when ceiling a number overflows SD59x18.
    error PRBMathSD59x18__CeilOverflow(int256 x);
    /// @notice Emitted when one of the inputs is MIN_SD59x18.
    error PRBMathSD59x18__DivInputTooSmall();
    /// @notice Emitted when one of the intermediary unsigned results overflows SD59x18.
    error PRBMathSD59x18__DivOverflow(uint256 rAbs);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 32 of 32 : PRBMathSD59x18.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: Unlicense
    pragma solidity >=0.8.4;
    import "./PRBMath.sol";
    /// @title PRBMathSD59x18
    /// @author Paul Razvan Berg
    /// @notice Smart contract library for advanced fixed-point math that works with int256 numbers considered to have 18
    /// trailing decimals. We call this number representation signed 59.18-decimal fixed-point, since the numbers can have
    /// a sign and there can be up to 59 digits in the integer part and up to 18 decimals in the fractional part. The numbers
    /// are bound by the minimum and the maximum values permitted by the Solidity type int256.
    library PRBMathSD59x18 {
    /// @dev log2(e) as a signed 59.18-decimal fixed-point number.
    int256 internal constant LOG2_E = 1_442695040888963407;
    /// @dev Half the SCALE number.
    int256 internal constant HALF_SCALE = 5e17;
    /// @dev The maximum value a signed 59.18-decimal fixed-point number can have.
    int256 internal constant MAX_SD59x18 =
    57896044618658097711785492504343953926634992332820282019728_792003956564819967;
    /// @dev The maximum whole value a signed 59.18-decimal fixed-point number can have.
    int256 internal constant MAX_WHOLE_SD59x18 =
    57896044618658097711785492504343953926634992332820282019728_000000000000000000;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    {
    "optimizer": {
    "enabled": true,
    "runs": 800
    },
    "outputSelection": {
    "*": {
    "*": [
    "evm.bytecode",
    "evm.deployedBytecode",
    "devdoc",
    "userdoc",
    "metadata",
    "abi"
    ]
    }
    },
    "metadata": {
    "useLiteralContent": true
    },
    "libraries": {}
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"isolatedSubaccount","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"parentSubaccount","type":"bytes32"}],"name":"CloseIsolatedSubaccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"productId","type":"uint32"},{"indexed":true,"internalType":"bytes32","name":"digest","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"indexed":false,"internalType":"int128","name":"priceX18","type":"int128"},{"indexed":false,"internalType":"int128","name":"amount","type":"int128"},{"indexed":false,"internalType":"uint64","name":"expiration","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bool","name":"isTaker","type":"bool"},{"indexed":false,"internalType":"int128","name":"feeAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"baseDelta","type":"int128"},{"indexed":false,"internalType":"int128","name":"quoteDelta","type":"int128"}],"name":"FillOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"components":[{"components":[{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"int128","name":"priceX18","type":"int128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"int128","name":"margin","type":"int128"}],"internalType":"struct IEndpoint.IsolatedOrder","name":"order","type":"tuple"},{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEndpoint.CreateIsolatedSubaccount","name":"txn","type":"tuple"},{"internalType":"address","name":"linkedSigner","type":"address"}],"name":"createIsolatedSubaccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dumpFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"filledAmounts","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint32[]","name":"productIds","type":"uint32[]"}],"name":"getAllFeeRates","outputs":[{"components":[{"internalType":"int64","name":"makerRateX18","type":"int64"},{"internalType":"int64","name":"takerRateX18","type":"int64"},{"internalType":"uint8","name":"isNonDefault","type":"uint8"}],"internalType":"struct IOffchainExchange.FeeRates[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllVirtualBooks","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"startAt","type":"uint32"},{"internalType":"uint32","name":"limit","type":"uint32"}],"name":"getCustomFeeAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"components":[{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"int128","name":"priceX18","type":"int128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct IEndpoint.Order","name":"order","type":"tuple"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEndpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bool","name":"taker","type":"bool"}],"name":"getFeeFractionX18","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getFeeRatesX18","outputs":[{"internalType":"int128","name":"","type":"int128"},{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"components":[{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"int128","name":"priceX18","type":"int128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"int128","name":"margin","type":"int128"}],"internalType":"struct IEndpoint.IsolatedOrder","name":"order","type":"tuple"}],"name":"getIsolatedDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"getIsolatedSubaccounts","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getLpParams","outputs":[{"components":[{"internalType":"int128","name":"lpSpreadX18","type":"int128"}],"internalType":"struct IOffchainExchange.LpParams","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getMarketInfo","outputs":[{"components":[{"internalType":"uint32","name":"quoteId","type":"uint32"},{"internalType":"int128","name":"minSize","type":"int128"},{"internalType":"int128","name":"sizeIncrement","type":"int128"},{"internalType":"int128","name":"collectedFees","type":"int128"}],"internalType":"struct IOffchainExchange.MarketInfo","name":"m","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getMinSize","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"getParentSubaccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getSizeIncrement","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getVirtualBook","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clearinghouse","type":"address"},{"internalType":"address","name":"_endpoint","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parent","type":"bytes32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"isIsolatedSubaccountActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"int128","name":"baseDelta","type":"int128"},{"internalType":"int128","name":"quoteDelta","type":"int128"},{"components":[{"components":[{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"int128","name":"priceX18","type":"int128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct IEndpoint.Order","name":"order","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEndpoint.SignedOrder","name":"taker","type":"tuple"}],"internalType":"struct IEndpoint.MatchOrderAMM","name":"txn","type":"tuple"},{"internalType":"address","name":"takerLinkedSigner","type":"address"}],"name":"matchOrderAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"productId","type":"uint32"},{"components":[{"components":[{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"int128","name":"priceX18","type":"int128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct IEndpoint.Order","name":"order","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEndpoint.SignedOrder","name":"taker","type":"tuple"},{"components":[{"components":[{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"int128","name":"priceX18","type":"int128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct IEndpoint.Order","name":"order","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IEndpoint.SignedOrder","name":"maker","type":"tuple"}],"internalType":"struct IEndpoint.MatchOrders","name":"matchOrders","type":"tuple"},{"internalType":"address","name":"takerLinkedSigner","type":"address"},{"internalType":"address","name":"makerLinkedSigner","type":"address"}],"internalType":"struct IEndpoint.MatchOrdersWithSigner","name":"txn","type":"tuple"}],"name":"matchOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"int128","name":"priceX18","type":"int128"}],"internalType":"struct IEndpoint.SwapAMM","name":"txn","type":"tuple"}],"name":"swapAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"tryCloseIsolatedSubaccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"int64","name":"makerRateX18","type":"int64"},{"internalType":"int64","name":"takerRateX18","type":"int64"}],"name":"updateFeeRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"uint32","name":"quoteId","type":"uint32"},{"internalType":"address","name":"virtualBook","type":"address"},{"internalType":"int128","name":"sizeIncrement","type":"int128"},{"internalType":"int128","name":"minSize","type":"int128"},{"internalType":"int128","name":"lpSpreadX18","type":"int128"}],"name":"updateMarket","outputs":[],"stateMutability":"nonpayable","type":"function"}]

    608060405234801561001057600080fd5b50615a5c80620000216000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806388bc796811610104578063b60aaa7c116100a2578063edc6d37b11610071578063edc6d37b146104cf578063f2b26331146104ef578063f2fde38b14610502578063f6ee7b4b1461051557600080fd5b8063b60aaa7c14610481578063b76d78e314610494578063ce933e59146104a7578063d895202a146104af57600080fd5b8063a27a250a116100de578063a27a250a14610437578063a5ae218b1461044a578063aed8e9671461045d578063b5cbd70e1461046e57600080fd5b806388bc7968146104005780638da5cb5b1461041357806395ee60711461042457600080fd5b806340f1a34d1161017157806366f87bd11161014b57806366f87bd114610396578063707c8b58146103dd578063715018a6146103e557806378f0d3ce146103ed57600080fd5b806340f1a34d146102f95780634821c8b51461032f578063485cc9551461038357600080fd5b80631a2b2d16116101ad5780631a2b2d16146102495780631d029b4d1461026c5780632da1c59b146102c65780633fceea28146102d957600080fd5b80630f2c878e146101d45780630f4b509d1461020657806313b56ddb1461021b575b600080fd5b6101e76101e2366004614a5a565b610528565b60408051600f93840b81529190920b6020820152015b60405180910390f35b610219610214366004614aa2565b6105c5565b005b61023b610229366004614abe565b600090815260a8602052604090205490565b6040519081526020016101fd565b61025c610257366004614ad7565b6109e1565b60405190151581526020016101fd565b61027f61027a366004614af9565b610a36565b6040516101fd9190600060808201905063ffffffff83511682526020830151600f0b60208301526040830151600f0b60408301526060830151600f0b606083015292915050565b6102196102d4366004614b4a565b610af7565b6102ec6102e7366004614bcc565b610cb9565b6040516101fd9190614bfa565b61031c610307366004614abe565b609e60205260009081526040902054600f0b81565b604051600f9190910b81526020016101fd565b61037161033d366004614af9565b604080516020808201835260009182905263ffffffff939093168152609d8352819020815192830190915254600f0b815290565b6040519051600f0b81526020016101fd565b610219610391366004614c47565b610de9565b6103c56103a4366004614af9565b63ffffffff166000908152609c60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016101fd565b6102196110ae565b610219611538565b6102196103fb366004614c75565b61154c565b61021961040e366004614cbc565b6118d0565b6033546001600160a01b03166103c5565b61023b610432366004614de4565b611ec0565b61023b610445366004614f2c565b612040565b61023b610458366004614fde565b6124e9565b6065546001600160a01b03166103c5565b61031c61047c36600461500b565b612580565b61031c61048f366004614af9565b612620565b6102196104a2366004615064565b612647565b6102ec612afd565b6104c26104bd366004615149565b612dc8565b6040516101fd919061520b565b6104e26104dd366004614abe565b612f60565b6040516101fd919061526e565b61031c6104fd366004614af9565b613062565b6102196105103660046152a6565b613090565b610219610523366004614abe565b613120565b606082811c600090815260a16020908152604080832063ffffffff8616845282528083208151948501825254600781810b8652600160401b8204900b92850192909252600160801b90910460ff169083018190529091829182036105ab5750604080516060810182526000815265b5e620f4800060208201526001918101919091525b60208101519051600791820b9350900b90505b9250929050565b6065546001600160a01b031633146106375760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b60648201526084015b60405180910390fd5b6040805180820190915260018152605560f81b60208201526269736f823562ffffff16036106785760405162461bcd60e51b815260040161062e91906152c3565b50600061068e61027a6040840160208501614af9565b905060006106aa6106a56040850160208601614af9565b61316e565b905060006106be6080850160608601615318565b600f0b136040518060400160405280600381526020016224a82960e91b815250906106fc5760405162461bcd60e51b815260040161062e91906152c3565b5080604001511561076757816040015183604001602081019061071f9190615318565b610729919061534b565b60408051808201909152600381526204953560ec1b602082015290600f0b156107655760405162461bcd60e51b815260040161062e91906152c3565b505b6000816040015161077c57816020015161077f565b81515b90506000806001600160a01b03831663c7167cf56107a36040890160208a01614af9565b6107b360608a0160408b01615318565b6107df6107c660808c0160608d01615318565b6107d660608d0160408e01615318565b600f0b90613290565b6107e890615383565b6040516001600160e01b031960e086901b16815263ffffffff939093166004840152600f91820b6024840152900b604482015260640160408051808303816000875af115801561083c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086091906153a9565b915091508161086e90615383565b915061087981615383565b905060006108c36108906040890160208a01614af9565b88358886866000600f83900b136108b4578b602001516108af90615383565b6108ba565b8b602001515b6000600161330b565b87519093509091506108da90869089358686613330565b609a546040516388b6496f60e01b81526000916001600160a01b0316906388b6496f9061090e908b359085906004016153ee565b602060405180830381865afa15801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f9190615412565b600f0b121560405180604001604052806002815260200161125560f21b8152509061098d5760405162461bcd60e51b815260040161062e91906152c3565b506060860151609b60006109a760408b0160208c01614af9565b63ffffffff168152602081019190915260400160002080546001600160801b03928316600160801b02921691909117905550505050505050565b6000805b600a811015610a2a57600084815260a9602090815260408083208484529091529020548303610a18576001915050610a30565b80610a228161542f565b9150506109e5565b50600090505b92915050565b6040805160808101825260008082526020808301829052828401829052606080840183815263ffffffff878116808652609b85528786208851948501895254600781810b8652600160401b8204810b86880152600160801b909104600f90810b868b0190815292885260a49096529790952054168552925190910b909152805191929091610ac9910b633b9aca00615448565b600f0b602080840191909152810151610ae99060070b633b9aca00615448565b600f0b604083015250919050565b610aff61351d565b6001600160a01b03841615610ba95763ffffffff86166000908152609c60205260409020546001600160a01b031615610b7a5760405162461bcd60e51b815260206004820152601860248201527f7669727475616c20626f6f6b20616c7265616479207365740000000000000000604482015260640161062e565b63ffffffff86166000908152609c6020526040902080546001600160a01b0319166001600160a01b0386161790555b63ffffffff85811614610bdf5763ffffffff868116600090815260a460205260409020805463ffffffff19169187169190911790555b610bed633b9aca00836154e6565b63ffffffff87166000908152609b60205260409020805467ffffffffffffffff191667ffffffffffffffff92909216919091179055610c30633b9aca00846154e6565b63ffffffff969096166000818152609b6020908152604080832080546fffffffffffffffff00000000000000001916600160401b67ffffffffffffffff909c169b909b029a909a1790995588518082018a52600f9490940b8452918152609d90915295909520945185546001600160801b0319166001600160801b039091161790945550505050565b60606000610cc7838561552d565b60a35490915063ffffffff8082169083161115610ce2578091505b8063ffffffff168563ffffffff161115610cfa578094505b6000610d068684615555565b63ffffffff1667ffffffffffffffff811115610d2457610d24614cf7565b604051908082528060200260200182016040528015610d4d578160200160208202803683370190505b509050855b8363ffffffff168163ffffffff161015610ddf5760a38163ffffffff1681548110610d7f57610d7f61557a565b6000918252602090912001546001600160a01b031682610d9f8984615555565b63ffffffff1681518110610db557610db561557a565b6001600160a01b039092166020928302919091019091015280610dd781615590565b915050610d52565b5095945050505050565b600054610100900460ff1615808015610e095750600054600160ff909116105b80610e235750303b158015610e23575060005460ff166001145b610e955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161062e565b6000805460ff191660011790558015610eb8576000805461ff0019166101001790555b610ec061358c565b610ec9826135ff565b610f3d6040518060400160405280600681526020017f56657274657800000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e31000000000000000000000000000000000000000000000000000000815250613629565b609a80546001600160a01b0319166001600160a01b038516908117909155604051635d2e9ad160e01b8152635d2e9ad190610f7d906000906004016155b3565b602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906155cd565b609f80546001600160a01b0319166001600160a01b03928316179055609a54604051635d2e9ad160e01b8152911690635d2e9ad190611002906001906004016155b3565b602060405180830381865afa15801561101f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104391906155cd565b60a080546001600160a01b0319166001600160a01b039290921691909117905580156110a9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6065546001600160a01b0316331461111b5760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b609f54604080516347428e7b60e01b815290516000926001600160a01b0316916347428e7b91600480830192869291908290030181865afa158015611164573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261118c91908101906155ea565b905060015b81518163ffffffff161015611326576000828263ffffffff16815181106111ba576111ba61557a565b60209081029190910181015163ffffffff81166000908152609b8352604080822081516060810183529054600781810b8352600160401b8204900b95820195909552600160801b909404600f0b9084018190529193501261121c575050611314565b609f5463ffffffff838116600090815260a460205260408082205485820151915163e0b0621f60e01b8152931660048401526024830191909152600f0b60448201526001600160a01b039091169063e0b0621f90606401600060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b50506000604080850182815263ffffffff9096168252609b6020908152912084518154929095015195516001600160801b03908116600160801b0267ffffffffffffffff978816600160401b026001600160801b0319909416979096169690961791909117949094169290921790925550505b8061131e81615590565b915050611191565b5060a060009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561137a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a291908101906155ea565b905060005b81518163ffffffff161015611534576000828263ffffffff16815181106113d0576113d061557a565b60209081029190910181015163ffffffff81166000908152609b8352604080822081516060810183529054600781810b8352600160401b8204900b95820195909552600160801b909404600f0b90840181905291935003611432575050611522565b60a054604082810151905163f8a42e5160e01b815263ffffffff851660048201526000602482018190526044820152600f9190910b60648201526001600160a01b039091169063f8a42e5190608401600060405180830381600087803b15801561149b57600080fd5b505af11580156114af573d6000803e3d6000fd5b50506000604080850182815263ffffffff9096168252609b6020908152912084518154929095015195516001600160801b03908116600160801b0267ffffffffffffffff978816600160401b026001600160801b0319909416979096169690961791909117949094169290921790925550505b8061152c81615590565b9150506113a7565b5050565b61154061369e565b61154a60006136f8565b565b6065546001600160a01b031633146115b95760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b60006115cb6106a56020850185614af9565b905060006115df61027a6020860186614af9565b905060006116106115f36020870187614af9565b6116006060880188615684565b61043290368190038101906156a4565b905060006116216060870187615684565b611632906060810190604001615318565b905060006116436060880188615684565b61164c906156c0565b80515190915062ffffff166269736f1415604051806040016040528060018152602001605560f81b815250906116955760405162461bcd60e51b815260040161062e91906152c3565b506116a3858583868a61374a565b60405180604001604052806002815260200161125560f21b815250906116dc5760405162461bcd60e51b815260040161062e91906152c3565b5060008061170a876116f460408c0160208d01615318565b61170460608d0160408e01615318565b866139f0565b9092509050600061176561172160208c018c614af9565b855180516040909101518a9087908790829061173d908d615733565b6117479190615733565b611755600f8a900b8b613c7a565b61175e90615383565b600161330b565b885186515191945091925061177d918a918686613330565b604080518082019091526002815261125560f21b602082015250835151866117a860208d018d614af9565b865160208082015160608084015160809485015160408051600f95860b81528f860b9681019690965267ffffffffffffffff92831690860152169083015260019282019290925285820b60a082015287820b60c08201529086900b60e082015263ffffffff91909116907f7c57459d6f4f0fb2fc5b1e298c8c0eb238422944964aa1e249eaa78747f0cca9906101000160405180910390a46060870151609b600061185660208e018e614af9565b63ffffffff1681526020810191909152604090810160002080546001600160801b03938416600160801b02931692909217909155845101516118989086615733565b6000968752609e602052604090962080546001600160801b0319166001600160801b0390971696909617909555505050505050505050565b6065546001600160a01b0316331461193d5760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b600061195a61194c8380615783565b6106a5906020810190614af9565b6040805160608101825260008082526020820181905291810182905291925090819081908190600061198f8760600151610a36565b9050600061199d8980615783565b6119ab906020810190615684565b6119b4906156c0565b905060006119c28a80615783565b6119d0906040810190615684565b6119d9906156c0565b905060405180606001604052806119f88b606001518560000151611ec0565b8152602001611a0f8b606001518460000151611ec0565b81528251604090810151600f0b6020928301528251600090815260aa90925290205490945015611a4e578351600090815260aa60205260409020548251525b602080850151600090815260aa909152604090205415611a8157602080850151600090815260aa90915260409020548151525b8160000151604001519750611aaf89848487600001518e6020016020810190611aaa91906152a6565b61374a565b60405180604001604052806002815260200161125560f21b81525090611ae85760405162461bcd60e51b815260040161062e91906152c3565b50611b0789848387602001518e6040016020810190611aaa91906152a6565b60405180604001604052806002815260200161494d60f01b81525090611b405760405162461bcd60e51b815260040161062e91906152c3565b5081516040908101518251820151825180840190935260048352634f43424d60e01b60208401526000600f91820b81129290910b1303611b935760405162461bcd60e51b815260040161062e91906152c3565b506000816000015160400151600f0b1315611c0357816000015160200151600f0b816000015160200151600f0b1215604051806040016040528060048152602001634f43424d60e01b81525090611bfd5760405162461bcd60e51b815260040161062e91906152c3565b50611c5a565b816000015160200151600f0b816000015160200151600f0b1315604051806040016040528060048152602001634f43424d60e01b81525090611c585760405162461bcd60e51b815260040161062e91906152c3565b505b611c6f89848460000151846000015188613ce3565b8096508197505050611cb789606001518360000151600001518589898b8860000151604001518f611ca09190615733565b611caa9190615733565b875160200151600161330b565b8451845151929950909650611cd0918b91908989613330565b604080518082019091526002815261125560f21b602082015250604080518082019091526002815261494d60f01b602082015250606080840151908a015163ffffffff166000908152609b6020526040902080546001600160801b03928316600160801b029216919091179055815151600114611d8657815160400151611d579089615733565b84516000908152609e6020526040902080546001600160801b0319166001600160801b03929092169190911790555b805151600114611ddb578060000151604001518460400151611da89190615733565b6020858101516000908152609e9091526040902080546001600160801b0319166001600160801b03929092169190911790555b815151611de790613eba565b805151611df390613eba565b81600001516000015184600001518a6060015163ffffffff167f7c57459d6f4f0fb2fc5b1e298c8c0eb238422944964aa1e249eaa78747f0cca98560000151602001518c87600001516060015188600001516080015160018f8f8f604051611eac989796959493929190600f98890b815296880b602088015267ffffffffffffffff95861660408801529390941660608601529015156080850152840b60a084015290830b60c083015290910b60e08201526101000190565b60405180910390a450505050505050505050565b60008060405180608001604052806052815260200161596d6052913990506000818051906020012084600001518560200151866040015187606001518860800151604051602001611f4a969594939291909586526020860194909452600f92830b6040860152910b606084015267ffffffffffffffff90811660808401521660a082015260c00190565b60405160208183030381529060405280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611f8e60665490565b60675463ffffffff89166000908152609c6020908152604091829020548251918201959095529081019290925260608201524660808201526001600160a01b0390911660a082015260c001604051602081830303815290604052805190602001209050612036818360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b9695505050505050565b6065546000906001600160a01b031633146120b05760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b82515162ffffff166269736f1415604051806040016040528060018152602001605560f81b815250906120f65760405162461bcd60e51b815260040161062e91906152c3565b50600061210b846020015185600001516124e9565b9050612125846000015160000151828587604001516142a9565b60405180604001604052806002815260200161495360f01b8152509061215e5760405162461bcd60e51b815260040161062e91906152c3565b5083515160601c600081815260a7602052604081205490805b82816001901b116121f2576001811b8316156121e057875151600090815260a96020908152604080832084845290915290205480156121de5760006121bb82614309565b9050896020015163ffffffff168163ffffffff16036121dc575091506121f2565b505b505b6121eb600182615799565b9050612177565b50806123085761220560016104006157b1565b82036122535760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e792069736f6c61746564207375626163636f756e7473000000604482015260640161062e565b60005b600183161561227657600192831c9261226f90826157c8565b9050612256565b6020888101516001600160a01b038616600090815260a7835260408082208054600160ff881690811b9091179091558c515160189690961b63ff0000001693851b67ffffffff000000001660608a901b6bffffffffffffffffffffffff191617939093176269736f1780835260a88552818320959095558b5151825260a9845280822092825291909252902081905590505b600061238088602001516040518060a001604052808b600001516000015181526020018b6000015160200151600f0b81526020018b6000015160400151600f0b81526020018b600001516060015167ffffffffffffffff1681526020018b600001516080015167ffffffffffffffff16815250611ec0565b600081815260aa60205260408120849055895160a00151919250600f9190910b13156124de57875160a090810151600083815260ab6020526040812080546001600160801b0319166001600160801b0390931692909217909155609f548a5180519301516001600160a01b039091169263e0b0621f929161240090615383565b6040516001600160e01b031960e086901b16815263ffffffff9390931660048401526024830191909152600f0b6044820152606401600060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5050609f548a5160a0015160405163e0b0621f60e01b81526000600482015260248101879052600f9190910b60448201526001600160a01b03909116925063e0b0621f9150606401600060405180830381600087803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b505050505b509695505050505050565b6000806040518060a00160405280606881526020016159bf60689139905060008180519060200120846000015185602001518660400151876060015188608001518960a00151604051602001611f4a97969594939291909687526020870195909552600f93840b604087015291830b606086015267ffffffffffffffff90811660808601521660a08401520b60c082015260e00190565b606083811c600090815260a16020908152604080832063ffffffff8716845282528083208151948501825254600781810b8652600160401b8204900b92850192909252600160801b90910460ff1690830181905290919082036126025750604080516060810182526000815265b5e620f4800060208201526001918101919091525b8261260e578051612614565b80602001515b60070b95945050505050565b63ffffffff81166000908152609b6020526040812054610a309060070b633b9aca00615448565b6065546001600160a01b031633146126b45760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b6001600160a01b038416600090815260a2602052604090205460ff1661273a576001600160a01b038416600081815260a260205260408120805460ff1916600190811790915560a3805491820181559091527f60859188cffe297f44dde29f2d2865634621f26215049caeb304ccba566a8b170180546001600160a01b03191690911790555b63ffffffff8316612a6557609f54604080516347428e7b60e01b815290516000926001600160a01b0316916347428e7b91600480830192869291908290030181865afa15801561278e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127b691908101906155ea565b9050600060a060009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561280d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261283591908101906155ea565b905060005b82518163ffffffff16101561296457600063ffffffff16838263ffffffff16815181106128695761286961557a565b602002602001015163ffffffff1603156129525760405180606001604052808660070b81526020018560070b8152602001600160ff1681525060a16000896001600160a01b03166001600160a01b031681526020019081526020016000206000858463ffffffff16815181106128e1576128e161557a565b60209081029190910181015163ffffffff1682528181019290925260409081016000208351815493850151949092015160ff16600160801b0260ff60801b1967ffffffffffffffff958616600160401b026001600160801b0319909516959093169490941792909217169190911790555b8061295c81615590565b91505061283a565b5060005b81518163ffffffff161015612a5d5760405180606001604052808660070b81526020018560070b8152602001600160ff1681525060a16000896001600160a01b03166001600160a01b031681526020019081526020016000206000848463ffffffff16815181106129db576129db61557a565b60209081029190910181015163ffffffff1682528181019290925260409081016000208351815493850151949092015160ff16600160801b0260ff60801b1967ffffffffffffffff958616600160401b026001600160801b03199095169590931694909417929092171691909117905580612a5581615590565b915050612968565b505050612af7565b60408051606081018252600784810b825283900b602080830191825260018385019081526001600160a01b038916600090815260a1835285812063ffffffff8a168252909252939020915182549151935160ff16600160801b0260ff60801b1967ffffffffffffffff958616600160401b026001600160801b0319909416959092169490941791909117169190911790555b50505050565b60606000609f60009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612b54573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b7c91908101906155ea565b9050600060a060009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612bd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bfb91908101906155ea565b90506000805b83518163ffffffff161015612c78578163ffffffff16848263ffffffff1681518110612c2f57612c2f61557a565b602002602001015163ffffffff161115612c6657838163ffffffff1681518110612c5b57612c5b61557a565b602002602001015191505b80612c7081615590565b915050612c01565b5060005b82518163ffffffff161015612cf3578163ffffffff16838263ffffffff1681518110612caa57612caa61557a565b602002602001015163ffffffff161115612ce157828163ffffffff1681518110612cd657612cd661557a565b602002602001015191505b80612ceb81615590565b915050612c7c565b506000612d0182600161552d565b63ffffffff1667ffffffffffffffff811115612d1f57612d1f614cf7565b604051908082528060200260200182016040528015612d48578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1611612dbf5763ffffffff81166000818152609c602052604090205483516001600160a01b039091169184918110612d9557612d9561557a565b6001600160a01b039092166020928302919091019091015280612db781615590565b915050612d4e565b50949350505050565b6060600082518451612dda91906157ed565b67ffffffffffffffff811115612df257612df2614cf7565b604051908082528060200260200182016040528015612e3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612e105790505b50905060005b8451811015612f585760005b8451811015612f455760a16000878481518110612e6e57612e6e61557a565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000868381518110612eaa57612eaa61557a565b60209081029190910181015163ffffffff16825281810192909252604090810160002081516060810183529054600781810b8352600160401b8204900b93820193909352600160801b90920460ff1690820152855184908390612f0d90866157ed565b612f179190615799565b81518110612f2757612f2761557a565b60200260200101819052508080612f3d9061542f565b915050612e4f565b5080612f508161542f565b915050612e43565b509392505050565b60606000805b600a811015612fb057600084815260a9602090815260408083208484529091529020548015612f9d57612f9a600184615799565b92505b5080612fa88161542f565b915050612f66565b5060008167ffffffffffffffff811115612fcc57612fcc614cf7565b604051908082528060200260200182016040528015612ff5578160200160208202803683370190505b50905060005b600a811015612f5857600085815260a960209081526040808320848452909152902054801561304f57808361302f8661580c565b955085815181106130425761304261557a565b6020026020010181815250505b508061305a8161542f565b915050612ffb565b63ffffffff81166000908152609b6020526040812054610a3090600160401b900460070b633b9aca00615448565b61309861369e565b6001600160a01b0381166131145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161062e565b61311d816136f8565b50565b609a546040805180820190915260018152605560f81b6020820152906001600160a01b031633146131645760405162461bcd60e51b815260040161062e91906152c3565b5061311d81613eba565b604080516080810182526000808252602082018190529181018290526060810191909152609a5460405163deb14ec360e01b815263ffffffff841660048201526000916001600160a01b03169063deb14ec390602401602060405180830381865afa1580156131e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320591906155cd565b60a0549091506001600160a01b039081169082168190036132565750604080516080810182526001600160a01b0390921682526000602083015260019082015263ffffffff90921660608301525090565b5050604080516080810182526000808252609f546001600160a01b031660208301529181019190915263ffffffff90921660608301525090565b600080670de0b6b3a7640000600f85810b9085900b025b0590506f7fffffffffffffffffffffffffffffff1981128015906132d2575060016001607f1b038113155b6040518060400160405280600281526020016127a360f11b81525090612f585760405162461bcd60e51b815260040161062e91906152c3565b60008061331e8a8a8a8a8a8a8a8a61432d565b915091505b9850989650505050505050565b8460400151156133c1578451606086015160405163f8a42e5160e01b815263ffffffff909116600482015260248101859052600f84810b604483015283900b60648201526001600160a01b039091169063f8a42e51906084015b600060405180830381600087803b1580156133a457600080fd5b505af11580156133b8573d6000803e3d6000fd5b50505050613516565b63ffffffff8416613423576020850151606086015160405163f8a42e5160e01b815263ffffffff909116600482015260248101859052600f84810b604483015283900b60648201526001600160a01b039091169063f8a42e519060840161338a565b6020850151606086015160405163e0b0621f60e01b815263ffffffff909116600482015260248101859052600f84900b60448201526001600160a01b039091169063e0b0621f90606401600060405180830381600087803b15801561348757600080fd5b505af115801561349b573d6000803e3d6000fd5b505050602086015160405163e0b0621f60e01b815263ffffffff8716600482015260248101869052600f84900b60448201526001600160a01b03909116915063e0b0621f90606401600060405180830381600087803b1580156134fd57600080fd5b505af1158015613511573d6000803e3d6000fd5b505050505b5050505050565b609f546001600160a01b0316331480613540575060a0546001600160a01b031633145b61154a5760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c7920656e67696e652063616e206d6f6469667920636f6e666967000000604482015260640161062e565b600054610100900460ff166135f75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b61154a6144a2565b61360761369e565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166136945760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b6115348282614516565b6033546001600160a01b0316331461154a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161062e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82515160009060001901613760575060016139e7565b8351805160009061377090614309565b905063ffffffff8116156137cb578063ffffffff16886060015163ffffffff1614604051806040016040528060018152602001605560f81b815250906137c95760405162461bcd60e51b815260040161062e91906152c3565b505b6000858152609e602052604090819020549083018051600f9290920b918291906137f6908390615733565b600f0b9052506060830151603d1c6001908116036139ae576000896040015161389f5760208a015160608b01518551604051637c1e148760e01b815263ffffffff909216600483015260248201526001600160a01b0390911690637c1e1487906044016040805180830381865afa158015613875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138999190615823565b5161391f565b895160608b01518551604051637c1e148760e01b815263ffffffff909216600483015260248201526001600160a01b0390911690637c1e148790604401606060405180830381865afa1580156138f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391d9190615882565b515b9050600081600f0b13151560008560400151600f0b1315150361394857600060408501526139ac565b60008460400151600f0b131561397c5761396f84604001518261396a90615383565b61459b565b600f0b60408501526139ac565b60008460400151600f0b12156139ac576139a384604001518261399e90615383565b6145b9565b600f0b60408501525b505b60008360200151600f0b1380156139cb57506040830151600f0b15155b80156139e157506139df83606001516145ce565b155b93505050505b95945050505050565b60008080613a0d613a05600f87900b88613c7a565b600f0b6145ff565b90506000846000015160400151600f0b1315613adb57836000015160200151600f0b81600f0b1315604051806040016040528060048152602001634f43424d60e01b81525090613a705760405162461bcd60e51b815260040161062e91906152c3565b50600086600f0b128015613a9a5750613a8886615383565b600f0b846000015160400151600f0b12155b604051806040016040528060048152602001634f43424d60e01b81525090613ad55760405162461bcd60e51b815260040161062e91906152c3565b50613b8f565b836000015160200151600f0b81600f0b1215604051806040016040528060048152602001634f43424d60e01b81525090613b285760405162461bcd60e51b815260040161062e91906152c3565b50600086600f0b138015613b525750613b4086615383565b600f0b846000015160400151600f0b13155b604051806040016040528060048152602001634f43424d60e01b81525090613b8d5760405162461bcd60e51b815260040161062e91906152c3565b505b60008760400151613ba4578760200151613ba7565b87515b606089015160405163c7167cf560e01b815263ffffffff9091166004820152600f89810b602483015288900b604482015290915060009081906001600160a01b0384169063c7167cf59060640160408051808303816000875af1158015613c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3691906153a9565b91509150818760000151604001818151613c5091906158f4565b600f0b905250613c5f82615383565b613c6882615383565b95509550505050505b94509492505050565b600081600f0b600014156040518060400160405280600381526020016222212d60e91b81525090613cbe5760405162461bcd60e51b815260040161062e91906152c3565b50600082600f0b670de0b6b3a7640000600f0b85600f0b02816132a7576132a7615335565b60008060008560400151600f0b1215613d1357613d0c8560400151856040015161399e90615383565b9150613d44565b60008560400151600f0b1315613d3957613d0c8560400151856040015161396a90615383565b506000905080613eb0565b6040860151613d53908361534b565b613d5d9083615733565b91506000613d7b856020015184600f0b61329090919063ffffffff16565b9050613d8681615383565b91506000613dad896060015187600001518a87613da290615383565b86600080600061330b565b80935081925050508387604001818151613dc79190615733565b600f0b905250604086018051859190613de19083906158f4565b600f0b90525087518651613e00918b91613dfa88615383565b86613330565b856000015185602001518a6060015163ffffffff167f7c57459d6f4f0fb2fc5b1e298c8c0eb238422944964aa1e249eaa78747f0cca9896020015189604001518b606001518c608001516000898d613e5790615383565b60408051600f98890b815296880b602088015267ffffffffffffffff9586169087015293909216606085015215156080840152830b60a0830152820b60c08201529087900b60e08201526101000160405180910390a450505b9550959350505050565b6000613ec582614309565b90508063ffffffff16600003613ed9575050565b60a054604051637c1e148760e01b815263ffffffff83166004820152602481018490526000916001600160a01b031690637c1e148790604401606060405180830381865afa158015613f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f539190615882565b8051909150600f0b6000036110a9576000613f6d84614669565b600085815260a8602090815260409091205490840151919250606086901c91600f0b156140af5760a05460208501516001600160a01b039091169063f8a42e519087908990600090613fbe90615383565b6040516001600160e01b031960e087901b16815263ffffffff9490941660048501526024840192909252600f90810b60448401520b6064820152608401600060405180830381600087803b15801561401557600080fd5b505af1158015614029573d6000803e3d6000fd5b505060a054602087015160405163f8a42e5160e01b815263ffffffff8a1660048201526024810186905260006044820152600f9190910b60648201526001600160a01b03909116925063f8a42e519150608401600060405180830381600087803b15801561409657600080fd5b505af11580156140aa573d6000803e3d6000fd5b505050505b609f54604051637c1e148760e01b815260006004820181905260248201899052916001600160a01b031690637c1e1487906044016040805180830381865afa1580156140ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141239190615823565b519050600f81900b1561422457609f546001600160a01b031663e0b0621f60008961414d85615383565b6040516001600160e01b031960e086901b16815263ffffffff9390931660048401526024830191909152600f0b6044820152606401600060405180830381600087803b15801561419c57600080fd5b505af11580156141b0573d6000803e3d6000fd5b5050609f5460405163e0b0621f60e01b81526000600482015260248101869052600f85900b60448201526001600160a01b03909116925063e0b0621f9150606401600060405180830381600087803b15801561420b57600080fd5b505af115801561421f573d6000803e3d6000fd5b505050505b6001600160a01b038316600090815260a7602090815260408083208054600160ff8a1690811b6000191890911690915585845260a98352818420908452825280832083905589835260a890915280822082905551839189917f027ce6fbfb5b4d17a0ee36b592ef0db77b060df7e023bc84e68c5f0664c9b83a9190a350505050505050565b6000806142b6858461468c565b90506001600160a01b0381161580159061203657508515806142e457506001600160a01b038116606087901c145b806120365750836001600160a01b0316816001600160a01b0316149695505050505050565b600062ffffff82166269736f1461432257506000919050565b5060201c61ffff1690565b600080600019890161434457506000905084613323565b600083156143ff5785600f0b60000361438d57602089015161436990600f0b86613290565b61437390826158f4565b9050600087600f0b121561438d5761438a81615383565b90505b600061439b89600f0b6145ff565b905060008a602001516143b88b8a6143b391906158f4565b6146a8565b6143c29190615733565b90506143ce818361459b565b9050600081600f0b13156143f8576143eb600f8a900b82846146c3565b6143f590846158f4565b92505b505061440c565b61440987826158f4565b90505b60006144198b8d87612580565b61442b90670de0b6b3a7640000615733565b905060008083600f0b1361444c57614447600f84900b83613c7a565b61445a565b61445a600f84900b83613290565b905060006144688285615733565b9050808c60600181815161447c91906158f4565b600f0b9052508061448d818c615733565b95509550505050509850989650505050505050565b600054610100900460ff1661450d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b61154a336136f8565b600054610100900460ff166145815760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b815160209283012081519190920120606691909155606755565b600081600f0b83600f0b126145b057816145b2565b825b9392505050565b600081600f0b83600f0b136145b057816145b2565b60006145d8614788565b6001600160801b0316826703ffffffffffffff1667ffffffffffffffff1611159050919050565b60408051808201909152600281526127a360f11b6020820152600090600f83900b6f7fffffffffffffffffffffffffffffff19036146505760405162461bcd60e51b815260040161062e91906152c3565b50600082600f0b126146625781610a30565b5060000390565b600062ffffff82166269736f1461468257506000919050565b5060181c60ff1690565b600080600061469b85856147fb565b91509150612f588161483d565b60008082600f0b126146ba5781610a30565b610a3082615383565b600081600f0b600014156040518060400160405280600381526020016222212d60e91b815250906147075760405162461bcd60e51b815260040161062e91906152c3565b50600082600f0b84600f0b86600f0b028161472457614724615335565b0590506f7fffffffffffffffffffffffffffffff19811280159061474f575060016001607f1b038113155b6040518060400160405280600281526020016127a360f11b81525090612dbf5760405162461bcd60e51b815260040161062e91906152c3565b60655460408051632abf68dd60e11b815290516000926001600160a01b03169163557ed1ba9160048083019260209291908290030181865afa1580156147d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f69190615943565b905090565b60008082516041036148315760208301516040840151606085015160001a61482587828585614987565b945094505050506105be565b506000905060026105be565b6000816004811115614851576148516153d8565b036148595750565b600181600481111561486d5761486d6153d8565b036148ba5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161062e565b60028160048111156148ce576148ce6153d8565b0361491b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161062e565b600381600481111561492f5761492f6153d8565b0361311d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161062e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156149be5750600090506003613c71565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614a12573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614a3b57600060019250925050613c71565b9660009650945050505050565b63ffffffff8116811461311d57600080fd5b60008060408385031215614a6d57600080fd5b823591506020830135614a7f81614a48565b809150509250929050565b600060808284031215614a9c57600080fd5b50919050565b600060808284031215614ab457600080fd5b6145b28383614a8a565b600060208284031215614ad057600080fd5b5035919050565b60008060408385031215614aea57600080fd5b50508035926020909101359150565b600060208284031215614b0b57600080fd5b81356145b281614a48565b6001600160a01b038116811461311d57600080fd5b8035614b3681614b16565b919050565b80600f0b811461311d57600080fd5b60008060008060008060c08789031215614b6357600080fd5b8635614b6e81614a48565b95506020870135614b7e81614a48565b94506040870135614b8e81614b16565b93506060870135614b9e81614b3b565b92506080870135614bae81614b3b565b915060a0870135614bbe81614b3b565b809150509295509295509295565b60008060408385031215614bdf57600080fd5b8235614bea81614a48565b91506020830135614a7f81614a48565b6020808252825182820181905260009190848201906040850190845b81811015614c3b5783516001600160a01b031683529284019291840191600101614c16565b50909695505050505050565b60008060408385031215614c5a57600080fd5b8235614c6581614b16565b91506020830135614a7f81614b16565b60008060408385031215614c8857600080fd5b823567ffffffffffffffff811115614c9f57600080fd5b614cab85828601614a8a565b9250506020830135614a7f81614b16565b600060208284031215614cce57600080fd5b813567ffffffffffffffff811115614ce557600080fd5b8201606081850312156145b257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614d3657614d36614cf7565b604052919050565b803567ffffffffffffffff81168114614b3657600080fd5b600060a08284031215614d6857600080fd5b60405160a0810181811067ffffffffffffffff82111715614d8b57614d8b614cf7565b604052823581529050806020830135614da381614b3b565b60208201526040830135614db681614b3b565b6040820152614dc760608401614d3e565b6060820152614dd860808401614d3e565b60808201525092915050565b60008060c08385031215614df757600080fd5b8235614e0281614a48565b9150614e118460208501614d56565b90509250929050565b600060c08284031215614e2c57600080fd5b60405160c0810181811067ffffffffffffffff82111715614e4f57614e4f614cf7565b604052823581529050806020830135614e6781614b3b565b60208201526040830135614e7a81614b3b565b6040820152614e8b60608401614d3e565b6060820152614e9c60808401614d3e565b608082015260a0830135614eaf81614b3b565b60a0919091015292915050565b600082601f830112614ecd57600080fd5b813567ffffffffffffffff811115614ee757614ee7614cf7565b614efa601f8201601f1916602001614d0d565b818152846020838601011115614f0f57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614f3f57600080fd5b823567ffffffffffffffff80821115614f5757600080fd5b908401906101008287031215614f6c57600080fd5b604051606081018181108382111715614f8757614f87614cf7565b604052614f948784614e1a565b815260c0830135614fa481614a48565b602082015260e083013582811115614fbb57600080fd5b614fc788828601614ebc565b6040830152509350614e1191505060208401614b2b565b60008060e08385031215614ff157600080fd5b8235614ffc81614a48565b9150614e118460208501614e1a565b60008060006060848603121561502057600080fd5b83359250602084013561503281614a48565b91506040840135801515811461504757600080fd5b809150509250925092565b8035600781900b8114614b3657600080fd5b6000806000806080858703121561507a57600080fd5b843561508581614b16565b9350602085013561509581614a48565b92506150a360408601615052565b91506150b160608601615052565b905092959194509250565b600067ffffffffffffffff8211156150d6576150d6614cf7565b5060051b60200190565b600082601f8301126150f157600080fd5b81356020615106615101836150bc565b614d0d565b82815260059290921b8401810191818101908684111561512557600080fd5b8286015b848110156124de57803561513c81614a48565b8352918301918301615129565b6000806040838503121561515c57600080fd5b823567ffffffffffffffff8082111561517457600080fd5b818501915085601f83011261518857600080fd5b81356020615198615101836150bc565b82815260059290921b840181019181810190898411156151b757600080fd5b948201945b838610156151de5785356151cf81614b16565b825294820194908201906151bc565b965050860135925050808211156151f457600080fd5b50615201858286016150e0565b9150509250929050565b602080825282518282018190526000919060409081850190868401855b828110156152615781518051600790810b865287820151900b8786015285015160ff168585015260609093019290850190600101615228565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614c3b5783518352928401929184019160010161528a565b6000602082840312156152b857600080fd5b81356145b281614b16565b600060208083528351808285015260005b818110156152f0578581018301518582016040015282016152d4565b81811115615302576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561532a57600080fd5b81356145b281614b3b565b634e487b7160e01b600052601260045260246000fd5b600082600f0b8061535e5761535e615335565b8083600f0b0791505092915050565b634e487b7160e01b600052601160045260246000fd5b600081600f0b60016001607f1b031981036153a0576153a061536d565b60000392915050565b600080604083850312156153bc57600080fd5b82516153c781614b3b565b6020840151909250614a7f81614b3b565b634e487b7160e01b600052602160045260246000fd5b8281526040810160038310615405576154056153d8565b8260208301529392505050565b60006020828403121561542457600080fd5b81516145b281614b3b565b6000600182016154415761544161536d565b5060010190565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156154785761547861536d565b6f7fffffffffffffffffffffffffffffff1960008512828116878305871216156154a4576154a461536d565b600087129250858205871284841616156154c0576154c061536d565b858505871281841616156154d6576154d661536d565b5050509290910295945050505050565b600081600f0b83600f0b806154fd576154fd615335565b6f7fffffffffffffffffffffffffffffff198214600019821416156155245761552461536d565b90059392505050565b600063ffffffff80831681851680830382111561554c5761554c61536d565b01949350505050565b600063ffffffff838116908316818110156155725761557261536d565b039392505050565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff8083168181036155a9576155a961536d565b6001019392505050565b60208101600283106155c7576155c76153d8565b91905290565b6000602082840312156155df57600080fd5b81516145b281614b16565b600060208083850312156155fd57600080fd5b825167ffffffffffffffff81111561561457600080fd5b8301601f8101851361562557600080fd5b8051615633615101826150bc565b81815260059190911b8201830190838101908783111561565257600080fd5b928401925b8284101561567957835161566a81614a48565b82529284019290840190615657565b979650505050505050565b6000823560be1983360301811261569a57600080fd5b9190910192915050565b600060a082840312156156b657600080fd5b6145b28383614d56565b600060c082360312156156d257600080fd5b6040516040810167ffffffffffffffff82821081831117156156f6576156f6614cf7565b816040526157043686614d56565b835260a085013591508082111561571a57600080fd5b5061572736828601614ebc565b60208301525092915050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561575e5761575e61536d565b8160016001607f1b030183138116156157795761577961536d565b5090039392505050565b60008235605e1983360301811261569a57600080fd5b600082198211156157ac576157ac61536d565b500190565b6000828210156157c3576157c361536d565b500390565b600060ff821660ff84168060ff038211156157e5576157e561536d565b019392505050565b60008160001904831182151516156158075761580761536d565b500290565b60008161581b5761581b61536d565b506000190190565b60006040828403121561583557600080fd5b6040516040810181811067ffffffffffffffff8211171561585857615858614cf7565b604052825161586681614b3b565b8152602083015161587681614b3b565b60208201529392505050565b60006060828403121561589457600080fd5b6040516060810181811067ffffffffffffffff821117156158b7576158b7614cf7565b60405282516158c581614b3b565b815260208301516158d581614b3b565b602082015260408301516158e881614b3b565b60408201529392505050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561591e5761591e61536d565b8260016001607f1b031903821281161561593a5761593a61536d565b50019392505050565b60006020828403121561595557600080fd5b81516001600160801b03811681146145b257600080fdfe4f7264657228627974657333322073656e6465722c696e743132382070726963655831382c696e7431323820616d6f756e742c75696e7436342065787069726174696f6e2c75696e743634206e6f6e63652949736f6c617465644f7264657228627974657333322073656e6465722c696e743132382070726963655831382c696e7431323820616d6f756e742c75696e7436342065787069726174696f6e2c75696e743634206e6f6e63652c696e74313238206d617267696e29a264697066735822122055c1dfd41aeaf7f141d3d7b30860c91f7ebb6fee2e9c1b75721d1a687cc8dbcf64736f6c634300080d0033

    Deployed Bytecode

    0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806388bc796811610104578063b60aaa7c116100a2578063edc6d37b11610071578063edc6d37b146104cf578063f2b26331146104ef578063f2fde38b14610502578063f6ee7b4b1461051557600080fd5b8063b60aaa7c14610481578063b76d78e314610494578063ce933e59146104a7578063d895202a146104af57600080fd5b8063a27a250a116100de578063a27a250a14610437578063a5ae218b1461044a578063aed8e9671461045d578063b5cbd70e1461046e57600080fd5b806388bc7968146104005780638da5cb5b1461041357806395ee60711461042457600080fd5b806340f1a34d1161017157806366f87bd11161014b57806366f87bd114610396578063707c8b58146103dd578063715018a6146103e557806378f0d3ce146103ed57600080fd5b806340f1a34d146102f95780634821c8b51461032f578063485cc9551461038357600080fd5b80631a2b2d16116101ad5780631a2b2d16146102495780631d029b4d1461026c5780632da1c59b146102c65780633fceea28146102d957600080fd5b80630f2c878e146101d45780630f4b509d1461020657806313b56ddb1461021b575b600080fd5b6101e76101e2366004614a5a565b610528565b60408051600f93840b81529190920b6020820152015b60405180910390f35b610219610214366004614aa2565b6105c5565b005b61023b610229366004614abe565b600090815260a8602052604090205490565b6040519081526020016101fd565b61025c610257366004614ad7565b6109e1565b60405190151581526020016101fd565b61027f61027a366004614af9565b610a36565b6040516101fd9190600060808201905063ffffffff83511682526020830151600f0b60208301526040830151600f0b60408301526060830151600f0b606083015292915050565b6102196102d4366004614b4a565b610af7565b6102ec6102e7366004614bcc565b610cb9565b6040516101fd9190614bfa565b61031c610307366004614abe565b609e60205260009081526040902054600f0b81565b604051600f9190910b81526020016101fd565b61037161033d366004614af9565b604080516020808201835260009182905263ffffffff939093168152609d8352819020815192830190915254600f0b815290565b6040519051600f0b81526020016101fd565b610219610391366004614c47565b610de9565b6103c56103a4366004614af9565b63ffffffff166000908152609c60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016101fd565b6102196110ae565b610219611538565b6102196103fb366004614c75565b61154c565b61021961040e366004614cbc565b6118d0565b6033546001600160a01b03166103c5565b61023b610432366004614de4565b611ec0565b61023b610445366004614f2c565b612040565b61023b610458366004614fde565b6124e9565b6065546001600160a01b03166103c5565b61031c61047c36600461500b565b612580565b61031c61048f366004614af9565b612620565b6102196104a2366004615064565b612647565b6102ec612afd565b6104c26104bd366004615149565b612dc8565b6040516101fd919061520b565b6104e26104dd366004614abe565b612f60565b6040516101fd919061526e565b61031c6104fd366004614af9565b613062565b6102196105103660046152a6565b613090565b610219610523366004614abe565b613120565b606082811c600090815260a16020908152604080832063ffffffff8616845282528083208151948501825254600781810b8652600160401b8204900b92850192909252600160801b90910460ff169083018190529091829182036105ab5750604080516060810182526000815265b5e620f4800060208201526001918101919091525b60208101519051600791820b9350900b90505b9250929050565b6065546001600160a01b031633146106375760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b60648201526084015b60405180910390fd5b6040805180820190915260018152605560f81b60208201526269736f823562ffffff16036106785760405162461bcd60e51b815260040161062e91906152c3565b50600061068e61027a6040840160208501614af9565b905060006106aa6106a56040850160208601614af9565b61316e565b905060006106be6080850160608601615318565b600f0b136040518060400160405280600381526020016224a82960e91b815250906106fc5760405162461bcd60e51b815260040161062e91906152c3565b5080604001511561076757816040015183604001602081019061071f9190615318565b610729919061534b565b60408051808201909152600381526204953560ec1b602082015290600f0b156107655760405162461bcd60e51b815260040161062e91906152c3565b505b6000816040015161077c57816020015161077f565b81515b90506000806001600160a01b03831663c7167cf56107a36040890160208a01614af9565b6107b360608a0160408b01615318565b6107df6107c660808c0160608d01615318565b6107d660608d0160408e01615318565b600f0b90613290565b6107e890615383565b6040516001600160e01b031960e086901b16815263ffffffff939093166004840152600f91820b6024840152900b604482015260640160408051808303816000875af115801561083c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086091906153a9565b915091508161086e90615383565b915061087981615383565b905060006108c36108906040890160208a01614af9565b88358886866000600f83900b136108b4578b602001516108af90615383565b6108ba565b8b602001515b6000600161330b565b87519093509091506108da90869089358686613330565b609a546040516388b6496f60e01b81526000916001600160a01b0316906388b6496f9061090e908b359085906004016153ee565b602060405180830381865afa15801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f9190615412565b600f0b121560405180604001604052806002815260200161125560f21b8152509061098d5760405162461bcd60e51b815260040161062e91906152c3565b506060860151609b60006109a760408b0160208c01614af9565b63ffffffff168152602081019190915260400160002080546001600160801b03928316600160801b02921691909117905550505050505050565b6000805b600a811015610a2a57600084815260a9602090815260408083208484529091529020548303610a18576001915050610a30565b80610a228161542f565b9150506109e5565b50600090505b92915050565b6040805160808101825260008082526020808301829052828401829052606080840183815263ffffffff878116808652609b85528786208851948501895254600781810b8652600160401b8204810b86880152600160801b909104600f90810b868b0190815292885260a49096529790952054168552925190910b909152805191929091610ac9910b633b9aca00615448565b600f0b602080840191909152810151610ae99060070b633b9aca00615448565b600f0b604083015250919050565b610aff61351d565b6001600160a01b03841615610ba95763ffffffff86166000908152609c60205260409020546001600160a01b031615610b7a5760405162461bcd60e51b815260206004820152601860248201527f7669727475616c20626f6f6b20616c7265616479207365740000000000000000604482015260640161062e565b63ffffffff86166000908152609c6020526040902080546001600160a01b0319166001600160a01b0386161790555b63ffffffff85811614610bdf5763ffffffff868116600090815260a460205260409020805463ffffffff19169187169190911790555b610bed633b9aca00836154e6565b63ffffffff87166000908152609b60205260409020805467ffffffffffffffff191667ffffffffffffffff92909216919091179055610c30633b9aca00846154e6565b63ffffffff969096166000818152609b6020908152604080832080546fffffffffffffffff00000000000000001916600160401b67ffffffffffffffff909c169b909b029a909a1790995588518082018a52600f9490940b8452918152609d90915295909520945185546001600160801b0319166001600160801b039091161790945550505050565b60606000610cc7838561552d565b60a35490915063ffffffff8082169083161115610ce2578091505b8063ffffffff168563ffffffff161115610cfa578094505b6000610d068684615555565b63ffffffff1667ffffffffffffffff811115610d2457610d24614cf7565b604051908082528060200260200182016040528015610d4d578160200160208202803683370190505b509050855b8363ffffffff168163ffffffff161015610ddf5760a38163ffffffff1681548110610d7f57610d7f61557a565b6000918252602090912001546001600160a01b031682610d9f8984615555565b63ffffffff1681518110610db557610db561557a565b6001600160a01b039092166020928302919091019091015280610dd781615590565b915050610d52565b5095945050505050565b600054610100900460ff1615808015610e095750600054600160ff909116105b80610e235750303b158015610e23575060005460ff166001145b610e955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161062e565b6000805460ff191660011790558015610eb8576000805461ff0019166101001790555b610ec061358c565b610ec9826135ff565b610f3d6040518060400160405280600681526020017f56657274657800000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f302e302e31000000000000000000000000000000000000000000000000000000815250613629565b609a80546001600160a01b0319166001600160a01b038516908117909155604051635d2e9ad160e01b8152635d2e9ad190610f7d906000906004016155b3565b602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906155cd565b609f80546001600160a01b0319166001600160a01b03928316179055609a54604051635d2e9ad160e01b8152911690635d2e9ad190611002906001906004016155b3565b602060405180830381865afa15801561101f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104391906155cd565b60a080546001600160a01b0319166001600160a01b039290921691909117905580156110a9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6065546001600160a01b0316331461111b5760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b609f54604080516347428e7b60e01b815290516000926001600160a01b0316916347428e7b91600480830192869291908290030181865afa158015611164573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261118c91908101906155ea565b905060015b81518163ffffffff161015611326576000828263ffffffff16815181106111ba576111ba61557a565b60209081029190910181015163ffffffff81166000908152609b8352604080822081516060810183529054600781810b8352600160401b8204900b95820195909552600160801b909404600f0b9084018190529193501261121c575050611314565b609f5463ffffffff838116600090815260a460205260408082205485820151915163e0b0621f60e01b8152931660048401526024830191909152600f0b60448201526001600160a01b039091169063e0b0621f90606401600060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b50506000604080850182815263ffffffff9096168252609b6020908152912084518154929095015195516001600160801b03908116600160801b0267ffffffffffffffff978816600160401b026001600160801b0319909416979096169690961791909117949094169290921790925550505b8061131e81615590565b915050611191565b5060a060009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561137a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a291908101906155ea565b905060005b81518163ffffffff161015611534576000828263ffffffff16815181106113d0576113d061557a565b60209081029190910181015163ffffffff81166000908152609b8352604080822081516060810183529054600781810b8352600160401b8204900b95820195909552600160801b909404600f0b90840181905291935003611432575050611522565b60a054604082810151905163f8a42e5160e01b815263ffffffff851660048201526000602482018190526044820152600f9190910b60648201526001600160a01b039091169063f8a42e5190608401600060405180830381600087803b15801561149b57600080fd5b505af11580156114af573d6000803e3d6000fd5b50506000604080850182815263ffffffff9096168252609b6020908152912084518154929095015195516001600160801b03908116600160801b0267ffffffffffffffff978816600160401b026001600160801b0319909416979096169690961791909117949094169290921790925550505b8061152c81615590565b9150506113a7565b5050565b61154061369e565b61154a60006136f8565b565b6065546001600160a01b031633146115b95760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b60006115cb6106a56020850185614af9565b905060006115df61027a6020860186614af9565b905060006116106115f36020870187614af9565b6116006060880188615684565b61043290368190038101906156a4565b905060006116216060870187615684565b611632906060810190604001615318565b905060006116436060880188615684565b61164c906156c0565b80515190915062ffffff166269736f1415604051806040016040528060018152602001605560f81b815250906116955760405162461bcd60e51b815260040161062e91906152c3565b506116a3858583868a61374a565b60405180604001604052806002815260200161125560f21b815250906116dc5760405162461bcd60e51b815260040161062e91906152c3565b5060008061170a876116f460408c0160208d01615318565b61170460608d0160408e01615318565b866139f0565b9092509050600061176561172160208c018c614af9565b855180516040909101518a9087908790829061173d908d615733565b6117479190615733565b611755600f8a900b8b613c7a565b61175e90615383565b600161330b565b885186515191945091925061177d918a918686613330565b604080518082019091526002815261125560f21b602082015250835151866117a860208d018d614af9565b865160208082015160608084015160809485015160408051600f95860b81528f860b9681019690965267ffffffffffffffff92831690860152169083015260019282019290925285820b60a082015287820b60c08201529086900b60e082015263ffffffff91909116907f7c57459d6f4f0fb2fc5b1e298c8c0eb238422944964aa1e249eaa78747f0cca9906101000160405180910390a46060870151609b600061185660208e018e614af9565b63ffffffff1681526020810191909152604090810160002080546001600160801b03938416600160801b02931692909217909155845101516118989086615733565b6000968752609e602052604090962080546001600160801b0319166001600160801b0390971696909617909555505050505050505050565b6065546001600160a01b0316331461193d5760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b600061195a61194c8380615783565b6106a5906020810190614af9565b6040805160608101825260008082526020820181905291810182905291925090819081908190600061198f8760600151610a36565b9050600061199d8980615783565b6119ab906020810190615684565b6119b4906156c0565b905060006119c28a80615783565b6119d0906040810190615684565b6119d9906156c0565b905060405180606001604052806119f88b606001518560000151611ec0565b8152602001611a0f8b606001518460000151611ec0565b81528251604090810151600f0b6020928301528251600090815260aa90925290205490945015611a4e578351600090815260aa60205260409020548251525b602080850151600090815260aa909152604090205415611a8157602080850151600090815260aa90915260409020548151525b8160000151604001519750611aaf89848487600001518e6020016020810190611aaa91906152a6565b61374a565b60405180604001604052806002815260200161125560f21b81525090611ae85760405162461bcd60e51b815260040161062e91906152c3565b50611b0789848387602001518e6040016020810190611aaa91906152a6565b60405180604001604052806002815260200161494d60f01b81525090611b405760405162461bcd60e51b815260040161062e91906152c3565b5081516040908101518251820151825180840190935260048352634f43424d60e01b60208401526000600f91820b81129290910b1303611b935760405162461bcd60e51b815260040161062e91906152c3565b506000816000015160400151600f0b1315611c0357816000015160200151600f0b816000015160200151600f0b1215604051806040016040528060048152602001634f43424d60e01b81525090611bfd5760405162461bcd60e51b815260040161062e91906152c3565b50611c5a565b816000015160200151600f0b816000015160200151600f0b1315604051806040016040528060048152602001634f43424d60e01b81525090611c585760405162461bcd60e51b815260040161062e91906152c3565b505b611c6f89848460000151846000015188613ce3565b8096508197505050611cb789606001518360000151600001518589898b8860000151604001518f611ca09190615733565b611caa9190615733565b875160200151600161330b565b8451845151929950909650611cd0918b91908989613330565b604080518082019091526002815261125560f21b602082015250604080518082019091526002815261494d60f01b602082015250606080840151908a015163ffffffff166000908152609b6020526040902080546001600160801b03928316600160801b029216919091179055815151600114611d8657815160400151611d579089615733565b84516000908152609e6020526040902080546001600160801b0319166001600160801b03929092169190911790555b805151600114611ddb578060000151604001518460400151611da89190615733565b6020858101516000908152609e9091526040902080546001600160801b0319166001600160801b03929092169190911790555b815151611de790613eba565b805151611df390613eba565b81600001516000015184600001518a6060015163ffffffff167f7c57459d6f4f0fb2fc5b1e298c8c0eb238422944964aa1e249eaa78747f0cca98560000151602001518c87600001516060015188600001516080015160018f8f8f604051611eac989796959493929190600f98890b815296880b602088015267ffffffffffffffff95861660408801529390941660608601529015156080850152840b60a084015290830b60c083015290910b60e08201526101000190565b60405180910390a450505050505050505050565b60008060405180608001604052806052815260200161596d6052913990506000818051906020012084600001518560200151866040015187606001518860800151604051602001611f4a969594939291909586526020860194909452600f92830b6040860152910b606084015267ffffffffffffffff90811660808401521660a082015260c00190565b60405160208183030381529060405280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611f8e60665490565b60675463ffffffff89166000908152609c6020908152604091829020548251918201959095529081019290925260608201524660808201526001600160a01b0390911660a082015260c001604051602081830303815290604052805190602001209050612036818360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b9695505050505050565b6065546000906001600160a01b031633146120b05760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b82515162ffffff166269736f1415604051806040016040528060018152602001605560f81b815250906120f65760405162461bcd60e51b815260040161062e91906152c3565b50600061210b846020015185600001516124e9565b9050612125846000015160000151828587604001516142a9565b60405180604001604052806002815260200161495360f01b8152509061215e5760405162461bcd60e51b815260040161062e91906152c3565b5083515160601c600081815260a7602052604081205490805b82816001901b116121f2576001811b8316156121e057875151600090815260a96020908152604080832084845290915290205480156121de5760006121bb82614309565b9050896020015163ffffffff168163ffffffff16036121dc575091506121f2565b505b505b6121eb600182615799565b9050612177565b50806123085761220560016104006157b1565b82036122535760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e792069736f6c61746564207375626163636f756e7473000000604482015260640161062e565b60005b600183161561227657600192831c9261226f90826157c8565b9050612256565b6020888101516001600160a01b038616600090815260a7835260408082208054600160ff881690811b9091179091558c515160189690961b63ff0000001693851b67ffffffff000000001660608a901b6bffffffffffffffffffffffff191617939093176269736f1780835260a88552818320959095558b5151825260a9845280822092825291909252902081905590505b600061238088602001516040518060a001604052808b600001516000015181526020018b6000015160200151600f0b81526020018b6000015160400151600f0b81526020018b600001516060015167ffffffffffffffff1681526020018b600001516080015167ffffffffffffffff16815250611ec0565b600081815260aa60205260408120849055895160a00151919250600f9190910b13156124de57875160a090810151600083815260ab6020526040812080546001600160801b0319166001600160801b0390931692909217909155609f548a5180519301516001600160a01b039091169263e0b0621f929161240090615383565b6040516001600160e01b031960e086901b16815263ffffffff9390931660048401526024830191909152600f0b6044820152606401600060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5050609f548a5160a0015160405163e0b0621f60e01b81526000600482015260248101879052600f9190910b60448201526001600160a01b03909116925063e0b0621f9150606401600060405180830381600087803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b505050505b509695505050505050565b6000806040518060a00160405280606881526020016159bf60689139905060008180519060200120846000015185602001518660400151876060015188608001518960a00151604051602001611f4a97969594939291909687526020870195909552600f93840b604087015291830b606086015267ffffffffffffffff90811660808601521660a08401520b60c082015260e00190565b606083811c600090815260a16020908152604080832063ffffffff8716845282528083208151948501825254600781810b8652600160401b8204900b92850192909252600160801b90910460ff1690830181905290919082036126025750604080516060810182526000815265b5e620f4800060208201526001918101919091525b8261260e578051612614565b80602001515b60070b95945050505050565b63ffffffff81166000908152609b6020526040812054610a309060070b633b9aca00615448565b6065546001600160a01b031633146126b45760405162461bcd60e51b815260206004820152602a60248201527f53657175656e63657247617465643a2063616c6c6572206973206e6f742074686044820152691948195b991c1bda5b9d60b21b606482015260840161062e565b6001600160a01b038416600090815260a2602052604090205460ff1661273a576001600160a01b038416600081815260a260205260408120805460ff1916600190811790915560a3805491820181559091527f60859188cffe297f44dde29f2d2865634621f26215049caeb304ccba566a8b170180546001600160a01b03191690911790555b63ffffffff8316612a6557609f54604080516347428e7b60e01b815290516000926001600160a01b0316916347428e7b91600480830192869291908290030181865afa15801561278e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127b691908101906155ea565b9050600060a060009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561280d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261283591908101906155ea565b905060005b82518163ffffffff16101561296457600063ffffffff16838263ffffffff16815181106128695761286961557a565b602002602001015163ffffffff1603156129525760405180606001604052808660070b81526020018560070b8152602001600160ff1681525060a16000896001600160a01b03166001600160a01b031681526020019081526020016000206000858463ffffffff16815181106128e1576128e161557a565b60209081029190910181015163ffffffff1682528181019290925260409081016000208351815493850151949092015160ff16600160801b0260ff60801b1967ffffffffffffffff958616600160401b026001600160801b0319909516959093169490941792909217169190911790555b8061295c81615590565b91505061283a565b5060005b81518163ffffffff161015612a5d5760405180606001604052808660070b81526020018560070b8152602001600160ff1681525060a16000896001600160a01b03166001600160a01b031681526020019081526020016000206000848463ffffffff16815181106129db576129db61557a565b60209081029190910181015163ffffffff1682528181019290925260409081016000208351815493850151949092015160ff16600160801b0260ff60801b1967ffffffffffffffff958616600160401b026001600160801b03199095169590931694909417929092171691909117905580612a5581615590565b915050612968565b505050612af7565b60408051606081018252600784810b825283900b602080830191825260018385019081526001600160a01b038916600090815260a1835285812063ffffffff8a168252909252939020915182549151935160ff16600160801b0260ff60801b1967ffffffffffffffff958616600160401b026001600160801b0319909416959092169490941791909117169190911790555b50505050565b60606000609f60009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612b54573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b7c91908101906155ea565b9050600060a060009054906101000a90046001600160a01b03166001600160a01b03166347428e7b6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612bd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bfb91908101906155ea565b90506000805b83518163ffffffff161015612c78578163ffffffff16848263ffffffff1681518110612c2f57612c2f61557a565b602002602001015163ffffffff161115612c6657838163ffffffff1681518110612c5b57612c5b61557a565b602002602001015191505b80612c7081615590565b915050612c01565b5060005b82518163ffffffff161015612cf3578163ffffffff16838263ffffffff1681518110612caa57612caa61557a565b602002602001015163ffffffff161115612ce157828163ffffffff1681518110612cd657612cd661557a565b602002602001015191505b80612ceb81615590565b915050612c7c565b506000612d0182600161552d565b63ffffffff1667ffffffffffffffff811115612d1f57612d1f614cf7565b604051908082528060200260200182016040528015612d48578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1611612dbf5763ffffffff81166000818152609c602052604090205483516001600160a01b039091169184918110612d9557612d9561557a565b6001600160a01b039092166020928302919091019091015280612db781615590565b915050612d4e565b50949350505050565b6060600082518451612dda91906157ed565b67ffffffffffffffff811115612df257612df2614cf7565b604051908082528060200260200182016040528015612e3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612e105790505b50905060005b8451811015612f585760005b8451811015612f455760a16000878481518110612e6e57612e6e61557a565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000868381518110612eaa57612eaa61557a565b60209081029190910181015163ffffffff16825281810192909252604090810160002081516060810183529054600781810b8352600160401b8204900b93820193909352600160801b90920460ff1690820152855184908390612f0d90866157ed565b612f179190615799565b81518110612f2757612f2761557a565b60200260200101819052508080612f3d9061542f565b915050612e4f565b5080612f508161542f565b915050612e43565b509392505050565b60606000805b600a811015612fb057600084815260a9602090815260408083208484529091529020548015612f9d57612f9a600184615799565b92505b5080612fa88161542f565b915050612f66565b5060008167ffffffffffffffff811115612fcc57612fcc614cf7565b604051908082528060200260200182016040528015612ff5578160200160208202803683370190505b50905060005b600a811015612f5857600085815260a960209081526040808320848452909152902054801561304f57808361302f8661580c565b955085815181106130425761304261557a565b6020026020010181815250505b508061305a8161542f565b915050612ffb565b63ffffffff81166000908152609b6020526040812054610a3090600160401b900460070b633b9aca00615448565b61309861369e565b6001600160a01b0381166131145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161062e565b61311d816136f8565b50565b609a546040805180820190915260018152605560f81b6020820152906001600160a01b031633146131645760405162461bcd60e51b815260040161062e91906152c3565b5061311d81613eba565b604080516080810182526000808252602082018190529181018290526060810191909152609a5460405163deb14ec360e01b815263ffffffff841660048201526000916001600160a01b03169063deb14ec390602401602060405180830381865afa1580156131e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320591906155cd565b60a0549091506001600160a01b039081169082168190036132565750604080516080810182526001600160a01b0390921682526000602083015260019082015263ffffffff90921660608301525090565b5050604080516080810182526000808252609f546001600160a01b031660208301529181019190915263ffffffff90921660608301525090565b600080670de0b6b3a7640000600f85810b9085900b025b0590506f7fffffffffffffffffffffffffffffff1981128015906132d2575060016001607f1b038113155b6040518060400160405280600281526020016127a360f11b81525090612f585760405162461bcd60e51b815260040161062e91906152c3565b60008061331e8a8a8a8a8a8a8a8a61432d565b915091505b9850989650505050505050565b8460400151156133c1578451606086015160405163f8a42e5160e01b815263ffffffff909116600482015260248101859052600f84810b604483015283900b60648201526001600160a01b039091169063f8a42e51906084015b600060405180830381600087803b1580156133a457600080fd5b505af11580156133b8573d6000803e3d6000fd5b50505050613516565b63ffffffff8416613423576020850151606086015160405163f8a42e5160e01b815263ffffffff909116600482015260248101859052600f84810b604483015283900b60648201526001600160a01b039091169063f8a42e519060840161338a565b6020850151606086015160405163e0b0621f60e01b815263ffffffff909116600482015260248101859052600f84900b60448201526001600160a01b039091169063e0b0621f90606401600060405180830381600087803b15801561348757600080fd5b505af115801561349b573d6000803e3d6000fd5b505050602086015160405163e0b0621f60e01b815263ffffffff8716600482015260248101869052600f84900b60448201526001600160a01b03909116915063e0b0621f90606401600060405180830381600087803b1580156134fd57600080fd5b505af1158015613511573d6000803e3d6000fd5b505050505b5050505050565b609f546001600160a01b0316331480613540575060a0546001600160a01b031633145b61154a5760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c7920656e67696e652063616e206d6f6469667920636f6e666967000000604482015260640161062e565b600054610100900460ff166135f75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b61154a6144a2565b61360761369e565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166136945760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b6115348282614516565b6033546001600160a01b0316331461154a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161062e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82515160009060001901613760575060016139e7565b8351805160009061377090614309565b905063ffffffff8116156137cb578063ffffffff16886060015163ffffffff1614604051806040016040528060018152602001605560f81b815250906137c95760405162461bcd60e51b815260040161062e91906152c3565b505b6000858152609e602052604090819020549083018051600f9290920b918291906137f6908390615733565b600f0b9052506060830151603d1c6001908116036139ae576000896040015161389f5760208a015160608b01518551604051637c1e148760e01b815263ffffffff909216600483015260248201526001600160a01b0390911690637c1e1487906044016040805180830381865afa158015613875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138999190615823565b5161391f565b895160608b01518551604051637c1e148760e01b815263ffffffff909216600483015260248201526001600160a01b0390911690637c1e148790604401606060405180830381865afa1580156138f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391d9190615882565b515b9050600081600f0b13151560008560400151600f0b1315150361394857600060408501526139ac565b60008460400151600f0b131561397c5761396f84604001518261396a90615383565b61459b565b600f0b60408501526139ac565b60008460400151600f0b12156139ac576139a384604001518261399e90615383565b6145b9565b600f0b60408501525b505b60008360200151600f0b1380156139cb57506040830151600f0b15155b80156139e157506139df83606001516145ce565b155b93505050505b95945050505050565b60008080613a0d613a05600f87900b88613c7a565b600f0b6145ff565b90506000846000015160400151600f0b1315613adb57836000015160200151600f0b81600f0b1315604051806040016040528060048152602001634f43424d60e01b81525090613a705760405162461bcd60e51b815260040161062e91906152c3565b50600086600f0b128015613a9a5750613a8886615383565b600f0b846000015160400151600f0b12155b604051806040016040528060048152602001634f43424d60e01b81525090613ad55760405162461bcd60e51b815260040161062e91906152c3565b50613b8f565b836000015160200151600f0b81600f0b1215604051806040016040528060048152602001634f43424d60e01b81525090613b285760405162461bcd60e51b815260040161062e91906152c3565b50600086600f0b138015613b525750613b4086615383565b600f0b846000015160400151600f0b13155b604051806040016040528060048152602001634f43424d60e01b81525090613b8d5760405162461bcd60e51b815260040161062e91906152c3565b505b60008760400151613ba4578760200151613ba7565b87515b606089015160405163c7167cf560e01b815263ffffffff9091166004820152600f89810b602483015288900b604482015290915060009081906001600160a01b0384169063c7167cf59060640160408051808303816000875af1158015613c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3691906153a9565b91509150818760000151604001818151613c5091906158f4565b600f0b905250613c5f82615383565b613c6882615383565b95509550505050505b94509492505050565b600081600f0b600014156040518060400160405280600381526020016222212d60e91b81525090613cbe5760405162461bcd60e51b815260040161062e91906152c3565b50600082600f0b670de0b6b3a7640000600f0b85600f0b02816132a7576132a7615335565b60008060008560400151600f0b1215613d1357613d0c8560400151856040015161399e90615383565b9150613d44565b60008560400151600f0b1315613d3957613d0c8560400151856040015161396a90615383565b506000905080613eb0565b6040860151613d53908361534b565b613d5d9083615733565b91506000613d7b856020015184600f0b61329090919063ffffffff16565b9050613d8681615383565b91506000613dad896060015187600001518a87613da290615383565b86600080600061330b565b80935081925050508387604001818151613dc79190615733565b600f0b905250604086018051859190613de19083906158f4565b600f0b90525087518651613e00918b91613dfa88615383565b86613330565b856000015185602001518a6060015163ffffffff167f7c57459d6f4f0fb2fc5b1e298c8c0eb238422944964aa1e249eaa78747f0cca9896020015189604001518b606001518c608001516000898d613e5790615383565b60408051600f98890b815296880b602088015267ffffffffffffffff9586169087015293909216606085015215156080840152830b60a0830152820b60c08201529087900b60e08201526101000160405180910390a450505b9550959350505050565b6000613ec582614309565b90508063ffffffff16600003613ed9575050565b60a054604051637c1e148760e01b815263ffffffff83166004820152602481018490526000916001600160a01b031690637c1e148790604401606060405180830381865afa158015613f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f539190615882565b8051909150600f0b6000036110a9576000613f6d84614669565b600085815260a8602090815260409091205490840151919250606086901c91600f0b156140af5760a05460208501516001600160a01b039091169063f8a42e519087908990600090613fbe90615383565b6040516001600160e01b031960e087901b16815263ffffffff9490941660048501526024840192909252600f90810b60448401520b6064820152608401600060405180830381600087803b15801561401557600080fd5b505af1158015614029573d6000803e3d6000fd5b505060a054602087015160405163f8a42e5160e01b815263ffffffff8a1660048201526024810186905260006044820152600f9190910b60648201526001600160a01b03909116925063f8a42e519150608401600060405180830381600087803b15801561409657600080fd5b505af11580156140aa573d6000803e3d6000fd5b505050505b609f54604051637c1e148760e01b815260006004820181905260248201899052916001600160a01b031690637c1e1487906044016040805180830381865afa1580156140ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141239190615823565b519050600f81900b1561422457609f546001600160a01b031663e0b0621f60008961414d85615383565b6040516001600160e01b031960e086901b16815263ffffffff9390931660048401526024830191909152600f0b6044820152606401600060405180830381600087803b15801561419c57600080fd5b505af11580156141b0573d6000803e3d6000fd5b5050609f5460405163e0b0621f60e01b81526000600482015260248101869052600f85900b60448201526001600160a01b03909116925063e0b0621f9150606401600060405180830381600087803b15801561420b57600080fd5b505af115801561421f573d6000803e3d6000fd5b505050505b6001600160a01b038316600090815260a7602090815260408083208054600160ff8a1690811b6000191890911690915585845260a98352818420908452825280832083905589835260a890915280822082905551839189917f027ce6fbfb5b4d17a0ee36b592ef0db77b060df7e023bc84e68c5f0664c9b83a9190a350505050505050565b6000806142b6858461468c565b90506001600160a01b0381161580159061203657508515806142e457506001600160a01b038116606087901c145b806120365750836001600160a01b0316816001600160a01b0316149695505050505050565b600062ffffff82166269736f1461432257506000919050565b5060201c61ffff1690565b600080600019890161434457506000905084613323565b600083156143ff5785600f0b60000361438d57602089015161436990600f0b86613290565b61437390826158f4565b9050600087600f0b121561438d5761438a81615383565b90505b600061439b89600f0b6145ff565b905060008a602001516143b88b8a6143b391906158f4565b6146a8565b6143c29190615733565b90506143ce818361459b565b9050600081600f0b13156143f8576143eb600f8a900b82846146c3565b6143f590846158f4565b92505b505061440c565b61440987826158f4565b90505b60006144198b8d87612580565b61442b90670de0b6b3a7640000615733565b905060008083600f0b1361444c57614447600f84900b83613c7a565b61445a565b61445a600f84900b83613290565b905060006144688285615733565b9050808c60600181815161447c91906158f4565b600f0b9052508061448d818c615733565b95509550505050509850989650505050505050565b600054610100900460ff1661450d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b61154a336136f8565b600054610100900460ff166145815760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161062e565b815160209283012081519190920120606691909155606755565b600081600f0b83600f0b126145b057816145b2565b825b9392505050565b600081600f0b83600f0b136145b057816145b2565b60006145d8614788565b6001600160801b0316826703ffffffffffffff1667ffffffffffffffff1611159050919050565b60408051808201909152600281526127a360f11b6020820152600090600f83900b6f7fffffffffffffffffffffffffffffff19036146505760405162461bcd60e51b815260040161062e91906152c3565b50600082600f0b126146625781610a30565b5060000390565b600062ffffff82166269736f1461468257506000919050565b5060181c60ff1690565b600080600061469b85856147fb565b91509150612f588161483d565b60008082600f0b126146ba5781610a30565b610a3082615383565b600081600f0b600014156040518060400160405280600381526020016222212d60e91b815250906147075760405162461bcd60e51b815260040161062e91906152c3565b50600082600f0b84600f0b86600f0b028161472457614724615335565b0590506f7fffffffffffffffffffffffffffffff19811280159061474f575060016001607f1b038113155b6040518060400160405280600281526020016127a360f11b81525090612dbf5760405162461bcd60e51b815260040161062e91906152c3565b60655460408051632abf68dd60e11b815290516000926001600160a01b03169163557ed1ba9160048083019260209291908290030181865afa1580156147d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f69190615943565b905090565b60008082516041036148315760208301516040840151606085015160001a61482587828585614987565b945094505050506105be565b506000905060026105be565b6000816004811115614851576148516153d8565b036148595750565b600181600481111561486d5761486d6153d8565b036148ba5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161062e565b60028160048111156148ce576148ce6153d8565b0361491b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161062e565b600381600481111561492f5761492f6153d8565b0361311d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161062e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156149be5750600090506003613c71565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614a12573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614a3b57600060019250925050613c71565b9660009650945050505050565b63ffffffff8116811461311d57600080fd5b60008060408385031215614a6d57600080fd5b823591506020830135614a7f81614a48565b809150509250929050565b600060808284031215614a9c57600080fd5b50919050565b600060808284031215614ab457600080fd5b6145b28383614a8a565b600060208284031215614ad057600080fd5b5035919050565b60008060408385031215614aea57600080fd5b50508035926020909101359150565b600060208284031215614b0b57600080fd5b81356145b281614a48565b6001600160a01b038116811461311d57600080fd5b8035614b3681614b16565b919050565b80600f0b811461311d57600080fd5b60008060008060008060c08789031215614b6357600080fd5b8635614b6e81614a48565b95506020870135614b7e81614a48565b94506040870135614b8e81614b16565b93506060870135614b9e81614b3b565b92506080870135614bae81614b3b565b915060a0870135614bbe81614b3b565b809150509295509295509295565b60008060408385031215614bdf57600080fd5b8235614bea81614a48565b91506020830135614a7f81614a48565b6020808252825182820181905260009190848201906040850190845b81811015614c3b5783516001600160a01b031683529284019291840191600101614c16565b50909695505050505050565b60008060408385031215614c5a57600080fd5b8235614c6581614b16565b91506020830135614a7f81614b16565b60008060408385031215614c8857600080fd5b823567ffffffffffffffff811115614c9f57600080fd5b614cab85828601614a8a565b9250506020830135614a7f81614b16565b600060208284031215614cce57600080fd5b813567ffffffffffffffff811115614ce557600080fd5b8201606081850312156145b257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614d3657614d36614cf7565b604052919050565b803567ffffffffffffffff81168114614b3657600080fd5b600060a08284031215614d6857600080fd5b60405160a0810181811067ffffffffffffffff82111715614d8b57614d8b614cf7565b604052823581529050806020830135614da381614b3b565b60208201526040830135614db681614b3b565b6040820152614dc760608401614d3e565b6060820152614dd860808401614d3e565b60808201525092915050565b60008060c08385031215614df757600080fd5b8235614e0281614a48565b9150614e118460208501614d56565b90509250929050565b600060c08284031215614e2c57600080fd5b60405160c0810181811067ffffffffffffffff82111715614e4f57614e4f614cf7565b604052823581529050806020830135614e6781614b3b565b60208201526040830135614e7a81614b3b565b6040820152614e8b60608401614d3e565b6060820152614e9c60808401614d3e565b608082015260a0830135614eaf81614b3b565b60a0919091015292915050565b600082601f830112614ecd57600080fd5b813567ffffffffffffffff811115614ee757614ee7614cf7565b614efa601f8201601f1916602001614d0d565b818152846020838601011115614f0f57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614f3f57600080fd5b823567ffffffffffffffff80821115614f5757600080fd5b908401906101008287031215614f6c57600080fd5b604051606081018181108382111715614f8757614f87614cf7565b604052614f948784614e1a565b815260c0830135614fa481614a48565b602082015260e083013582811115614fbb57600080fd5b614fc788828601614ebc565b6040830152509350614e1191505060208401614b2b565b60008060e08385031215614ff157600080fd5b8235614ffc81614a48565b9150614e118460208501614e1a565b60008060006060848603121561502057600080fd5b83359250602084013561503281614a48565b91506040840135801515811461504757600080fd5b809150509250925092565b8035600781900b8114614b3657600080fd5b6000806000806080858703121561507a57600080fd5b843561508581614b16565b9350602085013561509581614a48565b92506150a360408601615052565b91506150b160608601615052565b905092959194509250565b600067ffffffffffffffff8211156150d6576150d6614cf7565b5060051b60200190565b600082601f8301126150f157600080fd5b81356020615106615101836150bc565b614d0d565b82815260059290921b8401810191818101908684111561512557600080fd5b8286015b848110156124de57803561513c81614a48565b8352918301918301615129565b6000806040838503121561515c57600080fd5b823567ffffffffffffffff8082111561517457600080fd5b818501915085601f83011261518857600080fd5b81356020615198615101836150bc565b82815260059290921b840181019181810190898411156151b757600080fd5b948201945b838610156151de5785356151cf81614b16565b825294820194908201906151bc565b965050860135925050808211156151f457600080fd5b50615201858286016150e0565b9150509250929050565b602080825282518282018190526000919060409081850190868401855b828110156152615781518051600790810b865287820151900b8786015285015160ff168585015260609093019290850190600101615228565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614c3b5783518352928401929184019160010161528a565b6000602082840312156152b857600080fd5b81356145b281614b16565b600060208083528351808285015260005b818110156152f0578581018301518582016040015282016152d4565b81811115615302576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561532a57600080fd5b81356145b281614b3b565b634e487b7160e01b600052601260045260246000fd5b600082600f0b8061535e5761535e615335565b8083600f0b0791505092915050565b634e487b7160e01b600052601160045260246000fd5b600081600f0b60016001607f1b031981036153a0576153a061536d565b60000392915050565b600080604083850312156153bc57600080fd5b82516153c781614b3b565b6020840151909250614a7f81614b3b565b634e487b7160e01b600052602160045260246000fd5b8281526040810160038310615405576154056153d8565b8260208301529392505050565b60006020828403121561542457600080fd5b81516145b281614b3b565b6000600182016154415761544161536d565b5060010190565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156154785761547861536d565b6f7fffffffffffffffffffffffffffffff1960008512828116878305871216156154a4576154a461536d565b600087129250858205871284841616156154c0576154c061536d565b858505871281841616156154d6576154d661536d565b5050509290910295945050505050565b600081600f0b83600f0b806154fd576154fd615335565b6f7fffffffffffffffffffffffffffffff198214600019821416156155245761552461536d565b90059392505050565b600063ffffffff80831681851680830382111561554c5761554c61536d565b01949350505050565b600063ffffffff838116908316818110156155725761557261536d565b039392505050565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff8083168181036155a9576155a961536d565b6001019392505050565b60208101600283106155c7576155c76153d8565b91905290565b6000602082840312156155df57600080fd5b81516145b281614b16565b600060208083850312156155fd57600080fd5b825167ffffffffffffffff81111561561457600080fd5b8301601f8101851361562557600080fd5b8051615633615101826150bc565b81815260059190911b8201830190838101908783111561565257600080fd5b928401925b8284101561567957835161566a81614a48565b82529284019290840190615657565b979650505050505050565b6000823560be1983360301811261569a57600080fd5b9190910192915050565b600060a082840312156156b657600080fd5b6145b28383614d56565b600060c082360312156156d257600080fd5b6040516040810167ffffffffffffffff82821081831117156156f6576156f6614cf7565b816040526157043686614d56565b835260a085013591508082111561571a57600080fd5b5061572736828601614ebc565b60208301525092915050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561575e5761575e61536d565b8160016001607f1b030183138116156157795761577961536d565b5090039392505050565b60008235605e1983360301811261569a57600080fd5b600082198211156157ac576157ac61536d565b500190565b6000828210156157c3576157c361536d565b500390565b600060ff821660ff84168060ff038211156157e5576157e561536d565b019392505050565b60008160001904831182151516156158075761580761536d565b500290565b60008161581b5761581b61536d565b506000190190565b60006040828403121561583557600080fd5b6040516040810181811067ffffffffffffffff8211171561585857615858614cf7565b604052825161586681614b3b565b8152602083015161587681614b3b565b60208201529392505050565b60006060828403121561589457600080fd5b6040516060810181811067ffffffffffffffff821117156158b7576158b7614cf7565b60405282516158c581614b3b565b815260208301516158d581614b3b565b602082015260408301516158e881614b3b565b60408201529392505050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561591e5761591e61536d565b8260016001607f1b031903821281161561593a5761593a61536d565b50019392505050565b60006020828403121561595557600080fd5b81516001600160801b03811681146145b257600080fdfe4f7264657228627974657333322073656e6465722c696e743132382070726963655831382c696e7431323820616d6f756e742c75696e7436342065787069726174696f6e2c75696e743634206e6f6e63652949736f6c617465644f7264657228627974657333322073656e6465722c696e743132382070726963655831382c696e7431323820616d6f756e742c75696e7436342065787069726174696f6e2c75696e743634206e6f6e63652c696e74313238206d617267696e29a264697066735822122055c1dfd41aeaf7f141d3d7b30860c91f7ebb6fee2e9c1b75721d1a687cc8dbcf64736f6c634300080d0033

    Block Age Transaction Gas Used Reward
    view all blocks ##produced##

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

    Validator Index Block Age Amount
    View All Withdrawals

    Transaction Hash Block Age Value Eth2 PubKey Valid
    View All Deposits

    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.