ETH Price: $1,595.55 (+0.29%)
Gas: 8 Gwei
 

Multi Chain

Multichain Addresses

Transaction Hash
Method
Block
From
To
Value
Create Escrow165048792023-01-28 11:00:23237 days 14 hrs ago1674903623IN
LocalEthereum 1
0.135 ETH0.00360015103
Create Escrow127143832021-06-27 5:58:46817 days 19 hrs ago1624773526IN
LocalEthereum 1
0.02982 ETH0.000139814
Create Escrow127143742021-06-27 5:56:19817 days 19 hrs ago1624773379IN
LocalEthereum 1
0.02982 ETH0.000139814
Create Escrow127090562021-06-26 10:04:59818 days 15 hrs ago1624701899IN
LocalEthereum 1
0.03379 ETH0.000139714
Create Escrow126261992021-06-13 12:45:23831 days 12 hrs ago1623588323IN
LocalEthereum 1
0.12 ETH0.0009122726.1
Create Escrow126261992021-06-13 12:45:23831 days 12 hrs ago1623588323IN
LocalEthereum 1
0.12 ETH0.0009122726.1
Create Escrow126261992021-06-13 12:45:23831 days 12 hrs ago1623588323IN
LocalEthereum 1
0.1239 ETH0.000139864
Batch Relay121886912021-04-06 21:44:02899 days 3 hrs ago1617745442IN
LocalEthereum 1
0 ETH0.00558522141.05168
Batch Relay120248872021-03-12 17:02:08924 days 8 hrs ago1615568528IN
LocalEthereum 1
0 ETH0.01409244197.83872
Batch Relay120025312021-03-09 5:52:25927 days 19 hrs ago1615269145IN
LocalEthereum 1
0 ETH0.00551228119.2
Batch Relay119884472021-03-07 1:36:55930 days ago1615081015IN
LocalEthereum 1
0 ETH0.00409926104
Resolve Dispute119522712021-03-01 12:15:05935 days 13 hrs ago1614600905IN
LocalEthereum 1
0 ETH0.0035332692
Withdraw Fees118837982021-02-18 23:32:21946 days 2 hrs ago1613691141IN
LocalEthereum 1
0 ETH0.0056016150
Batch Relay118723262021-02-17 5:11:18947 days 20 hrs ago1613538678IN
LocalEthereum 1
0 ETH0.00708857140.8
Batch Relay118275122021-02-10 7:53:41954 days 17 hrs ago1612943621IN
LocalEthereum 1
0 ETH0.0169561238.04055541
Batch Relay118152442021-02-08 10:23:06956 days 15 hrs ago1612779786IN
LocalEthereum 1
0 ETH0.00575946114.4
Batch Relay118148372021-02-08 8:58:42956 days 16 hrs ago1612774722IN
LocalEthereum 1
0 ETH0.00516488112
Create Escrow118147732021-02-08 8:45:57956 days 16 hrs ago1612773957IN
LocalEthereum 1
2.10923 ETH0.00773654140
Batch Relay118047342021-02-06 19:51:27958 days 5 hrs ago1612641087IN
LocalEthereum 1
0 ETH0.00831744180
Batch Relay118040092021-02-06 17:03:07958 days 8 hrs ago1612630987IN
LocalEthereum 1
0 ETH0.00715704155.2
Batch Relay117987722021-02-05 21:47:42959 days 3 hrs ago1612561662IN
LocalEthereum 1
0 ETH0.01681358236
Batch Relay117929072021-02-04 23:56:23960 days 1 hr ago1612482983IN
LocalEthereum 1
0 ETH0.00886759192.3432
Batch Relay117875452021-02-04 4:18:03960 days 21 hrs ago1612412283IN
LocalEthereum 1
0 ETH0.01248194175.2
Batch Relay117855042021-02-03 20:46:01961 days 4 hrs ago1612385161IN
LocalEthereum 1
0 ETH0.00946711188
Create Escrow117838412021-02-03 14:26:38961 days 11 hrs ago1612362398IN
LocalEthereum 1
6.8 ETH0.00494115150
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Advanced Filter
Parent Txn Hash Block From To Value
120248872021-03-12 17:02:08924 days 8 hrs ago1615568528
LocalEthereum 1
0.02056977 ETH
120025312021-03-09 5:52:25927 days 19 hrs ago1615269145
LocalEthereum 1
0.63611506 ETH
119522712021-03-01 12:15:05935 days 13 hrs ago1614600905
LocalEthereum 1
3.54559454 ETH
118837982021-02-18 23:32:21946 days 2 hrs ago1613691141
LocalEthereum 1
40 ETH
118275122021-02-10 7:53:41954 days 17 hrs ago1612943621
LocalEthereum 1
0.13415597 ETH
118148372021-02-08 8:58:42956 days 16 hrs ago1612774722
LocalEthereum 1
2.07972784 ETH
118047342021-02-06 19:51:27958 days 5 hrs ago1612641087
LocalEthereum 1
0.0364433 ETH
118040092021-02-06 17:03:07958 days 8 hrs ago1612630987
LocalEthereum 1
0.77215901 ETH
117987722021-02-05 21:47:42959 days 3 hrs ago1612561662
LocalEthereum 1
0.16621034 ETH
117929072021-02-04 23:56:23960 days 1 hr ago1612482983
LocalEthereum 1
6.1844743 ETH
117875452021-02-04 4:18:03960 days 21 hrs ago1612412283
LocalEthereum 1
0.58654481 ETH
117837562021-02-03 14:08:38961 days 11 hrs ago1612361318
LocalEthereum 1
6.7948016 ETH
117793552021-02-02 22:03:21962 days 3 hrs ago1612303401
LocalEthereum 1
0.15090463 ETH
117770992021-02-02 13:32:48962 days 12 hrs ago1612272768
LocalEthereum 1
0.24203181 ETH
117762782021-02-02 10:29:22962 days 15 hrs ago1612261762
LocalEthereum 1
0.02932502 ETH
117757452021-02-02 8:28:36962 days 17 hrs ago1612254516
LocalEthereum 1
0.06980662 ETH
117755102021-02-02 7:39:31962 days 17 hrs ago1612251571
LocalEthereum 1
0.11802695 ETH
117717722021-02-01 17:47:50963 days 7 hrs ago1612201670
LocalEthereum 1
0.03975814 ETH
117699782021-02-01 11:14:37963 days 14 hrs ago1612178077
LocalEthereum 1
0.63098094 ETH
117689502021-02-01 7:22:49963 days 18 hrs ago1612164169
LocalEthereum 1
0.39837326 ETH
117689322021-02-01 7:17:26963 days 18 hrs ago1612163846
LocalEthereum 1
0.24434055 ETH
117639012021-01-31 12:52:35964 days 12 hrs ago1612097555
LocalEthereum 1
8.92539202 ETH
117638182021-01-31 12:35:03964 days 13 hrs ago1612096503
LocalEthereum 1
0.25672466 ETH
117624312021-01-31 7:33:04964 days 18 hrs ago1612078384
LocalEthereum 1
0.02441767 ETH
117593832021-01-30 20:22:07965 days 5 hrs ago1612038127
LocalEthereum 1
0.12670043 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LocalEthereumEscrows

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-06-03
*/

pragma solidity ^0.4.24;

contract Token {
    function transfer(address _to, uint _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    function approve(address _spender, uint _value) public returns (bool success);
}

/// @title localethereum.com
/// @author localethereum.com
contract LocalEthereumEscrows {
    /***********************
    +   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 of the relayer (who is allowed to forward signed instructions from parties)
    address public relayer;
    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() public {
        owner = msg.sender;
        arbitrator = msg.sender;
        relayer = msg.sender;
        requestCancellationMinimumTime = 2 hours;
    }

    /// @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) == relayer, "Must be relayer");
        // 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 = 36100;
    /// @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 _seller,
        address _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)
          _buyer.transfer((_value - _totalFees) * _buyerPercent / 100);
        if (_buyerPercent < 100)
          _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 _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 _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 _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);
    }

    /// @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
    uint16 constant GAS_batchRelayBaseCost = 28500;
    function batchRelay(
        bytes16[] _tradeID,
        address[] _seller,
        address[] _buyer,
        uint256[] _value,
        uint16[] _fee,
        uint128[] _maximumGasPrice,
        uint8[] _v,
        bytes32[] _r,
        bytes32[] _s,
        uint8[] _instructionByte
    ) public returns (bool[]) {
        bool[] memory _results = new bool[](_tradeID.length);
        uint128 _additionalGas = uint128(msg.sender == relayer ? GAS_batchRelayBaseCost / _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 _to, uint256 _amount) onlyOwner external {
        // This check also prevents underflow
        require(_amount <= feesAvailableForWithdraw, "Amount is higher than amount available");
        feesAvailableForWithdraw -= _amount;
        _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 Change the relayer to a new address. Only the owner can call this.
    /// @param _newRelayer Address of the replacement relayer
    function setRelayer(address _newRelayer) onlyOwner external {
        relayer = _newRelayer;
    }

    /// @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 _seller,
        address _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);
            }
        } else {
            require(msg.sender == _seller, "Unrecognised party");
            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 _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;
        _to.transfer(_value - _totalFees);
    }

    uint16 constant GAS_doRelease = 46588;
    /// @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 _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
            + (msg.sender == relayer
                ? (GAS_doRelease + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit Released(_tradeHash);
        transferMinusFees(_buyer, _value, _gasFees, _fee);
        return true;
    }

    uint16 constant GAS_doDisableSellerCancel = 28944;
    /// @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 (msg.sender == relayer) {
          increaseGasSpent(_tradeHash, GAS_doDisableSellerCancel + _additionalGas);
        }
        return true;
    }

    uint16 constant GAS_doBuyerCancel = 46255;
    /// @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 _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
            + (msg.sender == relayer
                ? (GAS_doBuyerCancel + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit CancelledByBuyer(_tradeHash);
        transferMinusFees(_seller, _value, _gasFees, 0);
        return true;
    }

    uint16 constant GAS_doSellerCancel = 46815;
    /// @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 _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;
        }
        uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer
            + (msg.sender == relayer
                ? (GAS_doSellerCancel + _additionalGas ) * uint128(tx.gasprice)
                : 0
            );
        delete escrows[_tradeHash];
        emit CancelledBySeller(_tradeHash);
        transferMinusFees(_seller, _value, _gasFees, 0);
        return true;
    }

    uint16 constant GAS_doSellerRequestCancel = 29507;
    /// @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 (msg.sender == relayer) {
          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;
        }
        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, 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

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

608060405234801561001057600080fd5b506001805433600160a060020a03199182168117909255600080548216831781556002805490921690921760a060020a63ffffffff021916751c20000000000000000000000000000000000000000017905561243090819061007290396000f30060806040526004361061010e5763ffffffff60e060020a60003504166305b64993811461011357806313af40351461013357806324943c7d146101545780632cc9636c146101a75780632d83549c146101f957806335adc0c51461023f57806357938b2a1461027d5780635c810f09146102ab5780636548e9bc146102e95780636b4078371461030a5780636cc6cde1146103485780638406c079146103795780638da5cb5b1461038e5780638eb4e0ad146103a3578063ad3b1b4714610649578063b0eefabe1461066d578063da3e33971461068e578063de5785d5146106b8578063e5994905146106df578063e9600f121461070f578063f1e03d671461074d578063f5537ede1461079b575b600080fd5b34801561011f57600080fd5b5061013163ffffffff600435166107c5565b005b34801561013f57600080fd5b50610131600160a060020a036004351661085d565b34801561016057600080fd5b506101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351660ff60a43581169060c4359060e4359061010435166108dc565b3480156101b357600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610ce9565b604080519115158252519081900360200190f35b34801561020557600080fd5b50610211600435610d64565b60408051931515845263ffffffff90921660208401526001608060020a031682820152519081900360600190f35b34801561024b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610d99565b34801561028957600080fd5b50610292610e0a565b6040805163ffffffff9092168252519081900360200190f35b3480156102b757600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610e2e565b3480156102f557600080fd5b50610131600160a060020a0360043516610e9f565b34801561031657600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610f1e565b34801561035457600080fd5b5061035d610f8f565b60408051600160a060020a039092168252519081900360200190f35b34801561038557600080fd5b5061035d610f9e565b34801561039a57600080fd5b5061035d610fad565b3480156103af57600080fd5b50604080516020600480358082013583810280860185019096528085526105f995369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610fbc9650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b34801561065557600080fd5b50610131600160a060020a036004351660243561117e565b34801561067957600080fd5b50610131600160a060020a0360043516611292565b34801561069a57600080fd5b50610131600160a060020a0360043581169060243516604435611311565b3480156106c457600080fd5b506106cd6113f5565b60408051918252519081900360200190f35b3480156106eb57600080fd5b50610131600160a060020a03600435811690602435811690604435166064356113fb565b34801561071b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff608435166114f1565b6101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351663ffffffff60a43581169060c4351660ff60e435166101043561012435611562565b3480156107a757600080fd5b50610131600160a060020a036004358116906024351660443561195c565b600154600160a060020a03163314610815576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a031633146108ad576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006108e66123c4565b600080548190600160a060020a0316331461094b576040805160e560020a62461bcd02815260206004820152601260248201527f4d7573742062652061726269747261746f720000000000000000000000000000604482015290519081900360640190fd5b604080516001608060020a03198f166020808301919091527f06000000000000000000000000000000000000000000000000000000000000006030830152825160118184030181526031909201928390528151610a0193918291908401908083835b602083106109cc5780518252601f1990920191602091820191016109ad565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020898989611a0f565b93508a600160a060020a031684600160a060020a03161480610a3457508b600160a060020a031684600160a060020a0316145b1515610a8a576040805160e560020a62461bcd02815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610a978d8d8d8d8d611b70565b815191945092501515610af4576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b606460ff86161115610b76576040805160e560020a62461bcd02815260206004820152602260248201527f5f627579657250657263656e74206d75737420626520313030206f72206c6f7760448201527f6572000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060408201513a618d0402016001608060020a0316808a038a1015610be5576040805160e560020a62461bcd02815260206004820152600e60248201527f4f766572666c6f77206572726f72000000000000000000000000000000000000604482015290519081900360640190fd5b6003805482019055600082815260046020526040808220805474ffffffffffffffffffffffffffffffffffffffffff191690555183917f65e0c7182ce84cd9087c1b07dc4b65875578877b885848e4be19ee312f2c3d3191a260008560ff161115610c8b57604051600160a060020a038c1690606460ff8816848e03020480156108fc02916000818181858888f19350505050158015610c89573d6000803e3d6000fd5b505b60648560ff161015610cda57604051600160a060020a038d1690606487810360ff16848e03020480156108fc02916000818181858888f19350505050158015610cd8573d6000803e3d6000fd5b505b50505050505050505050505050565b600033600160a060020a03851614610d4b576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611cb4565b9695505050505050565b60046020526000908152604090205460ff811690610100810463ffffffff16906501000000000090046001608060020a031683565b600033600160a060020a03861614610dfb576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611d7f565b60025474010000000000000000000000000000000000000000900463ffffffff1681565b600033600160a060020a03851614610e90576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611e69565b600154600160a060020a03163314610eef576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600033600160a060020a03861614610f80576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611f25565b600054600160a060020a031681565b600254600160a060020a031681565b600154600160a060020a031681565b6060806000808d51604051908082528060200260200182016040528015610fed578160200160208202803883390190505b50600254909350600160a060020a0316331461100a57600061101a565b8d51616f5481151561101857fe5b045b9150600090505b8d518160ff16101561116c576111448e8260ff1681518110151561104157fe5b906020019060200201518e8360ff1681518110151561105c57fe5b906020019060200201518e8460ff1681518110151561107757fe5b906020019060200201518e8560ff1681518110151561109257fe5b906020019060200201518e8660ff168151811015156110ad57fe5b906020019060200201518e8760ff168151811015156110c857fe5b906020019060200201518e8860ff168151811015156110e357fe5b906020019060200201518e8960ff168151811015156110fe57fe5b906020019060200201518e8a60ff1681518110151561111957fe5b906020019060200201518e8b60ff1681518110151561113457fe5b906020019060200201518c612007565b838260ff1681518110151561115557fe5b911515602092830290910190910152600101611021565b50909c9b505050505050505050505050565b600154600160a060020a031633146111ce576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b60035481111561124e576040805160e560020a62461bcd02815260206004820152602660248201527f416d6f756e7420697320686967686572207468616e20616d6f756e742061766160448201527f696c61626c650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600380548290039055604051600160a060020a0383169082156108fc029083906000818181858888f1935050505015801561128d573d6000803e3d6000fd5b505050565b600154600160a060020a031633146112e2576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a03163314611361576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b505af11580156113d8573d6000803e3d6000fd5b505050506040513d60208110156113ee57600080fd5b5050505050565b60035481565b600154600160a060020a0316331461144b576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b1580156114bf57600080fd5b505af11580156114d3573d6000803e3d6000fd5b505050506040513d60208110156114e957600080fd5b505050505050565b600033600160a060020a03861614611553576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000612151565b604080516001608060020a03198c166020808301919091526c01000000000000000000000000600160a060020a03808e16820260308501528c16026044830152605882018a90527e0100000000000000000000000000000000000000000000000000000000000061ffff8a160260788301528251605a818403018152607a90920192839052815160009384938493909282918401908083835b6020831061161a5780518252601f1990920191602091820191016115fb565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008181526004909252929020549196505060ff161591506116b09050576040805160e560020a62461bcd02815260206004820152601460248201527f547261646520616c726561647920657869737473000000000000000000000000604482015290519081900360640190fd5b60408051602080820186905260e060020a63ffffffff808d168202848601528b1602604483015282516028818403018152604890920192839052815191929182918401908083835b602083106117175780518252601f1990920191602091820191016116f8565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600254909550600160a060020a031692506117619150849050888888611a0f565b600160a060020a0316146117bf576040805160e560020a62461bcd02815260206004820152600f60248201527f4d7573742062652072656c617965720000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8716421061181c576040805160e560020a62461bcd02815260206004820152601560248201527f5369676e61747572652068617320657870697265640000000000000000000000604482015290519081900360640190fd5b893414801561182b5750600034115b1515611881576040805160e560020a62461bcd02815260206004820152601460248201527f496e636f72726563742065746865722073656e74000000000000000000000000604482015290519081900360640190fd5b63ffffffff88161561189557874201611898565b60015b604080516060810182526001815263ffffffff808416602080840191825260008486018181528a8252600490925285812094518554935192516001608060020a0316650100000000000274ffffffffffffffffffffffffffffffff000000000019939095166101000264ffffffff001991151560ff199095169490941716929092171691909117909155905191925084917f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c9190a250505050505050505050505050565b600154600160a060020a031633146119ac576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b604080518082018252601c8082527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208084019182529351600094859385938b939092019182918083835b60208310611a7a5780518252601f199092019160209182019101611a5b565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310611ada5780518252601f199092019160209182019101611abb565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080845283830180875282905260ff8e1684870152606084018d9052608084018c905294519097506001965060a080840196509194601f19820194509281900390910191865af1158015611b5a573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b611b786123c4565b604080516001608060020a031988166020808301919091526c01000000000000000000000000600160a060020a03808a16820260308501528816026044830152605882018690527e0100000000000000000000000000000000000000000000000000000000000061ffff86160260788301528251605a818403018152607a909201928390528151600093849392909182918401908083835b60208310611c2f5780518252601f199092019160209182019101611c10565b518151602093840361010090810a6000190180199093169290911691909117909152604080519390950183900383206000818152600484528690206060850187525460ff81161515855291820463ffffffff16928401929092526501000000000090046001608060020a0316938201939093529c919b50909950505050505050505050565b6000611cbe6123c4565b600080611cce8a8a8a8a8a611b70565b815191945092501515611ce45760009350611d72565b600254600160a060020a03163314611cfd576000611d05565b61b4af85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917fd9b627ddaa414e8e6c82366cc9c179f6281d73968827cc17038a56852e28ac8b9190a2611d6d8988836000612205565b600193505b5050509695505050505050565b6000611d896123c4565b600080611d998a8a8a8a8a611b70565b815191945092501515611daf5760009350611d72565b6001836020015163ffffffff16111580611dd2575042836020015163ffffffff16115b15611de05760009350611d72565b600254600160a060020a03163314611df9576000611e01565b61b6df85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f366d2b4e6cc37ecebb3d7d41df6d581634fd8137412710a1e086e4ca4656bb589190a2611d6d8988836000612205565b6000611e736123c4565b6000611e828989898989611b70565b815191935091501515611e985760009250611f19565b602082015163ffffffff161515611eb25760009250611f19565b600081815260046020526040808220805464ffffffff00191690555182917fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb91a2600254600160a060020a0316331415611f1457611f14816171108601612269565b600192505b50509695505050505050565b6000611f2f6123c4565b6000611f3e8989898989611b70565b815191935091501515611f545760009250611f19565b816020015163ffffffff166001141515611f715760009250611f19565b60025460008281526004602052604080822080544263ffffffff740100000000000000000000000000000000000000009096048616019094166101000264ffffffff001990941693909317909255905182917f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab91a2600254600160a060020a0316331415611f1457611f14816173438601612269565b6000806120188d858a8a8a8a6122bb565b90508a600160a060020a031681600160a060020a031614156120745760ff8416600114156120555761204e8d8d8d8d8d88611e69565b9150612141565b60ff84166002141561206f5761204e8d8d8d8d8d88611cb4565b612141565b8b600160a060020a031681600160a060020a031614156120dc5760ff8416600514156120a85761204e8d8d8d8d8d88612151565b60ff8416600314156120c25761204e8d8d8d8d8d88611d7f565b60ff84166004141561206f5761204e8d8d8d8d8d88611f25565b33600160a060020a038d161461213c576040805160e560020a62461bcd02815260206004820152601260248201527f556e7265636f676e697365642070617274790000000000000000000000000000604482015290519081900360640190fd5b600091505b509b9a5050505050505050505050565b600061215b6123c4565b60008061216b8a8a8a8a8a611b70565b8151919450925015156121815760009350611d72565b600254600160a060020a0316331461219a5760006121a2565b61b5fc85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d149190a2611d6d888883895b61271061ffff82168402046001608060020a0383160180840384101561222a576113ee565b6003805482019055604051600160a060020a0386169082860380156108fc02916000818181858888f193505050501580156114e9573d6000803e3d6000fd5b600091825260046020526040909120805474ffffffffffffffffffffffffffffffff00000000001981163a90930265010000000000918290046001608060020a03908116919091011602919091179055565b604080516001608060020a031988166020808301919091527f010000000000000000000000000000000000000000000000000000000000000060ff89160260308301527001000000000000000000000000000000006001608060020a038816026031830152825160218184030181526041909201928390528151600093849392909182918401908083835b602083106123655780518252601f199092019160209182019101612346565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050856001608060020a03163a11156123aa576123b9565b6123b681868686611a0f565b91505b509695505050505050565b60408051606081018252600080825260208201819052918101919091529056004d757374206265206f776e657200000000000000000000000000000000000000a165627a7a72305820654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b6830029

Deployed Bytecode

0x60806040526004361061010e5763ffffffff60e060020a60003504166305b64993811461011357806313af40351461013357806324943c7d146101545780632cc9636c146101a75780632d83549c146101f957806335adc0c51461023f57806357938b2a1461027d5780635c810f09146102ab5780636548e9bc146102e95780636b4078371461030a5780636cc6cde1146103485780638406c079146103795780638da5cb5b1461038e5780638eb4e0ad146103a3578063ad3b1b4714610649578063b0eefabe1461066d578063da3e33971461068e578063de5785d5146106b8578063e5994905146106df578063e9600f121461070f578063f1e03d671461074d578063f5537ede1461079b575b600080fd5b34801561011f57600080fd5b5061013163ffffffff600435166107c5565b005b34801561013f57600080fd5b50610131600160a060020a036004351661085d565b34801561016057600080fd5b506101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351660ff60a43581169060c4359060e4359061010435166108dc565b3480156101b357600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610ce9565b604080519115158252519081900360200190f35b34801561020557600080fd5b50610211600435610d64565b60408051931515845263ffffffff90921660208401526001608060020a031682820152519081900360600190f35b34801561024b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610d99565b34801561028957600080fd5b50610292610e0a565b6040805163ffffffff9092168252519081900360200190f35b3480156102b757600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610e2e565b3480156102f557600080fd5b50610131600160a060020a0360043516610e9f565b34801561031657600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610f1e565b34801561035457600080fd5b5061035d610f8f565b60408051600160a060020a039092168252519081900360200190f35b34801561038557600080fd5b5061035d610f9e565b34801561039a57600080fd5b5061035d610fad565b3480156103af57600080fd5b50604080516020600480358082013583810280860185019096528085526105f995369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610fbc9650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b34801561065557600080fd5b50610131600160a060020a036004351660243561117e565b34801561067957600080fd5b50610131600160a060020a0360043516611292565b34801561069a57600080fd5b50610131600160a060020a0360043581169060243516604435611311565b3480156106c457600080fd5b506106cd6113f5565b60408051918252519081900360200190f35b3480156106eb57600080fd5b50610131600160a060020a03600435811690602435811690604435166064356113fb565b34801561071b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff608435166114f1565b6101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351663ffffffff60a43581169060c4351660ff60e435166101043561012435611562565b3480156107a757600080fd5b50610131600160a060020a036004358116906024351660443561195c565b600154600160a060020a03163314610815576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a031633146108ad576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006108e66123c4565b600080548190600160a060020a0316331461094b576040805160e560020a62461bcd02815260206004820152601260248201527f4d7573742062652061726269747261746f720000000000000000000000000000604482015290519081900360640190fd5b604080516001608060020a03198f166020808301919091527f06000000000000000000000000000000000000000000000000000000000000006030830152825160118184030181526031909201928390528151610a0193918291908401908083835b602083106109cc5780518252601f1990920191602091820191016109ad565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020898989611a0f565b93508a600160a060020a031684600160a060020a03161480610a3457508b600160a060020a031684600160a060020a0316145b1515610a8a576040805160e560020a62461bcd02815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610a978d8d8d8d8d611b70565b815191945092501515610af4576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b606460ff86161115610b76576040805160e560020a62461bcd02815260206004820152602260248201527f5f627579657250657263656e74206d75737420626520313030206f72206c6f7760448201527f6572000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060408201513a618d0402016001608060020a0316808a038a1015610be5576040805160e560020a62461bcd02815260206004820152600e60248201527f4f766572666c6f77206572726f72000000000000000000000000000000000000604482015290519081900360640190fd5b6003805482019055600082815260046020526040808220805474ffffffffffffffffffffffffffffffffffffffffff191690555183917f65e0c7182ce84cd9087c1b07dc4b65875578877b885848e4be19ee312f2c3d3191a260008560ff161115610c8b57604051600160a060020a038c1690606460ff8816848e03020480156108fc02916000818181858888f19350505050158015610c89573d6000803e3d6000fd5b505b60648560ff161015610cda57604051600160a060020a038d1690606487810360ff16848e03020480156108fc02916000818181858888f19350505050158015610cd8573d6000803e3d6000fd5b505b50505050505050505050505050565b600033600160a060020a03851614610d4b576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611cb4565b9695505050505050565b60046020526000908152604090205460ff811690610100810463ffffffff16906501000000000090046001608060020a031683565b600033600160a060020a03861614610dfb576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611d7f565b60025474010000000000000000000000000000000000000000900463ffffffff1681565b600033600160a060020a03851614610e90576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611e69565b600154600160a060020a03163314610eef576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600033600160a060020a03861614610f80576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611f25565b600054600160a060020a031681565b600254600160a060020a031681565b600154600160a060020a031681565b6060806000808d51604051908082528060200260200182016040528015610fed578160200160208202803883390190505b50600254909350600160a060020a0316331461100a57600061101a565b8d51616f5481151561101857fe5b045b9150600090505b8d518160ff16101561116c576111448e8260ff1681518110151561104157fe5b906020019060200201518e8360ff1681518110151561105c57fe5b906020019060200201518e8460ff1681518110151561107757fe5b906020019060200201518e8560ff1681518110151561109257fe5b906020019060200201518e8660ff168151811015156110ad57fe5b906020019060200201518e8760ff168151811015156110c857fe5b906020019060200201518e8860ff168151811015156110e357fe5b906020019060200201518e8960ff168151811015156110fe57fe5b906020019060200201518e8a60ff1681518110151561111957fe5b906020019060200201518e8b60ff1681518110151561113457fe5b906020019060200201518c612007565b838260ff1681518110151561115557fe5b911515602092830290910190910152600101611021565b50909c9b505050505050505050505050565b600154600160a060020a031633146111ce576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b60035481111561124e576040805160e560020a62461bcd02815260206004820152602660248201527f416d6f756e7420697320686967686572207468616e20616d6f756e742061766160448201527f696c61626c650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600380548290039055604051600160a060020a0383169082156108fc029083906000818181858888f1935050505015801561128d573d6000803e3d6000fd5b505050565b600154600160a060020a031633146112e2576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a03163314611361576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b505af11580156113d8573d6000803e3d6000fd5b505050506040513d60208110156113ee57600080fd5b5050505050565b60035481565b600154600160a060020a0316331461144b576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b1580156114bf57600080fd5b505af11580156114d3573d6000803e3d6000fd5b505050506040513d60208110156114e957600080fd5b505050505050565b600033600160a060020a03861614611553576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000612151565b604080516001608060020a03198c166020808301919091526c01000000000000000000000000600160a060020a03808e16820260308501528c16026044830152605882018a90527e0100000000000000000000000000000000000000000000000000000000000061ffff8a160260788301528251605a818403018152607a90920192839052815160009384938493909282918401908083835b6020831061161a5780518252601f1990920191602091820191016115fb565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008181526004909252929020549196505060ff161591506116b09050576040805160e560020a62461bcd02815260206004820152601460248201527f547261646520616c726561647920657869737473000000000000000000000000604482015290519081900360640190fd5b60408051602080820186905260e060020a63ffffffff808d168202848601528b1602604483015282516028818403018152604890920192839052815191929182918401908083835b602083106117175780518252601f1990920191602091820191016116f8565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600254909550600160a060020a031692506117619150849050888888611a0f565b600160a060020a0316146117bf576040805160e560020a62461bcd02815260206004820152600f60248201527f4d7573742062652072656c617965720000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8716421061181c576040805160e560020a62461bcd02815260206004820152601560248201527f5369676e61747572652068617320657870697265640000000000000000000000604482015290519081900360640190fd5b893414801561182b5750600034115b1515611881576040805160e560020a62461bcd02815260206004820152601460248201527f496e636f72726563742065746865722073656e74000000000000000000000000604482015290519081900360640190fd5b63ffffffff88161561189557874201611898565b60015b604080516060810182526001815263ffffffff808416602080840191825260008486018181528a8252600490925285812094518554935192516001608060020a0316650100000000000274ffffffffffffffffffffffffffffffff000000000019939095166101000264ffffffff001991151560ff199095169490941716929092171691909117909155905191925084917f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c9190a250505050505050505050505050565b600154600160a060020a031633146119ac576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b604080518082018252601c8082527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208084019182529351600094859385938b939092019182918083835b60208310611a7a5780518252601f199092019160209182019101611a5b565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310611ada5780518252601f199092019160209182019101611abb565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080845283830180875282905260ff8e1684870152606084018d9052608084018c905294519097506001965060a080840196509194601f19820194509281900390910191865af1158015611b5a573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b611b786123c4565b604080516001608060020a031988166020808301919091526c01000000000000000000000000600160a060020a03808a16820260308501528816026044830152605882018690527e0100000000000000000000000000000000000000000000000000000000000061ffff86160260788301528251605a818403018152607a909201928390528151600093849392909182918401908083835b60208310611c2f5780518252601f199092019160209182019101611c10565b518151602093840361010090810a6000190180199093169290911691909117909152604080519390950183900383206000818152600484528690206060850187525460ff81161515855291820463ffffffff16928401929092526501000000000090046001608060020a0316938201939093529c919b50909950505050505050505050565b6000611cbe6123c4565b600080611cce8a8a8a8a8a611b70565b815191945092501515611ce45760009350611d72565b600254600160a060020a03163314611cfd576000611d05565b61b4af85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917fd9b627ddaa414e8e6c82366cc9c179f6281d73968827cc17038a56852e28ac8b9190a2611d6d8988836000612205565b600193505b5050509695505050505050565b6000611d896123c4565b600080611d998a8a8a8a8a611b70565b815191945092501515611daf5760009350611d72565b6001836020015163ffffffff16111580611dd2575042836020015163ffffffff16115b15611de05760009350611d72565b600254600160a060020a03163314611df9576000611e01565b61b6df85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f366d2b4e6cc37ecebb3d7d41df6d581634fd8137412710a1e086e4ca4656bb589190a2611d6d8988836000612205565b6000611e736123c4565b6000611e828989898989611b70565b815191935091501515611e985760009250611f19565b602082015163ffffffff161515611eb25760009250611f19565b600081815260046020526040808220805464ffffffff00191690555182917fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb91a2600254600160a060020a0316331415611f1457611f14816171108601612269565b600192505b50509695505050505050565b6000611f2f6123c4565b6000611f3e8989898989611b70565b815191935091501515611f545760009250611f19565b816020015163ffffffff166001141515611f715760009250611f19565b60025460008281526004602052604080822080544263ffffffff740100000000000000000000000000000000000000009096048616019094166101000264ffffffff001990941693909317909255905182917f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab91a2600254600160a060020a0316331415611f1457611f14816173438601612269565b6000806120188d858a8a8a8a6122bb565b90508a600160a060020a031681600160a060020a031614156120745760ff8416600114156120555761204e8d8d8d8d8d88611e69565b9150612141565b60ff84166002141561206f5761204e8d8d8d8d8d88611cb4565b612141565b8b600160a060020a031681600160a060020a031614156120dc5760ff8416600514156120a85761204e8d8d8d8d8d88612151565b60ff8416600314156120c25761204e8d8d8d8d8d88611d7f565b60ff84166004141561206f5761204e8d8d8d8d8d88611f25565b33600160a060020a038d161461213c576040805160e560020a62461bcd02815260206004820152601260248201527f556e7265636f676e697365642070617274790000000000000000000000000000604482015290519081900360640190fd5b600091505b509b9a5050505050505050505050565b600061215b6123c4565b60008061216b8a8a8a8a8a611b70565b8151919450925015156121815760009350611d72565b600254600160a060020a0316331461219a5760006121a2565b61b5fc85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d149190a2611d6d888883895b61271061ffff82168402046001608060020a0383160180840384101561222a576113ee565b6003805482019055604051600160a060020a0386169082860380156108fc02916000818181858888f193505050501580156114e9573d6000803e3d6000fd5b600091825260046020526040909120805474ffffffffffffffffffffffffffffffff00000000001981163a90930265010000000000918290046001608060020a03908116919091011602919091179055565b604080516001608060020a031988166020808301919091527f010000000000000000000000000000000000000000000000000000000000000060ff89160260308301527001000000000000000000000000000000006001608060020a038816026031830152825160218184030181526041909201928390528151600093849392909182918401908083835b602083106123655780518252601f199092019160209182019101612346565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050856001608060020a03163a11156123aa576123b9565b6123b681868686611a0f565b91505b509695505050505050565b60408051606081018252600080825260208201819052918101919091529056004d757374206265206f776e657200000000000000000000000000000000000000a165627a7a72305820654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b6830029

Swarm Source

bzzr://654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b683

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.