Contract 0xdcdb42c9a256690bd153a7b409751adfc8dd5851

 

TxHash Block Age From To Value [TxFee]
0x15cb4d75d54f4b26081b137f98bc3f69319a3556b6bd3b9b1d224c7b33dc392b74235221 hr 52 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002068395
0x90aca5f898688588d665c7e764cebf5d3a0548e53dfc4be9151850dbb120473674234742 hrs 5 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.0020625
0x576cfc498806f50aa768078956598f37aaeb0b513b4b94e2a4090cd9f301aad674234632 hrs 7 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002062275
0x6dde47e517b54a021f6a707548a9573f02268549c99a84f15c9671e3d605af9374234572 hrs 8 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002066475
0xfae78b5f79ba07cf9eb094cbe9f451995a23664d72b7945d43f84790a190c58974234472 hrs 11 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002067435
0x9f0ca271f428bd5ca070c57605834863722feffbfd22bdf587105917afcbb9cf74234322 hrs 14 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00251058
0x4b8fe918ed8327bb5ca5119194ae2021a66549964ea07371e86032d9361b3d7c74234192 hrs 17 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00183138
0x095ff372e8507906315f4d41e5d7ebd6a741ecaa9b8bafd29d6291d35fc8778c74226715 hrs 16 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.0020688
0x18042bad1994ce06c2349ec80a96b3386632856bc25eaf13ea6c043feee6689674225545 hrs 44 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.0025131
0x61c7fb22a26be378830867ab72b91509d46088500659cef179bc2274bc8691d474224775 hrs 58 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.0020688
0xedba3ead88f671fde139198d024aa9d99716e50db6064cd0b431042ae4343d1274224376 hrs 9 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00463947
0x98506cd2869e1f55d008cc27a80bb985f8e311a99e0745d05e13bbede4fe0a9e74222886 hrs 38 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002511945
0x20ca67305f2fefef4a5b74a6110b3baecac803a1691ae7fa57e888f02eff13a674222616 hrs 43 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002511945
0x050cac71a93479586c3474e2fd6562ce23a6ab4e6a62f3a961ba48d6536fc2eb74222586 hrs 44 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00251502
0x4e0f4a75e3be4cd2f28e7fdb1865d1835d3fb6284587846b2b51b1b89e10928874222366 hrs 50 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002069955
0xd0898f11e7e675cceb609b24b8b70364aead6298e087595039353fe2a0ded55d74222336 hrs 50 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.004644405
0x96e9072db7d77347d84f4b21d4d3eab149c5243d7bf386097417c06f5f46033a74221787 hrs 2 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00375312
0xcee52fd026f22bf4ab9bbee18212178a37c8370ff9705a866d6c46d5336433f874221727 hrs 3 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00251118
0xa935c47f53e5660b62f9d37919599a12fe10ebb9212de958f3b5dbae4838c44e74221707 hrs 4 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002513865
0xe87a25e629a19ad37fc82ccb77426c84db6b8c87d60c6647539c62771e188afe74221417 hrs 12 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.0041955
0x4bcb362072d41f69df4dbef71121d96196a64eb75b7b4d90f6db50b5f53d983874220937 hrs 23 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00419646
0x3f2ef808a294ce02e6f8b9ff4cdeee0e02b949b5f368060c63f8cc233b0583db74218038 hrs 23 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00251598
0x918af83bbec528430f25add60878493a2eb480d522b3e0f8700079b944d3740474217058 hrs 42 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.0025131
0xa64bf2bc224b967d4c5d985d11d8d4061957c74b1a0afb17d46645a3a0888ea474216998 hrs 45 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.002068035
0x19a6e16f26bf6c6e4e6d23968b5d5dd6a649bfa237f98a7c70d744aada8f6a3f74216978 hrs 45 mins ago0x61b9898c9b60a159fc91ae8026563cd226b7a0c1 IN  Ethfinex_Trustless0 Ether0.00419838
[ Download CSV Export 

Latest 1 internal transaction Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x5a1fd20ae25f77649d04fdf1439feb555ec9de275b29a83f6c4b12ee2fb5480a6293901195 days 21 hrs ago0xdcdb42c9a256690bd153a7b409751adfc8dd5851  Contract Creation0 Ether
[ Download CSV Export 

Contract Source Code Verified (Exact Match)

Contract Name:
ExchangeEfx

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

/*

  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

6060604052341561000f57600080fd5b610017610052565b604051809103906000f080151561002d57600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055610062565b6040516102748061177c83390190565b61170b806100716000396000f3006060604052600436106100e25763ffffffff60e060020a60003504166314df96ee81146100e7578063288cdc91146101175780632ac126221461013f578063363349be146101555780633f01dc991461031a5780634f1507871461032d578063741bcc931461052057806377fcce68146105965780637b8e3514146105ba5780637e9abb50146105df5780638163681e146105f557806398024a8b14610623578063add1cbc51461063f578063b7b2c7d61461066e578063bc61394a1461086a578063cfc4d0ec146108e7578063f06bbf7514610948578063ffa1ad7414610972575b600080fd5b34156100f257600080fd5b6101036004356024356044356109fc565b604051901515815260200160405180910390f35b341561012257600080fd5b61012d600435610a49565b60405190815260200160405180910390f35b341561014a57600080fd5b61012d600435610a5b565b341561016057600080fd5b61012d60046024813581810190830135806020818102016040519081016040528181529291906000602085015b828210156101c95760a08083028601906005906040519081016040529190828260a080828437505050918352505060019091019060200161018d565b505050505091908035906020019082018035906020019080806020026020016040519081016040528181529291906000602085015b8282101561023a5760c08083028601906006906040519081016040529190828260c08082843750505091835250506001909101906020016101fe565b5050505050919080359060200190919080351515906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610a6d95505050505050565b341561032557600080fd5b61012d610b7a565b341561033857600080fd5b61051e60046024813581810190830135806020818102016040519081016040528181529291906000602085015b828210156103a15760a08083028601906005906040519081016040529190828260a0808284375050509183525050600190910190602001610365565b505050505091908035906020019082018035906020019080806020026020016040519081016040528181529291906000602085015b828210156104125760c08083028601906006906040519081016040529190828260c08082843750505091835250506001909101906020016103d6565b50505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610b8095505050505050565b005b341561052b57600080fd5b61051e600460a481600560a06040519081016040529190828260a080828437820191505050505091908060c001906006806020026040519081016040529190828260c080828437509395505083359360ff602082013516935060408101359250606001359050610c29565b34156105a157600080fd5b61051e600160a060020a03600435166024351515610c4c565b34156105c557600080fd5b610103600160a060020a0360043581169060243516610cbd565b34156105ea57600080fd5b61012d600435610cdd565b341561060057600080fd5b610103600160a060020a036004351660243560ff60443516606435608435610d07565b341561062e57600080fd5b61012d600435602435604435610e97565b341561064a57600080fd5b610652610eb4565b604051600160a060020a03909116815260200160405180910390f35b341561067957600080fd5b61051e60046024813581810190830135806020818102016040519081016040528181529291906000602085015b828210156106e25760a08083028601906005906040519081016040529190828260a08082843750505091835250506001909101906020016106a6565b505050505091908035906020019082018035906020019080806020026020016040519081016040528181529291906000602085015b828210156107535760c08083028601906006906040519081016040529190828260c0808284375050509183525050600190910190602001610717565b505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080351515906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610ec395505050505050565b341561087557600080fd5b61012d600460a481600560a06040519081016040529190828260a080828437820191505050505091908060c001906006806020026040519081016040529190828260c080828437509395505083359360208101351515935060ff60408201351692506060810135915060800135610f60565b34156108f257600080fd5b61012d600460a481600560a06040519081016040529190828260a080828437820191505050505091908060c001906006806020026040519081016040529190828260c0808284375093955061130a945050505050565b341561095357600080fd5b61095b6113d1565b60405161ffff909116815260200160405180910390f35b341561097d57600080fd5b6109856113d7565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156109c15780820151838201526020016109a9565b50505050905090810190601f1680156109ee5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000806000848685099150811515610a175760009250610a40565b610a36610a2783620f424061140e565b610a31888761140e565b611439565b90506103e8811192505b50509392505050565b60016020526000908152604090205481565b60026020526000908152604090205481565b600080805b8951811015610b6d5789600081518110610a8857fe5b9060200190602002015160600151600160a060020a03168a8281518110610aab57fe5b9060200190602002015160600151600160a060020a031614610acc57600080fd5b610b5682610b518c8481518110610adf57fe5b906020019060200201518c8581518110610af557fe5b90602001906020020151610b098d88611450565b8c8c8881518110610b1657fe5b906020019060200201518c8981518110610b2c57fe5b906020019060200201518c8a81518110610b4257fe5b90602001906020020151610f60565b611462565b915087821415610b6557610b6d565b600101610a72565b5098975050505050505050565b61019081565b60005b8651811015610c2057610c18878281518110610b9b57fe5b90602001906020020151878381518110610bb157fe5b90602001906020020151878481518110610bc757fe5b90602001906020020151878581518110610bdd57fe5b90602001906020020151878681518110610bf357fe5b90602001906020020151878781518110610c0957fe5b90602001906020020151610c29565b600101610b83565b50505050505050565b83610c3a8787876000888888610f60565b14610c4457600080fd5b505050505050565b33600160a060020a0381811660008181526003602090815260408083209488168084529490915290819020805460ff19168615151790557fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190859051901515815260200160405180910390a3505050565b600360209081526000928352604080842090915290825290205460ff1681565b6000818152600160209081526040808320546002909252822054610d019190611462565b92915050565b6000806001866040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0160405180910390208686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f11515610da857600080fd5b505060206040510351600160a060020a0380891660009081526003602090815260408083209385168352929052205490915060ff1615610deb5760019150610e8d565b610df487611471565b15610e755780600160a060020a031687600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610e4957600080fd5b6102c65a03f11515610e5a57600080fd5b50505060405180519050600160a060020a0316149150610e8d565b80600160a060020a031687600160a060020a03161491505b5095945050505050565b6000610eac610ea6858461140e565b84611439565b949350505050565b600054600160a060020a031681565b60005b8751811015610f5657610f4d888281518110610ede57fe5b90602001906020020151888381518110610ef457fe5b90602001906020020151888481518110610f0a57fe5b9060200190602002015188888681518110610f2157fe5b90602001906020020151888781518110610f3757fe5b90602001906020020151888881518110610b4257fe5b50600101610ec6565b5050505050505050565b6000610f6a611683565b600080600080610160604051908101604052808e51600160a060020a031681526020018e60016020020151600160a060020a0316815260200160408f0151600160a060020a0316815260200160608f0151600160a060020a0316815260200160808f0151600160a060020a031681526020018d5181526020018d60016020020151815260200160408e0151815260200160608e0151815260200160808e015181526020016110188f8f61130a565b9052945060006020860151600160a060020a0316148061104d575033600160a060020a03168560200151600160a060020a0316145b151561105857600080fd5b60008560a00151118015611070575060008560c00151115b801561107c575060008b115b151561108757600080fd5b61109a85518661014001518b8b8b610d07565b15156110a557600080fd5b84610120015142106110f25784610140015160005b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600095506112fa565b61110d8560c00151611108876101400151610cdd565b611450565b93506111198b85611479565b955085151561112f5784610140015160016110ba565b611142868660c001518760a001516109fc565b156111545784610140015160026110ba565b891580156111695750611167858761148f565b155b1561117b5784610140015160036110ba565b61118e868660c001518760a00151610e97565b92506111b460016000876101400151815260208101919091526040016000205487611462565b60016000876101400151815260208101919091526040908101600020919091556111e4908601518651338661151a565b15156111ef57600080fd5b61120d85606001513387516112068a610190611439565b8a0361151a565b151561121857600080fd5b846040015185606001516040516c01000000000000000000000000600160a060020a0393841681028252919092160260148201526028016040519081900390206080860151600160a060020a03168651600160a060020a03167f0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb33389604001518a60600151898d8a8a8f6101400151604051600160a060020a0398891681529688166020880152949096166040808701919091526060860193909352608085019190915260a084015260c083019390935260e082015261010001905180910390a45b5050505050979650505050505050565b600030835160208501516040860151606087015160808801518751602089015160408a015160608b015160808c015160a08d01516040516c01000000000000000000000000600160a060020a039d8e16810282529b8d168c026014820152998c168b0260288b0152978b168a02603c8a0152958a16890260508901529390981690960260648601526078850152609884019490945260b883019490945260d882019290925260f8810192909252610118820152610138016040518091039020905092915050565b61138781565b60408051908101604052600981527f45544846582e302e300000000000000000000000000000000000000000000000602082015281565b600082820283158061142a575082848281151561142757fe5b04145b151561143257fe5b9392505050565b600080828481151561144757fe5b04949350505050565b60008282111561145c57fe5b50900390565b60008282018381101561143257fe5b6000903b1190565b60008183106114885781611432565b5090919050565b600033816114a68460c08701518760a00151610e97565b9050806114b8866040015187516115b0565b10806114d15750806114cf86604001518751611621565b105b806114e85750836114e68660600151846115b0565b105b806114ff5750836114fd866060015184611621565b105b1561150d5760009250611512565b600192505b505092915050565b60008054600160a060020a03166315dacbea86868686866040516020015260405160e060020a63ffffffff8716028152600160a060020a0394851660048201529284166024840152921660448201526064810191909152608401602060405180830381600087803b151561158d57600080fd5b6102c65a03f1151561159e57600080fd5b50505060405180519695505050505050565b6000600160a060020a0383166370a082316113878460405160e060020a63ffffffff8516028152600160a060020a039091166004820152602401602060405180830381600088803b151561160357600080fd5b87f1151561161057600080fd5b505050506040518051949350505050565b60008054600160a060020a038085169163dd62ed3e916113879186911660405160e060020a63ffffffff8616028152600160a060020a03928316600482015291166024820152604401602060405180830381600088803b151561160357600080fd5b6101606040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201819052610140820152905600a165627a7a723058206d83040c889cc256c3c794ef2d15606f3a95a253d26d4992c6c220083ece28d000296060604052341561000f57600080fd5b6100253364010000000061019261002a82021704565b610062565b600054600160a060020a03161561004057600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b610203806100716000396000f30060606040526004361061004b5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166315dacbea81146100505780639cd0160514610092575b600080fd5b341561005b57600080fd5b61007e600160a060020a03600435811690602435811690604435166064356100c1565b604051901515815260200160405180910390f35b341561009d57600080fd5b6100a5610183565b604051600160a060020a03909116815260200160405180910390f35b6000805433600160a060020a039081169116146100dd57600080fd5b84600160a060020a03166323b872dd8585856000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561016057600080fd5b6102c65a03f1151561017157600080fd5b50505060405180519695505050505050565b600054600160a060020a031681565b600054600160a060020a0316156101a857600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555600a165627a7a7230582075e74845f5bf3d8ccf94117dc10527ffebe3d8bd027af0b0e97f08767c1785d60029

Swarm Source

bzzr://75e74845f5bf3d8ccf94117dc10527ffebe3d8bd027af0b0e97f08767c1785d6
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.