ETH Price: $2,368.64 (+1.82%)
Gas: 1.61 Gwei

Contract

0x91db0FF6239496E69Aa97BEB448578B063204884
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Fill Orders89784842019-11-22 4:49:291756 days ago1574398169IN
0x91db0FF6...063204884
0.001 ETH0.000627682
0x6080604089784022019-11-22 4:31:301756 days ago1574397090IN
 Contract Creation
0 ETH0.0180432415

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
89784842019-11-22 4:49:291756 days ago1574398169
0x91db0FF6...063204884
0.001 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x8fbB22E4...13140c71f
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Forwarder

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-11-22
*/

pragma solidity 0.5.11;
pragma experimental ABIEncoderV2;


contract SafeMath {

    function safeMul(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(
            c / a == b,
            "UINT256_OVERFLOW"
        );
        return c;
    }

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

    function safeSub(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        require(
            b <= a,
            "UINT256_UNDERFLOW"
        );
        return a - b;
    }

    function safeAdd(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        uint256 c = a + b;
        require(
            c >= a,
            "UINT256_OVERFLOW"
        );
        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;
    }
}

contract LibFillResults is
    SafeMath
{
    struct FillResults {
        uint256 makerAssetFilledAmount;  
        uint256 takerAssetFilledAmount;  
        uint256 makerFeePaid;            
        uint256 takerFeePaid;            
    }

    struct MatchedFillResults {
        FillResults left;                    
        FillResults right;                   
        uint256 leftMakerAssetSpreadAmount;  
    }

    
    
    
    
    function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)
        internal
        pure
    {
        totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);
        totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);
        totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);
        totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);
    }
}

contract LibEIP712 {

    
    string constant internal EIP191_HEADER = "\x19\x01";

    
    string constant internal EIP712_DOMAIN_NAME = "0x Protocol";

    
    string constant internal EIP712_DOMAIN_VERSION = "2";

    
    bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(
        "EIP712Domain(",
        "string name,",
        "string version,",
        "address verifyingContract",
        ")"
    ));

    
    
    bytes32 public EIP712_DOMAIN_HASH;

    constructor ()
        public
    {
        EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(
            EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,
            keccak256(bytes(EIP712_DOMAIN_NAME)),
            keccak256(bytes(EIP712_DOMAIN_VERSION)),
            uint256(address(this))
        ));
    }

    
    
    
    function hashEIP712Message(bytes32 hashStruct)
        internal
        view
        returns (bytes32 result)
    {
        bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;

        
        
        
        
        
        

        assembly {
            
            let memPtr := mload(64)

            mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000)  
            mstore(add(memPtr, 2), eip712DomainHash)                                            
            mstore(add(memPtr, 34), hashStruct)                                                 

            
            result := keccak256(memPtr, 66)
        }
        return result;
    }
}

contract LibOrder is
    LibEIP712
{
    
    bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(
        "Order(",
        "address makerAddress,",
        "address takerAddress,",
        "address feeRecipientAddress,",
        "address senderAddress,",
        "uint256 makerAssetAmount,",
        "uint256 takerAssetAmount,",
        "uint256 makerFee,",
        "uint256 takerFee,",
        "uint256 expirationTimeSeconds,",
        "uint256 salt,",
        "bytes makerAssetData,",
        "bytes takerAssetData",
        ")"
    ));

    
    
    enum OrderStatus {
        INVALID,                     
        INVALID_MAKER_ASSET_AMOUNT,  
        INVALID_TAKER_ASSET_AMOUNT,  
        FILLABLE,                    
        EXPIRED,                     
        FULLY_FILLED,                
        CANCELLED                    
    }

    
    struct Order {
        address makerAddress;           
        address takerAddress;           
        address feeRecipientAddress;    
        address senderAddress;          
        uint256 makerAssetAmount;       
        uint256 takerAssetAmount;       
        uint256 makerFee;               
        uint256 takerFee;               
        uint256 expirationTimeSeconds;  
        uint256 salt;                   
        bytes makerAssetData;           
        bytes takerAssetData;           
    }
    

    struct OrderInfo {
        uint8 orderStatus;                    
        bytes32 orderHash;                    
        uint256 orderTakerAssetFilledAmount;  
    }

    
    
    
    function getOrderHash(Order memory order)
        internal
        view
        returns (bytes32 orderHash)
    {
        orderHash = hashEIP712Message(hashOrder(order));
        return orderHash;
    }

    
    
    
    function hashOrder(Order memory order)
        internal
        pure
        returns (bytes32 result)
    {
        bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;
        bytes32 makerAssetDataHash = keccak256(order.makerAssetData);
        bytes32 takerAssetDataHash = keccak256(order.takerAssetData);

        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        

        assembly {
            
            let pos1 := sub(order, 32)
            let pos2 := add(order, 320)
            let pos3 := add(order, 352)

            
            let temp1 := mload(pos1)
            let temp2 := mload(pos2)
            let temp3 := mload(pos3)
            
            
            mstore(pos1, schemaHash)
            mstore(pos2, makerAssetDataHash)
            mstore(pos3, takerAssetDataHash)
            result := keccak256(pos1, 416)
            
            
            mstore(pos1, temp1)
            mstore(pos2, temp2)
            mstore(pos3, temp3)
        }
        return result;
    }
}

interface IERC20 {
    
    function totalSupply() external view returns (uint256);

    
    function balanceOf(address account) external view returns (uint256);

    
    function transfer(address recipient, uint256 amount) external returns (bool);

    
    function allowance(address owner, address spender) external view returns (uint256);

    
    function approve(address spender, uint256 amount) external returns (bool);

    
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    
    event Transfer(address indexed from, address indexed to, uint256 value);

    
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC165 {
    
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    
    function balanceOf(address owner) public view returns (uint256 balance);

    
    function ownerOf(uint256 tokenId) public view returns (address owner);

    
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

contract IExchange {

    
    
    
    
    function fillOrKillOrder(
        LibOrder.Order memory order,
        uint256 takerAssetFillAmount,
        bytes memory signature
    )
        public
        returns (LibFillResults.FillResults memory fillResults);

    
    
    
    
    
    
    function fillOrderNoThrow(
        LibOrder.Order memory order,
        uint256 takerAssetFillAmount,
        bytes memory signature
    )
        public
        returns (LibFillResults.FillResults memory fillResults);

    
    
    
    
    
    function batchFillOrders(
        LibOrder.Order[] memory orders,
        uint256[] memory takerAssetFillAmounts,
        bytes[] memory signatures
    )
        public
        returns (LibFillResults.FillResults memory totalFillResults);

    
    
    
    
    
    function batchFillOrKillOrders(
        LibOrder.Order[] memory orders,
        uint256[] memory takerAssetFillAmounts,
        bytes[] memory signatures
    )
        public
        returns (LibFillResults.FillResults memory totalFillResults);

    
    
    
    
    
    
    function batchFillOrdersNoThrow(
        LibOrder.Order[] memory orders,
        uint256[] memory takerAssetFillAmounts,
        bytes[] memory signatures
    )
        public
        returns (LibFillResults.FillResults memory totalFillResults);

    
    
    
    
    
    function marketSellOrders(
        LibOrder.Order[] memory orders,
        uint256 takerAssetFillAmount,
        bytes[] memory signatures
    )
        public
        returns (LibFillResults.FillResults memory totalFillResults);

    
    
    
    
    
    
    function marketSellOrdersNoThrow(
        LibOrder.Order[] memory orders,
        uint256 takerAssetFillAmount,
        bytes[] memory signatures
    )
        public
        returns (LibFillResults.FillResults memory totalFillResults);

    
    
    
    
    
    function marketBuyOrders(
        LibOrder.Order[] memory orders,
        uint256 makerAssetFillAmount,
        bytes[] memory signatures
    )
        public
        returns (LibFillResults.FillResults memory totalFillResults);

    
    
    
    
    
    
    function marketBuyOrdersNoThrow(
        LibOrder.Order[] memory orders,
        uint256 makerAssetFillAmount,
        bytes[] memory signatures
    )
        public
        returns (LibFillResults.FillResults memory totalFillResults);

    
    
    function batchCancelOrders(LibOrder.Order[] memory orders)
        public;

    
    
    
    function getOrdersInfo(LibOrder.Order[] memory orders)
        public
        view
        returns (LibOrder.OrderInfo[] memory);
}

contract IEtherToken is IERC20 {
    function deposit() public payable;
    function withdraw(uint256 _amount) public;
    function withdrawTo(address _to, uint256 _amount) public;
}

library LibBytesRichErrors {

    enum InvalidByteOperationErrorCodes {
        FromLessThanOrEqualsToRequired,
        ToLessThanOrEqualsLengthRequired,
        LengthGreaterThanZeroRequired,
        LengthGreaterThanOrEqualsFourRequired,
        LengthGreaterThanOrEqualsTwentyRequired,
        LengthGreaterThanOrEqualsThirtyTwoRequired,
        LengthGreaterThanOrEqualsNestedBytesLengthRequired,
        DestinationLengthGreaterThanOrEqualSourceLengthRequired
    }

    
    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =
        0x28006595;

    
    function InvalidByteOperationError(
        InvalidByteOperationErrorCodes errorCode,
        uint256 offset,
        uint256 required
    )
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            INVALID_BYTE_OPERATION_ERROR_SELECTOR,
            errorCode,
            offset,
            required
        );
    }
}

library LibRichErrors {

    
    bytes4 internal constant STANDARD_ERROR_SELECTOR =
        0x08c379a0;

    
    
    
    
    
    
    function StandardError(
        string memory message
    )
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            STANDARD_ERROR_SELECTOR,
            bytes(message)
        );
    }
    

    
    
    function rrevert(bytes memory errorData)
        internal
        pure
    {
        assembly {
            revert(add(errorData, 0x20), mload(errorData))
        }
    }
}

library LibBytes {

    using LibBytes for bytes;

    
    
    
    
    
    function rawAddress(bytes memory input)
        internal
        pure
        returns (uint256 memoryAddress)
    {
        assembly {
            memoryAddress := input
        }
        return memoryAddress;
    }

    
    
    
    function contentAddress(bytes memory input)
        internal
        pure
        returns (uint256 memoryAddress)
    {
        assembly {
            memoryAddress := add(input, 32)
        }
        return memoryAddress;
    }

    
    
    
    
    function memCopy(
        uint256 dest,
        uint256 source,
        uint256 length
    )
        internal
        pure
    {
        if (length < 32) {
            
            
            
            assembly {
                let mask := sub(exp(256, sub(32, length)), 1)
                let s := and(mload(source), not(mask))
                let d := and(mload(dest), mask)
                mstore(dest, or(s, d))
            }
        } else {
            
            if (source == dest) {
                return;
            }

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            if (source > dest) {
                assembly {
                    
                    
                    
                    
                    length := sub(length, 32)
                    let sEnd := add(source, length)
                    let dEnd := add(dest, length)

                    
                    
                    
                    
                    let last := mload(sEnd)

                    
                    
                    
                    
                    for {} lt(source, sEnd) {} {
                        mstore(dest, mload(source))
                        source := add(source, 32)
                        dest := add(dest, 32)
                    }

                    
                    mstore(dEnd, last)
                }
            } else {
                assembly {
                    
                    
                    length := sub(length, 32)
                    let sEnd := add(source, length)
                    let dEnd := add(dest, length)

                    
                    
                    
                    
                    let first := mload(source)

                    
                    
                    
                    
                    
                    
                    
                    
                    for {} slt(dest, dEnd) {} {
                        mstore(dEnd, mload(sEnd))
                        sEnd := sub(sEnd, 32)
                        dEnd := sub(dEnd, 32)
                    }

                    
                    mstore(dest, first)
                }
            }
        }
    }

    
    
    
    
    
    function slice(
        bytes memory b,
        uint256 from,
        uint256 to
    )
        internal
        pure
        returns (bytes memory result)
    {
        
        
        if (from > to) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
                from,
                to
            ));
        }
        if (to > b.length) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
                to,
                b.length
            ));
        }

        
        result = new bytes(to - from);
        memCopy(
            result.contentAddress(),
            b.contentAddress() + from,
            result.length
        );
        return result;
    }

    
    
    
    
    
    
    function sliceDestructive(
        bytes memory b,
        uint256 from,
        uint256 to
    )
        internal
        pure
        returns (bytes memory result)
    {
        
        
        if (from > to) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
                from,
                to
            ));
        }
        if (to > b.length) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
                to,
                b.length
            ));
        }

        
        assembly {
            result := add(b, from)
            mstore(result, sub(to, from))
        }
        return result;
    }

    
    
    
    function popLastByte(bytes memory b)
        internal
        pure
        returns (bytes1 result)
    {
        if (b.length == 0) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,
                b.length,
                0
            ));
        }

        
        result = b[b.length - 1];

        assembly {
            
            let newLen := sub(mload(b), 1)
            mstore(b, newLen)
        }
        return result;
    }

    
    
    
    
    function equals(
        bytes memory lhs,
        bytes memory rhs
    )
        internal
        pure
        returns (bool equal)
    {
        
        
        
        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);
    }

    
    
    
    
    function readAddress(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (address result)
    {
        if (b.length < index + 20) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
                b.length,
                index + 20 
            ));
        }

        
        
        
        index += 20;

        
        assembly {
            
            
            
            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)
        }
        return result;
    }

    
    
    
    
    function writeAddress(
        bytes memory b,
        uint256 index,
        address input
    )
        internal
        pure
    {
        if (b.length < index + 20) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
                b.length,
                index + 20 
            ));
        }

        
        
        
        index += 20;

        
        assembly {
            
            
            
            

            
            
            
            let neighbors := and(
                mload(add(b, index)),
                0xffffffffffffffffffffffff0000000000000000000000000000000000000000
            )

            
            
            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)

            
            mstore(add(b, index), xor(input, neighbors))
        }
    }

    
    
    
    
    function readBytes32(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (bytes32 result)
    {
        if (b.length < index + 32) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
                b.length,
                index + 32
            ));
        }

        
        index += 32;

        
        assembly {
            result := mload(add(b, index))
        }
        return result;
    }

    
    
    
    
    function writeBytes32(
        bytes memory b,
        uint256 index,
        bytes32 input
    )
        internal
        pure
    {
        if (b.length < index + 32) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
                b.length,
                index + 32
            ));
        }

        
        index += 32;

        
        assembly {
            mstore(add(b, index), input)
        }
    }

    
    
    
    
    function readUint256(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (uint256 result)
    {
        result = uint256(readBytes32(b, index));
        return result;
    }

    
    
    
    
    function writeUint256(
        bytes memory b,
        uint256 index,
        uint256 input
    )
        internal
        pure
    {
        writeBytes32(b, index, bytes32(input));
    }

    
    
    
    
    function readBytes4(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (bytes4 result)
    {
        if (b.length < index + 4) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,
                b.length,
                index + 4
            ));
        }

        
        index += 32;

        
        assembly {
            result := mload(add(b, index))
            
            
            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)
        }
        return result;
    }

    
    
    
    
    
    function writeLength(bytes memory b, uint256 length)
        internal
        pure
    {
        assembly {
            mstore(b, length)
        }
    }
}

contract Forwarder is LibOrder {

    using LibBytes for bytes;

    address public ZERO_EX_EXCHANGE;
    address public ZERO_EX_TOKEN_PROXY;

    address payable public ETHER_TOKEN;

    constructor(
        address zeroExExchange,
        address zeroExProxy,
        address payable etherToken
    )
        public
    {
        ZERO_EX_EXCHANGE = zeroExExchange;
        ZERO_EX_TOKEN_PROXY = zeroExProxy;
        ETHER_TOKEN = etherToken;

        
        IEtherToken(ETHER_TOKEN).approve(ZERO_EX_TOKEN_PROXY, (2**256)-1);
    }

    function fillOrders(
        LibOrder.Order[] memory orders,
        uint256[] memory takerAssetFillAmounts,
        bytes[] memory signatures
    )
        public
        payable
    {
        
        IEtherToken token = IEtherToken(ETHER_TOKEN);
        IExchange v2Exchange = IExchange(ZERO_EX_EXCHANGE);

        token.deposit.value(msg.value)();

        
        
        for (uint i = 0; i < orders.length; i++) {
            LibFillResults.FillResults memory result = v2Exchange.fillOrderNoThrow(
                orders[i],
                takerAssetFillAmounts[i],
                signatures[i]
            );

            
            (address cardToken, uint256 tokenId) = abi.decode(
                orders[i].makerAssetData.sliceDestructive(
                    4,
                    orders[i].makerAssetData.length
                ),
                (address, uint256)
            );

            
            if (result.takerAssetFilledAmount == takerAssetFillAmounts[i]) {
                IERC721(cardToken).transferFrom(address(this), msg.sender, tokenId);
            }
        }

        uint remainingBalance = token.balanceOf(address(this));
        token.withdraw(remainingBalance);

        
        address(msg.sender).transfer(remainingBalance);

        
        require(
            address(this).balance == 0,
            "Forwarder: must have zero ETH at the end"
        );

    }

    function ()
        external
        payable
    {
        require(
            msg.sender == address(ETHER_TOKEN),
            "Forwarder: will not accept ETH from only ether token address"
        );
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"ETHER_TOKEN","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ZERO_EX_EXCHANGE","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"makerAddress","type":"address"},{"internalType":"address","name":"takerAddress","type":"address"},{"internalType":"address","name":"feeRecipientAddress","type":"address"},{"internalType":"address","name":"senderAddress","type":"address"},{"internalType":"uint256","name":"makerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"takerAssetAmount","type":"uint256"},{"internalType":"uint256","name":"makerFee","type":"uint256"},{"internalType":"uint256","name":"takerFee","type":"uint256"},{"internalType":"uint256","name":"expirationTimeSeconds","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"makerAssetData","type":"bytes"},{"internalType":"bytes","name":"takerAssetData","type":"bytes"}],"internalType":"struct LibOrder.Order[]","name":"orders","type":"tuple[]"},{"internalType":"uint256[]","name":"takerAssetFillAmounts","type":"uint256[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"fillOrders","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ZERO_EX_TOKEN_PROXY","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EIP712_DOMAIN_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"zeroExExchange","type":"address"},{"internalType":"address","name":"zeroExProxy","type":"address"},{"internalType":"address payable","name":"etherToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]

Deployed Bytecode

0x60806040526004361061004a5760003560e01c806329b8ef161461007f5780635da270fc146100aa57806381e2f252146100bf578063d1f37d59146100d2578063e306f779146100e7575b6003546001600160a01b0316331461007d5760405162461bcd60e51b815260040161007490610c68565b60405180910390fd5b005b34801561008b57600080fd5b50610094610109565b6040516100a19190610bfb565b60405180910390f35b3480156100b657600080fd5b50610094610118565b61007d6100cd366004610915565b610127565b3480156100de57600080fd5b50610094610487565b3480156100f357600080fd5b506100fc610496565b6040516100a19190610c3f565b6003546001600160a01b031681565b6001546001600160a01b031681565b60035460015460408051630d0e30db60e41b815290516001600160a01b039384169390921691839163d0e30db091349160048082019260009290919082900301818588803b15801561017857600080fd5b505af115801561018c573d6000803e3d6000fd5b50600093505050505b8551811015610351576101a6610541565b826001600160a01b0316633e228bae8884815181106101c157fe5b60200260200101518885815181106101d557fe5b60200260200101518886815181106101e957fe5b60200260200101516040518463ffffffff1660e01b815260040161020f93929190610c88565b608060405180830381600087803b15801561022957600080fd5b505af115801561023d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061026191908101906109a9565b90506000806102ad60048a868151811061027757fe5b60200260200101516101400151518b878151811061029157fe5b6020026020010151610140015161049c9092919063ffffffff16565b8060200190516102c091908101906108db565b915091508784815181106102d057fe5b602002602001015183602001511415610346576040516323b872dd60e01b81526001600160a01b038316906323b872dd9061031390309033908690600401610c17565b600060405180830381600087803b15801561032d57600080fd5b505af1158015610341573d6000803e3d6000fd5b505050505b505050600101610195565b506040516370a0823160e01b81526000906001600160a01b038416906370a0823190610381903090600401610c09565b60206040518083038186803b15801561039957600080fd5b505afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103d191908101906109cf565b604051632e1a7d4d60e01b81529091506001600160a01b03841690632e1a7d4d90610400908490600401610c3f565b600060405180830381600087803b15801561041a57600080fd5b505af115801561042e573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f1935050505015801561045f573d6000803e3d6000fd5b5030311561047f5760405162461bcd60e51b815260040161007490610c78565b505050505050565b6002546001600160a01b031681565b60005481565b6060818311156104ba576104ba6104b5600085856104df565b610539565b83518211156104d3576104d36104b560018487516104df565b50819003910190815290565b6060632800659560e01b8484846040516024016104fe93929190610c4d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b6040518060800160405280600081526020016000815260200160008152602001600081525090565b803561057481610dd4565b92915050565b805161057481610dd4565b600082601f83011261059657600080fd5b81356105a96105a482610ce1565b610cba565b81815260209384019390925082018360005b838110156105e757813586016105d188826106be565b84525060209283019291909101906001016105bb565b5050505092915050565b600082601f83011261060257600080fd5b81356106106105a482610ce1565b81815260209384019390925082018360005b838110156105e75781358601610638888261077c565b8452506020928301929190910190600101610622565b600082601f83011261065f57600080fd5b813561066d6105a482610ce1565b9150818183526020840193506020810190508385602084028201111561069257600080fd5b60005b838110156105e757816106a888826108c5565b8452506020928301929190910190600101610695565b600082601f8301126106cf57600080fd5b81356106dd6105a482610d02565b915080825260208301602083018583830111156106f957600080fd5b610704838284610d81565b50505092915050565b60006080828403121561071f57600080fd5b6107296080610cba565b9050600061073784846108d0565b8252506020610748848483016108d0565b602083015250604061075c848285016108d0565b6040830152506060610770848285016108d0565b60608301525092915050565b6000610180828403121561078f57600080fd5b61079a610180610cba565b905060006107a88484610569565b82525060206107b984848301610569565b60208301525060406107cd84828501610569565b60408301525060606107e184828501610569565b60608301525060806107f5848285016108c5565b60808301525060a0610809848285016108c5565b60a08301525060c061081d848285016108c5565b60c08301525060e0610831848285016108c5565b60e083015250610100610846848285016108c5565b6101008301525061012061085c848285016108c5565b6101208301525061014082013567ffffffffffffffff81111561087e57600080fd5b61088a848285016106be565b6101408301525061016082013567ffffffffffffffff8111156108ac57600080fd5b6108b8848285016106be565b6101608301525092915050565b803561057481610de8565b805161057481610de8565b600080604083850312156108ee57600080fd5b60006108fa858561057a565b925050602061090b858286016108d0565b9150509250929050565b60008060006060848603121561092a57600080fd5b833567ffffffffffffffff81111561094157600080fd5b61094d868287016105f1565b935050602084013567ffffffffffffffff81111561096a57600080fd5b6109768682870161064e565b925050604084013567ffffffffffffffff81111561099357600080fd5b61099f86828701610585565b9150509250925092565b6000608082840312156109bb57600080fd5b60006109c7848461070d565b949350505050565b6000602082840312156109e157600080fd5b60006109c784846108d0565b6109f681610d60565b82525050565b6109f681610d37565b6109f681610d42565b6000610a1982610d2a565b610a238185610d2e565b9350610a33818560208601610d8d565b610a3c81610dbd565b9093019392505050565b6109f681610d6b565b6000610a5c603c83610d2e565b7f466f727761726465723a2077696c6c206e6f742061636365707420455448206681527f726f6d206f6e6c7920657468657220746f6b656e206164647265737300000000602082015260400192915050565b6000610abb602883610d2e565b7f466f727761726465723a206d7573742068617665207a65726f20455448206174815267081d1a1948195b9960c21b602082015260400192915050565b8051600090610180840190610b0d85826109fc565b506020830151610b2060208601826109fc565b506040830151610b3360408601826109fc565b506060830151610b4660608601826109fc565b506080830151610b596080860182610a05565b5060a0830151610b6c60a0860182610a05565b5060c0830151610b7f60c0860182610a05565b5060e0830151610b9260e0860182610a05565b50610100830151610ba7610100860182610a05565b50610120830151610bbc610120860182610a05565b50610140830151848203610140860152610bd68282610a0e565b915050610160830151848203610160860152610bf28282610a0e565b95945050505050565b6020810161057482846109fc565b6020810161057482846109ed565b60608101610c2582866109ed565b610c3260208301856109ed565b6109c76040830184610a05565b602081016105748284610a05565b60608101610c5b8286610a46565b610c326020830185610a05565b6020808252810161057481610a4f565b6020808252810161057481610aae565b60608082528101610c998186610af8565b9050610ca86020830185610a05565b8181036040830152610bf28184610a0e565b60405181810167ffffffffffffffff81118282101715610cd957600080fd5b604052919050565b600067ffffffffffffffff821115610cf857600080fd5b5060209081020190565b600067ffffffffffffffff821115610d1957600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b600061057482610d54565b90565b80610d4f81610dc7565b919050565b6001600160a01b031690565b600061057482610d76565b600061057482610d45565b600061057482610d37565b82818337506000910152565b60005b83811015610da8578181015183820152602001610d90565b83811115610db7576000848401525b50505050565b601f01601f191690565b60088110610dd157fe5b50565b610ddd81610d37565b8114610dd157600080fd5b610ddd81610d4256fea365627a7a72315820c72be876b35ef141e653b144a306fb98f02cc2917735a4c2e95800ac175883e86c6578706572696d656e74616cf564736f6c634300050b0040

Swarm Source

bzzr://c72be876b35ef141e653b144a306fb98f02cc2917735a4c2e95800ac175883e8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.