Contract 0x867ffb5a3871b500f65bdfafe0136f9667deae06

 

TxHash Block Age From To Value [TxFee]
0xe5bc2540bd5488d56bebd1cc23e10d3f201e54021f81daa1e815e438131745c472441063 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.0010635471
0xb4583950be4e66c55828d6951f68988822699a80c7735e83db175fba39d6125d72440997 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.000966861
0x2cce74248dbf7c001b0e6765c5b81f59a78c2192fc54185e227682823490a58772440949 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.0007441434
0x53f7c6b1a42b6eebac2a5714def8a47ca100d8985673cef57912f300b7a0496b724409210 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.0006510546
0xb826f5eb487eb43837c433c51495e4db2a07041b4fdb3db35896a67874024c16724409010 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.00052776927
0xc194f7687b7257ffeed8e4b5013b2e1f133c7e96f741b7782207e298a566746a724408611 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.000960013152
0x5d989a33bf6956363b2b1175f3c2e73c2fa3f3a756378586d31920316f959b4f724408313 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.00052776927
0xca4291b6a33b1acda7b1dbe0e5dd6dbc6848751904cd88185bd670479148dfc4724408213 mins ago0x4d0a93c87a04bae811e59a80d0e9bdf0c09504d8 IN  LocalEthereum_10.68 Ether0.0006026125
0xad2ee15450e5aca76da804d61853d4a7c389050a4f56321b901a0d99910bf3d0724407117 mins ago0xe880f32e33061919d09811eee00ee94392cd4fde IN  LocalEthereum_16.88022 Ether0.000849646
0xb21f879ed6c294f6f450e19d899b6c0b1287b1c3f530ae1324d3040e85aee3fb724406720 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.001197315
0x78db0b088b91c0c0f2170858db088ff084425ef1ebb99aebd50f4c0d68e1f164724406720 mins ago0x9ba4f4bac1d7b978f363a18e7b4abae294081d1b IN  LocalEthereum_10.26 Ether0.00084875
0xda5070da532e0596ef878dea0e476604cf0bdf7cce1e411d5e8b8d55792ef95b724406321 mins ago0x9a1031b539a5886e28b0247f6cf6dac833b56360 IN  LocalEthereum_10.1078 Ether0.000849646
0xbb441d712eba68fcd0394652df7cd160081002b1dc61e16c975d20bdf120078b724406221 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.0009660546
0x039391a6a13699245ba241ff939b0166ed7c0589fa90e62a68b45561535f349d724406023 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.000743337
0xb74f49bb28cf1066ae4ce496581560a347e356eec68fc1c9d440230032173924724404128 mins ago0xe3e6a577c57213fdc5c5f35efc536c68f086d4b9 IN  LocalEthereum_10.75 Ether0.00084875
0x99cb70213599c41e75f484b09c0b6220d74cac231aacde86cacd662d6b138a52724404029 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.000966861
0x6eead3949c76fefc5099b5bd567c4711b16008a1eea62863018d7e06f85e075e724403630 mins ago0x6a7f17111344cdb48354848af7b96a1efe90edde IN  LocalEthereum_15 Ether0.00084875
0x37a57e7fc924a2cd7f4c149b2890bedebc2b04eac9cb6e8888119c8a9d456def724403231 mins ago0xf384569dbb21b96a7d895f1f4fd6e1685b16007d IN  LocalEthereum_10.37834 Ether0.0010609375
0x297467a5aa3e5d30564d405f6d5968d048b2e1a8811b747c966c3d2b2f7491d2724402433 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.0007417242
0xbd26d1c80bfce1482d2739ff995bf2865ba4cf3121704de6abc0110b27219da9724400339 mins ago0x7a93b674688bd96cdca1017127357a24932a3c73 IN  LocalEthereum_11.03198 Ether0.000849646
0xcc59472932efeff1718f9b9c43cc6e6a91f556023a2d04070cca1fdd333c8502724397056 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.0007441434
0xb5fd34a8cd554c14dcf005e38c1f72e71dd1d0b9e8fad068295135eef1bbc15f72439001 hr 19 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.0006510546
0xe3b1f486419ff96d165616ca465855dcdb2ea199d29af325c02d733cd51a0c5972438941 hr 21 mins ago0xf008e2c7a7f16ac706c2e0ebd3f015d442016420 IN  LocalEthereum_10 Ether0.000501057648
0xb3f87052ff7a99861c71857c8fb9fd0f66ef53f6027e39d736705ad77275bd1c72438931 hr 21 mins ago0x28a3ad94ff880f5e09901250fa45d3cc8d739d61 IN  LocalEthereum_10.46069 Ether0.00084875
0xb6a63b7955fc4fc87273c0cd8359d6e12f17ff15c71092b14bb772ffdfb1716872438771 hr 26 mins ago0xd9e14d8304b2d8e703409bd596c40f5072e0fc14 IN  LocalEthereum_10.09135 Ether0.00084875
[ Download CSV Export 

Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0xe5bc2540bd5488d56bebd1cc23e10d3f201e54021f81daa1e815e438131745c472441063 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xff8a6d3e5e434967d8d05e11e2d15e4a4695d0990.08867198592 Ether
0xb4583950be4e66c55828d6951f68988822699a80c7735e83db175fba39d6125d72440997 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x3369cca0c4e2b4a58399dd3dadaf50c34010fb340.1050520968 Ether
0x53f7c6b1a42b6eebac2a5714def8a47ca100d8985673cef57912f300b7a0496b724409210 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x28a3ad94ff880f5e09901250fa45d3cc8d739d610.671739997176 Ether
0xc194f7687b7257ffeed8e4b5013b2e1f133c7e96f741b7782207e298a566746a724408611 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xeaa456b64b5731ff88896a7777f07f3a1c0c60b80.256341849228 Ether
0xb21f879ed6c294f6f450e19d899b6c0b1287b1c3f530ae1324d3040e85aee3fb724406720 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xa2b73a063bee58f66c6b3650f23123388814d2040.7410096468 Ether
0xbb441d712eba68fcd0394652df7cd160081002b1dc61e16c975d20bdf120078b724406221 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x7ffc3ce4e89afbfd4b66c8cea05e34987786148f0.3736104912 Ether
0x99cb70213599c41e75f484b09c0b6220d74cac231aacde86cacd662d6b138a52724404029 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xfe4f4f78cdcead80d024f0e433e8bf5b0537954c1.0199902968 Ether
0xb5fd34a8cd554c14dcf005e38c1f72e71dd1d0b9e8fad068295135eef1bbc15f72439001 hr 19 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xb5c0f0ff448c4891e04fd88ff77e634e8c9d6e7b0.4551369912 Ether
0xe3b1f486419ff96d165616ca465855dcdb2ea199d29af325c02d733cd51a0c5972438941 hr 21 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xed69b531d2ab683fe6fe92d7f599af331e5f5d311.02531020524 Ether
0x04501283f31ae946921cc5360809313ae0ae8f8fc96471ed369c764efb06d7bc72438101 hr 49 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x28a3ad94ff880f5e09901250fa45d3cc8d739d610.3686648522 Ether
0xcda366086d459fa0afd61eb5758f037f85e2793dc5d8d412ad889f22a687ac7e72437582 hrs 4 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x998bc753487f393bc5a5ee8cc5d09ac86bef2af90.3618789912 Ether
0xcac484f17f75083de3df2e5992463b065a531c75f9903582ad4f97edc4e2b7ed72437482 hrs 8 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x13ba96f23fedac6b56e9855f77272772fbca56a40.360521031 Ether
0xf447ae7a90d8c483f51e8e6b52d5235a9ae25e9adf5d0eb7836316c86e02861e72437142 hrs 21 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x6f4b9b8cea6e242b13ace6cf7e819e93c901a3a71.6896658968 Ether
0xc15d2657280f3f4503b1d7cfd0096628f735e7e4bc4b09264fa48b2f5cda376a72436222 hrs 52 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xe3e6a577c57213fdc5c5f35efc536c68f086d4b91.6995255155 Ether
0xc3401551350ff471460e407a70d6262d6613a7e51aac51401f2bc6207c19068c72436132 hrs 55 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x44678deac293c866e28c5e30e1491ce9a0d47c241.7047766484 Ether
0xd10c080162ca336d8a7acb102a2ab1b0eb2a1f397e8dc15ba6213a1c766150a472435982 hrs 59 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x28a3ad94ff880f5e09901250fa45d3cc8d739d6110.8891650484 Ether
0xaf1c2a0e548cfe547a134fc466feb57a239eb85451430e0b0a26259d52387b7672435793 hrs 4 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xa793f13c7c7d38b2ffb27c5273edbd0245adbe760.3486990435 Ether
0x5258ca8d11de16cccec9c187ca035b0d23deec7cfa77d60e1e0172ecdc2584ef72435573 hrs 13 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x3066ebc39a3dfaac5da1759ac139c2ef6f9f701d0.1282269456 Ether
0xeb9e6ef06a6ac259ac6826fe90e03d406736688dbe8d13bad0ff36daa805c6a272435393 hrs 20 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x13ac3339f7b03fa73e625b4f33f6e1c848e4ce230.8954769456 Ether
0x0f61dee4ec92237cfdcb2be159db99e7700d3400360a9a630fd90898de1112e172435173 hrs 29 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x4e1fa051f575dd4bd0fe42ac9d53c5af94d63acc4.2991706484 Ether
0x05fbc0550d891ec135ded2a83810d42ed271b573e20cef3ef8e4743012062c5a72435093 hrs 32 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xa5a82b196724aa24cb61e0db4e5a7ba2c35866324.6353801456 Ether
0x25fad99169974caccc58f155539e75f7c2b8d782c6dd1200f46d1712dbc5300b72434763 hrs 42 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x178a25a9d6d301bcee3530be4c27d04121a1391b1.8715398912 Ether
0xefc03ad54c02a1f5013ae7039a8f4d6be821efea82c1807acc0683c78427a16372434633 hrs 46 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x26afb5a68a15c727582eab8d136173c822a914916.8246275968 Ether
0x1637163d0534f2ede6975c51e13e7e6611306a3fdeeee2ff50a577b40ada277172433814 hrs 15 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060xab29b1cb255cf46686c9d9459b42c9c2123d905f0.7837755155 Ether
0xfbbf9829f494fe352662606e87f89f3cfe4aeacc86587d2585fc0f85c485e2f372433494 hrs 27 mins ago0x867ffb5a3871b500f65bdfafe0136f9667deae060x04be96c6f27ca2ffd3b41534a6ea92424fd7b3900.9095290435 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: LocalEthereumEscrows
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
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 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"}]

Contract Creation Code
608060405234801561001057600080fd5b506001805433600160a060020a03199182168117909255600080548216831781556002805490921690921760a060020a63ffffffff021916751c20000000000000000000000000000000000000000017905561243090819061007290396000f30060806040526004361061010e5763ffffffff60e060020a60003504166305b64993811461011357806313af40351461013357806324943c7d146101545780632cc9636c146101a75780632d83549c146101f957806335adc0c51461023f57806357938b2a1461027d5780635c810f09146102ab5780636548e9bc146102e95780636b4078371461030a5780636cc6cde1146103485780638406c079146103795780638da5cb5b1461038e5780638eb4e0ad146103a3578063ad3b1b4714610649578063b0eefabe1461066d578063da3e33971461068e578063de5785d5146106b8578063e5994905146106df578063e9600f121461070f578063f1e03d671461074d578063f5537ede1461079b575b600080fd5b34801561011f57600080fd5b5061013163ffffffff600435166107c5565b005b34801561013f57600080fd5b50610131600160a060020a036004351661085d565b34801561016057600080fd5b506101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351660ff60a43581169060c4359060e4359061010435166108dc565b3480156101b357600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610ce9565b604080519115158252519081900360200190f35b34801561020557600080fd5b50610211600435610d64565b60408051931515845263ffffffff90921660208401526001608060020a031682820152519081900360600190f35b34801561024b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610d99565b34801561028957600080fd5b50610292610e0a565b6040805163ffffffff9092168252519081900360200190f35b3480156102b757600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610e2e565b3480156102f557600080fd5b50610131600160a060020a0360043516610e9f565b34801561031657600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610f1e565b34801561035457600080fd5b5061035d610f8f565b60408051600160a060020a039092168252519081900360200190f35b34801561038557600080fd5b5061035d610f9e565b34801561039a57600080fd5b5061035d610fad565b3480156103af57600080fd5b50604080516020600480358082013583810280860185019096528085526105f995369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610fbc9650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b34801561065557600080fd5b50610131600160a060020a036004351660243561117e565b34801561067957600080fd5b50610131600160a060020a0360043516611292565b34801561069a57600080fd5b50610131600160a060020a0360043581169060243516604435611311565b3480156106c457600080fd5b506106cd6113f5565b60408051918252519081900360200190f35b3480156106eb57600080fd5b50610131600160a060020a03600435811690602435811690604435166064356113fb565b34801561071b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff608435166114f1565b6101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351663ffffffff60a43581169060c4351660ff60e435166101043561012435611562565b3480156107a757600080fd5b50610131600160a060020a036004358116906024351660443561195c565b600154600160a060020a03163314610815576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a031633146108ad576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006108e66123c4565b600080548190600160a060020a0316331461094b576040805160e560020a62461bcd02815260206004820152601260248201527f4d7573742062652061726269747261746f720000000000000000000000000000604482015290519081900360640190fd5b604080516001608060020a03198f166020808301919091527f06000000000000000000000000000000000000000000000000000000000000006030830152825160118184030181526031909201928390528151610a0193918291908401908083835b602083106109cc5780518252601f1990920191602091820191016109ad565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020898989611a0f565b93508a600160a060020a031684600160a060020a03161480610a3457508b600160a060020a031684600160a060020a0316145b1515610a8a576040805160e560020a62461bcd02815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610a978d8d8d8d8d611b70565b815191945092501515610af4576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b606460ff86161115610b76576040805160e560020a62461bcd02815260206004820152602260248201527f5f627579657250657263656e74206d75737420626520313030206f72206c6f7760448201527f6572000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060408201513a618d0402016001608060020a0316808a038a1015610be5576040805160e560020a62461bcd02815260206004820152600e60248201527f4f766572666c6f77206572726f72000000000000000000000000000000000000604482015290519081900360640190fd5b6003805482019055600082815260046020526040808220805474ffffffffffffffffffffffffffffffffffffffffff191690555183917f65e0c7182ce84cd9087c1b07dc4b65875578877b885848e4be19ee312f2c3d3191a260008560ff161115610c8b57604051600160a060020a038c1690606460ff8816848e03020480156108fc02916000818181858888f19350505050158015610c89573d6000803e3d6000fd5b505b60648560ff161015610cda57604051600160a060020a038d1690606487810360ff16848e03020480156108fc02916000818181858888f19350505050158015610cd8573d6000803e3d6000fd5b505b50505050505050505050505050565b600033600160a060020a03851614610d4b576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611cb4565b9695505050505050565b60046020526000908152604090205460ff811690610100810463ffffffff16906501000000000090046001608060020a031683565b600033600160a060020a03861614610dfb576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611d7f565b60025474010000000000000000000000000000000000000000900463ffffffff1681565b600033600160a060020a03851614610e90576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611e69565b600154600160a060020a03163314610eef576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600033600160a060020a03861614610f80576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611f25565b600054600160a060020a031681565b600254600160a060020a031681565b600154600160a060020a031681565b6060806000808d51604051908082528060200260200182016040528015610fed578160200160208202803883390190505b50600254909350600160a060020a0316331461100a57600061101a565b8d51616f5481151561101857fe5b045b9150600090505b8d518160ff16101561116c576111448e8260ff1681518110151561104157fe5b906020019060200201518e8360ff1681518110151561105c57fe5b906020019060200201518e8460ff1681518110151561107757fe5b906020019060200201518e8560ff1681518110151561109257fe5b906020019060200201518e8660ff168151811015156110ad57fe5b906020019060200201518e8760ff168151811015156110c857fe5b906020019060200201518e8860ff168151811015156110e357fe5b906020019060200201518e8960ff168151811015156110fe57fe5b906020019060200201518e8a60ff1681518110151561111957fe5b906020019060200201518e8b60ff1681518110151561113457fe5b906020019060200201518c612007565b838260ff1681518110151561115557fe5b911515602092830290910190910152600101611021565b50909c9b505050505050505050505050565b600154600160a060020a031633146111ce576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b60035481111561124e576040805160e560020a62461bcd02815260206004820152602660248201527f416d6f756e7420697320686967686572207468616e20616d6f756e742061766160448201527f696c61626c650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600380548290039055604051600160a060020a0383169082156108fc029083906000818181858888f1935050505015801561128d573d6000803e3d6000fd5b505050565b600154600160a060020a031633146112e2576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a03163314611361576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b505af11580156113d8573d6000803e3d6000fd5b505050506040513d60208110156113ee57600080fd5b5050505050565b60035481565b600154600160a060020a0316331461144b576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b1580156114bf57600080fd5b505af11580156114d3573d6000803e3d6000fd5b505050506040513d60208110156114e957600080fd5b505050505050565b600033600160a060020a03861614611553576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000612151565b604080516001608060020a03198c166020808301919091526c01000000000000000000000000600160a060020a03808e16820260308501528c16026044830152605882018a90527e0100000000000000000000000000000000000000000000000000000000000061ffff8a160260788301528251605a818403018152607a90920192839052815160009384938493909282918401908083835b6020831061161a5780518252601f1990920191602091820191016115fb565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008181526004909252929020549196505060ff161591506116b09050576040805160e560020a62461bcd02815260206004820152601460248201527f547261646520616c726561647920657869737473000000000000000000000000604482015290519081900360640190fd5b60408051602080820186905260e060020a63ffffffff808d168202848601528b1602604483015282516028818403018152604890920192839052815191929182918401908083835b602083106117175780518252601f1990920191602091820191016116f8565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600254909550600160a060020a031692506117619150849050888888611a0f565b600160a060020a0316146117bf576040805160e560020a62461bcd02815260206004820152600f60248201527f4d7573742062652072656c617965720000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8716421061181c576040805160e560020a62461bcd02815260206004820152601560248201527f5369676e61747572652068617320657870697265640000000000000000000000604482015290519081900360640190fd5b893414801561182b5750600034115b1515611881576040805160e560020a62461bcd02815260206004820152601460248201527f496e636f72726563742065746865722073656e74000000000000000000000000604482015290519081900360640190fd5b63ffffffff88161561189557874201611898565b60015b604080516060810182526001815263ffffffff808416602080840191825260008486018181528a8252600490925285812094518554935192516001608060020a0316650100000000000274ffffffffffffffffffffffffffffffff000000000019939095166101000264ffffffff001991151560ff199095169490941716929092171691909117909155905191925084917f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c9190a250505050505050505050505050565b600154600160a060020a031633146119ac576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b604080518082018252601c8082527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208084019182529351600094859385938b939092019182918083835b60208310611a7a5780518252601f199092019160209182019101611a5b565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310611ada5780518252601f199092019160209182019101611abb565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080845283830180875282905260ff8e1684870152606084018d9052608084018c905294519097506001965060a080840196509194601f19820194509281900390910191865af1158015611b5a573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b611b786123c4565b604080516001608060020a031988166020808301919091526c01000000000000000000000000600160a060020a03808a16820260308501528816026044830152605882018690527e0100000000000000000000000000000000000000000000000000000000000061ffff86160260788301528251605a818403018152607a909201928390528151600093849392909182918401908083835b60208310611c2f5780518252601f199092019160209182019101611c10565b518151602093840361010090810a6000190180199093169290911691909117909152604080519390950183900383206000818152600484528690206060850187525460ff81161515855291820463ffffffff16928401929092526501000000000090046001608060020a0316938201939093529c919b50909950505050505050505050565b6000611cbe6123c4565b600080611cce8a8a8a8a8a611b70565b815191945092501515611ce45760009350611d72565b600254600160a060020a03163314611cfd576000611d05565b61b4af85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917fd9b627ddaa414e8e6c82366cc9c179f6281d73968827cc17038a56852e28ac8b9190a2611d6d8988836000612205565b600193505b5050509695505050505050565b6000611d896123c4565b600080611d998a8a8a8a8a611b70565b815191945092501515611daf5760009350611d72565b6001836020015163ffffffff16111580611dd2575042836020015163ffffffff16115b15611de05760009350611d72565b600254600160a060020a03163314611df9576000611e01565b61b6df85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f366d2b4e6cc37ecebb3d7d41df6d581634fd8137412710a1e086e4ca4656bb589190a2611d6d8988836000612205565b6000611e736123c4565b6000611e828989898989611b70565b815191935091501515611e985760009250611f19565b602082015163ffffffff161515611eb25760009250611f19565b600081815260046020526040808220805464ffffffff00191690555182917fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb91a2600254600160a060020a0316331415611f1457611f14816171108601612269565b600192505b50509695505050505050565b6000611f2f6123c4565b6000611f3e8989898989611b70565b815191935091501515611f545760009250611f19565b816020015163ffffffff166001141515611f715760009250611f19565b60025460008281526004602052604080822080544263ffffffff740100000000000000000000000000000000000000009096048616019094166101000264ffffffff001990941693909317909255905182917f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab91a2600254600160a060020a0316331415611f1457611f14816173438601612269565b6000806120188d858a8a8a8a6122bb565b90508a600160a060020a031681600160a060020a031614156120745760ff8416600114156120555761204e8d8d8d8d8d88611e69565b9150612141565b60ff84166002141561206f5761204e8d8d8d8d8d88611cb4565b612141565b8b600160a060020a031681600160a060020a031614156120dc5760ff8416600514156120a85761204e8d8d8d8d8d88612151565b60ff8416600314156120c25761204e8d8d8d8d8d88611d7f565b60ff84166004141561206f5761204e8d8d8d8d8d88611f25565b33600160a060020a038d161461213c576040805160e560020a62461bcd02815260206004820152601260248201527f556e7265636f676e697365642070617274790000000000000000000000000000604482015290519081900360640190fd5b600091505b509b9a5050505050505050505050565b600061215b6123c4565b60008061216b8a8a8a8a8a611b70565b8151919450925015156121815760009350611d72565b600254600160a060020a0316331461219a5760006121a2565b61b5fc85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d149190a2611d6d888883895b61271061ffff82168402046001608060020a0383160180840384101561222a576113ee565b6003805482019055604051600160a060020a0386169082860380156108fc02916000818181858888f193505050501580156114e9573d6000803e3d6000fd5b600091825260046020526040909120805474ffffffffffffffffffffffffffffffff00000000001981163a90930265010000000000918290046001608060020a03908116919091011602919091179055565b604080516001608060020a031988166020808301919091527f010000000000000000000000000000000000000000000000000000000000000060ff89160260308301527001000000000000000000000000000000006001608060020a038816026031830152825160218184030181526041909201928390528151600093849392909182918401908083835b602083106123655780518252601f199092019160209182019101612346565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050856001608060020a03163a11156123aa576123b9565b6123b681868686611a0f565b91505b509695505050505050565b60408051606081018252600080825260208201819052918101919091529056004d757374206265206f776e657200000000000000000000000000000000000000a165627a7a72305820654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b6830029


   Swarm Source:
bzzr://654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b683
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.