ETH Price: $3,055.90 (+1.53%)
Gas: 12 Gwei

Contract

0xEDe26cCC85ae521D06B5eF2604952a421c9124b6
 
Transaction Hash
Method
Block
From
To
Value
0xc4ef3d6cf0ebaeccf06c69c466f623468a1c1d545baa93588afb3ef200682012Create Escrow(pending)2024-05-17 4:25:543 hrs ago1715919954IN
0xEDe26cCC...21c9124b6
0.03021 ETH(Pending)(Pending)
0x3ab6c05b8ba8b3f9281231852be11f3ddee413202e77d5a9fa241b9fe61c19f8Create Escrow(pending)2024-05-17 0:42:517 hrs ago1715906571IN
0xEDe26cCC...21c9124b6
0.0145 ETH(Pending)(Pending)
0x5ac58ff1abbf89d83faaa520e604ebfdf763dfd199bf7aeb66595798d4e6af98Create Escrow(pending)2024-05-16 19:33:1812 hrs ago1715887998IN
0xEDe26cCC...21c9124b6
0.031345 ETH(Pending)(Pending)
0xa364cd0178ece17e275f28fc51a0fb93ca91cc7986d029967366a7cfedb3c0afCreate Escrow(pending)2024-05-16 17:22:0315 hrs ago1715880123IN
0xEDe26cCC...21c9124b6
0.00832 ETH(Pending)(Pending)
0x5e031677fdea9002285b956a346cc24d217136be7eed00a9a9cf1e8b86e43adfCreate Escrow(pending)2024-05-16 15:32:5116 hrs ago1715873571IN
0xEDe26cCC...21c9124b6
0.02539 ETH(Pending)(Pending)
Seller Cancel177877692023-07-27 23:46:23294 days ago1690501583IN
0xEDe26cCC...21c9124b6
0 ETH0.0007263627.8793961
Seller Cancel177876982023-07-27 23:32:11294 days ago1690500731IN
0xEDe26cCC...21c9124b6
0 ETH0.0008115431.14838576
Withdraw Fees168948522023-03-24 4:01:47420 days ago1679630507IN
0xEDe26cCC...21c9124b6
0 ETH0.0004516314.42653235
Batch Relay167977812023-03-10 12:38:59433 days ago1678451939IN
0xEDe26cCC...21c9124b6
0 ETH0.0009458723
Batch Relay167971652023-03-10 10:33:47433 days ago1678444427IN
0xEDe26cCC...21c9124b6
0 ETH0.0014393735
Batch Relay167965582023-03-10 8:27:59433 days ago1678436879IN
0xEDe26cCC...21c9124b6
0 ETH0.0009458723
Batch Relay167959642023-03-10 6:27:35434 days ago1678429655IN
0xEDe26cCC...21c9124b6
0 ETH0.0009458723
Batch Relay167953732023-03-10 4:27:11434 days ago1678422431IN
0xEDe26cCC...21c9124b6
0 ETH0.0009458723
Batch Relay167947802023-03-10 2:26:35434 days ago1678415195IN
0xEDe26cCC...21c9124b6
0 ETH0.0011103727
Batch Relay167941552023-03-10 0:18:47434 days ago1678407527IN
0xEDe26cCC...21c9124b6
0 ETH0.0012748731
Batch Relay167935492023-03-09 22:15:59434 days ago1678400159IN
0xEDe26cCC...21c9124b6
0 ETH0.0017683743
Batch Relay167929132023-03-09 20:06:35434 days ago1678392395IN
0xEDe26cCC...21c9124b6
0 ETH0.0024263759
Batch Relay167922652023-03-09 17:55:11434 days ago1678384511IN
0xEDe26cCC...21c9124b6
0 ETH0.0022618755
Batch Relay167916682023-03-09 15:54:23434 days ago1678377263IN
0xEDe26cCC...21c9124b6
0 ETH0.0012748731
Batch Relay167910382023-03-09 13:47:11434 days ago1678369631IN
0xEDe26cCC...21c9124b6
0 ETH0.0014393735
Batch Relay167903812023-03-09 11:33:35434 days ago1678361615IN
0xEDe26cCC...21c9124b6
0 ETH0.0009458723
Batch Relay167897822023-03-09 9:33:11434 days ago1678354391IN
0xEDe26cCC...21c9124b6
0 ETH0.0009458723
Batch Relay167891832023-03-09 7:32:35435 days ago1678347155IN
0xEDe26cCC...21c9124b6
0 ETH0.0011103727
Batch Relay167885432023-03-09 5:23:23435 days ago1678339403IN
0xEDe26cCC...21c9124b6
0 ETH0.0009458723
Batch Relay167879442023-03-09 3:21:47435 days ago1678332107IN
0xEDe26cCC...21c9124b6
0 ETH0.0012748731
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
168948522023-03-24 4:01:47420 days ago1679630507
0xEDe26cCC...21c9124b6
4.23291808 ETH
164155212023-01-15 23:37:23487 days ago1673825843
0xEDe26cCC...21c9124b6
1.49430617 ETH
163900342023-01-12 10:09:47490 days ago1673518187
0xEDe26cCC...21c9124b6
0.75351517 ETH
163880422023-01-12 3:29:35491 days ago1673494175
0xEDe26cCC...21c9124b6
1.00481893 ETH
163876112023-01-12 2:03:11491 days ago1673488991
0xEDe26cCC...21c9124b6
0.09919173 ETH
163861822023-01-11 21:15:11491 days ago1673471711
0xEDe26cCC...21c9124b6
0.08758456 ETH
163860822023-01-11 20:55:11491 days ago1673470511
0xEDe26cCC...21c9124b6
1.27258918 ETH
163855812023-01-11 19:14:23491 days ago1673464463
0xEDe26cCC...21c9124b6
0.05043616 ETH
163851842023-01-11 17:54:35491 days ago1673459675
0xEDe26cCC...21c9124b6
0.3579856 ETH
163851442023-01-11 17:46:11491 days ago1673459171
0xEDe26cCC...21c9124b6
0.4885728 ETH
163839352023-01-11 13:41:59491 days ago1673444519
0xEDe26cCC...21c9124b6
0.04964016 ETH
163837852023-01-11 13:11:47491 days ago1673442707
0xEDe26cCC...21c9124b6
1.48091587 ETH
163833452023-01-11 11:42:47491 days ago1673437367
0xEDe26cCC...21c9124b6
0.77151016 ETH
163827142023-01-11 9:36:11491 days ago1673429771
0xEDe26cCC...21c9124b6
1.00623546 ETH
163825832023-01-11 9:09:59491 days ago1673428199
0xEDe26cCC...21c9124b6
0.20994084 ETH
163824112023-01-11 8:35:23491 days ago1673426123
0xEDe26cCC...21c9124b6
0.46722938 ETH
163822272023-01-11 7:58:35492 days ago1673423915
0xEDe26cCC...21c9124b6
3.20370818 ETH
163819772023-01-11 7:08:23492 days ago1673420903
0xEDe26cCC...21c9124b6
2.15282376 ETH
163818192023-01-11 6:36:35492 days ago1673418995
0xEDe26cCC...21c9124b6
0.02496668 ETH
163812002023-01-11 4:32:23492 days ago1673411543
0xEDe26cCC...21c9124b6
0.13537648 ETH
163799532023-01-11 0:21:47492 days ago1673396507
0xEDe26cCC...21c9124b6
1.97921031 ETH
163798992023-01-11 0:10:59492 days ago1673395859
0xEDe26cCC...21c9124b6
0.23560774 ETH
163791462023-01-10 21:37:59492 days ago1673386679
0xEDe26cCC...21c9124b6
0.28566673 ETH
163791152023-01-10 21:31:47492 days ago1673386307
0xEDe26cCC...21c9124b6
0.068397 ETH
163789512023-01-10 20:58:59492 days ago1673384339
0xEDe26cCC...21c9124b6
0.344805 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LocalCryptosETHEscrows

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license
/**
 *Submitted for verification at Etherscan.io on 2021-01-30
*/

/**
   Copyright (c) 2021 LocalCryptos.com

   Licensed under the Apache License, Version 2.0 (the “License”);
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an “AS IS” BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.7.6;

abstract contract Token {
    function transfer(address _to, uint _value) public virtual returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public virtual returns (bool success);
    function virtualapprove(address _spender, uint _value) public virtual returns (bool success);
    function approve(address spender, uint256 value) public virtual returns (bool);
}

/// @title LocalCryptos ETH Escrows
/// @author LocalCryptos
contract LocalCryptosETHEscrows {
    /***********************
    +   Global settings   +
    ***********************/

    // Address of the arbitrator (currently always localethereum staff)
    address public arbitrator;
    // Address of the owner (who can withdraw collected fees)
    address public owner;
    address public inviterAddress;
    // Addresses of the relayers (which addresses are allowed to forward signed instructions from parties)
    mapping (address => bool) public relayers;

    uint32 public requestCancellationMinimumTime;
    // Cumulative balance of collected fees
    uint256 public feesAvailableForWithdraw;

    /***********************
    +  Instruction types  +
    ***********************/

    // Called when the buyer marks payment as sent. Locks funds in escrow
    uint8 constant INSTRUCTION_SELLER_CANNOT_CANCEL = 0x01;
    // Buyer cancelling
    uint8 constant INSTRUCTION_BUYER_CANCEL = 0x02;
    // Seller cancelling
    uint8 constant INSTRUCTION_SELLER_CANCEL = 0x03;
    // Seller requesting to cancel. Begins a window for buyer to object
    uint8 constant INSTRUCTION_SELLER_REQUEST_CANCEL = 0x04;
    // Seller releasing funds to the buyer
    uint8 constant INSTRUCTION_RELEASE = 0x05;
    // Either party permitting the arbitrator to resolve a dispute
    uint8 constant INSTRUCTION_RESOLVE = 0x06;

    /***********************
    +       Events        +
    ***********************/

    event Created(bytes32 indexed _tradeHash);
    event SellerCancelDisabled(bytes32 indexed _tradeHash);
    event SellerRequestedCancel(bytes32 indexed _tradeHash);
    event CancelledBySeller(bytes32 indexed _tradeHash);
    event CancelledByBuyer(bytes32 indexed _tradeHash);
    event Released(bytes32 indexed _tradeHash);
    event DisputeResolved(bytes32 indexed _tradeHash);

    struct Escrow {
        // So we know the escrow exists
        bool exists;
        // This is the timestamp in whic hthe seller can cancel the escrow after.
        // It has two special values:
        // 0 : Permanently locked by the buyer (i.e. marked as paid; the seller can never cancel)
        // 1 : The seller can only request to cancel, which will change this value to a timestamp.
        //     This option is avaialble for complex trade terms such as cash-in-person where a
        //     payment window is inappropriate
        uint32 sellerCanCancelAfter;
        // Cumulative cost of gas incurred by the relayer. This amount will be refunded to the owner
        // in the way of fees once the escrow has completed
        uint128 totalGasFeesSpentByRelayer;
    }

    // Mapping of active trades. The key here is a hash of the trade proprties
    mapping (bytes32 => Escrow) public escrows;

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

    modifier onlyArbitrator() {
        require(msg.sender == arbitrator, "Must be arbitrator");
        _;
    }

    /// @notice Initialize the contract.
    constructor() {
        owner = msg.sender;
        arbitrator = msg.sender;
        inviterAddress = msg.sender;
        requestCancellationMinimumTime = 0 seconds;
    }

    /// @notice Create and fund a new escrow.
    /// @param _tradeID The unique ID of the trade, generated by localethereum.com
    /// @param _seller The selling party
    /// @param _buyer The buying party
    /// @param _value The amount of the escrow, exclusive of the fee
    /// @param _fee Localethereum's commission in 1/10000ths
    /// @param _paymentWindowInSeconds The time in seconds from escrow creation that the seller can cancel after
    /// @param _expiry This transaction must be created before this time
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    function createEscrow(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee,
        uint32 _paymentWindowInSeconds,
        uint32 _expiry,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) payable external {
        // The trade hash is created by tightly-concatenating and hashing properties of the trade.
        // This hash becomes the identifier of the escrow, and hence all these variables must be
        // supplied on future contract calls
        bytes32 _tradeHash = keccak256(abi.encodePacked(_tradeID, _seller, _buyer, _value, _fee));
        // Require that trade does not already exist
        require(!escrows[_tradeHash].exists, "Trade already exists");
        // A signature (v, r and s) must come from localethereum to open an escrow
        bytes32 _invitationHash = keccak256(abi.encodePacked(
            _tradeHash,
            _paymentWindowInSeconds,
            _expiry
        ));
        require(recoverAddress(_invitationHash, _v, _r, _s) == inviterAddress, "Invitation signature was not valid");
        // These signatures come with an expiry stamp
        require(block.timestamp < _expiry, "Signature has expired");
        // Check transaction value against signed _value and make sure is not 0
        require(msg.value == _value && msg.value > 0, "Incorrect ether sent");
        uint32 _sellerCanCancelAfter = _paymentWindowInSeconds == 0
            ? 1
            : uint32(block.timestamp) + _paymentWindowInSeconds;
        // Add the escrow to the public mapping
        escrows[_tradeHash] = Escrow(true, _sellerCanCancelAfter, 0);
        emit Created(_tradeHash);
    }

    uint16 constant GAS_doResolveDispute = 45368;
    /// @notice Called by the arbitrator to resolve a dispute. Requires a signature from either party.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @param _buyerPercent What % should be distributed to the buyer (this is usually 0 or 100)
    function resolveDispute(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint8 _v,
        bytes32 _r,
        bytes32 _s,
        uint8 _buyerPercent
    ) external onlyArbitrator {
        address _signature = recoverAddress(keccak256(abi.encodePacked(
            _tradeID,
            INSTRUCTION_RESOLVE
        )), _v, _r, _s);
        require(_signature == _buyer || _signature == _seller, "Must be buyer or seller");

        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        require(_escrow.exists, "Escrow does not exist");
        require(_buyerPercent <= 100, "_buyerPercent must be 100 or lower");

        uint256 _totalFees = _escrow.totalGasFeesSpentByRelayer + (GAS_doResolveDispute * uint128(tx.gasprice));
        require(_value - _totalFees <= _value, "Overflow error"); // Prevent underflow
        feesAvailableForWithdraw += _totalFees; // Add the the pot for localethereum to withdraw

        delete escrows[_tradeHash];
        emit DisputeResolved(_tradeHash);
        if (_buyerPercent > 0)
          payable(_buyer).transfer((_value - _totalFees) * _buyerPercent / 100);
        if (_buyerPercent < 100)
          payable(_seller).transfer((_value - _totalFees) * (100 - _buyerPercent) / 100);
    }

    /// @notice Release ether in escrow to the buyer. Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function release(
        bytes16 _tradeID,
        address _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _seller, "Must be seller");
        return doRelease(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    /// @notice Disable the seller from cancelling (i.e. "mark as paid"). Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function disableSellerCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _buyer, "Must be buyer");
        return doDisableSellerCancel(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    /// @notice Cancel the escrow as a buyer. Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function buyerCancel(
      bytes16 _tradeID,
      address payable _seller,
      address _buyer,
      uint256 _value,
      uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _buyer, "Must be buyer");
        return doBuyerCancel(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    /// @notice Cancel the escrow as a seller. Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function sellerCancel(
        bytes16 _tradeID,
        address payable _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _seller, "Must be seller");
        return doSellerCancel(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    /// @notice Request to cancel as a seller. Direct call option.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return bool
    function sellerRequestCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee
    ) external returns (bool) {
        require(msg.sender == _seller, "Must be seller");
        return doSellerRequestCancel(_tradeID, _seller, _buyer, _value, _fee, 0);
    }

    uint16 constant GAS_batchRelayBase = 32720;
    /// @notice Relay multiple signed instructions from parties of escrows.
    /// @param _tradeID List of _tradeID values
    /// @param _seller List of _seller values
    /// @param _buyer List of _buyer values
    /// @param _value List of _value values
    /// @param _fee List of _fee values
    /// @param _maximumGasPrice List of _maximumGasPrice values
    /// @param _v List of signature "v" components
    /// @param _r List of signature "r" components
    /// @param _s List of signature "s" components
    /// @param _instructionByte List of _instructionByte values
    /// @return bool List of results
    function batchRelay(
        bytes16[] memory _tradeID,
        address payable[] memory _seller,
        address payable[] memory _buyer,
        uint256[] memory _value,
        uint16[] memory _fee,
        uint128[] memory _maximumGasPrice,
        uint8[] memory _v,
        bytes32[] memory _r,
        bytes32[] memory _s,
        uint8[] memory _instructionByte
    ) public returns (bool[] memory) {
        bool[] memory _results = new bool[](_tradeID.length);
        uint128 _additionalGas = uint128(relayers[msg.sender] == true ? (GAS_batchRelayBase / _tradeID.length) : 0);
        for (uint8 i=0; i<_tradeID.length; i++) {
            _results[i] = relay(
                _tradeID[i],
                _seller[i],
                _buyer[i],
                _value[i],
                _fee[i],
                _maximumGasPrice[i],
                _v[i],
                _r[i],
                _s[i],
                _instructionByte[i],
                _additionalGas
            );
        }
        return _results;
    }

    /// @notice Withdraw fees collected by the contract. Only the owner can call this.
    /// @param _to Address to withdraw fees in to
    /// @param _amount Amount to withdraw
    function withdrawFees(address payable _to, uint256 _amount) onlyOwner external {
        // This check also prevents underflow
        require(_amount <= feesAvailableForWithdraw, "Amount is higher than amount available");
        feesAvailableForWithdraw -= _amount;
        payable(_to).transfer(_amount);
    }

    /// @notice Set the arbitrator to a new address. Only the owner can call this.
    /// @param _newArbitrator Address of the replacement arbitrator
    function setArbitrator(address _newArbitrator) onlyOwner external {
        arbitrator = _newArbitrator;
    }

    /// @notice Change the owner to a new address. Only the owner can call this.
    /// @param _newOwner Address of the replacement owner
    function setOwner(address _newOwner) onlyOwner external {
        owner = _newOwner;
    }

    /// @notice Enable or disable a relayer address. Only the owner can call this.
    /// @param _newRelayer Address of the relayer
    /// @param _enabled Whether the relayer is enabled
    function setRelayer(address _newRelayer, bool _enabled) onlyOwner external {
        relayers[_newRelayer] = _enabled;
    }

    /// @notice Change the inviter to a new address. Only the owner can call this.
    /// @param _newInviterAddress Address of the inviter address
    function setInviterAddress(address _newInviterAddress) onlyOwner external {
        inviterAddress = _newInviterAddress;
    }

    /// @notice Change the requestCancellationMinimumTime. Only the owner can call this.
    /// @param _newRequestCancellationMinimumTime Replacement
    function setRequestCancellationMinimumTime(
        uint32 _newRequestCancellationMinimumTime
    ) onlyOwner external {
        requestCancellationMinimumTime = _newRequestCancellationMinimumTime;
    }

    /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens.
    /// @param _tokenContract Token contract
    /// @param _transferTo Recipient
    /// @param _value Value
    function transferToken(
        Token _tokenContract,
        address _transferTo,
        uint256 _value
    ) onlyOwner external {
        _tokenContract.transfer(_transferTo, _value);
    }

    /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens.
    /// @param _tokenContract Token contract
    /// @param _transferTo Recipient
    /// @param _transferFrom Sender
    /// @param _value Value
    function transferTokenFrom(
        Token _tokenContract,
        address _transferTo,
        address _transferFrom,
        uint256 _value
    ) onlyOwner external {
        _tokenContract.transferFrom(_transferTo, _transferFrom, _value);
    }

    /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens.
    /// @param _tokenContract Token contract
    /// @param _spender Spender address
    /// @param _value Value
    function approveToken(
        Token _tokenContract,
        address _spender,
        uint256 _value
    ) onlyOwner external {
        _tokenContract.approve(_spender, _value);
    }

    /// @notice Relay a signed instruction from a party of an escrow.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _maximumGasPrice Maximum gas price permitted for the relayer (set by the instructor)
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function relay(
        bytes16 _tradeID,
        address payable _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _maximumGasPrice,
        uint8 _v,
        bytes32 _r,
        bytes32 _s,
        uint8 _instructionByte,
        uint128 _additionalGas
    ) private returns (bool) {
        address _relayedSender = getRelayedSender(
            _tradeID,
            _instructionByte,
            _maximumGasPrice,
            _v,
            _r,
            _s
        );
        if (_relayedSender == _buyer) {
            // Buyer's instructions:
            if (_instructionByte == INSTRUCTION_SELLER_CANNOT_CANCEL) {
                // Disable seller from cancelling
                return doDisableSellerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            } else if (_instructionByte == INSTRUCTION_BUYER_CANCEL) {
                // Cancel
                return doBuyerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            }
        } else if (_relayedSender == _seller) {
            // Seller's instructions:
            if (_instructionByte == INSTRUCTION_RELEASE) {
                // Release
                return doRelease(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            } else if (_instructionByte == INSTRUCTION_SELLER_CANCEL) {
                // Cancel
                return doSellerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            } else if (_instructionByte == INSTRUCTION_SELLER_REQUEST_CANCEL) {
                // Request to cancel
                return doSellerRequestCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas);
            }
        }
        return false;
    }

    /// @notice Increase the amount of gas to be charged later on completion of an escrow
    /// @param _tradeHash Trade hash
    /// @param _gas Gas cost
    function increaseGasSpent(bytes32 _tradeHash, uint128 _gas) private {
        escrows[_tradeHash].totalGasFeesSpentByRelayer += _gas * uint128(tx.gasprice);
    }

    /// @notice Transfer the value of an escrow, minus the fees, minus the gas costs incurred by relay
    /// @param _to Recipient address
    /// @param _value Value of the transfer
    /// @param _totalGasFeesSpentByRelayer Total gas fees spent by the relayer
    /// @param _fee Commission in 1/10000ths
    function transferMinusFees(
        address payable _to,
        uint256 _value,
        uint128 _totalGasFeesSpentByRelayer,
        uint16 _fee
    ) private {
        uint256 _totalFees = (_value * _fee / 10000) + _totalGasFeesSpentByRelayer;
        // Prevent underflow
        if(_value - _totalFees > _value) {
            return;
        }
        // Add fees to the pot for localethereum to withdraw
        feesAvailableForWithdraw += _totalFees;
        payable(_to).transfer(_value - _totalFees);
    }

    uint16 constant GAS_doRelease = 12664;
    /// @notice Release escrow to the buyer. This completes it and removes it from the mapping.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doRelease(
        bytes16 _tradeID,
        address _seller,
        address payable _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) return false;
        uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer
            + (relayers[msg.sender] == true
                ? (GAS_doRelease + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit Released(_tradeHash);
        transferMinusFees(_buyer, _value, _gasFees, _fee);
        return true;
    }

    uint16 constant GAS_doDisableSellerCancel = 16568;
    /// @notice Prevents the seller from cancelling an escrow. Used to "mark as paid" by the buyer.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doDisableSellerCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) return false;
        if(_escrow.sellerCanCancelAfter == 0) return false;
        escrows[_tradeHash].sellerCanCancelAfter = 0;
        emit SellerCancelDisabled(_tradeHash);
        if (relayers[msg.sender] == true) {
          increaseGasSpent(_tradeHash, GAS_doDisableSellerCancel + _additionalGas);
        }
        return true;
    }

    uint16 constant GAS_doBuyerCancel = 12648;
    /// @notice Cancels the trade and returns the ether to the seller. Can only be called the buyer.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doBuyerCancel(
        bytes16 _tradeID,
        address payable _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) {
            return false;
        }
        uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer
            + (relayers[msg.sender] == true
                ? (GAS_doBuyerCancel + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit CancelledByBuyer(_tradeHash);
        transferMinusFees(_seller, _value, _gasFees, 0);
        return true;
    }

    uint16 constant GAS_doSellerCancel = 13714;
    /// @notice Returns the ether in escrow to the seller. Called by the seller. Sometimes unavailable.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doSellerCancel(
        bytes16 _tradeID,
        address payable _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) {
            return false;
        }
        if(_escrow.sellerCanCancelAfter <= 1 || _escrow.sellerCanCancelAfter > block.timestamp) {
            return false;
        }
        if (relayers[msg.sender] == false && _escrow.sellerCanCancelAfter + 12 hours > block.timestamp) {
            return false;
        }
        uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer
            + (relayers[msg.sender] == true
                ? (GAS_doSellerCancel + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit CancelledBySeller(_tradeHash);
        transferMinusFees(_seller, _value, _gasFees, 0);
        return true;
    }

    uint16 constant GAS_doSellerRequestCancel = 17004;
    /// @notice Request to cancel. Used if the buyer is unresponsive. Begins a countdown timer.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @param _additionalGas Additional gas to be deducted after this operation
    /// @return bool
    function doSellerRequestCancel(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee,
        uint128 _additionalGas
    ) private returns (bool) {
        // Called on unlimited payment window trades where the buyer is not responding
        Escrow memory _escrow;
        bytes32 _tradeHash;
        (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee);
        if (!_escrow.exists) {
            return false;
        }
        if(_escrow.sellerCanCancelAfter != 1) {
            return false;
        }
        escrows[_tradeHash].sellerCanCancelAfter = uint32(block.timestamp)
            + requestCancellationMinimumTime;
        emit SellerRequestedCancel(_tradeHash);
        if (relayers[msg.sender] == true) {
          increaseGasSpent(_tradeHash, GAS_doSellerRequestCancel + _additionalGas);
        }
        return true;
    }

    /// @notice Get the sender of the signed instruction.
    /// @param _tradeID Identifier of the trade
    /// @param _instructionByte Identifier of the instruction
    /// @param _maximumGasPrice Maximum gas price permitted by the sender
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @return address
    function getRelayedSender(
      bytes16 _tradeID,
      uint8 _instructionByte,
      uint128 _maximumGasPrice,
      uint8 _v,
      bytes32 _r,
      bytes32 _s
    ) view private returns (address) {
        bytes32 _hash = keccak256(abi.encodePacked(
            _tradeID,
            _instructionByte,
            _maximumGasPrice
        ));
        if(tx.gasprice > _maximumGasPrice) {
            return (address)(0);
        }
        return recoverAddress(_hash, _v, _r, _s);
    }

    /// @notice Hashes the values and returns the matching escrow object and trade hash.
    /// @dev Returns an empty escrow struct and 0 _tradeHash if not found.
    /// @param _tradeID Escrow "tradeID" parameter
    /// @param _seller Escrow "seller" parameter
    /// @param _buyer Escrow "buyer" parameter
    /// @param _value Escrow "value" parameter
    /// @param _fee Escrow "fee parameter
    /// @return Escrow
    function getEscrowAndHash(
        bytes16 _tradeID,
        address _seller,
        address _buyer,
        uint256 _value,
        uint16 _fee
    ) view private returns (Escrow memory, bytes32) {
        bytes32 _tradeHash = keccak256(abi.encodePacked(
            _tradeID,
            _seller,
            _buyer,
            _value,
            _fee
        ));
        return (escrows[_tradeHash], _tradeHash);
    }

    /// @notice Returns an empty escrow struct and 0 _tradeHash if not found.
    /// @param _h Data to be hashed
    /// @param _v Signature "v" component
    /// @param _r Signature "r" component
    /// @param _s Signature "s" component
    /// @return address
    function recoverAddress(
        bytes32 _h,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) private pure returns (address) {
        bytes memory _prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 _prefixedHash = keccak256(abi.encodePacked(_prefix, _h));
        return ecrecover(_prefixedHash, _v, _r, _s);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tradeHash","type":"bytes32"}],"name":"CancelledByBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tradeHash","type":"bytes32"}],"name":"CancelledBySeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tradeHash","type":"bytes32"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tradeHash","type":"bytes32"}],"name":"DisputeResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tradeHash","type":"bytes32"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tradeHash","type":"bytes32"}],"name":"SellerCancelDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tradeHash","type":"bytes32"}],"name":"SellerRequestedCancel","type":"event"},{"inputs":[{"internalType":"contract Token","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arbitrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16[]","name":"_tradeID","type":"bytes16[]"},{"internalType":"address payable[]","name":"_seller","type":"address[]"},{"internalType":"address payable[]","name":"_buyer","type":"address[]"},{"internalType":"uint256[]","name":"_value","type":"uint256[]"},{"internalType":"uint16[]","name":"_fee","type":"uint16[]"},{"internalType":"uint128[]","name":"_maximumGasPrice","type":"uint128[]"},{"internalType":"uint8[]","name":"_v","type":"uint8[]"},{"internalType":"bytes32[]","name":"_r","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_s","type":"bytes32[]"},{"internalType":"uint8[]","name":"_instructionByte","type":"uint8[]"}],"name":"batchRelay","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_tradeID","type":"bytes16"},{"internalType":"address payable","name":"_seller","type":"address"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint16","name":"_fee","type":"uint16"}],"name":"buyerCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_tradeID","type":"bytes16"},{"internalType":"address","name":"_seller","type":"address"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint32","name":"_paymentWindowInSeconds","type":"uint32"},{"internalType":"uint32","name":"_expiry","type":"uint32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"createEscrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_tradeID","type":"bytes16"},{"internalType":"address","name":"_seller","type":"address"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint16","name":"_fee","type":"uint16"}],"name":"disableSellerCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"escrows","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint32","name":"sellerCanCancelAfter","type":"uint32"},{"internalType":"uint128","name":"totalGasFeesSpentByRelayer","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesAvailableForWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inviterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"relayers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_tradeID","type":"bytes16"},{"internalType":"address","name":"_seller","type":"address"},{"internalType":"address payable","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint16","name":"_fee","type":"uint16"}],"name":"release","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestCancellationMinimumTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_tradeID","type":"bytes16"},{"internalType":"address payable","name":"_seller","type":"address"},{"internalType":"address payable","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint8","name":"_buyerPercent","type":"uint8"}],"name":"resolveDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_tradeID","type":"bytes16"},{"internalType":"address payable","name":"_seller","type":"address"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint16","name":"_fee","type":"uint16"}],"name":"sellerCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_tradeID","type":"bytes16"},{"internalType":"address","name":"_seller","type":"address"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint16","name":"_fee","type":"uint16"}],"name":"sellerRequestCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newArbitrator","type":"address"}],"name":"setArbitrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newInviterAddress","type":"address"}],"name":"setInviterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRelayer","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newRequestCancellationMinimumTime","type":"uint32"}],"name":"setRequestCancellationMinimumTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_transferTo","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_transferTo","type":"address"},{"internalType":"address","name":"_transferFrom","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600180546001600160a01b031990811633908117909255600080548216831790556002805490911690911790556004805463ffffffff1916905561258d8061005a6000396000f3fe60806040526004361061014b5760003560e01c80638eb4e0ad116100b6578063e59949051161006f578063e599490514610b38578063e9600f1214610b81578063ecd8dc3a14610bdf578063ede856d914610c1a578063f1e03d6714610c4d578063f5537ede14610ccb5761014b565b80638eb4e0ad146104bc578063ad3b1b4714610a4d578063b0eefabe14610a86578063b1e1fd4b14610ab9578063da3e339714610ace578063de5785d514610b115761014b565b80635300f841116101085780635300f8411461035957806357938b2a1461038c5780635c810f09146103ba5780636b407837146104185780636cc6cde1146104765780638da5cb5b146104a75761014b565b806305b649931461015057806313af40351461018257806324943c7d146101b55780632cc9636c146102315780632d83549c146102a357806335adc0c5146102fb575b600080fd5b34801561015c57600080fd5b506101806004803603602081101561017357600080fd5b503563ffffffff16610d0e565b005b34801561018e57600080fd5b50610180600480360360208110156101a557600080fd5b50356001600160a01b0316610d79565b3480156101c157600080fd5b5061018060048036036101208110156101d957600080fd5b506001600160801b0319813516906001600160a01b03602082013581169160408101359091169060608101359061ffff6080820135169060ff60a082013581169160c08101359160e082013591610100013516610dea565b34801561023d57600080fd5b5061028f600480360360a081101561025457600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff16611103565b604080519115158252519081900360200190f35b3480156102af57600080fd5b506102cd600480360360208110156102c657600080fd5b503561116b565b60408051931515845263ffffffff90921660208401526001600160801b031682820152519081900360600190f35b34801561030757600080fd5b5061028f600480360360a081101561031e57600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff1661119e565b34801561036557600080fd5b5061028f6004803603602081101561037c57600080fd5b50356001600160a01b03166111fd565b34801561039857600080fd5b506103a1611212565b6040805163ffffffff9092168252519081900360200190f35b3480156103c657600080fd5b5061028f600480360360a08110156103dd57600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff1661121e565b34801561042457600080fd5b5061028f600480360360a081101561043b57600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff1661127c565b34801561048257600080fd5b5061048b6112db565b604080516001600160a01b039092168252519081900360200190f35b3480156104b357600080fd5b5061048b6112ea565b3480156104c857600080fd5b506109fd60048036036101408110156104e057600080fd5b810190602081018135600160201b8111156104fa57600080fd5b82018360208201111561050c57600080fd5b803590602001918460208302840111600160201b8311171561052d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561057c57600080fd5b82018360208201111561058e57600080fd5b803590602001918460208302840111600160201b831117156105af57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105fe57600080fd5b82018360208201111561061057600080fd5b803590602001918460208302840111600160201b8311171561063157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561068057600080fd5b82018360208201111561069257600080fd5b803590602001918460208302840111600160201b831117156106b357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561070257600080fd5b82018360208201111561071457600080fd5b803590602001918460208302840111600160201b8311171561073557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561078457600080fd5b82018360208201111561079657600080fd5b803590602001918460208302840111600160201b831117156107b757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561080657600080fd5b82018360208201111561081857600080fd5b803590602001918460208302840111600160201b8311171561083957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561088857600080fd5b82018360208201111561089a57600080fd5b803590602001918460208302840111600160201b831117156108bb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561090a57600080fd5b82018360208201111561091c57600080fd5b803590602001918460208302840111600160201b8311171561093d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098c57600080fd5b82018360208201111561099e57600080fd5b803590602001918460208302840111600160201b831117156109bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506112f9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a39578181015183820152602001610a21565b505050509050019250505060405180910390f35b348015610a5957600080fd5b5061018060048036036040811015610a7057600080fd5b506001600160a01b0381351690602001356114ae565b348015610a9257600080fd5b5061018060048036036020811015610aa957600080fd5b50356001600160a01b0316611582565b348015610ac557600080fd5b5061048b6115f3565b348015610ada57600080fd5b5061018060048036036060811015610af157600080fd5b506001600160a01b03813581169160208101359091169060400135611602565b348015610b1d57600080fd5b50610b266116d9565b60408051918252519081900360200190f35b348015610b4457600080fd5b5061018060048036036080811015610b5b57600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356116df565b348015610b8d57600080fd5b5061028f600480360360a0811015610ba457600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff166117c8565b348015610beb57600080fd5b5061018060048036036040811015610c0257600080fd5b506001600160a01b0381351690602001351515611827565b348015610c2657600080fd5b5061018060048036036020811015610c3d57600080fd5b50356001600160a01b03166118a1565b6101806004803603610140811015610c6457600080fd5b506001600160801b0319813516906001600160a01b03602082013581169160408101359091169060608101359061ffff6080820135169063ffffffff60a082013581169160c08101359091169060ff60e08201351690610100810135906101200135611912565b348015610cd757600080fd5b5061018060048036036060811015610cee57600080fd5b506001600160a01b03813581169160208101359091169060400135611bf4565b6001546001600160a01b03163314610d5d576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6004805463ffffffff191663ffffffff92909216919091179055565b6001546001600160a01b03163314610dc8576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e3e576040805162461bcd60e51b815260206004820152601260248201527126bab9ba1031329030b93134ba3930ba37b960711b604482015290519081900360640190fd5b604080516001600160801b03198b16602080830191909152600360f91b60308301528251601181840301815260319092019092528051910120600090610e8690868686611c9a565b9050876001600160a01b0316816001600160a01b03161480610eb95750886001600160a01b0316816001600160a01b0316145b610f0a576040805162461bcd60e51b815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610f126124cd565b6000610f218c8c8c8c8c611daf565b81519193509150610f71576040805162461bcd60e51b8152602060048201526015602482015274115cd8dc9bddc8191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b60648460ff161115610fb45760405162461bcd60e51b81526004018080602001828103825260228152602001806124ee6022913960400191505060405180910390fd5b60408201513a61b13802016001600160801b0316808a038a1015611010576040805162461bcd60e51b815260206004820152600e60248201526d27bb32b9333637bb9032b93937b960911b604482015290519081900360640190fd5b600580548201905560008281526006602052604080822080546001600160a81b03191690555183917f65e0c7182ce84cd9087c1b07dc4b65875578877b885848e4be19ee312f2c3d3191a260ff8516156110a5576040516001600160a01b038c1690606460ff8816848e03020480156108fc02916000818181858888f193505050501580156110a3573d6000803e3d6000fd5b505b60648560ff1610156110f4576040516001600160a01b038d1690606487810360ff16848e03020480156108fc02916000818181858888f193505050501580156110f2573d6000803e3d6000fd5b505b50505050505050505050505050565b6000336001600160a01b03851614611152576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba10313290313abcb2b960991b604482015290519081900360640190fd5b61116186868686866000611e7a565b9695505050505050565b60066020526000908152604090205460ff811690610100810463ffffffff1690600160281b90046001600160801b031683565b6000336001600160a01b038616146111ee576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329039b2b63632b960911b604482015290519081900360640190fd5b61116186868686866000611f3e565b60036020526000908152604090205460ff1681565b60045463ffffffff1681565b6000336001600160a01b0385161461126d576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba10313290313abcb2b960991b604482015290519081900360640190fd5b61116186868686866000612062565b6000336001600160a01b038616146112cc576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329039b2b63632b960911b604482015290519081900360640190fd5b61116186868686866000612126565b6000546001600160a01b031681565b6001546001600160a01b031681565b606060008b5167ffffffffffffffff8111801561131557600080fd5b5060405190808252806020026020018201604052801561133f578160200160208202803683370190505b50336000908152600360205260408120549192509060ff161515600114611367576000611375565b8c51617fd08161137357fe5b045b905060005b8d518160ff16101561149c576114758e8260ff168151811061139857fe5b60200260200101518e8360ff16815181106113af57fe5b60200260200101518e8460ff16815181106113c657fe5b60200260200101518e8560ff16815181106113dd57fe5b60200260200101518e8660ff16815181106113f457fe5b60200260200101518e8760ff168151811061140b57fe5b60200260200101518e8860ff168151811061142257fe5b60200260200101518e8960ff168151811061143957fe5b60200260200101518e8a60ff168151811061145057fe5b60200260200101518e8b60ff168151811061146757fe5b60200260200101518c6121fa565b838260ff168151811061148457fe5b9115156020928302919091019091015260010161137a565b50909c9b505050505050505050505050565b6001546001600160a01b031633146114fd576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b60055481111561153e5760405162461bcd60e51b81526004018080602001828103825260268152602001806125326026913960400191505060405180910390fd5b6005805482900390556040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561157d573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146115d1576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6001546001600160a01b03163314611651576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b826001600160a01b031663095ea7b383836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116a857600080fd5b505af11580156116bc573d6000803e3d6000fd5b505050506040513d60208110156116d257600080fd5b5050505050565b60055481565b6001546001600160a01b0316331461172e576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b836001600160a01b03166323b872dd8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b505050506040513d60208110156117c057600080fd5b505050505050565b6000336001600160a01b03861614611818576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329039b2b63632b960911b604482015290519081900360640190fd5b611161868686868660006122e5565b6001546001600160a01b03163314611876576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146118f0576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160801b03198c166020808301919091526bffffffffffffffffffffffff1960608d811b821660308501528c901b166044830152605882018a90526001600160f01b031960f08a901b1660788301528251605a818403018152607a9092018352815191810191909120600081815260069092529190205460ff16156119dc576040805162461bcd60e51b8152602060048201526014602482015273547261646520616c72656164792065786973747360601b604482015290519081900360640190fd5b6040805160208082018490526001600160e01b031960e08a811b82168486015289901b16604483015282516028818403018152604890920190925280519101206002546001600160a01b0316611a3482878787611c9a565b6001600160a01b031614611a795760405162461bcd60e51b81526004018080602001828103825260228152602001806125106022913960400191505060405180910390fd5b8563ffffffff164210611acb576040805162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b604482015290519081900360640190fd5b8834148015611ada5750600034115b611b22576040805162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd08195d1a195c881cd95b9d60621b604482015290519081900360640190fd5b600063ffffffff881615611b3857874201611b3b565b60015b604080516060810182526001815263ffffffff808416602080840191825260008486018181528a8252600690925285812094518554935192516001600160801b0316600160281b0265010000000000600160a81b0319939095166101000264ffffffff001991151560ff199095169490941716929092171691909117909155905191925084917f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c9190a250505050505050505050505050565b6001546001600160a01b03163314611c43576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116a857600080fd5b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020018083805190602001908083835b60208310611d0b5780518252601f199092019160209182019101611cec565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152848301808352815191840191909120600090915281850180835281905260ff8c166060860152608085018b905260a085018a905290519095506001945060c080850194929350601f198201928290030190855afa158015611d99573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b611db76124cd565b50604080516001600160801b031987166020808301919091526bffffffffffffffffffffffff19606088811b8216603085015287901b166044830152605882018590526001600160f01b031960f085901b1660788301528251605a818403018152607a8301808552815191830191909120600081815260069093529184902060da8401909452925460ff81161515845263ffffffff610100820416609a840152600160281b90046001600160801b031660ba909201919091529550959350505050565b6000611e846124cd565b6000611e938989898989611daf565b81519193509150611ea957600092505050611161565b3360009081526003602052604081205460ff161515600114611ecc576000611ed4565b61316885013a025b6040808501516000858152600660205282812080546001600160a81b031916905591519201925083917fd9b627ddaa414e8e6c82366cc9c179f6281d73968827cc17038a56852e28ac8b9190a2611f2e8988836000612394565b5060019998505050505050505050565b6000611f486124cd565b6000611f578989898989611daf565b81519193509150611f6d57600092505050611161565b6001826020015163ffffffff16111580611f90575042826020015163ffffffff16115b15611fa057600092505050611161565b3360009081526003602052604090205460ff16158015611fcd575042826020015161a8c00163ffffffff16115b15611fdd57600092505050611161565b3360009081526003602052604081205460ff161515600114612000576000612008565b61359285013a025b6040808501516000858152600660205282812080546001600160a81b031916905591519201925083917f366d2b4e6cc37ecebb3d7d41df6d581634fd8137412710a1e086e4ca4656bb589190a2611f2e8988836000612394565b600061206c6124cd565b600061207b8989898989611daf565b8151919350915061209157600092505050611161565b602082015163ffffffff166120ab57600092505050611161565b600081815260066020526040808220805464ffffffff00191690555182917fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb91a23360009081526003602052604090205460ff1615156001141561211757612117816140b886016123ff565b50600198975050505050505050565b60006121306124cd565b600061213f8989898989611daf565b8151919350915061215557600092505050611161565b816020015163ffffffff1660011461217257600092505050611161565b60045460008281526006602052604080822080544263ffffffff958616019094166101000264ffffffff001990941693909317909255905182917f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab91a23360009081526003602052604090205460ff16151560011415612117576121178161426c86016123ff565b60008061220b8d858a8a8a8a612446565b90508a6001600160a01b0316816001600160a01b031614156122685760ff841660011415612249576122418d8d8d8d8d88612062565b9150506122d6565b60ff841660021415612263576122418d8d8d8d8d88611e7a565b6122d0565b8b6001600160a01b0316816001600160a01b031614156122d05760ff84166005141561229c576122418d8d8d8d8d886122e5565b60ff8416600314156122b6576122418d8d8d8d8d88611f3e565b60ff8416600414156122d0576122418d8d8d8d8d88612126565b60009150505b9b9a5050505050505050505050565b60006122ef6124cd565b60006122fe8989898989611daf565b8151919350915061231457600092505050611161565b3360009081526003602052604081205460ff16151560011461233757600061233f565b61317885013a025b6040808501516000858152600660205282812080546001600160a81b031916905591519201925083917f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d149190a2611f2e888883895b61271061ffff82168402046001600160801b038316018084038410156123ba57506123f9565b60058054820190556040516001600160a01b0386169082860380156108fc02916000818181858888f193505050501580156117c0573d6000803e3d6000fd5b50505050565b600091825260066020526040909120805465010000000000600160a81b031981163a909302600160281b918290046001600160801b03908116919091011602919091179055565b604080516001600160801b03198089166020808401919091526001600160f81b031960f88a901b166030840152608088901b909116603183015282516021818403018152604190920190925280519101206000906001600160801b0386163a11156124b5576000915050611161565b6124c181868686611c9a565b98975050505050505050565b60408051606081018252600080825260208201819052918101919091529056fe5f627579657250657263656e74206d75737420626520313030206f72206c6f776572496e7669746174696f6e207369676e617475726520776173206e6f742076616c6964416d6f756e7420697320686967686572207468616e20616d6f756e7420617661696c61626c65a26469706673582212205002c724a7f667f48c4e71b9e8bdce94d18e54e3e68ec8e1f9f95295d24ee65c64736f6c63430007060033

Deployed Bytecode

0x60806040526004361061014b5760003560e01c80638eb4e0ad116100b6578063e59949051161006f578063e599490514610b38578063e9600f1214610b81578063ecd8dc3a14610bdf578063ede856d914610c1a578063f1e03d6714610c4d578063f5537ede14610ccb5761014b565b80638eb4e0ad146104bc578063ad3b1b4714610a4d578063b0eefabe14610a86578063b1e1fd4b14610ab9578063da3e339714610ace578063de5785d514610b115761014b565b80635300f841116101085780635300f8411461035957806357938b2a1461038c5780635c810f09146103ba5780636b407837146104185780636cc6cde1146104765780638da5cb5b146104a75761014b565b806305b649931461015057806313af40351461018257806324943c7d146101b55780632cc9636c146102315780632d83549c146102a357806335adc0c5146102fb575b600080fd5b34801561015c57600080fd5b506101806004803603602081101561017357600080fd5b503563ffffffff16610d0e565b005b34801561018e57600080fd5b50610180600480360360208110156101a557600080fd5b50356001600160a01b0316610d79565b3480156101c157600080fd5b5061018060048036036101208110156101d957600080fd5b506001600160801b0319813516906001600160a01b03602082013581169160408101359091169060608101359061ffff6080820135169060ff60a082013581169160c08101359160e082013591610100013516610dea565b34801561023d57600080fd5b5061028f600480360360a081101561025457600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff16611103565b604080519115158252519081900360200190f35b3480156102af57600080fd5b506102cd600480360360208110156102c657600080fd5b503561116b565b60408051931515845263ffffffff90921660208401526001600160801b031682820152519081900360600190f35b34801561030757600080fd5b5061028f600480360360a081101561031e57600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff1661119e565b34801561036557600080fd5b5061028f6004803603602081101561037c57600080fd5b50356001600160a01b03166111fd565b34801561039857600080fd5b506103a1611212565b6040805163ffffffff9092168252519081900360200190f35b3480156103c657600080fd5b5061028f600480360360a08110156103dd57600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff1661121e565b34801561042457600080fd5b5061028f600480360360a081101561043b57600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff1661127c565b34801561048257600080fd5b5061048b6112db565b604080516001600160a01b039092168252519081900360200190f35b3480156104b357600080fd5b5061048b6112ea565b3480156104c857600080fd5b506109fd60048036036101408110156104e057600080fd5b810190602081018135600160201b8111156104fa57600080fd5b82018360208201111561050c57600080fd5b803590602001918460208302840111600160201b8311171561052d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561057c57600080fd5b82018360208201111561058e57600080fd5b803590602001918460208302840111600160201b831117156105af57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105fe57600080fd5b82018360208201111561061057600080fd5b803590602001918460208302840111600160201b8311171561063157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561068057600080fd5b82018360208201111561069257600080fd5b803590602001918460208302840111600160201b831117156106b357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561070257600080fd5b82018360208201111561071457600080fd5b803590602001918460208302840111600160201b8311171561073557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561078457600080fd5b82018360208201111561079657600080fd5b803590602001918460208302840111600160201b831117156107b757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561080657600080fd5b82018360208201111561081857600080fd5b803590602001918460208302840111600160201b8311171561083957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561088857600080fd5b82018360208201111561089a57600080fd5b803590602001918460208302840111600160201b831117156108bb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561090a57600080fd5b82018360208201111561091c57600080fd5b803590602001918460208302840111600160201b8311171561093d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098c57600080fd5b82018360208201111561099e57600080fd5b803590602001918460208302840111600160201b831117156109bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506112f9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a39578181015183820152602001610a21565b505050509050019250505060405180910390f35b348015610a5957600080fd5b5061018060048036036040811015610a7057600080fd5b506001600160a01b0381351690602001356114ae565b348015610a9257600080fd5b5061018060048036036020811015610aa957600080fd5b50356001600160a01b0316611582565b348015610ac557600080fd5b5061048b6115f3565b348015610ada57600080fd5b5061018060048036036060811015610af157600080fd5b506001600160a01b03813581169160208101359091169060400135611602565b348015610b1d57600080fd5b50610b266116d9565b60408051918252519081900360200190f35b348015610b4457600080fd5b5061018060048036036080811015610b5b57600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356116df565b348015610b8d57600080fd5b5061028f600480360360a0811015610ba457600080fd5b5080356001600160801b0319169060208101356001600160a01b03908116916040810135909116906060810135906080013561ffff166117c8565b348015610beb57600080fd5b5061018060048036036040811015610c0257600080fd5b506001600160a01b0381351690602001351515611827565b348015610c2657600080fd5b5061018060048036036020811015610c3d57600080fd5b50356001600160a01b03166118a1565b6101806004803603610140811015610c6457600080fd5b506001600160801b0319813516906001600160a01b03602082013581169160408101359091169060608101359061ffff6080820135169063ffffffff60a082013581169160c08101359091169060ff60e08201351690610100810135906101200135611912565b348015610cd757600080fd5b5061018060048036036060811015610cee57600080fd5b506001600160a01b03813581169160208101359091169060400135611bf4565b6001546001600160a01b03163314610d5d576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6004805463ffffffff191663ffffffff92909216919091179055565b6001546001600160a01b03163314610dc8576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e3e576040805162461bcd60e51b815260206004820152601260248201527126bab9ba1031329030b93134ba3930ba37b960711b604482015290519081900360640190fd5b604080516001600160801b03198b16602080830191909152600360f91b60308301528251601181840301815260319092019092528051910120600090610e8690868686611c9a565b9050876001600160a01b0316816001600160a01b03161480610eb95750886001600160a01b0316816001600160a01b0316145b610f0a576040805162461bcd60e51b815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610f126124cd565b6000610f218c8c8c8c8c611daf565b81519193509150610f71576040805162461bcd60e51b8152602060048201526015602482015274115cd8dc9bddc8191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b60648460ff161115610fb45760405162461bcd60e51b81526004018080602001828103825260228152602001806124ee6022913960400191505060405180910390fd5b60408201513a61b13802016001600160801b0316808a038a1015611010576040805162461bcd60e51b815260206004820152600e60248201526d27bb32b9333637bb9032b93937b960911b604482015290519081900360640190fd5b600580548201905560008281526006602052604080822080546001600160a81b03191690555183917f65e0c7182ce84cd9087c1b07dc4b65875578877b885848e4be19ee312f2c3d3191a260ff8516156110a5576040516001600160a01b038c1690606460ff8816848e03020480156108fc02916000818181858888f193505050501580156110a3573d6000803e3d6000fd5b505b60648560ff1610156110f4576040516001600160a01b038d1690606487810360ff16848e03020480156108fc02916000818181858888f193505050501580156110f2573d6000803e3d6000fd5b505b50505050505050505050505050565b6000336001600160a01b03851614611152576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba10313290313abcb2b960991b604482015290519081900360640190fd5b61116186868686866000611e7a565b9695505050505050565b60066020526000908152604090205460ff811690610100810463ffffffff1690600160281b90046001600160801b031683565b6000336001600160a01b038616146111ee576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329039b2b63632b960911b604482015290519081900360640190fd5b61116186868686866000611f3e565b60036020526000908152604090205460ff1681565b60045463ffffffff1681565b6000336001600160a01b0385161461126d576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba10313290313abcb2b960991b604482015290519081900360640190fd5b61116186868686866000612062565b6000336001600160a01b038616146112cc576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329039b2b63632b960911b604482015290519081900360640190fd5b61116186868686866000612126565b6000546001600160a01b031681565b6001546001600160a01b031681565b606060008b5167ffffffffffffffff8111801561131557600080fd5b5060405190808252806020026020018201604052801561133f578160200160208202803683370190505b50336000908152600360205260408120549192509060ff161515600114611367576000611375565b8c51617fd08161137357fe5b045b905060005b8d518160ff16101561149c576114758e8260ff168151811061139857fe5b60200260200101518e8360ff16815181106113af57fe5b60200260200101518e8460ff16815181106113c657fe5b60200260200101518e8560ff16815181106113dd57fe5b60200260200101518e8660ff16815181106113f457fe5b60200260200101518e8760ff168151811061140b57fe5b60200260200101518e8860ff168151811061142257fe5b60200260200101518e8960ff168151811061143957fe5b60200260200101518e8a60ff168151811061145057fe5b60200260200101518e8b60ff168151811061146757fe5b60200260200101518c6121fa565b838260ff168151811061148457fe5b9115156020928302919091019091015260010161137a565b50909c9b505050505050505050505050565b6001546001600160a01b031633146114fd576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b60055481111561153e5760405162461bcd60e51b81526004018080602001828103825260268152602001806125326026913960400191505060405180910390fd5b6005805482900390556040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561157d573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146115d1576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6001546001600160a01b03163314611651576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b826001600160a01b031663095ea7b383836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116a857600080fd5b505af11580156116bc573d6000803e3d6000fd5b505050506040513d60208110156116d257600080fd5b5050505050565b60055481565b6001546001600160a01b0316331461172e576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b836001600160a01b03166323b872dd8484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b505050506040513d60208110156117c057600080fd5b505050505050565b6000336001600160a01b03861614611818576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329039b2b63632b960911b604482015290519081900360640190fd5b611161868686868660006122e5565b6001546001600160a01b03163314611876576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146118f0576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160801b03198c166020808301919091526bffffffffffffffffffffffff1960608d811b821660308501528c901b166044830152605882018a90526001600160f01b031960f08a901b1660788301528251605a818403018152607a9092018352815191810191909120600081815260069092529190205460ff16156119dc576040805162461bcd60e51b8152602060048201526014602482015273547261646520616c72656164792065786973747360601b604482015290519081900360640190fd5b6040805160208082018490526001600160e01b031960e08a811b82168486015289901b16604483015282516028818403018152604890920190925280519101206002546001600160a01b0316611a3482878787611c9a565b6001600160a01b031614611a795760405162461bcd60e51b81526004018080602001828103825260228152602001806125106022913960400191505060405180910390fd5b8563ffffffff164210611acb576040805162461bcd60e51b815260206004820152601560248201527414da59db985d1d5c99481a185cc8195e1c1a5c9959605a1b604482015290519081900360640190fd5b8834148015611ada5750600034115b611b22576040805162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd08195d1a195c881cd95b9d60621b604482015290519081900360640190fd5b600063ffffffff881615611b3857874201611b3b565b60015b604080516060810182526001815263ffffffff808416602080840191825260008486018181528a8252600690925285812094518554935192516001600160801b0316600160281b0265010000000000600160a81b0319939095166101000264ffffffff001991151560ff199095169490941716929092171691909117909155905191925084917f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c9190a250505050505050505050505050565b6001546001600160a01b03163314611c43576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116a857600080fd5b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020018083805190602001908083835b60208310611d0b5780518252601f199092019160209182019101611cec565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152848301808352815191840191909120600090915281850180835281905260ff8c166060860152608085018b905260a085018a905290519095506001945060c080850194929350601f198201928290030190855afa158015611d99573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b611db76124cd565b50604080516001600160801b031987166020808301919091526bffffffffffffffffffffffff19606088811b8216603085015287901b166044830152605882018590526001600160f01b031960f085901b1660788301528251605a818403018152607a8301808552815191830191909120600081815260069093529184902060da8401909452925460ff81161515845263ffffffff610100820416609a840152600160281b90046001600160801b031660ba909201919091529550959350505050565b6000611e846124cd565b6000611e938989898989611daf565b81519193509150611ea957600092505050611161565b3360009081526003602052604081205460ff161515600114611ecc576000611ed4565b61316885013a025b6040808501516000858152600660205282812080546001600160a81b031916905591519201925083917fd9b627ddaa414e8e6c82366cc9c179f6281d73968827cc17038a56852e28ac8b9190a2611f2e8988836000612394565b5060019998505050505050505050565b6000611f486124cd565b6000611f578989898989611daf565b81519193509150611f6d57600092505050611161565b6001826020015163ffffffff16111580611f90575042826020015163ffffffff16115b15611fa057600092505050611161565b3360009081526003602052604090205460ff16158015611fcd575042826020015161a8c00163ffffffff16115b15611fdd57600092505050611161565b3360009081526003602052604081205460ff161515600114612000576000612008565b61359285013a025b6040808501516000858152600660205282812080546001600160a81b031916905591519201925083917f366d2b4e6cc37ecebb3d7d41df6d581634fd8137412710a1e086e4ca4656bb589190a2611f2e8988836000612394565b600061206c6124cd565b600061207b8989898989611daf565b8151919350915061209157600092505050611161565b602082015163ffffffff166120ab57600092505050611161565b600081815260066020526040808220805464ffffffff00191690555182917fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb91a23360009081526003602052604090205460ff1615156001141561211757612117816140b886016123ff565b50600198975050505050505050565b60006121306124cd565b600061213f8989898989611daf565b8151919350915061215557600092505050611161565b816020015163ffffffff1660011461217257600092505050611161565b60045460008281526006602052604080822080544263ffffffff958616019094166101000264ffffffff001990941693909317909255905182917f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab91a23360009081526003602052604090205460ff16151560011415612117576121178161426c86016123ff565b60008061220b8d858a8a8a8a612446565b90508a6001600160a01b0316816001600160a01b031614156122685760ff841660011415612249576122418d8d8d8d8d88612062565b9150506122d6565b60ff841660021415612263576122418d8d8d8d8d88611e7a565b6122d0565b8b6001600160a01b0316816001600160a01b031614156122d05760ff84166005141561229c576122418d8d8d8d8d886122e5565b60ff8416600314156122b6576122418d8d8d8d8d88611f3e565b60ff8416600414156122d0576122418d8d8d8d8d88612126565b60009150505b9b9a5050505050505050505050565b60006122ef6124cd565b60006122fe8989898989611daf565b8151919350915061231457600092505050611161565b3360009081526003602052604081205460ff16151560011461233757600061233f565b61317885013a025b6040808501516000858152600660205282812080546001600160a81b031916905591519201925083917f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d149190a2611f2e888883895b61271061ffff82168402046001600160801b038316018084038410156123ba57506123f9565b60058054820190556040516001600160a01b0386169082860380156108fc02916000818181858888f193505050501580156117c0573d6000803e3d6000fd5b50505050565b600091825260066020526040909120805465010000000000600160a81b031981163a909302600160281b918290046001600160801b03908116919091011602919091179055565b604080516001600160801b03198089166020808401919091526001600160f81b031960f88a901b166030840152608088901b909116603183015282516021818403018152604190920190925280519101206000906001600160801b0386163a11156124b5576000915050611161565b6124c181868686611c9a565b98975050505050505050565b60408051606081018252600080825260208201819052918101919091529056fe5f627579657250657263656e74206d75737420626520313030206f72206c6f776572496e7669746174696f6e207369676e617475726520776173206e6f742076616c6964416d6f756e7420697320686967686572207468616e20616d6f756e7420617661696c61626c65a26469706673582212205002c724a7f667f48c4e71b9e8bdce94d18e54e3e68ec8e1f9f95295d24ee65c64736f6c63430007060033

Deployed Bytecode Sourcemap

1161:29263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15810:207;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15810:207:0;;;;:::i;:::-;;14946:92;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14946:92:0;-1:-1:-1;;;;;14946:92:0;;:::i;7449:1457::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;7449:1457:0;;;;-1:-1:-1;;;;;7449:1457:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10608:315::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10608:315:0;;-1:-1:-1;;;;;;10608:315:0;;;;;;-1:-1:-1;;;;;10608:315:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3922:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3922:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3922:42:0;;;;;;;;;;;;;;11262:329;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11262:329:0;;-1:-1:-1;;;;;;11262:329:0;;;;;;-1:-1:-1;;;;;11262:329:0;;;;;;;;;;;;;;;;;;;;;;;:::i;1630:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1630:41:0;-1:-1:-1;;;;;1630:41:0;;:::i;1680:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9937:333;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9937:333:0;;-1:-1:-1;;;;;;9937:333:0;;;;;;-1:-1:-1;;;;;9937:333:0;;;;;;;;;;;;;;;;;;;;;;;:::i;11930:335::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11930:335:0;;-1:-1:-1;;;;;;11930:335:0;;;;;;-1:-1:-1;;;;;11930:335:0;;;;;;;;;;;;;;;;;;;;;;;:::i;1364:25::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1364:25:0;;;;;;;;;;;;;;1459:20;;;;;;;;;;;;;:::i;12950:1066::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12950:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12950:1066:0;;-1:-1:-1;12950:1066:0;;-1:-1:-1;;;;;12950:1066:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14206:318;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14206:318:0;;;;;;;;:::i;14685:112::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14685:112:0;-1:-1:-1;;;;;14685:112:0;;:::i;1486:29::-;;;;;;;;;;;;;:::i;17183:190::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17183:190:0;;;;;;;;;;;;;;;;;:::i;1776:39::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;16702:253;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16702:253:0;;;;;;;;;;;;;;;;;;;;;;:::i;9252:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9252:319:0;;-1:-1:-1;;;;;;9252:319:0;;;;;;-1:-1:-1;;;;;9252:319:0;;;;;;;;;;;;;;;;;;;;;;;:::i;15237:126::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15237:126:0;;;;;;;;;;:::i;15521:128::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15521:128:0;-1:-1:-1;;;;;15521:128:0;;:::i;5086:1731::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;5086:1731:0;;;;-1:-1:-1;;;;;5086:1731:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16242:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16242:198:0;;;;;;;;;;;;;;;;;:::i;15810:207::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;15942:30:::1;:67:::0;;-1:-1:-1;;15942:67:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;15810:207::o;14946:92::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;15013:5:::1;:17:::0;;-1:-1:-1;;;;;;15013:17:0::1;-1:-1:-1::0;;;;;15013:17:0;;;::::1;::::0;;;::::1;::::0;;14946:92::o;7449:1457::-;4137:10;;-1:-1:-1;;;;;4137:10:0;4123;:24;4115:55;;;;;-1:-1:-1;;;4115:55:0;;;;;;;;;;;;-1:-1:-1;;;4115:55:0;;;;;;;;;;;;;;;7793:84:::1;::::0;;-1:-1:-1;;;;;;7793:84:0;::::1;;::::0;;::::1;::::0;;;;-1:-1:-1;;;7793:84:0;;;;;;;;;;;;;;;;;;;;7783:95;;;::::1;::::0;7747:18:::1;::::0;7768:123:::1;::::0;7880:2;7884;7888;7768:14:::1;:123::i;:::-;7747:144;;7924:6;-1:-1:-1::0;;;;;7910:20:0::1;:10;-1:-1:-1::0;;;;;7910:20:0::1;;:45;;;;7948:7;-1:-1:-1::0;;;;;7934:21:0::1;:10;-1:-1:-1::0;;;;;7934:21:0::1;;7910:45;7902:81;;;::::0;;-1:-1:-1;;;7902:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;7996:21;;:::i;:::-;8028:18;8081:57;8098:8;8108:7;8117:6;8125;8133:4;8081:16;:57::i;:::-;8157:14:::0;;8057:81;;-1:-1:-1;8057:81:0;-1:-1:-1;8149:48:0::1;;;::::0;;-1:-1:-1;;;8149:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8149:48:0;;;;;;;;;;;;;::::1;;8233:3;8216:13;:20;;;;8208:67;;;;-1:-1:-1::0;;;8208:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8309:34;::::0;::::1;::::0;8378:11:::1;6864:5;8347:43;8309:82;-1:-1:-1::0;;;;;8288:103:0::1;8410:19:::0;;::::1;-1:-1:-1::0;;8410:29:0::1;8402:56;;;::::0;;-1:-1:-1;;;8402:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8402:56:0;;;;;;;;;;;;;::::1;;8490:24;:38:::0;;;::::1;::::0;;:24:::1;8597:19:::0;;;:7:::1;:19;::::0;;;;;8590:26;;-1:-1:-1;;;;;;8590:26:0;;;8632:27;8605:10;;8632:27:::1;::::0;::::1;8674:17;::::0;::::1;::::0;8670:103:::1;;8704:69;::::0;-1:-1:-1;;;;;8704:24:0;::::1;::::0;8769:3:::1;8729:37;::::0;::::1;8730:19:::0;;::::1;8729:37;:43;8704:69:::0;::::1;;;::::0;::::1;::::0;;;8729:43;8704:24;:69;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8670:103;8804:3;8788:13;:19;;;8784:114;;;8820:78;::::0;-1:-1:-1;;;;;8820:25:0;::::1;::::0;8894:3:::1;8871:19:::0;;::::1;8846:45;;8847:19:::0;;::::1;8846:45;:51;8820:78:::0;::::1;;;::::0;::::1;::::0;;;8846:51;8820:25;:78;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8784:114;4181:1;;;;7449:1457:::0;;;;;;;;;:::o;10608:315::-;10777:4;10802:10;-1:-1:-1;;;;;10802:20:0;;;10794:46;;;;;-1:-1:-1;;;10794:46:0;;;;;;;;;;;;-1:-1:-1;;;10794:46:0;;;;;;;;;;;;;;;10858:57;10872:8;10882:7;10891:6;10899;10907:4;10913:1;10858:13;:57::i;:::-;10851:64;10608:315;-1:-1:-1;;;;;;10608:315:0:o;3922:42::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3922:42:0;;-1:-1:-1;;;;;3922:42:0;;:::o;11262:329::-;11442:4;11467:10;-1:-1:-1;;;;;11467:21:0;;;11459:48;;;;;-1:-1:-1;;;11459:48:0;;;;;;;;;;;;-1:-1:-1;;;11459:48:0;;;;;;;;;;;;;;;11525:58;11540:8;11550:7;11559:6;11567;11575:4;11581:1;11525:14;:58::i;1630:41::-;;;;;;;;;;;;;;;:::o;1680:44::-;;;;;;:::o;9937:333::-;10116:4;10141:10;-1:-1:-1;;;;;10141:20:0;;;10133:46;;;;;-1:-1:-1;;;10133:46:0;;;;;;;;;;;;-1:-1:-1;;;10133:46:0;;;;;;;;;;;;;;;10197:65;10219:8;10229:7;10238:6;10246;10254:4;10260:1;10197:21;:65::i;11930:335::-;12109:4;12134:10;-1:-1:-1;;;;;12134:21:0;;;12126:48;;;;;-1:-1:-1;;;12126:48:0;;;;;;;;;;;;-1:-1:-1;;;12126:48:0;;;;;;;;;;;;;;;12192:65;12214:8;12224:7;12233:6;12241;12249:4;12255:1;12192:21;:65::i;1364:25::-;;;-1:-1:-1;;;;;1364:25:0;;:::o;1459:20::-;;;-1:-1:-1;;;;;1459:20:0;;:::o;12950:1066::-;13353:13;13379:22;13415:8;:15;13404:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13404:27:0;-1:-1:-1;13484:10:0;13442:22;13475:20;;;:8;:20;;;;;;13379:52;;-1:-1:-1;13442:22:0;13475:20;;:28;;:20;:28;:73;;13547:1;13475:73;;;13528:15;;12310:5;13528:15;13507:36;;;;;13475:73;13442:107;;13565:7;13560:423;13578:8;:15;13576:1;:17;;;13560:423;;;13629:342;13653:8;13662:1;13653:11;;;;;;;;;;;;;;;;13683:7;13691:1;13683:10;;;;;;;;;;;;;;;;13712:6;13719:1;13712:9;;;;;;;;;;;;;;;;13740:6;13747:1;13740:9;;;;;;;;;;;;;;;;13768:4;13773:1;13768:7;;;;;;;;;;;;;;;;13794:16;13811:1;13794:19;;;;;;;;;;;;;;;;13832:2;13835:1;13832:5;;;;;;;;;;;;;;;;13856:2;13859:1;13856:5;;;;;;;;;;;;;;;;13880:2;13883:1;13880:5;;;;;;;;;;;;;;;;13904:16;13921:1;13904:19;;;;;;;;;;;;;;;;13942:14;13629:5;:342::i;:::-;13615:8;13624:1;13615:11;;;;;;;;;;:356;;;:11;;;;;;;;;;;:356;13595:3;;13560:423;;;-1:-1:-1;14000:8:0;;12950:1066;-1:-1:-1;;;;;;;;;;;;12950:1066:0:o;14206:318::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;14362:24:::1;;14351:7;:35;;14343:86;;;;-1:-1:-1::0;;;14343:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14440:24;:35:::0;;;;::::1;::::0;;14486:30:::1;::::0;-1:-1:-1;;;;;14486:21:0;::::1;::::0;:30;::::1;;;::::0;14468:7;;14440:24:::1;14486:30:::0;14440:24;14486:30;14468:7;14486:21;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;14206:318:::0;;:::o;14685:112::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;14762:10:::1;:27:::0;;-1:-1:-1;;;;;;14762:27:0::1;-1:-1:-1::0;;;;;14762:27:0;;;::::1;::::0;;;::::1;::::0;;14685:112::o;1486:29::-;;;-1:-1:-1;;;;;1486:29:0;;:::o;17183:190::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;17325:14:::1;-1:-1:-1::0;;;;;17325:22:0::1;;17348:8;17358:6;17325:40;;;;;;;;;;;;;-1:-1:-1::0;;;;;17325:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;17183:190:0:o;1776:39::-;;;;:::o;16702:253::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;16884:14:::1;-1:-1:-1::0;;;;;16884:27:0::1;;16912:11;16925:13;16940:6;16884:63;;;;;;;;;;;;;-1:-1:-1::0;;;;;16884:63:0::1;;;;;;-1:-1:-1::0;;;;;16884:63:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;;16702:253:0:o;9252:319::-;9427:4;9452:10;-1:-1:-1;;;;;9452:21:0;;;9444:48;;;;;-1:-1:-1;;;9444:48:0;;;;;;;;;;;;-1:-1:-1;;;9444:48:0;;;;;;;;;;;;;;;9510:53;9520:8;9530:7;9539:6;9547;9555:4;9561:1;9510:9;:53::i;15237:126::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15323:21:0;;;::::1;;::::0;;;:8:::1;:21;::::0;;;;:32;;-1:-1:-1;;15323:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15237:126::o;15521:128::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;15606:14:::1;:35:::0;;-1:-1:-1;;;;;;15606:35:0::1;-1:-1:-1::0;;;;;15606:35:0;;;::::1;::::0;;;::::1;::::0;;15521:128::o;5086:1731::-;5670:57;;;-1:-1:-1;;;;;;5670:57:0;;;;;;;;;;-1:-1:-1;;5670:57:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5670:57:0;;;;;;;;;;;;;;;;;;;;;;;;5660:68;;;;;;;;;5639:18;5802:19;;;:7;:19;;;;;;:26;;;5801:27;5793:60;;;;;-1:-1:-1;;;5793:60:0;;;;;;;;;;;;-1:-1:-1;;;5793:60:0;;;;;;;;;;;;;;;5984:112;;;;;;;;;;-1:-1:-1;;;;;;5984:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5974:123;;;;;6163:14;;-1:-1:-1;;;;;6163:14:0;6116:43;5974:123;6148:2;6152;6156;6116:14;:43::i;:::-;-1:-1:-1;;;;;6116:61:0;;6108:108;;;;-1:-1:-1;;;6108:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6308:7;6290:25;;:15;:25;6282:59;;;;;-1:-1:-1;;;6282:59:0;;;;;;;;;;;;-1:-1:-1;;;6282:59:0;;;;;;;;;;;;;;;6454:6;6441:9;:19;:36;;;;;6476:1;6464:9;:13;6441:36;6433:69;;;;;-1:-1:-1;;;6433:69:0;;;;;;;;;;;;-1:-1:-1;;;6433:69:0;;;;;;;;;;;;;;;6513:28;6544;;;;:110;;6631:23;6612:15;6605:49;6544:110;;;6588:1;6544:110;6736:38;;;;;;;;6743:4;6736:38;;;;;;;;;;;;;-1:-1:-1;6736:38:0;;;;;;6714:19;;;:7;:19;;;;;;:60;;;;;;;;-1:-1:-1;;;;;6714:60:0;-1:-1:-1;;;6714:60:0;-1:-1:-1;;;;;;6714:60:0;;;;;;-1:-1:-1;;6714:60:0;;;-1:-1:-1;;6714:60:0;;;;;;;;;;;;;;;;;;;;6790:19;;6513:141;;-1:-1:-1;6722:10:0;;6790:19;;-1:-1:-1;6790:19:0;5086:1731;;;;;;;;;;;;;:::o;16242:198::-;4027:5;;-1:-1:-1;;;;;4027:5:0;4013:10;:19;4005:45;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;-1:-1:-1;;;4005:45:0;;;;;;;;;;;;;;;16388:14:::1;-1:-1:-1::0;;;;;16388:23:0::1;;16412:11;16425:6;16388:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;16388:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;30072:349:::0;30207:7;30227:20;:57;;;;;;;;;;;;;;;;;;;30295:21;30346:7;30355:2;30329:29;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30329:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30329:29:0;;;;;;;;;;;;;;;;-1:-1:-1;30329:29:0;;;;;;;;;;;;;;30319:40;;;;;;;;;-1:-1:-1;30377:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30319:40;;-1:-1:-1;30329:29:0;;-1:-1:-1;30377:36:0;;;;;30329:29;;-1:-1:-1;;;30377:36:0;;;;;;;;30329:29;30377:36;;;;;;;;;;;;;;;-1:-1:-1;;30377:36:0;;-1:-1:-1;;30377:36:0;;;30072:349;-1:-1:-1;;;;;;;;30072:349:0:o;29355:439::-;29535:13;;:::i;:::-;-1:-1:-1;29601:133:0;;;-1:-1:-1;;;;;;29601:133:0;;;;;;;;;;-1:-1:-1;;29601:133:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29601:133:0;;;;;;;;;;;;;;;;;;;;;;;;29591:144;;;;;;;;;29550:7;29754:19;;;:7;:19;;;;;;;29746:40;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29746:40:0;;-1:-1:-1;;;;;29746:40:0;;;;;;;;;29355:439;;;;;;;;:::o;24070:836::-;24283:4;24300:21;;:::i;:::-;24332:18;24385:57;24402:8;24412:7;24421:6;24429;24437:4;24385:16;:57::i;:::-;24458:14;;24361:81;;-1:-1:-1;24361:81:0;-1:-1:-1;24453:60:0;;24496:5;24489:12;;;;;;24453:60;24602:10;24523:16;24593:20;;;:8;:20;;;;;;;;:28;;:20;:28;:129;;24721:1;24593:129;;;23611:5;24642:34;;24689:11;24641:60;24593:129;24542:34;;;;;24755:19;;;;:7;:19;;;;;24748:26;;-1:-1:-1;;;;;;24748:26:0;;;24790:28;;24542:195;;;-1:-1:-1;24763:10:0;;24790:28;;24755:19;24790:28;24829:47;24847:7;24856:6;24864:8;24874:1;24829:17;:47::i;:::-;-1:-1:-1;24894:4:0;;24070:836;-1:-1:-1;;;;;;;;;24070:836:0:o;25413:1121::-;25627:4;25644:21;;:::i;:::-;25676:18;25729:57;25746:8;25756:7;25765:6;25773;25781:4;25729:16;:57::i;:::-;25802:14;;25705:81;;-1:-1:-1;25705:81:0;-1:-1:-1;25797:60:0;;25840:5;25833:12;;;;;;25797:60;25902:1;25870:7;:28;;;:33;;;;:83;;;;25938:15;25907:7;:28;;;:46;;;25870:83;25867:127;;;25977:5;25970:12;;;;;;25867:127;26017:10;26008:20;;;;:8;:20;;;;;;;;:29;;;:90;;;26083:15;26041:7;:28;;;26072:8;26041:39;:57;;;26008:90;26004:135;;;26122:5;26115:12;;;;;;26004:135;26228:10;26149:16;26219:20;;;:8;:20;;;;;;;;:28;;:20;:28;:130;;26348:1;26219:130;;;24951:5;26268:35;;26316:11;26267:61;26219:130;26168:34;;;;;26382:19;;;;:7;:19;;;;;26375:26;;-1:-1:-1;;;;;;26375:26:0;;;26417:29;;26168:196;;;-1:-1:-1;26390:10:0;;26417:29;;26382:19;26417:29;26457:47;26475:7;26484:6;26492:8;26502:1;26457:17;:47::i;22816:751::-;23029:4;23046:21;;:::i;:::-;23078:18;23131:57;23148:8;23158:7;23167:6;23175;23183:4;23131:16;:57::i;:::-;23204:14;;23107:81;;-1:-1:-1;23107:81:0;-1:-1:-1;23199:33:0;;23227:5;23220:12;;;;;;23199:33;23246:28;;;;:33;;23243:50;;23288:5;23281:12;;;;;;23243:50;23347:1;23304:19;;;:7;:19;;;;;;:44;;-1:-1:-1;;23304:44:0;;;23364:32;23312:10;;23364:32;;;23420:10;23411:20;;;;:8;:20;;;;;;;;:28;;:20;:28;23407:131;;;23454:72;23471:10;22358:5;23483:42;;23454:16;:72::i;:::-;-1:-1:-1;23555:4:0;;22816:751;-1:-1:-1;;;;;;;;22816:751:0:o;27040:960::-;27253:4;27358:21;;:::i;:::-;27390:18;27443:57;27460:8;27470:7;27479:6;27487;27495:4;27443:16;:57::i;:::-;27516:14;;27419:81;;-1:-1:-1;27419:81:0;-1:-1:-1;27511:60:0;;27554:5;27547:12;;;;;;27511:60;27584:7;:28;;;:33;;27616:1;27584:33;27581:77;;27641:5;27634:12;;;;;;27581:77;27750:30;;;27668:19;;;:7;:19;;;;;;:112;;27718:15;27750:30;;;;27711:69;27668:112;;;27750:30;27668:112;-1:-1:-1;;27668:112:0;;;;;;;;;;27796:33;;27676:10;;27796:33;;;27853:10;27844:20;;;;:8;:20;;;;;;;;:28;;:20;:28;27840:131;;;27887:72;27904:10;26586:5;27916:42;;27887:16;:72::i;18027:1809::-;18369:4;18386:22;18411:163;18442:8;18465:16;18496;18527:2;18544;18561;18411:16;:163::i;:::-;18386:188;;18607:6;-1:-1:-1;;;;;18589:24:0;:14;-1:-1:-1;;;;;18589:24:0;;18585:1221;;;18672:52;;;2040:4;18672:52;18668:424;;;18803:78;18825:8;18835:7;18844:6;18852;18860:4;18866:14;18803:21;:78::i;:::-;18796:85;;;;;18668:424;18907:44;;;2118:4;18907:44;18903:189;;;19006:70;19020:8;19030:7;19039:6;19047;19055:4;19061:14;19006:13;:70::i;18903:189::-;18585:1221;;;19131:7;-1:-1:-1;;;;;19113:25:0;:14;-1:-1:-1;;;;;19113:25:0;;19109:697;;;19198:39;;;2425:4;19198:39;19194:601;;;19293:66;19303:8;19313:7;19322:6;19330;19338:4;19344:14;19293:9;:66::i;19194:601::-;19385:45;;;2198:4;19385:45;19381:414;;;19485:71;19500:8;19510:7;19519:6;19527;19535:4;19541:14;19485;:71::i;19381:414::-;19582:53;;;2333:4;19582:53;19578:217;;;19701:78;19723:8;19733:7;19742:6;19750;19758:4;19764:14;19701:21;:78::i;19578:217::-;19823:5;19816:12;;;18027:1809;;;;;;;;;;;;;;:::o;21510:796::-;21719:4;21736:21;;:::i;:::-;21768:18;21821:57;21838:8;21848:7;21857:6;21865;21873:4;21821:16;:57::i;:::-;21894:14;;21797:81;;-1:-1:-1;21797:81:0;-1:-1:-1;21889:33:0;;21917:5;21910:12;;;;;;21889:33;22012:10;21933:16;22003:20;;;:8;:20;;;;;;;;:28;;:20;:28;:125;;22127:1;22003:125;;;21056:5;22052:30;;22095:11;22051:56;22003:125;21952:34;;;;;22161:19;;;;:7;:19;;;;;22154:26;;-1:-1:-1;;;;;;22154:26:0;;;22196:20;;21952:191;;;-1:-1:-1;22169:10:0;;22196:20;;22161:19;22196:20;22227:49;22245:6;22253;22261:8;22271:4;20488:528;20702:5;20686:13;;;;;:21;-1:-1:-1;;;;;20685:53:0;;;20782:19;;;:28;-1:-1:-1;20779:66:0;;;20827:7;;;20779:66;20917:24;:38;;;;;;20966:42;;-1:-1:-1;;;;;20966:21:0;;;20988:19;;;20966:42;;;;;20917:24;20966:42;20917:24;20966:42;20988:19;20966:21;:42;;;;;;;;;;;;;;;;;;;20488:528;;;;;:::o;20003:164::-;20082:19;;;;:7;:19;;;;;;:77;;-1:-1:-1;;;;;;20082:77:0;;20147:11;20132:27;;;-1:-1:-1;;;20082:77:0;;;;-1:-1:-1;;;;;20082:77:0;;;;;;;;;;;;;;;20003:164::o;28408:508::-;28653:112;;;-1:-1:-1;;;;;;28653:112:0;;;;;;;;;;;-1:-1:-1;;;;;;28653:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28643:123;;;;;28607:7;;-1:-1:-1;;;;;28653:112:0;;28780:11;:30;28777:81;;;28844:1;28827:19;;;;;28777:81;28875:33;28890:5;28897:2;28901;28905;28875:14;:33::i;:::-;28868:40;28408:508;-1:-1:-1;;;;;;;;28408:508:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://5002c724a7f667f48c4e71b9e8bdce94d18e54e3e68ec8e1f9f95295d24ee65c

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.