Contract Overview |  Ethfinex_Trustless
Balance: 0 Ether
Ether Value: $0
Transactions: 6779 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xe1f3c653248de6894d683cb2f10de7ca2253046fat txn 0x5a1fd20ae25f77649d04fdf1439feb555ec9de275b29a83f6c4b12ee2fb5480a
 Latest 25 transactions from a total of 6779 transactions

TxHash Age From To Value [TxFee]
0x7cb2783a0ec78bf16dab638d96c61ab3998dc4c852e83da7f1be41f4be7b02042 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00167604
0xf5625ebfc02940e01c3cd829a68f8c5cdf1f93d8013a43a54728acd8dafdc2988 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00167668
0x5ecd5228457afea719d8220e7658d687cf030ee560c8b39ce320a8dfaed43d7e13 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00250285
0xd344707948ac7f4e046f7ef189d62dce43a2db464cedf9cb55e684622e86776d14 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00167604
0x9be95af674d0e26c4785427b7fa0413e9e5c9d6952c180ddb760f893b1c854e224 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137933
0xe70e52a6f2059485a54a9c19220c990cc9b12383222a1c2542e3ec4059239d5325 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00279764
0x949ebe7997685b427486c3c9f60fe872329a991e6858c8c33cba7136d10023781 hr 29 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00250349
0xcc92ad1f198cdf995013f0b116742aa92d52d21d8da8b29dc3cd3238ed2f597c1 hr 34 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137997
0x17effcc77f6c4336acd8b94f65027f3559273f70e14f152d0b35bb0c380d38e91 hr 39 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137856
0x174457d60be3e7c42381dd6443eb34ab5a19c4fc5df91f85376b582a676fb7081 hr 47 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137933
0xe480b300632ee18af1127bbb5024e76dac40fcff0a661f5dfd6cf05a9f2439331 hr 48 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00279956
0x1321bacdbb21577845d487baa67b44d2e7d84cecd8d0e4eab756e885f77ed8911 hr 50 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00250029
0x0bdad357df0e1f842da0368aeae1302795595f0e7e53a97328e8679c7a5791a41 hr 52 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00250221
0x4b9b852af798aadc4cd1a4853e5e6660a22ad708c1d2efc8633ac483865a302b1 hr 54 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137933
0x2cb5f0e553b1570cf900a6a6e3a9af688920bc7496b4eed05a17166880ab587f1 hr 54 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00534094
0xb610d00625f02f981429538b05257b3f64b44ce3ce10dbf5ac721f6037d4963e2 hrs ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.0036226
0x0d0bb3bc8b5b7fdafb575bb60460d66d323161d15e5f74a569a831dd3552b5552 hrs ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00167412
0x0be6839c75ee37ca95f590db794495fd7e9d454ffc9b9dda78d94c4022b99e342 hrs 1 min ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137869
0x740a1c6700f47c5989747bab4b25ea78d6af20dac01e51fba783323696ea8c252 hrs 2 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137933
0x4fe91488e3324fd43e40cfb7663afe70a3dfe0164f276dfb237921fc79cffd072 hrs 3 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00250349
0x76463c7eb20ecae593d538c1156f9755773c5a55890c6ed21a736cc3fff4d69b2 hrs 4 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00475264
0xac655253b84cadb1171993c50b9c5451fd91d36154a4e8d31938438caf0f35c72 hrs 6 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00250349
0x18e883039eaea85e401bee53cc5777a294aa68d311dec95cff432bba4476c3212 hrs 7 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00587571
0x3885b0ae3bab751b962653cb0f236bd08811195496117bcd9cdcd32741f8ac0d2 hrs 8 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00646785
0x335e36b20379ae80b6280b58193fcb128157ba2f2847e07e5a84ed080ac5546e2 hrs 13 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1  IN   Ethfinex_Trustless0 Ether0.00137869
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 1 Internal Transaction

ParentTxHash Block Age From To Value
0x5a1fd20ae25f77649d04fdf1439feb555ec9de275b29a83f6c4b12ee2fb5480a6293901138 days 1 hr ago0xdcdb42c9a256690bd153a7b409751adfc8dd5851  Contract Creation0 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: ExchangeEfx
Compiler Text: v0.4.19+commit.c4cbbb05
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

/*

  Copyright 2018 Ethfinex Inc

  This is a derivative work based on software developed by ZeroEx Intl
  This and the original are licensed under Apache License, Version 2.0

  Original attribution:

  Copyright 2017 ZeroEx Intl.

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

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

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity 0.4.19; // MUST BE COMPILED WITH COMPILER VERSION 0.4.19

contract Owned { address public owner; } // GR ADDITION

interface Token {

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address _to, uint _value) public returns (bool);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint _value) public returns (bool);

    /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of wei to be approved for transfer
    /// @return Whether the approval was successful or not
    function approve(address _spender, uint _value) public returns (bool);

    /// @param _owner The address from which the balance will be retrieved
    /// @return The balance
    function balanceOf(address _owner) public view returns (uint);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent
    function allowance(address _owner, address _spender) public view returns (uint);

    event Transfer(address indexed _from, address indexed _to, uint _value); // solhint-disable-line
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}


//solhint-disable-next-line
/// @title TokenTransferProxy - Transfers tokens on behalf of exchange
/// @author Ahmed Ali <[email protected]>
contract TokenTransferProxy {

    modifier onlyExchange {
        require(msg.sender == exchangeAddress);
        _;
    }

    address public exchangeAddress;


    event LogAuthorizedAddressAdded(address indexed target, address indexed caller);

    function TokenTransferProxy() public {
        setExchange(msg.sender);
    }
    /*
     * Public functions
     */

    /// @dev Calls into ERC20 Token contract, invoking transferFrom.
    /// @param token Address of token to transfer.
    /// @param from Address to transfer token from.
    /// @param to Address to transfer token to.
    /// @param value Amount of token to transfer.
    /// @return Success of transfer.
    function transferFrom(
        address token,
        address from,
        address to,
        uint value)
        public
        onlyExchange
        returns (bool)
    {
        return Token(token).transferFrom(from, to, value);
    }

    /// @dev Used to set exchange address
    /// @param _exchange the address of the exchange
    function setExchange(address _exchange) internal {
        require(exchangeAddress == address(0));
        exchangeAddress = _exchange;
    }
}

contract SafeMath {
    function safeMul(uint a, uint b)
        internal
        pure
        returns (uint256)
    {
        uint c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function safeDiv(uint a, uint b)
        internal
        pure
        returns (uint256)
    {
        uint c = a / b;
        return c;
    }

    function safeSub(uint a, uint b)
        internal
        pure
        returns (uint256)
    {
        assert(b <= a);
        return a - b;
    }

    function safeAdd(uint a, uint b)
        internal
        pure
        returns (uint256)
    {
        uint c = a + b;
        assert(c >= a);
        return c;
    }

    function max64(uint64 a, uint64 b)
        internal
        pure
        returns (uint256)
    {
        return a >= b ? a : b;
    }

    function min64(uint64 a, uint64 b)
        internal
        pure
        returns (uint256)
    {
        return a < b ? a : b;
    }

    function max256(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        return a >= b ? a : b;
    }

    function min256(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        return a < b ? a : b;
    }
}


/// @title ExchangeEfx - Facilitates exchange of ERC20 tokens.
/// @author Amir Bandeali - <[email protected]>, Will Warren - <[email protected]>
// Modified by Ahmed Ali <[email protected]>
contract ExchangeEfx is SafeMath {

    // Error Codes
    enum Errors {
        ORDER_EXPIRED,                    // Order has already expired
        ORDER_FULLY_FILLED_OR_CANCELLED,  // Order has already been fully filled or cancelled
        ROUNDING_ERROR_TOO_LARGE,         // Rounding error too large
        INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
    }

    string constant public VERSION = "ETHFX.0.0";
    uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 4999;    // Changes to state require at least 5000 gas
    uint constant public ETHFINEX_FEE = 400; // Amount - (Amount/fee) is what gets send to user

    // address public TOKEN_TRANSFER_PROXY_CONTRACT;
    address public TOKEN_TRANSFER_PROXY_CONTRACT;

    // Mappings of orderHash => amounts of takerTokenAmount filled or cancelled.
    mapping (bytes32 => uint) public filled;
    mapping (bytes32 => uint) public cancelled;

    // GR ADDITION
    // Mapping of signer => validator => approved
    mapping (address => mapping (address => bool)) public allowedValidators;

    event LogFill(
        address indexed maker,
        address taker,
        address indexed feeRecipient,
        address makerToken,
        address takerToken,
        uint filledMakerTokenAmount,
        uint filledTakerTokenAmount,
        uint paidMakerFee,
        uint paidTakerFee,
        bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
        bytes32 orderHash
    );

    event LogCancel(
        address indexed maker,
        address indexed feeRecipient,
        address makerToken,
        address takerToken,
        uint cancelledMakerTokenAmount,
        uint cancelledTakerTokenAmount,
        bytes32 indexed tokens,
        bytes32 orderHash
    );

    event LogError(uint8 indexed errorId, bytes32 indexed orderHash);

    event SignatureValidatorApproval(
        address indexed signerAddress,     // Address that approves or disapproves a contract to verify signatures.
        address indexed validatorAddress,  // Address of signature validator contract.
        bool approved                      // Approval or disapproval of validator contract.
    );

    struct Order {
        address maker;
        address taker;
        address makerToken;
        address takerToken;
        address feeRecipient;
        uint makerTokenAmount;
        uint takerTokenAmount;
        uint makerFee;
        uint takerFee;
        uint expirationTimestampInSec;
        bytes32 orderHash;
    }

    // MODIFIED CODE, constructor changed
    function ExchangeEfx() public {
        // ZRX_TOKEN_CONTRACT = _zrxToken;
        TOKEN_TRANSFER_PROXY_CONTRACT = address(new TokenTransferProxy());
    }

    /*
    * Core exchange functions
    */

    /// @dev Fills the input order.
    /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
    /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
    /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
    /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
    /// @param v ECDSA signature parameter v.
    /// @param r ECDSA signature parameters r.
    /// @param s ECDSA signature parameters s.
    /// @return Total amount of takerToken filled in trade.
    function fillOrder(
          address[5] orderAddresses,
          uint[6] orderValues,
          uint fillTakerTokenAmount,
          bool shouldThrowOnInsufficientBalanceOrAllowance,
          uint8 v,
          bytes32 r,
          bytes32 s)
          public
          returns (uint filledTakerTokenAmount)
    {
        Order memory order = Order({
            maker: orderAddresses[0],
            taker: orderAddresses[1],
            makerToken: orderAddresses[2],
            takerToken: orderAddresses[3],
            feeRecipient: orderAddresses[4],
            makerTokenAmount: orderValues[0],
            takerTokenAmount: orderValues[1],
            makerFee: orderValues[2],
            takerFee: orderValues[3],
            expirationTimestampInSec: orderValues[4],
            orderHash: getOrderHash(orderAddresses, orderValues)
        });

        require(order.taker == address(0) || order.taker == msg.sender);
        require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && fillTakerTokenAmount > 0);

        require(isValidSignature(
            order.maker,
            order.orderHash,
            v,
            r,
            s
        ));

        if (block.timestamp >= order.expirationTimestampInSec) {
            LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
            return 0;
        }

        uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
        filledTakerTokenAmount = min256(fillTakerTokenAmount, remainingTakerTokenAmount);
        if (filledTakerTokenAmount == 0) {
            LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
            return 0;
        }

        if (isRoundingError(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount)) {
            LogError(uint8(Errors.ROUNDING_ERROR_TOO_LARGE), order.orderHash);
            return 0;
        }

        if (!shouldThrowOnInsufficientBalanceOrAllowance && !isTransferable(order, filledTakerTokenAmount)) {
            LogError(uint8(Errors.INSUFFICIENT_BALANCE_OR_ALLOWANCE), order.orderHash);
            return 0;
        }

        /////////////// modified code /////////////////
        uint filledMakerTokenAmount = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
        ///////////// modified code ///////////

        uint paidMakerFee;
        uint paidTakerFee;
        filled[order.orderHash] = safeAdd(filled[order.orderHash], filledTakerTokenAmount);
        require(transferViaTokenTransferProxy(
            order.makerToken,
            order.maker,
            msg.sender,
            filledMakerTokenAmount
        ));
        require(transferViaTokenTransferProxy(
            order.takerToken,
            msg.sender,
            order.maker,
            filledTakerTokenAmount - safeDiv(filledTakerTokenAmount, ETHFINEX_FEE)
        ));
        // if (order.feeRecipient != address(0)) {
        //     if (order.makerFee > 0) {
        //         paidMakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerFee);
        //         require(transferViaTokenTransferProxy(
        //             ZRX_TOKEN_CONTRACT,
        //             order.maker,
        //             order.feeRecipient,
        //             paidMakerFee
        //         ));
        //     }
        //     if (order.takerFee > 0) {
        //         paidTakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.takerFee);
        //         require(transferViaTokenTransferProxy(
        //             ZRX_TOKEN_CONTRACT,
        //             msg.sender,
        //             order.feeRecipient,
        //             paidTakerFee
        //         ));
        //     }
        // }

        LogFill(
            order.maker,
            msg.sender,
            order.feeRecipient,
            order.makerToken,
            order.takerToken,
            filledMakerTokenAmount,
            filledTakerTokenAmount,
            paidMakerFee,
            paidTakerFee,
            keccak256(order.makerToken, order.takerToken),
            order.orderHash
        );
        return filledTakerTokenAmount;
    }

    /// @dev Cancels the input order.
    /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
    /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
    /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
    /// @return Amount of takerToken cancelled.
    // function cancelOrder(
    //     address[5] orderAddresses,
    //     uint[6] orderValues,
    //     uint cancelTakerTokenAmount)
    //     public
    //     returns (uint)
    // {
    //     Order memory order = Order({
    //         maker: orderAddresses[0],
    //         taker: orderAddresses[1],
    //         makerToken: orderAddresses[2],
    //         takerToken: orderAddresses[3],
    //         feeRecipient: orderAddresses[4],
    //         makerTokenAmount: orderValues[0],
    //         takerTokenAmount: orderValues[1],
    //         makerFee: orderValues[2],
    //         takerFee: orderValues[3],
    //         expirationTimestampInSec: orderValues[4],
    //         orderHash: getOrderHash(orderAddresses, orderValues)
    //     });

    //     require(order.maker == msg.sender);
    //     require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && cancelTakerTokenAmount > 0);

    //     if (block.timestamp >= order.expirationTimestampInSec) {
    //         LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
    //         return 0;
    //     }

    //     uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
    //     uint cancelledTakerTokenAmount = min256(cancelTakerTokenAmount, remainingTakerTokenAmount);
    //     if (cancelledTakerTokenAmount == 0) {
    //         LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
    //         return 0;
    //     }

    //     cancelled[order.orderHash] = safeAdd(cancelled[order.orderHash], cancelledTakerTokenAmount);

    //     LogCancel(
    //         order.maker,
    //         order.feeRecipient,
    //         order.makerToken,
    //         order.takerToken,
    //         getPartialAmount(cancelledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount),
    //         cancelledTakerTokenAmount,
    //         keccak256(order.makerToken, order.takerToken),
    //         order.orderHash
    //     );
    //     return cancelledTakerTokenAmount;
    // }

    /*
    * Wrapper functions
    */

    /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
    /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
    /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
    /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
    /// @param v ECDSA signature parameter v.
    /// @param r ECDSA signature parameters r.
    /// @param s ECDSA signature parameters s.
    function fillOrKillOrder(
        address[5] orderAddresses,
        uint[6] orderValues,
        uint fillTakerTokenAmount,
        uint8 v,
        bytes32 r,
        bytes32 s)
        public
    {
        require(fillOrder(
            orderAddresses,
            orderValues,
            fillTakerTokenAmount,
            false,
            v,
            r,
            s
        ) == fillTakerTokenAmount);
    }

    /// @dev Synchronously executes multiple fill orders in a single transaction.
    /// @param orderAddresses Array of address arrays containing individual order addresses.
    /// @param orderValues Array of uint arrays containing individual order values.
    /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
    /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
    /// @param v Array ECDSA signature v parameters.
    /// @param r Array of ECDSA signature r parameters.
    /// @param s Array of ECDSA signature s parameters.
    function batchFillOrders(
        address[5][] orderAddresses,
        uint[6][] orderValues,
        uint[] fillTakerTokenAmounts,
        bool shouldThrowOnInsufficientBalanceOrAllowance,
        uint8[] v,
        bytes32[] r,
        bytes32[] s)
        public
    {
        for (uint i = 0; i < orderAddresses.length; i++) {
            fillOrder(
                orderAddresses[i],
                orderValues[i],
                fillTakerTokenAmounts[i],
                shouldThrowOnInsufficientBalanceOrAllowance,
                v[i],
                r[i],
                s[i]
            );
        }
    }

    /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
    /// @param orderAddresses Array of address arrays containing individual order addresses.
    /// @param orderValues Array of uint arrays containing individual order values.
    /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
    /// @param v Array ECDSA signature v parameters.
    /// @param r Array of ECDSA signature r parameters.
    /// @param s Array of ECDSA signature s parameters.
    function batchFillOrKillOrders(
        address[5][] orderAddresses,
        uint[6][] orderValues,
        uint[] fillTakerTokenAmounts,
        uint8[] v,
        bytes32[] r,
        bytes32[] s)
        public
    {
        for (uint i = 0; i < orderAddresses.length; i++) {
            fillOrKillOrder(
                orderAddresses[i],
                orderValues[i],
                fillTakerTokenAmounts[i],
                v[i],
                r[i],
                s[i]
            );
        }
    }

    /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
    /// @param orderAddresses Array of address arrays containing individual order addresses.
    /// @param orderValues Array of uint arrays containing individual order values.
    /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
    /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
    /// @param v Array ECDSA signature v parameters.
    /// @param r Array of ECDSA signature r parameters.
    /// @param s Array of ECDSA signature s parameters.
    /// @return Total amount of fillTakerTokenAmount filled in orders.
    function fillOrdersUpTo(
        address[5][] orderAddresses,
        uint[6][] orderValues,
        uint fillTakerTokenAmount,
        bool shouldThrowOnInsufficientBalanceOrAllowance,
        uint8[] v,
        bytes32[] r,
        bytes32[] s)
        public
        returns (uint)
    {
        uint filledTakerTokenAmount = 0;
        for (uint i = 0; i < orderAddresses.length; i++) {
            require(orderAddresses[i][3] == orderAddresses[0][3]); // takerToken must be the same for each order
            filledTakerTokenAmount = safeAdd(filledTakerTokenAmount, fillOrder(
                orderAddresses[i],
                orderValues[i],
                safeSub(fillTakerTokenAmount, filledTakerTokenAmount),
                shouldThrowOnInsufficientBalanceOrAllowance,
                v[i],
                r[i],
                s[i]
            ));
            if (filledTakerTokenAmount == fillTakerTokenAmount) break;
        }
        return filledTakerTokenAmount;
    }

    /// @dev Synchronously cancels multiple orders in a single transaction.
    /// @param orderAddresses Array of address arrays containing individual order addresses.
    /// @param orderValues Array of uint arrays containing individual order values.
    /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
    // function batchCancelOrders(
    //     address[5][] orderAddresses,
    //     uint[6][] orderValues,
    //     uint[] cancelTakerTokenAmounts)
    //     public
    // {
    //     for (uint i = 0; i < orderAddresses.length; i++) {
    //         cancelOrder(
    //             orderAddresses[i],
    //             orderValues[i],
    //             cancelTakerTokenAmounts[i]
    //         );
    //     }
    // }

    /*
    * Constant public functions
    */

    /// @dev Calculates Keccak-256 hash of order with specified parameters.
    /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
    /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
    /// @return Keccak-256 hash of order.
    function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
        public
        constant
        returns (bytes32)
    {
        return keccak256(
            address(this),
            orderAddresses[0], // maker
            orderAddresses[1], // taker
            orderAddresses[2], // makerToken
            orderAddresses[3], // takerToken
            orderAddresses[4], // feeRecipient
            orderValues[0],    // makerTokenAmount
            orderValues[1],    // takerTokenAmount
            orderValues[2],    // makerFee
            orderValues[3],    // takerFee
            orderValues[4],    // expirationTimestampInSec
            orderValues[5]     // salt
        );
    }


    /// @dev Verifies that an order signature is valid.
    /// @param maker address of maker.
    /// @param hash Signed Keccak-256 hash.
    /// @param v ECDSA signature parameter v.
    /// @param r ECDSA signature parameters r.
    /// @param s ECDSA signature parameters s.
    /// @return Validity of order signature.
    function isValidSignature(
        address maker,
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s)
        public
        //pure
        view // GR ADDITION
        returns (bool)
    {
        address validator = ecrecover(
            keccak256("\x19Ethereum Signed Message:\n32", hash),
            v,
            r,
            s
        );

        if (allowedValidators[maker][validator]) {
            return true;
        } else if (isContract(maker)) {
            return Owned(maker).owner() == validator;
        } else {
            return maker == validator;
        }
    }

    /// @dev Checks if rounding error > 0.1%.
    /// @param numerator Numerator.
    /// @param denominator Denominator.
    /// @param target Value to multiply with numerator/denominator.
    /// @return Rounding error is present.
    function isRoundingError(uint numerator, uint denominator, uint target)
        public
        pure
        returns (bool)
    {
        uint remainder = mulmod(target, numerator, denominator);
        if (remainder == 0) return false; // No rounding error.

        uint errPercentageTimes1000000 = safeDiv(
            safeMul(remainder, 1000000),
            safeMul(numerator, target)
        );
        return errPercentageTimes1000000 > 1000;
    }

    /// @dev Calculates partial value given a numerator and denominator.
    /// @param numerator Numerator.
    /// @param denominator Denominator.
    /// @param target Value to calculate partial of.
    /// @return Partial value of target.
    function getPartialAmount(uint numerator, uint denominator, uint target)
        public
        pure
        returns (uint)
    {
        return safeDiv(safeMul(numerator, target), denominator);
    }

    /// @dev Calculates the sum of values already filled and cancelled for a given order.
    /// @param orderHash The Keccak-256 hash of the given order.
    /// @return Sum of values already filled and cancelled.
    function getUnavailableTakerTokenAmount(bytes32 orderHash)
        public
        constant
        returns (uint)
    {
        return safeAdd(filled[orderHash], cancelled[orderHash]);
    }


    /*
    * Internal functions
    */

    /// @dev Transfers a token using TokenTransferProxy transferFrom function.
    /// @param token Address of token to transferFrom.
    /// @param from Address transfering token.
    /// @param to Address receiving token.
    /// @param value Amount of token to transfer.
    /// @return Success of token transfer.
    function transferViaTokenTransferProxy(
        address token,
        address from,
        address to,
        uint value)
        internal
        returns (bool)
    {
        return TokenTransferProxy(TOKEN_TRANSFER_PROXY_CONTRACT).transferFrom(token, from, to, value);
    }

    /// @dev Checks if any order transfers will fail.
    /// @param order Order struct of params that will be checked.
    /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
    /// @return Predicted result of transfers.
    function isTransferable(Order order, uint fillTakerTokenAmount)
        internal
        constant  // The called token contracts may attempt to change state, but will not be able to due to gas limits on getBalance and getAllowance.
        returns (bool)
    {
        address taker = msg.sender;
        uint fillMakerTokenAmount = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);

        // if (order.feeRecipient != address(0)) {
        //     bool isMakerTokenZRX = order.makerToken == ZRX_TOKEN_CONTRACT;
        //     bool isTakerTokenZRX = order.takerToken == ZRX_TOKEN_CONTRACT;
        //     uint paidMakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerFee);
        //     uint paidTakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.takerFee);
        //     uint requiredMakerZRX = isMakerTokenZRX ? safeAdd(fillMakerTokenAmount, paidMakerFee) : paidMakerFee;
        //     uint requiredTakerZRX = isTakerTokenZRX ? safeAdd(fillTakerTokenAmount, paidTakerFee) : paidTakerFee;

        //     if (   getBalance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
        //         || getAllowance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
        //         || getBalance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
        //         || getAllowance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
        //     ) return false;

        //     if (!isMakerTokenZRX && (   getBalance(order.makerToken, order.maker) < fillMakerTokenAmount // Don't double check makerToken if ZRX
        //                              || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount)
        //     ) return false;
        //     if (!isTakerTokenZRX && (   getBalance(order.takerToken, taker) < fillTakerTokenAmount // Don't double check takerToken if ZRX
        //                              || getAllowance(order.takerToken, taker) < fillTakerTokenAmount)
        //     ) return false;
        // } else if (   getBalance(order.makerToken, order.maker) < fillMakerTokenAmount
        //            || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount
        //            || getBalance(order.takerToken, taker) < fillTakerTokenAmount
        //            || getAllowance(order.takerToken, taker) < fillTakerTokenAmount
        // ) return false;

        ///////// added code, copied from above ///////

        if (   getBalance(order.makerToken, order.maker) < fillMakerTokenAmount
                   || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount
                   || getBalance(order.takerToken, taker) < fillTakerTokenAmount
                   || getAllowance(order.takerToken, taker) < fillTakerTokenAmount
        ) return false;

        return true;
    }

    /// @dev Get token balance of an address.
    /// @param token Address of token.
    /// @param owner Address of owner.
    /// @return Token balance of owner.
    function getBalance(address token, address owner)
        internal
        constant  // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
        returns (uint)
    {
        return Token(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner); // Limit gas to prevent reentrancy
    }

    /// @dev Get allowance of token given to TokenTransferProxy by an address.
    /// @param token Address of token.
    /// @param owner Address of owner.
    /// @return Allowance of token given to TokenTransferProxy by owner.
    function getAllowance(address token, address owner)
        internal
        constant  // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
        returns (uint)
    {
        return Token(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY_CONTRACT); // Limit gas to prevent reentrancy
    }

    // GR ADDITION
    /// @dev Determines whether an address is an account or a contract
    /// @param _target Address to be inspected
    /// @return Boolean the address is a contract
    /// @notice if it is a contract, we use this function to lookup for the owner
    function isContract(address _target)
        internal view
        returns (bool)
    {
        uint size;
        assembly {
            size := extcodesize(_target)
        }
        return size > 0;
    }

    /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.
    /// @param validatorAddress Address of Validator contract.
    /// @param approval Approval or disapproval of  Validator contract.
    function setSignatureValidatorApproval(
        address validatorAddress,
        bool approval
    )
        external
    {
        address signerAddress = msg.sender;
        allowedValidators[signerAddress][validatorAddress] = approval;
        SignatureValidatorApproval(
            signerAddress,
            validatorAddress,
            approval
        );
    }
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"numerator","type":"uint256"},{"name":"denominator","type":"uint256"},{"name":"target","type":"uint256"}],"name":"isRoundingError","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"filled","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"cancelled","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderAddresses","type":"address[5][]"},{"name":"orderValues","type":"uint256[6][]"},{"name":"fillTakerTokenAmount","type":"uint256"},{"name":"shouldThrowOnInsufficientBalanceOrAllowance","type":"bool"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"}],"name":"fillOrdersUpTo","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ETHFINEX_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderAddresses","type":"address[5][]"},{"name":"orderValues","type":"uint256[6][]"},{"name":"fillTakerTokenAmounts","type":"uint256[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"}],"name":"batchFillOrKillOrders","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"orderAddresses","type":"address[5]"},{"name":"orderValues","type":"uint256[6]"},{"name":"fillTakerTokenAmount","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"fillOrKillOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"validatorAddress","type":"address"},{"name":"approval","type":"bool"}],"name":"setSignatureValidatorApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowedValidators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderHash","type":"bytes32"}],"name":"getUnavailableTakerTokenAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"},{"name":"hash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"isValidSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"numerator","type":"uint256"},{"name":"denominator","type":"uint256"},{"name":"target","type":"uint256"}],"name":"getPartialAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_TRANSFER_PROXY_CONTRACT","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderAddresses","type":"address[5][]"},{"name":"orderValues","type":"uint256[6][]"},{"name":"fillTakerTokenAmounts","type":"uint256[]"},{"name":"shouldThrowOnInsufficientBalanceOrAllowance","type":"bool"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"}],"name":"batchFillOrders","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"orderAddresses","type":"address[5]"},{"name":"orderValues","type":"uint256[6]"},{"name":"fillTakerTokenAmount","type":"uint256"},{"name":"shouldThrowOnInsufficientBalanceOrAllowance","type":"bool"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"fillOrder","outputs":[{"name":"filledTakerTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"orderAddresses","type":"address[5]"},{"name":"orderValues","type":"uint256[6]"}],"name":"getOrderHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXTERNAL_QUERY_GAS_LIMIT","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"taker","type":"address"},{"indexed":true,"name":"feeRecipient","type":"address"},{"indexed":false,"name":"makerToken","type":"address"},{"indexed":false,"name":"takerToken","type":"address"},{"indexed":false,"name":"filledMakerTokenAmount","type":"uint256"},{"indexed":false,"name":"filledTakerTokenAmount","type":"uint256"},{"indexed":false,"name":"paidMakerFee","type":"uint256"},{"indexed":false,"name":"paidTakerFee","type":"uint256"},{"indexed":true,"name":"tokens","type":"bytes32"},{"indexed":false,"name":"orderHash","type":"bytes32"}],"name":"LogFill","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":true,"name":"feeRecipient","type":"address"},{"indexed":false,"name":"makerToken","type":"address"},{"indexed":false,"name":"takerToken","type":"address"},{"indexed":false,"name":"cancelledMakerTokenAmount","type":"uint256"},{"indexed":false,"name":"cancelledTakerTokenAmount","type":"uint256"},{"indexed":true,"name":"tokens","type":"bytes32"},{"indexed":false,"name":"orderHash","type":"bytes32"}],"name":"LogCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"errorId","type":"uint8"},{"indexed":true,"name":"orderHash","type":"bytes32"}],"name":"LogError","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"signerAddress","type":"address"},{"indexed":true,"name":"validatorAddress","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"SignatureValidatorApproval","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6060604052341561000f57600080fd5b610017610052565b604051809103906000f080151561002d57600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055610062565b6040516102748061177c83390190565b61170b806100716000396000f3006060604052600436106100e25763ffffffff60e060020a60003504166314df96ee81146100e7578063288cdc91146101175780632ac126221461013f578063363349be146101555780633f01dc991461031a5780634f1507871461032d578063741bcc931461052057806377fcce68146105965780637b8e3514146105ba5780637e9abb50146105df5780638163681e146105f557806398024a8b14610623578063add1cbc51461063f578063b7b2c7d61461066e578063bc61394a1461086a578063cfc4d0ec146108e7578063f06bbf7514610948578063ffa1ad7414610972575b600080fd5b34156100f257600080fd5b6101036004356024356044356109fc565b604051901515815260200160405180910390f35b341561012257600080fd5b61012d600435610a49565b60405190815260200160405180910390f35b341561014a57600080fd5b61012d600435610a5b565b341561016057600080fd5b61012d60046024813581810190830135806020818102016040519081016040528181529291906000602085015b828210156101c95760a08083028601906005906040519081016040529190828260a080828437505050918352505060019091019060200161018d565b505050505091908035906020019082018035906020019080806020026020016040519081016040528181529291906000602085015b8282101561023a5760c08083028601906006906040519081016040529190828260c08082843750505091835250506001909101906020016101fe565b5050505050919080359060200190919080351515906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610a6d95505050505050565b341561032557600080fd5b61012d610b7a565b341561033857600080fd5b61051e60046024813581810190830135806020818102016040519081016040528181529291906000602085015b828210156103a15760a08083028601906005906040519081016040529190828260a0808284375050509183525050600190910190602001610365565b505050505091908035906020019082018035906020019080806020026020016040519081016040528181529291906000602085015b828210156104125760c08083028601906006906040519081016040529190828260c08082843750505091835250506001909101906020016103d6565b50505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610b8095505050505050565b005b341561052b57600080fd5b61051e600460a481600560a06040519081016040529190828260a080828437820191505050505091908060c001906006806020026040519081016040529190828260c080828437509395505083359360ff602082013516935060408101359250606001359050610c29565b34156105a157600080fd5b61051e600160a060020a03600435166024351515610c4c565b34156105c557600080fd5b610103600160a060020a0360043581169060243516610cbd565b34156105ea57600080fd5b61012d600435610cdd565b341561060057600080fd5b610103600160a060020a036004351660243560ff60443516606435608435610d07565b341561062e57600080fd5b61012d600435602435604435610e97565b341561064a57600080fd5b610652610eb4565b604051600160a060020a03909116815260200160405180910390f35b341561067957600080fd5b61051e60046024813581810190830135806020818102016040519081016040528181529291906000602085015b828210156106e25760a08083028601906005906040519081016040529190828260a08082843750505091835250506001909101906020016106a6565b505050505091908035906020019082018035906020019080806020026020016040519081016040528181529291906000602085015b828210156107535760c08083028601906006906040519081016040529190828260c0808284375050509183525050600190910190602001610717565b505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080351515906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610ec395505050505050565b341561087557600080fd5b61012d600460a481600560a06040519081016040529190828260a080828437820191505050505091908060c001906006806020026040519081016040529190828260c080828437509395505083359360208101351515935060ff60408201351692506060810135915060800135610f60565b34156108f257600080fd5b61012d600460a481600560a06040519081016040529190828260a080828437820191505050505091908060c001906006806020026040519081016040529190828260c0808284375093955061130a945050505050565b341561095357600080fd5b61095b6113d1565b60405161ffff909116815260200160405180910390f35b341561097d57600080fd5b6109856113d7565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156109c15780820151838201526020016109a9565b50505050905090810190601f1680156109ee5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000806000848685099150811515610a175760009250610a40565b610a36610a2783620f424061140e565b610a31888761140e565b611439565b90506103e8811192505b50509392505050565b60016020526000908152604090205481565b60026020526000908152604090205481565b600080805b8951811015610b6d5789600081518110610a8857fe5b9060200190602002015160600151600160a060020a03168a8281518110610aab57fe5b9060200190602002015160600151600160a060020a031614610acc57600080fd5b610b5682610b518c8481518110610adf57fe5b906020019060200201518c8581518110610af557fe5b90602001906020020151610b098d88611450565b8c8c8881518110610b1657fe5b906020019060200201518c8981518110610b2c57fe5b906020019060200201518c8a81518110610b4257fe5b90602001906020020151610f60565b611462565b915087821415610b6557610b6d565b600101610a72565b5098975050505050505050565b61019081565b60005b8651811015610c2057610c18878281518110610b9b57fe5b90602001906020020151878381518110610bb157fe5b90602001906020020151878481518110610bc757fe5b90602001906020020151878581518110610bdd57fe5b90602001906020020151878681518110610bf357fe5b90602001906020020151878781518110610c0957fe5b90602001906020020151610c29565b600101610b83565b50505050505050565b83610c3a8787876000888888610f60565b14610c4457600080fd5b505050505050565b33600160a060020a0381811660008181526003602090815260408083209488168084529490915290819020805460ff19168615151790557fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190859051901515815260200160405180910390a3505050565b600360209081526000928352604080842090915290825290205460ff1681565b6000818152600160209081526040808320546002909252822054610d019190611462565b92915050565b6000806001866040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0160405180910390208686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f11515610da857600080fd5b505060206040510351600160a060020a0380891660009081526003602090815260408083209385168352929052205490915060ff1615610deb5760019150610e8d565b610df487611471565b15610e755780600160a060020a031687600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610e4957600080fd5b6102c65a03f11515610e5a57600080fd5b50505060405180519050600160a060020a0316149150610e8d565b80600160a060020a031687600160a060020a03161491505b5095945050505050565b6000610eac610ea6858461140e565b84611439565b949350505050565b600054600160a060020a031681565b60005b8751811015610f5657610f4d888281518110610ede57fe5b90602001906020020151888381518110610ef457fe5b90602001906020020151888481518110610f0a57fe5b9060200190602002015188888681518110610f2157fe5b90602001906020020151888781518110610f3757fe5b90602001906020020151888881518110610b4257fe5b50600101610ec6565b5050505050505050565b6000610f6a611683565b600080600080610160604051908101604052808e51600160a060020a031681526020018e60016020020151600160a060020a0316815260200160408f0151600160a060020a0316815260200160608f0151600160a060020a0316815260200160808f0151600160a060020a031681526020018d5181526020018d60016020020151815260200160408e0151815260200160608e0151815260200160808e015181526020016110188f8f61130a565b9052945060006020860151600160a060020a0316148061104d575033600160a060020a03168560200151600160a060020a0316145b151561105857600080fd5b60008560a00151118015611070575060008560c00151115b801561107c575060008b115b151561108757600080fd5b61109a85518661014001518b8b8b610d07565b15156110a557600080fd5b84610120015142106110f25784610140015160005b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600095506112fa565b61110d8560c00151611108876101400151610cdd565b611450565b93506111198b85611479565b955085151561112f5784610140015160016110ba565b611142868660c001518760a001516109fc565b156111545784610140015160026110ba565b891580156111695750611167858761148f565b155b1561117b5784610140015160036110ba565b61118e868660c001518760a00151610e97565b92506111b460016000876101400151815260208101919091526040016000205487611462565b60016000876101400151815260208101919091526040908101600020919091556111e4908601518651338661151a565b15156111ef57600080fd5b61120d85606001513387516112068a610190611439565b8a0361151a565b151561121857600080fd5b846040015185606001516040516c01000000000000000000000000600160a060020a0393841681028252919092160260148201526028016040519081900390206080860151600160a060020a03168651600160a060020a03167f0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb33389604001518a60600151898d8a8a8f6101400151604051600160a060020a0398891681529688166020880152949096166040808701919091526060860193909352608085019190915260a084015260c083019390935260e082015261010001905180910390a45b5050505050979650505050505050565b600030835160208501516040860151606087015160808801518751602089015160408a015160608b015160808c015160a08d01516040516c01000000000000000000000000600160a060020a039d8e16810282529b8d168c026014820152998c168b0260288b0152978b168a02603c8a0152958a16890260508901529390981690960260648601526078850152609884019490945260b883019490945260d882019290925260f8810192909252610118820152610138016040518091039020905092915050565b61138781565b60408051908101604052600981527f45544846582e302e300000000000000000000000000000000000000000000000602082015281565b600082820283158061142a575082848281151561142757fe5b04145b151561143257fe5b9392505050565b600080828481151561144757fe5b04949350505050565b60008282111561145c57fe5b50900390565b60008282018381101561143257fe5b6000903b1190565b60008183106114885781611432565b5090919050565b600033816114a68460c08701518760a00151610e97565b9050806114b8866040015187516115b0565b10806114d15750806114cf86604001518751611621565b105b806114e85750836114e68660600151846115b0565b105b806114ff5750836114fd866060015184611621565b105b1561150d5760009250611512565b600192505b505092915050565b60008054600160a060020a03166315dacbea86868686866040516020015260405160e060020a63ffffffff8716028152600160a060020a0394851660048201529284166024840152921660448201526064810191909152608401602060405180830381600087803b151561158d57600080fd5b6102c65a03f1151561159e57600080fd5b50505060405180519695505050505050565b6000600160a060020a0383166370a082316113878460405160e060020a63ffffffff8516028152600160a060020a039091166004820152602401602060405180830381600088803b151561160357600080fd5b87f1151561161057600080fd5b505050506040518051949350505050565b60008054600160a060020a038085169163dd62ed3e916113879186911660405160e060020a63ffffffff8616028152600160a060020a03928316600482015291166024820152604401602060405180830381600088803b151561160357600080fd5b6101606040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201819052610140820152905600a165627a7a723058206d83040c889cc256c3c794ef2d15606f3a95a253d26d4992c6c220083ece28d000296060604052341561000f57600080fd5b6100253364010000000061019261002a82021704565b610062565b600054600160a060020a03161561004057600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b610203806100716000396000f30060606040526004361061004b5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166315dacbea81146100505780639cd0160514610092575b600080fd5b341561005b57600080fd5b61007e600160a060020a03600435811690602435811690604435166064356100c1565b604051901515815260200160405180910390f35b341561009d57600080fd5b6100a5610183565b604051600160a060020a03909116815260200160405180910390f35b6000805433600160a060020a039081169116146100dd57600080fd5b84600160a060020a03166323b872dd8585856000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561016057600080fd5b6102c65a03f1151561017157600080fd5b50505060405180519695505050505050565b600054600160a060020a031681565b600054600160a060020a0316156101a857600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555600a165627a7a7230582075e74845f5bf3d8ccf94117dc10527ffebe3d8bd027af0b0e97f08767c1785d60029

   Swarm Source:
bzzr://75e74845f5bf3d8ccf94117dc10527ffebe3d8bd027af0b0e97f08767c1785d6

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.