ETH Price: $3,856.71 (+4.32%)

Contract

0x4F1247A044500AC44993595c6E950dc17aBa36c9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Fees117716222021-02-01 17:19:511402 days ago1612199991IN
0x4F1247A0...17aBa36c9
0 ETH0.0043384200
Return Funds116107382021-01-08 0:25:591427 days ago1610065559IN
0x4F1247A0...17aBa36c9
0 ETH0.0026227890.00000154
Return Funds116107362021-01-08 0:25:101427 days ago1610065510IN
0x4F1247A0...17aBa36c9
0 ETH0.0026238690.00000154
Return Funds116076402021-01-07 12:46:301427 days ago1610023590IN
0x4F1247A0...17aBa36c9
0 ETH0.0026238690
Create115908462021-01-04 22:55:431430 days ago1609800943IN
0x4F1247A0...17aBa36c9
0 ETH0.0057847989.20823643
Create115908412021-01-04 22:55:121430 days ago1609800912IN
0x4F1247A0...17aBa36c9
0 ETH0.0064525199.48683298
Create115876172021-01-04 11:07:281430 days ago1609758448IN
0x4F1247A0...17aBa36c9
0 ETH0.01821109280.7840713
Return Funds114059372020-12-07 13:25:171458 days ago1607347517IN
0x4F1247A0...17aBa36c9
0 ETH0.0010338735.47722557
Return Funds114057392020-12-07 12:46:021458 days ago1607345162IN
0x4F1247A0...17aBa36c9
0 ETH0.0010652136.56776595
Return Funds114023302020-12-07 0:09:151459 days ago1607299755IN
0x4F1247A0...17aBa36c9
0 ETH0.0010020534.3851648
Return Funds114023142020-12-07 0:04:541459 days ago1607299494IN
0x4F1247A0...17aBa36c9
0 ETH0.0008764630.08799361
Return Funds114004032020-12-06 17:00:041459 days ago1607274004IN
0x4F1247A0...17aBa36c9
0 ETH0.0011710240.20003414
Return Funds113996432020-12-06 14:07:201459 days ago1607263640IN
0x4F1247A0...17aBa36c9
0 ETH0.0008264428.34768066
Return Funds113995962020-12-06 13:54:231459 days ago1607262863IN
0x4F1247A0...17aBa36c9
0 ETH0.0007128724.47213595
Return Funds113995462020-12-06 13:44:281459 days ago1607262268IN
0x4F1247A0...17aBa36c9
0 ETH0.0007128724.47213595
Return Funds113986072020-12-06 10:28:521459 days ago1607250532IN
0x4F1247A0...17aBa36c9
0 ETH0.0006972423.91588124
Return Funds113985822020-12-06 10:24:161459 days ago1607250256IN
0x4F1247A0...17aBa36c9
0 ETH0.0006972423.91588124
Return Funds113985642020-12-06 10:19:111459 days ago1607249951IN
0x4F1247A0...17aBa36c9
0 ETH0.0007134624.47213757
Return Funds113985382020-12-06 10:14:261459 days ago1607249666IN
0x4F1247A0...17aBa36c9
0 ETH0.0006158221.12310726
Return Funds113957242020-12-05 23:58:491460 days ago1607212729IN
0x4F1247A0...17aBa36c9
0 ETH0.000736225.25236015
Return Funds113888462020-12-04 22:26:461461 days ago1607120806IN
0x4F1247A0...17aBa36c9
0 ETH0.0011923740.91607978
Release113885762020-12-04 21:21:061461 days ago1607116866IN
0x4F1247A0...17aBa36c9
0 ETH0.0008033624.24971909
Release113867372020-12-04 14:41:221461 days ago1607092882IN
0x4F1247A0...17aBa36c9
0 ETH0.0016423849.55743852
Create113867282020-12-04 14:39:321461 days ago1607092772IN
0x4F1247A0...17aBa36c9
0 ETH0.0032141949.55743852
Release113863332020-12-04 13:07:211461 days ago1607087241IN
0x4F1247A0...17aBa36c9
0 ETH0.0011683435.2536433
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
117716222021-02-01 17:19:511402 days ago1612199991
0x4F1247A0...17aBa36c9
9.23767584 ETH
116107382021-01-08 0:25:591427 days ago1610065559
0x4F1247A0...17aBa36c9
0.36225664 ETH
116107362021-01-08 0:25:101427 days ago1610065510
0x4F1247A0...17aBa36c9
0.4825707 ETH
116076402021-01-07 12:46:301427 days ago1610023590
0x4F1247A0...17aBa36c9
0.19257284 ETH
115908462021-01-04 22:55:431430 days ago1609800943
0x4F1247A0...17aBa36c9
0.36225664 ETH
115908412021-01-04 22:55:121430 days ago1609800912
0x4F1247A0...17aBa36c9
0.4825707 ETH
115876172021-01-04 11:07:281430 days ago1609758448
0x4F1247A0...17aBa36c9
0.19257284 ETH
114059372020-12-07 13:25:171458 days ago1607347517
0x4F1247A0...17aBa36c9
0.22671017 ETH
114057392020-12-07 12:46:021458 days ago1607345162
0x4F1247A0...17aBa36c9
0.02033594 ETH
114023302020-12-07 0:09:151459 days ago1607299755
0x4F1247A0...17aBa36c9
0.05900716 ETH
114023142020-12-07 0:04:541459 days ago1607299494
0x4F1247A0...17aBa36c9
0.05893278 ETH
114004032020-12-06 17:00:041459 days ago1607274004
0x4F1247A0...17aBa36c9
0.03131583 ETH
113996432020-12-06 14:07:201459 days ago1607263640
0x4F1247A0...17aBa36c9
0.21992275 ETH
113995962020-12-06 13:54:231459 days ago1607262863
0x4F1247A0...17aBa36c9
0.05966367 ETH
113995462020-12-06 13:44:281459 days ago1607262268
0x4F1247A0...17aBa36c9
0.05927718 ETH
113986072020-12-06 10:28:521459 days ago1607250532
0x4F1247A0...17aBa36c9
0.09702565 ETH
113985822020-12-06 10:24:161459 days ago1607250256
0x4F1247A0...17aBa36c9
0.09709563 ETH
113985642020-12-06 10:19:111459 days ago1607249951
0x4F1247A0...17aBa36c9
0.09720079 ETH
113985382020-12-06 10:14:261459 days ago1607249666
0x4F1247A0...17aBa36c9
0.0971735 ETH
113957242020-12-05 23:58:491460 days ago1607212729
0x4F1247A0...17aBa36c9
0.20140079 ETH
113888462020-12-04 22:26:461461 days ago1607120806
0x4F1247A0...17aBa36c9
0.20242672 ETH
113885762020-12-04 21:21:061461 days ago1607116866
0x4F1247A0...17aBa36c9
0.05608532 ETH
113867372020-12-04 14:41:221461 days ago1607092882
0x4F1247A0...17aBa36c9
0.22116066 ETH
113867282020-12-04 14:39:321461 days ago1607092772
0x4F1247A0...17aBa36c9
0.22556175 ETH
113863332020-12-04 13:07:211461 days ago1607087241
0x4F1247A0...17aBa36c9
1.14981565 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RampInstantEthEscrows

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
Yes with 420 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-13
*/

pragma solidity 0.7.0;
// SPDX-License-Identifier: MIT

/**
 * Copyright © 2017-2019 Ramp Network sp. z o.o. All rights reserved (MIT License).
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
 * and associated documentation files (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
 * is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies
 * or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */


/**
 * Abstract class for an asset adapter -- a class handling a binary asset description,
 * encapsulating the asset-specific transfer logic, to maintain a single interface for the main
 * escrows contract, regardless of asset type.
 * The `assetData` bytes represent a tightly packed struct, consisting of a 2-byte (uint16) asset
 * type, followed by asset-specific data. For now there are 2 asset types, ETH and ERC-20 tokens.
 * The asset type bytes must be equal to the `ASSET_TYPE` constant in each subclass.
 *
 * @dev Subclasses of this class are used as mixins to their respective main escrows contract.
 *
 * @author Ramp Network sp. z o.o.
 */
abstract contract AssetAdapter {

    uint16 public immutable ASSET_TYPE;  // solhint-disable-line var-name-mixedcase

    constructor(
        uint16 assetType
    ) {
        ASSET_TYPE = assetType;
    }

    /**
     * Ensure the described asset is sent to the given address.
     * Should revert if the transfer failed, but callers must also handle `false` being returned,
     * much like ERC-20's `transfer`.
     */
    function rawSendAsset(
        bytes memory assetData,
        uint256 _amount,
        address payable _to
    ) internal virtual returns (bool success);

    /**
     * Ensure the described asset is sent to this contract.
     * Should revert if the transfer failed, but callers must also handle `false` being returned,
     * much like ERC-20's `transfer`.
     */
    function rawLockAsset(
        uint256 amount,
        address payable _from
    ) internal returns (bool success) {
        return RampInstantPoolInterface(_from).sendFundsToSwap(amount);
    }

    function getAmount(bytes memory assetData) internal virtual pure returns (uint256);

    /**
     * Verify that the passed asset data can be handled by this adapter and given pool.
     *
     * @dev it's sufficient to use this only when creating a new swap -- all the other swap
     * functions first check if the swap hash is valid, while a swap hash with invalid
     * asset type wouldn't be created at all.
     *
     * @dev asset type is 2 bytes long, and it's at offset 32 in `assetData`'s memory (the first 32
     * bytes are the data length). We load the word at offset 2 (it ends with the asset type bytes),
     * and retrieve its last 2 bytes into a `uint16` variable.
     */
    modifier checkAssetTypeAndData(bytes memory assetData, address _pool) {
        uint16 assetType;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            assetType := and(
                mload(add(assetData, 2)),
                0xffff
            )
        }
        require(assetType == ASSET_TYPE, "iat");  // "invalid asset type"
        checkAssetData(assetData, _pool);
        _;
    }

    function checkAssetData(bytes memory assetData, address _pool) internal virtual view;

}

/**
 * A simple interface used by the escrows contract (precisely AssetAdapters) to interact
 * with the liquidity pools.
 */
abstract contract RampInstantPoolInterface {

    uint16 public ASSET_TYPE;  // solhint-disable-line var-name-mixedcase

    function sendFundsToSwap(uint256 _amount)
        public virtual /*onlyActive onlySwapsContract isWithinLimits*/ returns(bool success);

}

/**
 * A standard, simple transferrable contract ownership.
 */
abstract contract Ownable {

    address public owner;

    event OwnerChanged(address oldOwner, address newOwner);

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "ooc");  // "only the owner can call this"
        _;
    }

    function changeOwner(address _newOwner) external onlyOwner {
        owner = _newOwner;
        emit OwnerChanged(msg.sender, _newOwner);
    }

}

/**
 * An extended version of the standard `Pausable` contract, with more possible statuses:
 *  * STOPPED: all swap actions cannot be executed until the status is changed,
 *  * RETURN_ONLY: the existing swaps can only be returned, no new swaps can be created;
 *  * FINALIZE_ONLY: the existing swaps can be released or returned, no new swaps can be created;
 *  * ACTIVE: all swap actions can be executed.
 *
 * @dev the status enum is strictly monotonic (i.e. all actions allowed on status X are allowed on
 * status X+1) and the default 0 is mapped to STOPPED for safety.
 */
abstract contract WithStatus is Ownable {

    enum Status {
        STOPPED,
        RETURN_ONLY,
        FINALIZE_ONLY,
        ACTIVE
    }

    event StatusChanged(Status oldStatus, Status newStatus);

    Status public status = Status.ACTIVE;

    function setStatus(Status _status) external onlyOwner {
        emit StatusChanged(status, _status);
        status = _status;
    }

    modifier statusAtLeast(Status _status) {
        require(status >= _status, "ics");  // "invalid contract status"
        _;
    }

}


/**
 * An owner-managed list of oracles, that are allowed to release or return swaps.
 * The deployer is the default only oracle.
 */
abstract contract WithOracles is Ownable {

    mapping (address => bool) internal oracles;

    constructor() {
        oracles[msg.sender] = true;
    }

    function approveOracle(address _oracle) external onlyOwner {
        oracles[_oracle] = true;
    }

    function revokeOracle(address _oracle) external onlyOwner {
        oracles[_oracle] = false;
    }

    modifier isOracle(address _oracle) {
        require(oracles[_oracle], "ioa");  // invalid oracle address"
        _;
    }

    modifier onlyOracleOrPool(address _pool, address _oracle) {
        require(
            msg.sender == _pool || (msg.sender == _oracle && oracles[msg.sender]),
            "oop"  // "only the oracle or the pool can call this"
        );
        _;
    }

}


/**
 * An owner-managed address that is allowed to create new swaps.
 */
abstract contract WithSwapsCreators is Ownable {

    mapping (address => bool) internal creators;

    constructor() {
        creators[msg.sender] = true;
    }

    function approveSwapCreator(address _creator) external onlyOwner {
        creators[_creator] = true;
    }

    function revokeSwapCreator(address _creator) external onlyOwner {
        creators[_creator] = false;
    }

    modifier onlySwapCreator() {
        require(creators[msg.sender], "osc");  // "only the swap creator can call this"
        _;
    }

}

/**
 * An extension of `AssetAdapter` that encapsulates collecting Ramp fees while locking and resolving
 * an escrow. The collected fees can be withdrawn by the contract owner.
 *
 * Fees are configured dynamically by the backend and encoded in `assetData`. The fee amount is
 * also hashed into the swapHash, so a swap is guaranteed to be released/returned with the same fee
 * it was created with.
 *
 * @author Ramp Network sp. z o.o.
 */
abstract contract AssetAdapterWithFees is Ownable, AssetAdapter {

    function accumulateFee(bytes memory assetData) internal virtual;

    function withdrawFees(
        bytes calldata assetData,
        address payable _to
    ) external virtual /*onlyOwner*/ returns (bool success);

    function getFee(bytes memory assetData) internal virtual pure returns (uint256);

    function getAmountWithFee(bytes memory assetData) internal pure returns (uint256) {
        return getAmount(assetData) + getFee(assetData);
    }

    function lockAssetWithFee(
        bytes memory assetData,
        address payable _from
    ) internal returns (bool success) {
        return rawLockAsset(getAmountWithFee(assetData), _from);
    }

    function sendAssetWithFee(
        bytes memory assetData,
        address payable _to
    ) internal returns (bool success) {
        return rawSendAsset(assetData, getAmountWithFee(assetData), _to);
    }

    function sendAssetKeepingFee(
        bytes memory assetData,
        address payable _to
    ) internal returns (bool success) {
        bool result = rawSendAsset(assetData, getAmount(assetData), _to);
        if (result) accumulateFee(assetData);
        return result;
    }

    function getAccumulatedFees(address _assetAddress) public virtual view returns (uint256);

}

/**
 * The main contract managing Ramp Swaps escrows lifecycle: create, release or return.
 * Uses an abstract AssetAdapter to carry out the transfers and handle the particular asset data.
 * With a corresponding off-chain oracle protocol allows for atomic-swap-like transfer between
 * fiat currencies and crypto assets.
 *
 * @dev an active swap is represented by a hash of its details, mapped to its escrow expiration
 * timestamp. When the swap is created, its end time is set a given amount of time in the future
 * (but within {MIN,MAX}_SWAP_LOCK_TIME_S).
 * The hashed swap details are:
 *  * address pool: the `RampInstantPool` contract that sells the crypto asset;
 *  * address receiver: the user that buys the crypto asset;
 *  * address oracle: address of the oracle that handles this particular swap;
 *  * bytes assetData: description of the crypto asset, handled by an AssetAdapter;
 *  * bytes32 paymentDetailsHash: hash of the fiat payment details: account numbers, fiat value
 *    and currency, and the transfer reference (title), that can be verified off-chain.
 *
 * @author Ramp Network sp. z o.o.
 */
abstract contract RampInstantEscrows
is Ownable, WithStatus, WithOracles, WithSwapsCreators, AssetAdapterWithFees {

    /// @dev contract version, defined in semver
    string public constant VERSION = "0.6.4";

    uint32 internal constant MIN_ACTUAL_TIMESTAMP = 1000000000;

    /// @dev lock time limits for pool's assets, after which unreleased escrows can be returned
    uint32 internal constant MIN_SWAP_LOCK_TIME_S = 24 hours;
    uint32 internal constant MAX_SWAP_LOCK_TIME_S = 30 days;

    event Created(bytes32 indexed swapHash);
    event Released(bytes32 indexed swapHash);
    event PoolReleased(bytes32 indexed swapHash);
    event Returned(bytes32 indexed swapHash);
    event PoolReturned(bytes32 indexed swapHash);

    /**
     * @dev Mapping from swap details hash to its end time (as a unix timestamp).
     * After the end time the swap can be cancelled, and the funds will be returned to the pool.
     */
    mapping (bytes32 => uint32) internal swaps;

    /**
     * Swap creation, called by the Ramp Network. Checks swap parameters and ensures the crypto
     * asset is locked on this contract.
     *
     * Emits a `Created` event with the swap hash.
     */
    function create(
        address payable _pool,
        address _receiver,
        address _oracle,
        bytes calldata _assetData,
        bytes32 _paymentDetailsHash,
        uint32 lockTimeS
    )
        external
        statusAtLeast(Status.ACTIVE)
        onlySwapCreator()
        isOracle(_oracle)
        checkAssetTypeAndData(_assetData, _pool)
        returns
        (bool success)
    {
        require(
            lockTimeS >= MIN_SWAP_LOCK_TIME_S && lockTimeS <= MAX_SWAP_LOCK_TIME_S,
            "ltl"  // "lock time outside limits"
        );
        bytes32 swapHash = getSwapHash(
            _pool, _receiver, _oracle, keccak256(_assetData), _paymentDetailsHash
        );
        requireSwapNotExists(swapHash);
        // Set up swap status before transfer, to avoid reentrancy attacks.
        // Even if a malicious token is somehow passed to this function (despite the oracle
        // signature of its details), the state of this contract is already fully updated,
        // so it will behave correctly (as it would be a separate call).
        // solhint-disable-next-line not-rely-on-time
        swaps[swapHash] = uint32(block.timestamp) + lockTimeS;
        require(
            lockAssetWithFee(_assetData, _pool),
            "elf"  // "escrow lock failed"
        );
        emit Created(swapHash);
        return true;
    }

    /**
     * Swap release, which transfers the crypto asset to the receiver and removes the swap from
     * the active swap mapping. Normally called by the swap's oracle after it confirms a matching
     * wire transfer on pool's bank account. Can be also called by the pool, for example in case
     * of a dispute, when the parties reach an agreement off-chain.
     *
     * Emits a `Released` or `PoolReleased` event with the swap's hash.
     */
    function release(
        address _pool,
        address payable _receiver,
        address _oracle,
        bytes calldata _assetData,
        bytes32 _paymentDetailsHash
    ) external statusAtLeast(Status.FINALIZE_ONLY) onlyOracleOrPool(_pool, _oracle) {
        bytes32 swapHash = getSwapHash(
            _pool, _receiver, _oracle, keccak256(_assetData), _paymentDetailsHash
        );
        requireSwapCreated(swapHash);
        // Delete the swap status before transfer, to avoid reentrancy attacks.
        swaps[swapHash] = 0;
        require(
            sendAssetKeepingFee(_assetData, _receiver),
            "arf"  // "asset release failed"
        );
        if (msg.sender == _pool) {
            emit PoolReleased(swapHash);
        } else {
            emit Released(swapHash);
        }
    }

    /**
     * Swap return, which transfers the crypto asset back to the pool and removes the swap from
     * the active swap mapping. Can be called by the pool or the swap's oracle, but only if the
     * escrow lock time expired.
     *
     * Emits a `Returned` or `PoolReturned` event with the swap's hash.
     */
    function returnFunds(
        address payable _pool,
        address _receiver,
        address _oracle,
        bytes calldata _assetData,
        bytes32 _paymentDetailsHash
    ) external statusAtLeast(Status.RETURN_ONLY) onlyOracleOrPool(_pool, _oracle) {
        bytes32 swapHash = getSwapHash(
            _pool, _receiver, _oracle, keccak256(_assetData), _paymentDetailsHash
        );
        requireSwapExpired(swapHash);
        // Delete the swap status before transfer, to avoid reentrancy attacks.
        swaps[swapHash] = 0;
        require(
            sendAssetWithFee(_assetData, _pool),
            "acf"  // "asset return failed"
        );
        if (msg.sender == _pool) {
            emit PoolReturned(swapHash);
        } else {
            emit Returned(swapHash);
        }
    }

    /**
     * Given all valid swap details, returns its status. The return can be:
     * 0: the swap details are invalid, swap doesn't exist, or was already released/returned.
     * >1: the swap was created, and the value is a timestamp indicating end of its lock time.
     */
    function getSwapStatus(
        address _pool,
        address _receiver,
        address _oracle,
        bytes calldata _assetData,
        bytes32 _paymentDetailsHash
    ) external view returns (uint32 status) {
        bytes32 swapHash = getSwapHash(
            _pool, _receiver, _oracle, keccak256(_assetData), _paymentDetailsHash
        );
        return swaps[swapHash];
    }

    /**
     * Calculates the swap hash used to reference the swap in this contract's storage.
     */
    function getSwapHash(
        address _pool,
        address _receiver,
        address _oracle,
        bytes32 assetHash,
        bytes32 _paymentDetailsHash
    ) internal pure returns (bytes32) {
        return keccak256(
            abi.encodePacked(
                _pool, _receiver, _oracle, assetHash, _paymentDetailsHash
            )
        );
    }

    function requireSwapNotExists(bytes32 swapHash) internal view {
        require(
            swaps[swapHash] == 0,
            "sae"  // "swap already exists"
        );
    }

    function requireSwapCreated(bytes32 swapHash) internal view {
        require(
            swaps[swapHash] > MIN_ACTUAL_TIMESTAMP,
            "siv"  // "swap invalid"
        );
    }

    function requireSwapExpired(bytes32 swapHash) internal view {
        require(
            // solhint-disable-next-line not-rely-on-time
            swaps[swapHash] > MIN_ACTUAL_TIMESTAMP && block.timestamp > swaps[swapHash],
            "sei"  // "swap not expired or invalid"
        );
    }

}

/**
 * An adapter for handling ether assets.
 *
 * @author Ramp Network sp. z o.o.
 */
abstract contract EthAdapter is AssetAdapterWithFees {

    uint16 internal constant ETH_TYPE_ID = 1;
    uint16 internal constant ETH_ASSET_DATA_LENGTH = 66;
    uint256 internal accumulatedFees = 0;

    constructor() AssetAdapter(ETH_TYPE_ID) {}

    /**
    * @dev extract the amount from the asset data bytes. ETH assetData bytes contents:
    * offset length type     contents
    * +00    32     uint256  data length (== 0x22 == 34 bytes)
    * +32     2     uint16   asset type  (== ETH_TYPE_ID == 1)
    * +34    32     uint256  ether amount in wei
    * +66    32     uint256  ether fee in wei
    */
    function getAmount(bytes memory assetData) internal override pure returns (uint256 amount) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            amount := mload(add(assetData, 34))
        }
    }

    /**
     * @dev extract the fee from the asset data bytes. See getAmount for bytes contents.
     */
    function getFee(bytes memory assetData) internal override pure returns (uint256 fee) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            fee := mload(add(assetData, 66))
        }
    }

    function rawSendAsset(
        bytes memory /*assetData*/,
        uint256 _amount,
        address payable _to
    ) internal override returns (bool success) {
        // To enable more complex purchase receiver contracts, we're using `call.value(...)` instead
        // of plain `transfer(...)`, which allows only 2300 gas to be used by the fallback function.
        // This works for transfers to plain accounts too, no need to check if it's a contract.
        // solhint-disable-next-line avoid-low-level-calls
        (bool transferSuccessful,) = _to.call{ value:_amount }("");
        require(transferSuccessful, "etf");  // "eth transfer failed"
        return true;
    }

    function accumulateFee(bytes memory assetData) internal override {
        accumulatedFees += getFee(assetData);
    }

    function withdrawFees(
        bytes calldata /*assetData*/,
        address payable _to
    ) external override onlyOwner returns (bool success) {
        uint256 fees = accumulatedFees;
        accumulatedFees = 0;
        _to.transfer(fees);
        return true;
    }

    /**
     * This adapter can receive eth payments, but no other use of the fallback function is allowed.
     * @dev this is the "receive ether" fallback function, split off from the regular fallback
     * function in Solidity 0.6
     */
    receive () external payable {}

    function checkAssetData(bytes memory assetData, address /*_pool*/) internal override pure {
        require(assetData.length == ETH_ASSET_DATA_LENGTH, "adl");  // "invalid asset data length"
    }

    function getAccumulatedFees(address /*_assetAddress*/) public override view returns (uint256) {
        return accumulatedFees;
    }

}


/**
 * Ramp Swaps contract with the ether asset adapter.
 *
 * @author Ramp Network sp. z o.o.
 */
contract RampInstantEthEscrows is RampInstantEscrows, EthAdapter {}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapHash","type":"bytes32"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapHash","type":"bytes32"}],"name":"PoolReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapHash","type":"bytes32"}],"name":"PoolReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapHash","type":"bytes32"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapHash","type":"bytes32"}],"name":"Returned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum WithStatus.Status","name":"oldStatus","type":"uint8"},{"indexed":false,"internalType":"enum WithStatus.Status","name":"newStatus","type":"uint8"}],"name":"StatusChanged","type":"event"},{"inputs":[],"name":"ASSET_TYPE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"approveOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"}],"name":"approveSwapCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_pool","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"bytes","name":"_assetData","type":"bytes"},{"internalType":"bytes32","name":"_paymentDetailsHash","type":"bytes32"},{"internalType":"uint32","name":"lockTimeS","type":"uint32"}],"name":"create","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getAccumulatedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"bytes","name":"_assetData","type":"bytes"},{"internalType":"bytes32","name":"_paymentDetailsHash","type":"bytes32"}],"name":"getSwapStatus","outputs":[{"internalType":"uint32","name":"status","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address payable","name":"_receiver","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"bytes","name":"_assetData","type":"bytes"},{"internalType":"bytes32","name":"_paymentDetailsHash","type":"bytes32"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_pool","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"bytes","name":"_assetData","type":"bytes"},{"internalType":"bytes32","name":"_paymentDetailsHash","type":"bytes32"}],"name":"returnFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"revokeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"}],"name":"revokeSwapCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum WithStatus.Status","name":"_status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum WithStatus.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawFees","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526000805460ff60a01b1916600360a01b17815560045534801561002657600080fd5b50600080546001600160a01b0319163390811782558152600160208181526040808420805460ff19908116851790915560029092528320805490911682179055600160f01b608052906115ed9061008b9039806108055280610b2e52506115ed6000f3fe6080604052600436106100f75760003560e01c80639a3c6e291161008a578063c2f6ce0011610059578063c2f6ce00146105a7578063dd651ed3146105da578063f47bc89c1461060d578063ffa1ad7414610640576100fe565b80639a3c6e29146103b2578063a6f9dae114610450578063a80e7acb14610483578063bfe5d9c514610521576100fe565b80635983e6b0116100c65780635983e6b01461026b5780638815eb391461029e5780638da5cb5b146102ca578063946519f1146102fb576100fe565b80630b898c9e14610103578063200d2ed2146101c15780632e49d78b146101f7578063564201f914610226576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b506101ad600480360360c081101561012657600080fd5b6001600160a01b038235811692602081013582169260408201359092169181019060808101606082013564010000000081111561016257600080fd5b82018360208201111561017457600080fd5b8035906020019184600183028401116401000000008311171561019657600080fd5b91935091508035906020013563ffffffff166106ca565b604080519115158252519081900360200190f35b3480156101cd57600080fd5b506101d66109df565b604051808260038111156101e657fe5b815260200191505060405180910390f35b34801561020357600080fd5b506102246004803603602081101561021a57600080fd5b503560ff166109ef565b005b34801561023257600080fd5b506102596004803603602081101561024957600080fd5b50356001600160a01b0316610abf565b60408051918252519081900360200190f35b34801561027757600080fd5b506102246004803603602081101561028e57600080fd5b50356001600160a01b0316610ac6565b3480156102aa57600080fd5b506102b3610b2c565b6040805161ffff9092168252519081900360200190f35b3480156102d657600080fd5b506102df610b50565b604080516001600160a01b039092168252519081900360200190f35b34801561030757600080fd5b50610399600480360360a081101561031e57600080fd5b6001600160a01b038235811692602081013582169260408201359092169181019060808101606082013564010000000081111561035a57600080fd5b82018360208201111561036c57600080fd5b8035906020019184600183028401116401000000008311171561038e57600080fd5b919350915035610b5f565b6040805163ffffffff9092168252519081900360200190f35b3480156103be57600080fd5b50610224600480360360a08110156103d557600080fd5b6001600160a01b038235811692602081013582169260408201359092169181019060808101606082013564010000000081111561041157600080fd5b82018360208201111561042357600080fd5b8035906020019184600183028401116401000000008311171561044557600080fd5b919350915035610bad565b34801561045c57600080fd5b506102246004803603602081101561047357600080fd5b50356001600160a01b0316610db3565b34801561048f57600080fd5b50610224600480360360a08110156104a657600080fd5b6001600160a01b03823581169260208101358216926040820135909216918101906080810160608201356401000000008111156104e257600080fd5b8201836020820111156104f457600080fd5b8035906020019184600183028401116401000000008311171561051657600080fd5b919350915035610e61565b34801561052d57600080fd5b506101ad6004803603604081101561054457600080fd5b81019060208101813564010000000081111561055f57600080fd5b82018360208201111561057157600080fd5b8035906020019184600183028401116401000000008311171561059357600080fd5b9193509150356001600160a01b0316611066565b3480156105b357600080fd5b50610224600480360360208110156105ca57600080fd5b50356001600160a01b03166110f9565b3480156105e657600080fd5b50610224600480360360208110156105fd57600080fd5b50356001600160a01b0316611162565b34801561061957600080fd5b506102246004803603602081101561063057600080fd5b50356001600160a01b03166111c8565b34801561064c57600080fd5b50610655611234565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561068f578181015183820152602001610677565b50505050905090810190601f1680156106bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000600380600054600160a01b900460ff1660038111156106e757fe5b1015610720576040805162461bcd60e51b815260206004820152600360248201526269637360e81b604482015290519081900360640190fd5b3360009081526002602052604090205460ff1661076a576040805162461bcd60e51b81526020600482015260036024820152626f736360e81b604482015290519081900360640190fd5b6001600160a01b038716600090815260016020526040902054879060ff166107bf576040805162461bcd60e51b8152602060048201526003602482015262696f6160e81b604482015290519081900360640190fd5b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060028101518b9061ffff908116907f000000000000000000000000000000000000000000000000000000000000000016811461085e576040805162461bcd60e51b81526020600482015260036024820152621a585d60ea1b604482015290519081900360640190fd5b6108688383611255565b6201518063ffffffff88161080159061088a575062278d0063ffffffff881611155b6108c1576040805162461bcd60e51b81526020600482015260036024820152621b1d1b60ea1b604482015290519081900360640190fd5b60006108ee8e8e8e8e8e60405180838380828437808301925050509250505060405180910390208d611295565b90506108f9816112f7565b600081815260036020908152604091829020805463ffffffff1916428c0163ffffffff161790558151601f8d018290048202810182019092528b825261096991908d908d9081908401838280828437600081840152601f19601f820116905080830192505050505050508f611347565b6109a0576040805162461bcd60e51b815260206004820152600360248201526232b63360e91b604482015290519081900360640190fd5b60405181907f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c90600090a25060019d9c50505050505050505050505050565b600054600160a01b900460ff1681565b6000546001600160a01b03163314610a34576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b7fe1377aa21d49fa10bb9ece6a0cd4f75597a90a80c3750f7f7674967f49ab9a62600060149054906101000a900460ff168260405180836003811115610a7657fe5b8152602001826003811115610a8757fe5b81526020019250505060405180910390a16000805482919060ff60a01b1916600160a01b836003811115610ab757fe5b021790555050565b5060045490565b6000546001600160a01b03163314610b0b576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600160205260409020805460ff19169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b600080610b8c888888888860405180838380828437604051920182900390912093508a9250611295915050565b60009081526003602052604090205463ffffffff1698975050505050505050565b600280600054600160a01b900460ff166003811115610bc857fe5b1015610c01576040805162461bcd60e51b815260206004820152600360248201526269637360e81b604482015290519081900360640190fd5b8685336001600160a01b0383161480610c3c5750336001600160a01b038216148015610c3c57503360009081526001602052604090205460ff165b610c73576040805162461bcd60e51b815260206004820152600360248201526206f6f760ec1b604482015290519081900360640190fd5b6000610c9f8a8a8a8a8a60405180838380828437604051920182900390912093508c9250611295915050565b9050610caa81611362565b600081815260036020908152604091829020805463ffffffff191690558151601f8901829004820281018201909252878252610d03919089908990819084018382808284376000920191909152508d92506113b6915050565b610d3a576040805162461bcd60e51b815260206004820152600360248201526230b93360e91b604482015290519081900360640190fd5b336001600160a01b038b161415610d7b5760405181907f789952a21900cba4809507b4ba56618cee6a1e748254f8faab21e9b8f1c60bc990600090a2610da7565b60405181907f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d1490600090a25b50505050505050505050565b6000546001600160a01b03163314610df8576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831690811790915560408051338152602081019290925280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a150565b600180600054600160a01b900460ff166003811115610e7c57fe5b1015610eb5576040805162461bcd60e51b815260206004820152600360248201526269637360e81b604482015290519081900360640190fd5b8685336001600160a01b0383161480610ef05750336001600160a01b038216148015610ef057503360009081526001602052604090205460ff165b610f27576040805162461bcd60e51b815260206004820152600360248201526206f6f760ec1b604482015290519081900360640190fd5b6000610f538a8a8a8a8a60405180838380828437604051920182900390912093508c9250611295915050565b9050610f5e816113dd565b600081815260036020908152604091829020805463ffffffff191690558151601f8901829004820281018201909252878252610fb7919089908990819084018382808284376000920191909152508e9250611450915050565b610fee576040805162461bcd60e51b815260206004820152600360248201526230b1b360e91b604482015290519081900360640190fd5b336001600160a01b038b16141561102f5760405181907f7b5ac55826e0ca40c3f69722d916fb9962d86cffcddc9c84d082b712419e5cbd90600090a2610da7565b60405181907fc99795d9dc9d68f27b21e122a0e663f689138f9110dee0122fc2980f8d57977590600090a250505050505050505050565b600080546001600160a01b031633146110ac576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6004805460009182905560405190916001600160a01b0385169183156108fc0291849190818181858888f193505050501580156110ed573d6000803e3d6000fd5b50600195945050505050565b6000546001600160a01b0316331461113e576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6000546001600160a01b031633146111a7576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6000546001600160a01b0316331461120d576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b604051806040016040528060058152602001640c0b8d8b8d60da1b81525081565b8151604214611291576040805162461bcd60e51b815260206004820152600360248201526218591b60ea1b604482015290519081900360640190fd5b5050565b604080516bffffffffffffffffffffffff19606097881b811660208084019190915296881b811660348301529490961b9093166048860152605c850191909152607c8085019190915281518085039091018152609c9093019052815191012090565b60008181526003602052604090205463ffffffff1615611344576040805162461bcd60e51b815260206004820152600360248201526273616560e81b604482015290519081900360640190fd5b50565b600061135b61135584611465565b83611480565b9392505050565b600081815260036020526040902054633b9aca0063ffffffff90911611611344576040805162461bcd60e51b815260206004820152600360248201526239b4bb60e91b604482015290519081900360640190fd5b6000806113cc846113c6866114fb565b85611502565b9050801561135b5761135b8461159b565b600081815260036020526040902054633b9aca0063ffffffff909116118015611419575060008181526003602052604090205463ffffffff1642115b611344576040805162461bcd60e51b815260206004820152600360248201526273656960e81b604482015290519081900360640190fd5b600061135b8361145f85611465565b84611502565b6000611470826115b0565b611479836114fb565b0192915050565b6000816001600160a01b03166381fd3f0b846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b50519392505050565b6022015190565b60405160009081906001600160a01b0384169085908381818185875af1925050503d806000811461154f576040519150601f19603f3d011682016040523d82523d6000602084013e611554565b606091505b5050905080611590576040805162461bcd60e51b815260206004820152600360248201526232ba3360e91b604482015290519081900360640190fd5b506001949350505050565b6115a4816115b0565b60048054909101905550565b604201519056fea264697066735822122040d4f4e159553924fcd3405061198325b4e3a8413f7dda315300452cc7e2cce564736f6c63430007000033

Deployed Bytecode

0x6080604052600436106100f75760003560e01c80639a3c6e291161008a578063c2f6ce0011610059578063c2f6ce00146105a7578063dd651ed3146105da578063f47bc89c1461060d578063ffa1ad7414610640576100fe565b80639a3c6e29146103b2578063a6f9dae114610450578063a80e7acb14610483578063bfe5d9c514610521576100fe565b80635983e6b0116100c65780635983e6b01461026b5780638815eb391461029e5780638da5cb5b146102ca578063946519f1146102fb576100fe565b80630b898c9e14610103578063200d2ed2146101c15780632e49d78b146101f7578063564201f914610226576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b506101ad600480360360c081101561012657600080fd5b6001600160a01b038235811692602081013582169260408201359092169181019060808101606082013564010000000081111561016257600080fd5b82018360208201111561017457600080fd5b8035906020019184600183028401116401000000008311171561019657600080fd5b91935091508035906020013563ffffffff166106ca565b604080519115158252519081900360200190f35b3480156101cd57600080fd5b506101d66109df565b604051808260038111156101e657fe5b815260200191505060405180910390f35b34801561020357600080fd5b506102246004803603602081101561021a57600080fd5b503560ff166109ef565b005b34801561023257600080fd5b506102596004803603602081101561024957600080fd5b50356001600160a01b0316610abf565b60408051918252519081900360200190f35b34801561027757600080fd5b506102246004803603602081101561028e57600080fd5b50356001600160a01b0316610ac6565b3480156102aa57600080fd5b506102b3610b2c565b6040805161ffff9092168252519081900360200190f35b3480156102d657600080fd5b506102df610b50565b604080516001600160a01b039092168252519081900360200190f35b34801561030757600080fd5b50610399600480360360a081101561031e57600080fd5b6001600160a01b038235811692602081013582169260408201359092169181019060808101606082013564010000000081111561035a57600080fd5b82018360208201111561036c57600080fd5b8035906020019184600183028401116401000000008311171561038e57600080fd5b919350915035610b5f565b6040805163ffffffff9092168252519081900360200190f35b3480156103be57600080fd5b50610224600480360360a08110156103d557600080fd5b6001600160a01b038235811692602081013582169260408201359092169181019060808101606082013564010000000081111561041157600080fd5b82018360208201111561042357600080fd5b8035906020019184600183028401116401000000008311171561044557600080fd5b919350915035610bad565b34801561045c57600080fd5b506102246004803603602081101561047357600080fd5b50356001600160a01b0316610db3565b34801561048f57600080fd5b50610224600480360360a08110156104a657600080fd5b6001600160a01b03823581169260208101358216926040820135909216918101906080810160608201356401000000008111156104e257600080fd5b8201836020820111156104f457600080fd5b8035906020019184600183028401116401000000008311171561051657600080fd5b919350915035610e61565b34801561052d57600080fd5b506101ad6004803603604081101561054457600080fd5b81019060208101813564010000000081111561055f57600080fd5b82018360208201111561057157600080fd5b8035906020019184600183028401116401000000008311171561059357600080fd5b9193509150356001600160a01b0316611066565b3480156105b357600080fd5b50610224600480360360208110156105ca57600080fd5b50356001600160a01b03166110f9565b3480156105e657600080fd5b50610224600480360360208110156105fd57600080fd5b50356001600160a01b0316611162565b34801561061957600080fd5b506102246004803603602081101561063057600080fd5b50356001600160a01b03166111c8565b34801561064c57600080fd5b50610655611234565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561068f578181015183820152602001610677565b50505050905090810190601f1680156106bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000600380600054600160a01b900460ff1660038111156106e757fe5b1015610720576040805162461bcd60e51b815260206004820152600360248201526269637360e81b604482015290519081900360640190fd5b3360009081526002602052604090205460ff1661076a576040805162461bcd60e51b81526020600482015260036024820152626f736360e81b604482015290519081900360640190fd5b6001600160a01b038716600090815260016020526040902054879060ff166107bf576040805162461bcd60e51b8152602060048201526003602482015262696f6160e81b604482015290519081900360640190fd5b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060028101518b9061ffff908116907f000000000000000000000000000000000000000000000000000000000000000116811461085e576040805162461bcd60e51b81526020600482015260036024820152621a585d60ea1b604482015290519081900360640190fd5b6108688383611255565b6201518063ffffffff88161080159061088a575062278d0063ffffffff881611155b6108c1576040805162461bcd60e51b81526020600482015260036024820152621b1d1b60ea1b604482015290519081900360640190fd5b60006108ee8e8e8e8e8e60405180838380828437808301925050509250505060405180910390208d611295565b90506108f9816112f7565b600081815260036020908152604091829020805463ffffffff1916428c0163ffffffff161790558151601f8d018290048202810182019092528b825261096991908d908d9081908401838280828437600081840152601f19601f820116905080830192505050505050508f611347565b6109a0576040805162461bcd60e51b815260206004820152600360248201526232b63360e91b604482015290519081900360640190fd5b60405181907f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c90600090a25060019d9c50505050505050505050505050565b600054600160a01b900460ff1681565b6000546001600160a01b03163314610a34576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b7fe1377aa21d49fa10bb9ece6a0cd4f75597a90a80c3750f7f7674967f49ab9a62600060149054906101000a900460ff168260405180836003811115610a7657fe5b8152602001826003811115610a8757fe5b81526020019250505060405180910390a16000805482919060ff60a01b1916600160a01b836003811115610ab757fe5b021790555050565b5060045490565b6000546001600160a01b03163314610b0b576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600160205260409020805460ff19169055565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000546001600160a01b031681565b600080610b8c888888888860405180838380828437604051920182900390912093508a9250611295915050565b60009081526003602052604090205463ffffffff1698975050505050505050565b600280600054600160a01b900460ff166003811115610bc857fe5b1015610c01576040805162461bcd60e51b815260206004820152600360248201526269637360e81b604482015290519081900360640190fd5b8685336001600160a01b0383161480610c3c5750336001600160a01b038216148015610c3c57503360009081526001602052604090205460ff165b610c73576040805162461bcd60e51b815260206004820152600360248201526206f6f760ec1b604482015290519081900360640190fd5b6000610c9f8a8a8a8a8a60405180838380828437604051920182900390912093508c9250611295915050565b9050610caa81611362565b600081815260036020908152604091829020805463ffffffff191690558151601f8901829004820281018201909252878252610d03919089908990819084018382808284376000920191909152508d92506113b6915050565b610d3a576040805162461bcd60e51b815260206004820152600360248201526230b93360e91b604482015290519081900360640190fd5b336001600160a01b038b161415610d7b5760405181907f789952a21900cba4809507b4ba56618cee6a1e748254f8faab21e9b8f1c60bc990600090a2610da7565b60405181907f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d1490600090a25b50505050505050505050565b6000546001600160a01b03163314610df8576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831690811790915560408051338152602081019290925280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a150565b600180600054600160a01b900460ff166003811115610e7c57fe5b1015610eb5576040805162461bcd60e51b815260206004820152600360248201526269637360e81b604482015290519081900360640190fd5b8685336001600160a01b0383161480610ef05750336001600160a01b038216148015610ef057503360009081526001602052604090205460ff165b610f27576040805162461bcd60e51b815260206004820152600360248201526206f6f760ec1b604482015290519081900360640190fd5b6000610f538a8a8a8a8a60405180838380828437604051920182900390912093508c9250611295915050565b9050610f5e816113dd565b600081815260036020908152604091829020805463ffffffff191690558151601f8901829004820281018201909252878252610fb7919089908990819084018382808284376000920191909152508e9250611450915050565b610fee576040805162461bcd60e51b815260206004820152600360248201526230b1b360e91b604482015290519081900360640190fd5b336001600160a01b038b16141561102f5760405181907f7b5ac55826e0ca40c3f69722d916fb9962d86cffcddc9c84d082b712419e5cbd90600090a2610da7565b60405181907fc99795d9dc9d68f27b21e122a0e663f689138f9110dee0122fc2980f8d57977590600090a250505050505050505050565b600080546001600160a01b031633146110ac576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6004805460009182905560405190916001600160a01b0385169183156108fc0291849190818181858888f193505050501580156110ed573d6000803e3d6000fd5b50600195945050505050565b6000546001600160a01b0316331461113e576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6000546001600160a01b031633146111a7576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6000546001600160a01b0316331461120d576040805162461bcd60e51b81526020600482015260036024820152626f6f6360e81b604482015290519081900360640190fd5b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b604051806040016040528060058152602001640c0b8d8b8d60da1b81525081565b8151604214611291576040805162461bcd60e51b815260206004820152600360248201526218591b60ea1b604482015290519081900360640190fd5b5050565b604080516bffffffffffffffffffffffff19606097881b811660208084019190915296881b811660348301529490961b9093166048860152605c850191909152607c8085019190915281518085039091018152609c9093019052815191012090565b60008181526003602052604090205463ffffffff1615611344576040805162461bcd60e51b815260206004820152600360248201526273616560e81b604482015290519081900360640190fd5b50565b600061135b61135584611465565b83611480565b9392505050565b600081815260036020526040902054633b9aca0063ffffffff90911611611344576040805162461bcd60e51b815260206004820152600360248201526239b4bb60e91b604482015290519081900360640190fd5b6000806113cc846113c6866114fb565b85611502565b9050801561135b5761135b8461159b565b600081815260036020526040902054633b9aca0063ffffffff909116118015611419575060008181526003602052604090205463ffffffff1642115b611344576040805162461bcd60e51b815260206004820152600360248201526273656960e81b604482015290519081900360640190fd5b600061135b8361145f85611465565b84611502565b6000611470826115b0565b611479836114fb565b0192915050565b6000816001600160a01b03166381fd3f0b846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b50519392505050565b6022015190565b60405160009081906001600160a01b0384169085908381818185875af1925050503d806000811461154f576040519150601f19603f3d011682016040523d82523d6000602084013e611554565b606091505b5050905080611590576040805162461bcd60e51b815260206004820152600360248201526232ba3360e91b604482015290519081900360640190fd5b506001949350505050565b6115a4816115b0565b60048054909101905550565b604201519056fea264697066735822122040d4f4e159553924fcd3405061198325b4e3a8413f7dda315300452cc7e2cce564736f6c63430007000033

Deployed Bytecode Sourcemap

20934:67:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12019:1400;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12019:1400:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12019:1400:0;-1:-1:-1;12019:1400:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5940:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;5985:135;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5985:135:0;;;;:::i;:::-;;20684;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20684:135:0;-1:-1:-1;;;;;20684:135:0;;:::i;:::-;;;;;;;;;;;;;;;;6687:101;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6687:101:0;-1:-1:-1;;;;;6687:101:0;;:::i;1947:34::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4693:20;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4693:20:0;;;;;;;;;;;;;;16180:397;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16180:397:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16180:397:0;-1:-1:-1;16180:397:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;13889:834;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13889:834:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13889:834:0;-1:-1:-1;13889:834:0;;:::i;4974:146::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4974:146:0;-1:-1:-1;;;;;4974:146:0;;:::i;15058:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15058:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15058:828:0;-1:-1:-1;15058:828:0;;:::i;19905:279::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19905:279:0;-1:-1:-1;19905:279:0;-1:-1:-1;;;;;19905:279:0;;:::i;7452:109::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7452:109:0;-1:-1:-1;;;;;7452:109:0;;:::i;7569:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7569:109:0;-1:-1:-1;;;;;7569:109:0;;:::i;6578:101::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6578:101:0;-1:-1:-1;;;;;6578:101:0;;:::i;10968:40::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12019:1400;12416:12;12270:13;;6186:6;;-1:-1:-1;;;6186:6:0;;;;:17;;;;;;;;;;6178:33;;;;;-1:-1:-1;;;6178:33:0;;;;;;;;;;;;-1:-1:-1;;;6178:33:0;;;;;;;;;;;;;;;7741:10:::1;7732:20;::::0;;;:8:::1;:20;::::0;;;;;::::1;;7724:36;;;::::0;;-1:-1:-1;;;7724:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7724:36:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;6850:16:0;::::2;;::::0;;;:7:::2;:16;::::0;;;;;12330:7;;6850:16:::2;;6842:32;;;::::0;;-1:-1:-1;;;6842:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;6842:32:0;;;;;;;;;;;;;::::2;;12370:10:::3;;3649:436;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;::::0;;;;-1:-1:-1;;;;3894:1:0::3;3879:17:::0;::::3;3873:24:::0;12382:5;;3916:6:::3;3851:86:::0;;::::3;::::0;3979:10:::3;3966:23;::::0;::::3;3958:39;;;::::0;;-1:-1:-1;;;3958:39:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;3958:39:0;;;;;;;;;;;;;::::3;;4033:32;4048:9;4059:5;4033:14;:32::i;:::-;11229:8:::4;12468:33;::::0;::::4;;::::0;::::4;::::0;:70:::4;;-1:-1:-1::0;11292:7:0::4;12505:33;::::0;::::4;;;12468:70;12446:154;;;::::0;;-1:-1:-1;;;12446:154:0;;::::4;;::::0;::::4;::::0;::::4;::::0;;;;-1:-1:-1;;;12446:154:0;;;;;;;;;;;;;::::4;;12611:16;12630:106;12656:5;12663:9;12674:7;12693:10;;12683:21;;;;;;;;;;;;;;;;;;;;;;;;;;;12706:19;12630:11;:106::i;:::-;12611:125;;12747:30;12768:8;12747:20;:30::i;:::-;13179:15;::::0;;;:5:::4;:15;::::0;;;;;;;;:53;;-1:-1:-1;;13179:53:0::4;13204:15;13197:35:::0;::::4;13179:53;;;::::0;;13265:35;;::::4;::::0;::::4;::::0;;::::4;::::0;::::4;::::0;;;;;;;;;;::::4;::::0;;13282:10;;13265:35;;;;;::::4;13282:10:::0;13265:35;;13282:10;13265:35;::::4;;;;;;;;;;;;;;;;;;;;;;;;;13294:5;13265:16;:35::i;:::-;13243:113;;;::::0;;-1:-1:-1;;;13243:113:0;;::::4;;::::0;::::4;::::0;::::4;::::0;;;;-1:-1:-1;;;13243:113:0;;;;;;;;;;;;;::::4;;13372:17;::::0;13380:8;;13372:17:::4;::::0;;;::::4;-1:-1:-1::0;13407:4:0::4;::::0;12019:1400;-1:-1:-1;;;;;;;;;;;;;12019:1400:0:o;5940:36::-;;;-1:-1:-1;;;5940:36:0;;;;;:::o;5985:135::-;4898:5;;-1:-1:-1;;;;;4898:5:0;4884:10;:19;4876:35;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;;;;6055:30:::1;6069:6;;;;;;;;;;;6077:7;6055:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6096:6;:16:::0;;6105:7;;6096:6;-1:-1:-1;;;;6096:16:0::1;-1:-1:-1::0;;;6105:7:0;6096:16:::1;::::0;::::1;;;;;;;;;;;5985:135:::0;:::o;20684:::-;-1:-1:-1;20796:15:0;;;20684:135::o;6687:101::-;4898:5;;-1:-1:-1;;;;;4898:5:0;4884:10;:19;4876:35;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;6756:16:0::1;6775:5;6756:16:::0;;;:7:::1;:16;::::0;;;;:24;;-1:-1:-1;;6756:24:0::1;::::0;;6687:101::o;1947:34::-;;;:::o;4693:20::-;;;-1:-1:-1;;;;;4693:20:0;;:::o;16180:397::-;16385:13;16411:16;16430:106;16456:5;16463:9;16474:7;16493:10;;16483:21;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16506:19:0;;-1:-1:-1;16430:11:0;;-1:-1:-1;;16430:106:0:i;:::-;16554:15;;;;:5;:15;;;;;;;;;16180:397;-1:-1:-1;;;;;;;;16180:397:0:o;13889:834::-;14096:20;;6186:6;;-1:-1:-1;;;6186:6:0;;;;:17;;;;;;;;;;6178:33;;;;;-1:-1:-1;;;6178:33:0;;;;;;;;;;;;-1:-1:-1;;;6178:33:0;;;;;;;;;;;;;;;14135:5;14142:7;7021:10:::1;-1:-1:-1::0;;;;;7021:19:0;::::1;;::::0;:69:::1;;-1:-1:-1::0;7045:10:0::1;-1:-1:-1::0;;;;;7045:21:0;::::1;;:44:::0;::::1;;;-1:-1:-1::0;7078:10:0::1;7070:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;7045:44;6999:170;;;::::0;;-1:-1:-1;;;6999:170:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;6999:170:0;;;;;;;;;;;;;::::1;;14162:16:::2;14181:106;14207:5;14214:9;14225:7;14244:10;;14234:21;;;;;;;;;;::::0;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;14257:19:0;;-1:-1:-1;14181:11:0::2;::::0;-1:-1:-1;;14181:106:0:i:2;:::-;14162:125;;14298:28;14317:8;14298:18;:28::i;:::-;14436:1;14418:15:::0;;;:5:::2;:15;::::0;;;;;;;;:19;;-1:-1:-1;;14418:19:0::2;::::0;;14470:42;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;::::2;::::0;;14490:10;;;;;;14470:42;::::2;14490:10:::0;;;;14470:42;::::2;;::::0;::::2;::::0;;;;-1:-1:-1;14502:9:0;;-1:-1:-1;14470:19:0::2;::::0;-1:-1:-1;;14470:42:0:i:2;:::-;14448:122;;;::::0;;-1:-1:-1;;;14448:122:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;14448:122:0;;;;;;;;;;;;;::::2;;14585:10;-1:-1:-1::0;;;;;14585:19:0;::::2;;14581:135;;;14626:22;::::0;14639:8;;14626:22:::2;::::0;;;::::2;14581:135;;;14686:18;::::0;14695:8;;14686:18:::2;::::0;;;::::2;14581:135;7180:1;6252::::1;;13889:834:::0;;;;;;;:::o;4974:146::-;4898:5;;-1:-1:-1;;;;;4898:5:0;4884:10;:19;4876:35;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;;;;5044:5:::1;:17:::0;;-1:-1:-1;;5044:17:0::1;-1:-1:-1::0;;;;;5044:17:0;::::1;::::0;;::::1;::::0;;;5077:35:::1;::::0;;5090:10:::1;5077:35:::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;4974:146:::0;:::o;15058:828::-;15269:18;;6186:6;;-1:-1:-1;;;6186:6:0;;;;:17;;;;;;;;;;6178:33;;;;;-1:-1:-1;;;6178:33:0;;;;;;;;;;;;-1:-1:-1;;;6178:33:0;;;;;;;;;;;;;;;15306:5;15313:7;7021:10:::1;-1:-1:-1::0;;;;;7021:19:0;::::1;;::::0;:69:::1;;-1:-1:-1::0;7045:10:0::1;-1:-1:-1::0;;;;;7045:21:0;::::1;;:44:::0;::::1;;;-1:-1:-1::0;7078:10:0::1;7070:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;7045:44;6999:170;;;::::0;;-1:-1:-1;;;6999:170:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;6999:170:0;;;;;;;;;;;;;::::1;;15333:16:::2;15352:106;15378:5;15385:9;15396:7;15415:10;;15405:21;;;;;;;;;;::::0;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;15428:19:0;;-1:-1:-1;15352:11:0::2;::::0;-1:-1:-1;;15352:106:0:i:2;:::-;15333:125;;15469:28;15488:8;15469:18;:28::i;:::-;15607:1;15589:15:::0;;;:5:::2;:15;::::0;;;;;;;;:19;;-1:-1:-1;;15589:19:0::2;::::0;;15641:35;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;::::2;::::0;;15658:10;;;;;;15641:35;::::2;15658:10:::0;;;;15641:35;::::2;;::::0;::::2;::::0;;;;-1:-1:-1;15670:5:0;;-1:-1:-1;15641:16:0::2;::::0;-1:-1:-1;;15641:35:0:i:2;:::-;15619:114;;;::::0;;-1:-1:-1;;;15619:114:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;15619:114:0;;;;;;;;;;;;;::::2;;15748:10;-1:-1:-1::0;;;;;15748:19:0;::::2;;15744:135;;;15789:22;::::0;15802:8;;15789:22:::2;::::0;;;::::2;15744:135;;;15849:18;::::0;15858:8;;15849:18:::2;::::0;;;::::2;7180:1;6252::::1;;15058:828:::0;;;;;;;:::o;19905:279::-;20040:12;4898:5;;-1:-1:-1;;;;;4898:5:0;4884:10;:19;4876:35;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;;;;20080:15:::1;::::0;;20065:12:::1;20106:19:::0;;;;20136:18:::1;::::0;20080:15;;-1:-1:-1;;;;;20136:12:0;::::1;::::0;:18;::::1;;;::::0;20080:15;;20136:18;;20065:12;20136:18;20080:15;20136:12;:18;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;20172:4:0::1;::::0;19905:279;-1:-1:-1;;;;;19905:279:0:o;7452:109::-;4898:5;;-1:-1:-1;;;;;4898:5:0;4884:10;:19;4876:35;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;7528:18:0::1;;::::0;;;:8:::1;:18;::::0;;;;:25;;-1:-1:-1;;7528:25:0::1;7549:4;7528:25;::::0;;7452:109::o;7569:::-;4898:5;;-1:-1:-1;;;;;4898:5:0;4884:10;:19;4876:35;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;7644:18:0::1;7665:5;7644:18:::0;;;:8:::1;:18;::::0;;;;:26;;-1:-1:-1;;7644:26:0::1;::::0;;7569:109::o;6578:101::-;4898:5;;-1:-1:-1;;;;;4898:5:0;4884:10;:19;4876:35;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;-1:-1:-1;;;4876:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;6648:16:0::1;;::::0;;;6667:4:::1;6648:16;::::0;;;;;;;:23;;-1:-1:-1;;6648:23:0::1;::::0;;::::1;::::0;;6578:101::o;10968:40::-;;;;;;;;;;;;;;-1:-1:-1;;;10968:40:0;;;;:::o;20478:198::-;20587:16;;18015:2;20587:41;20579:57;;;;;-1:-1:-1;;;20579:57:0;;;;;;;;;;;;-1:-1:-1;;;20579:57:0;;;;;;;;;;;;;;;20478:198;;:::o;16691:372::-;16937:107;;;-1:-1:-1;;16937:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16913:142;;;;;;16691:372::o;17071:180::-;17166:15;;;;:5;:15;;;;;;;;:20;17144:99;;;;;-1:-1:-1;;;17144:99:0;;;;;;;;;;;;-1:-1:-1;;;17144:99:0;;;;;;;;;;;;;;;17071:180;:::o;8829:204::-;8945:12;8977:48;8990:27;9007:9;8990:16;:27::i;:::-;9019:5;8977:12;:48::i;:::-;8970:55;8829:204;-1:-1:-1;;;8829:204:0:o;17259:189::-;17352:15;;;;:5;:15;;;;;;11065:10;17352:38;:15;;;:38;17330:110;;;;;-1:-1:-1;;;17330:110:0;;;;;;;;;;;;-1:-1:-1;;;17330:110:0;;;;;;;;;;;;;;9260:285;9377:12;9402:11;9416:50;9429:9;9440:20;9450:9;9440;:20::i;:::-;9462:3;9416:12;:50::i;:::-;9402:64;;9481:6;9477:36;;;9489:24;9503:9;9489:13;:24::i;17456:300::-;17608:15;;;;:5;:15;;;;;;11065:10;17608:38;:15;;;:38;:75;;;;-1:-1:-1;17668:15:0;;;;:5;:15;;;;;;;;17650;:33;17608:75;17527:221;;;;;-1:-1:-1;;;17527:221:0;;;;;;;;;;;;-1:-1:-1;;;17527:221:0;;;;;;;;;;;;;;9041:211;9155:12;9187:57;9200:9;9211:27;9228:9;9211:16;:27::i;:::-;9240:3;9187:12;:57::i;8673:148::-;8746:7;8796:17;8803:9;8796:6;:17::i;:::-;8773:20;8783:9;8773;:20::i;:::-;:40;;8673:148;-1:-1:-1;;8673:148:0:o;2733:199::-;2837:12;2894:5;-1:-1:-1;;;;;2869:47:0;;2917:6;2869:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2869:55:0;;2733:199;-1:-1:-1;;;2733:199:0:o;18488:236::-;18702:2;18687:18;18681:25;;18656:61::o;19075:694::-;19639:29;;19224:12;;;;-1:-1:-1;;;;;19639:8:0;;;19655:7;;19224:12;19639:29;19224:12;19639:29;19655:7;19639:8;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19610:58;;;19687:18;19679:34;;;;;-1:-1:-1;;;19679:34:0;;;;;;;;;;;;-1:-1:-1;;;19679:34:0;;;;;;;;;;;;;;;-1:-1:-1;19757:4:0;;19075:694;-1:-1:-1;;;;19075:694:0:o;19777:120::-;19872:17;19879:9;19872:6;:17::i;:::-;19853:15;:36;;;;;;;-1:-1:-1;19777:120:0:o;18840:227::-;19045:2;19030:18;19024:25;;19002:58::o

Swarm Source

ipfs://40d4f4e159553924fcd3405061198325b4e3a8413f7dda315300452cc7e2cce5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.