ETH Price: $2,135.58 (+5.46%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Orders59768852018-07-16 21:27:252815 days ago1531776445IN
0xdC596c68...Cc68C06c2
0 ETH0.0203827
Execute Orders59768752018-07-16 21:24:292815 days ago1531776269IN
0xdC596c68...Cc68C06c2
0.29508948 ETH0.005824077
Execute Orders59768522018-07-16 21:19:222815 days ago1531775962IN
0xdC596c68...Cc68C06c2
0.00056059 ETH0.00391237
Execute Orders59768262018-07-16 21:11:342815 days ago1531775494IN
0xdC596c68...Cc68C06c2
0 ETH0.006339527
Set Handler59767612018-07-16 20:55:042815 days ago1531774504IN
0xdC596c68...Cc68C06c2
0 ETH0.0001435910
Set Handler59767592018-07-16 20:54:472815 days ago1531774487IN
0xdC596c68...Cc68C06c2
0 ETH0.0001435910
Set Handler59767562018-07-16 20:54:042815 days ago1531774444IN
0xdC596c68...Cc68C06c2
0 ETH0.0004378110
Set Handler59767532018-07-16 20:53:042815 days ago1531774384IN
0xdC596c68...Cc68C06c2
0 ETH0.0004378110
Execute Orders59765802018-07-16 20:13:292815 days ago1531772009IN
0xdC596c68...Cc68C06c2
0 ETH0.00092678
Execute Orders59765592018-07-16 20:07:572815 days ago1531771677IN
0xdC596c68...Cc68C06c2
0 ETH0.0010633420
Execute Orders59765392018-07-16 20:03:222815 days ago1531771402IN
0xdC596c68...Cc68C06c2
0 ETH0.002035520
Execute Orders59765102018-07-16 19:58:482815 days ago1531771128IN
0xdC596c68...Cc68C06c2
0 ETH0.0024595220
Execute Orders59764482018-07-16 19:44:002815 days ago1531770240IN
0xdC596c68...Cc68C06c2
0.02179043 ETH0.005115655
Execute Orders59763912018-07-16 19:30:072815 days ago1531769407IN
0xdC596c68...Cc68C06c2
0.02181308 ETH0.005115655
Set Handler59751972018-07-16 14:31:212815 days ago1531751481IN
0xdC596c68...Cc68C06c2
0 ETH0.0004378110
Set Handler59751942018-07-16 14:30:532815 days ago1531751453IN
0xdC596c68...Cc68C06c2
0 ETH0.0004378110
Set Handler59751912018-07-16 14:30:212815 days ago1531751421IN
0xdC596c68...Cc68C06c2
0 ETH0.0004378110
Set Handler59751882018-07-16 14:29:322815 days ago1531751372IN
0xdC596c68...Cc68C06c2
0 ETH0.0004378110
Set Handler59751842018-07-16 14:28:362815 days ago1531751316IN
0xdC596c68...Cc68C06c2
0 ETH0.0004378110

Latest 11 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer59768752018-07-16 21:24:292815 days ago1531776269
0xdC596c68...Cc68C06c2
0.01598501 ETH
Transfer59768752018-07-16 21:24:292815 days ago1531776269
0xdC596c68...Cc68C06c2
0.21157376 ETH
Transfer59768752018-07-16 21:24:292815 days ago1531776269
0xdC596c68...Cc68C06c2
0.19439539 ETH
Transfer59768752018-07-16 21:24:292815 days ago1531776269
0xdC596c68...Cc68C06c2
0.12686469 ETH
Transfer59768522018-07-16 21:19:222815 days ago1531775962
0xdC596c68...Cc68C06c2
0.00131777 ETH
Transfer59768522018-07-16 21:19:222815 days ago1531775962
0xdC596c68...Cc68C06c2
0.02158431 ETH
Transfer59768522018-07-16 21:19:222815 days ago1531775962
0xdC596c68...Cc68C06c2
0.02234149 ETH
Transfer59768262018-07-16 21:11:342815 days ago1531775494
0xdC596c68...Cc68C06c2
0.01634507 ETH
Transfer59768262018-07-16 21:11:342815 days ago1531775494
0xdC596c68...Cc68C06c2
0.02234149 ETH
Transfer59764482018-07-16 19:44:002815 days ago1531770240
0xdC596c68...Cc68C06c2
0.02115576 ETH
Transfer59763912018-07-16 19:30:072815 days ago1531769407
0xdC596c68...Cc68C06c2
0.02117775 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TotlePrimary

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

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

pragma solidity 0.4.24;

// File: contracts/ExchangeHandler.sol

/// @title Interface for all exchange handler contracts
interface ExchangeHandler {

    /// @dev Get the available amount left to fill for an order
    /// @param orderAddresses Array of address values needed for this DEX order
    /// @param orderValues Array of uint values needed for this DEX order
    /// @param exchangeFee Value indicating the fee for this DEX order
    /// @param v ECDSA signature parameter v
    /// @param r ECDSA signature parameter r
    /// @param s ECDSA signature parameter s
    /// @return Available amount left to fill for this order
    function getAvailableAmount(
        address[8] orderAddresses,
        uint256[6] orderValues,
        uint256 exchangeFee,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256);

    /// @dev Perform a buy order at the exchange
    /// @param orderAddresses Array of address values needed for each DEX order
    /// @param orderValues Array of uint values needed for each DEX order
    /// @param exchangeFee Value indicating the fee for this DEX order
    /// @param amountToFill Amount to fill in this order
    /// @param v ECDSA signature parameter v
    /// @param r ECDSA signature parameter r
    /// @param s ECDSA signature parameter s
    /// @return Amount filled in this order
    function performBuy(
        address[8] orderAddresses,
        uint256[6] orderValues,
        uint256 exchangeFee,
        uint256 amountToFill,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable returns (uint256);

    /// @dev Perform a sell order at the exchange
    /// @param orderAddresses Array of address values needed for each DEX order
    /// @param orderValues Array of uint values needed for each DEX order
    /// @param exchangeFee Value indicating the fee for this DEX order
    /// @param amountToFill Amount to fill in this order
    /// @param v ECDSA signature parameter v
    /// @param r ECDSA signature parameter r
    /// @param s ECDSA signature parameter s
    /// @return Amount filled in this order
    function performSell(
        address[8] orderAddresses,
        uint256[6] orderValues,
        uint256 exchangeFee,
        uint256 amountToFill,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256);
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract Token is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/TokenTransferProxy.sol

/*
    Notice - This code is copyright 2017 ZeroEx Intl and licensed
    under the Apache License, Version 2.0;
*/

contract TokenTransferProxy is Ownable {

    /// @dev Only authorized addresses can invoke functions with this modifier.
    modifier onlyAuthorized {
        require(authorized[msg.sender]);
        _;
    }

    modifier targetAuthorized(address target) {
        require(authorized[target]);
        _;
    }

    modifier targetNotAuthorized(address target) {
        require(!authorized[target]);
        _;
    }

    mapping (address => bool) public authorized;
    address[] public authorities;

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

    /*
     * Public functions
     */

    /// @dev Authorizes an address.
    /// @param target Address to authorize.
    function addAuthorizedAddress(address target)
        public
        onlyOwner
        targetNotAuthorized(target)
    {
        authorized[target] = true;
        authorities.push(target);
        emit LogAuthorizedAddressAdded(target, msg.sender);
    }

    /// @dev Removes authorizion of an address.
    /// @param target Address to remove authorization from.
    function removeAuthorizedAddress(address target)
        public
        onlyOwner
        targetAuthorized(target)
    {
        delete authorized[target];
        for (uint i = 0; i < authorities.length; i++) {
            if (authorities[i] == target) {
                authorities[i] = authorities[authorities.length - 1];
                authorities.length -= 1;
                break;
            }
        }
        emit LogAuthorizedAddressRemoved(target, msg.sender);
    }

    /// @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
        onlyAuthorized
        returns (bool)
    {
        return Token(token).transferFrom(from, to, value);
    }

    /*
     * Public constant functions
     */

    /// @dev Gets all authorized addresses.
    /// @return Array of authorized addresses.
    function getAuthorizedAddresses()
        public
        constant
        returns (address[])
    {
        return authorities;
    }
}

// File: openzeppelin-solidity/contracts/math/Math.sol

/**
 * @title Math
 * @dev Assorted math operations
 */
library Math {
  function max64(uint64 a, uint64 b) internal pure returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal pure returns (uint64) {
    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;
  }
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

/// @title The primary contract for Totle Inc
contract TotlePrimary is Ownable {
    // Constants
    uint256 public constant MAX_EXCHANGE_FEE_PERCENTAGE = 0.01 * 10**18; // 1%
    bool constant BUY = false;
    bool constant SELL = true;

    // State variables
    mapping(address => bool) public handlerWhitelist;
    address tokenTransferProxy;

    // Structs
    struct Tokens {
        address[] tokenAddresses;
        bool[]    buyOrSell;
        uint256[] amountToObtain;
        uint256[] amountToGive;
    }

    struct DEXOrders {
        address[] tokenForOrder;
        address[] exchanges;
        address[8][] orderAddresses;
        uint256[6][] orderValues;
        uint256[] exchangeFees;
        uint8[] v;
        bytes32[] r;
        bytes32[] s;
    }

    /// @dev Constructor
    /// @param proxy Address of the TokenTransferProxy
    constructor(address proxy) public {
        tokenTransferProxy = proxy;
    }

    /*
    *   Public functions
    */

    /// @dev Set an exchange handler address to true/false
    /// @notice - onlyOwner modifier only allows the contract owner to run the code
    /// @param handler Address of the exchange handler which permission needs changing
    /// @param allowed Boolean value to set whether an exchange handler is allowed/denied
    function setHandler(address handler, bool allowed) public onlyOwner {
        handlerWhitelist[handler] = allowed;
    }

    /// @dev Synchronously executes an array of orders
    /// @notice The first four parameters relate to Token orders, the last eight relate to DEX orders
    /// @param tokenAddresses Array of addresses of ERC20 Token contracts for each Token order
    /// @param buyOrSell Array indicating whether each Token order is a buy or sell
    /// @param amountToObtain Array indicating the amount (in ether or tokens) to obtain in the order
    /// @param amountToGive Array indicating the amount (in ether or tokens) to give in the order
    /// @param tokenForOrder Array of addresses of ERC20 Token contracts for each DEX order
    /// @param exchanges Array of addresses of exchange handler contracts
    /// @param orderAddresses Array of address values needed for each DEX order
    /// @param orderValues Array of uint values needed for each DEX order
    /// @param exchangeFees Array indicating the fee for each DEX order (percentage of fill amount as decimal * 10**18)
    /// @param v ECDSA signature parameter v
    /// @param r ECDSA signature parameter r
    /// @param s ECDSA signature parameter s
    function executeOrders(
        // Tokens
        address[] tokenAddresses,
        bool[]    buyOrSell,
        uint256[] amountToObtain,
        uint256[] amountToGive,
        // DEX Orders
        address[] tokenForOrder,
        address[] exchanges,
        address[8][] orderAddresses,
        uint256[6][] orderValues,
        uint256[] exchangeFees,
        uint8[] v,
        bytes32[] r,
        bytes32[] s,
        // Unique ID
        uint256 uniqueID
    ) public payable {

        require(
            tokenAddresses.length == buyOrSell.length &&
            buyOrSell.length      == amountToObtain.length &&
            amountToObtain.length == amountToGive.length,
            "TotlePrimary - trade length check failed"
        );

        require(
            tokenForOrder.length  == exchanges.length &&
            exchanges.length      == orderAddresses.length &&
            orderAddresses.length == orderValues.length &&
            orderValues.length    == exchangeFees.length &&
            exchangeFees.length   == v.length &&
            v.length              == r.length &&
            r.length              == s.length,
            "TotlePrimary - order length check failed"
        );

        // Wrapping order in structs to reduce local variable count
        internalOrderExecution(
            Tokens(
                tokenAddresses,
                buyOrSell,
                amountToObtain,
                amountToGive
            ),
            DEXOrders(
                tokenForOrder,
                exchanges,
                orderAddresses,
                orderValues,
                exchangeFees,
                v,
                r,
                s
            )
        );
    }

    /*
    *   Internal functions
    */

    /// @dev Synchronously executes an array of orders
    /// @notice The orders in this function have been wrapped in structs to reduce the local variable count
    /// @param tokens Struct containing the arrays of token orders
    /// @param orders Struct containing the arrays of DEX orders
    function internalOrderExecution(Tokens tokens, DEXOrders orders) internal {
        transferTokens(tokens);

        uint256 tokensLength = tokens.tokenAddresses.length;
        uint256 ordersLength = orders.tokenForOrder.length;
        uint256 etherBalance = msg.value;
        uint256 orderIndex = 0;

        for(uint256 tokenIndex = 0; tokenIndex < tokensLength; tokenIndex++) {
            // NOTE - check for repetitions in the token list?

            uint256 amountRemaining = tokens.amountToGive[tokenIndex];
            uint256 amountObtained = 0;

            while(orderIndex < ordersLength) {
                require(
                    tokens.tokenAddresses[tokenIndex] == orders.tokenForOrder[orderIndex],
                    "TotlePrimary - tokenAddress != tokenForOrder"
                );
                require(
                    handlerWhitelist[orders.exchanges[orderIndex]],
                    "TotlePrimary - handler not in whitelist"
                );

                if(amountRemaining > 0) {
                    if(tokens.buyOrSell[tokenIndex] == BUY) {
                        require(
                            etherBalance >= amountRemaining,
                            "TotlePrimary - not enough ether left to fill next order"
                        );
                    }
                    (amountRemaining, amountObtained) = performTrade(
                        tokens.buyOrSell[tokenIndex],
                        amountRemaining,
                        amountObtained,
                        orders, // NOTE - unable to send pointer to order values individually, as run out of stack space!
                        orderIndex
                        );
                }

                orderIndex = SafeMath.add(orderIndex, 1);
                // If this is the last order for this token
                if(orderIndex == ordersLength || orders.tokenForOrder[SafeMath.sub(orderIndex, 1)] != orders.tokenForOrder[orderIndex]) {
                    break;
                }
            }

            uint256 amountGiven = SafeMath.sub(tokens.amountToGive[tokenIndex], amountRemaining);

            require(
                orderWasValid(amountObtained, amountGiven, tokens.amountToObtain[tokenIndex], tokens.amountToGive[tokenIndex]),
                "TotlePrimary - amount obtained for was not high enough"
            );

            if(tokens.buyOrSell[tokenIndex] == BUY) {
                // Take away spent ether from refund balance
                etherBalance = SafeMath.sub(etherBalance, amountGiven);
                // Transfer back tokens acquired
                if(amountObtained > 0) {
                    require(
                        Token(tokens.tokenAddresses[tokenIndex]).transfer(msg.sender, amountObtained),
                        "TotlePrimary - failed to transfer tokens bought to msg.sender"
                    );
                }
            } else {
                // Add ether to refund balance
                etherBalance = SafeMath.add(etherBalance, amountObtained);
                // Transfer back un-sold tokens
                if(amountRemaining > 0) {
                    require(
                        Token(tokens.tokenAddresses[tokenIndex]).transfer(msg.sender, amountRemaining),
                        "TotlePrimary - failed to transfer remaining tokens to msg.sender after sell"
                    );
                }
            }
        }

        // Send back acquired/unspent ether - throw on failure
        if(etherBalance > 0) {
            msg.sender.transfer(etherBalance);
        }
    }

    /// @dev Iterates through a list of token orders, transfer the SELL orders to this contract & calculates if we have the ether needed
    /// @param tokens Struct containing the arrays of token orders
    function transferTokens(Tokens tokens) internal {
        uint256 expectedEtherAvailable = msg.value;
        uint256 totalEtherNeeded = 0;

        for(uint256 i = 0; i < tokens.tokenAddresses.length; i++) {
            if(tokens.buyOrSell[i] == BUY) {
                totalEtherNeeded = SafeMath.add(totalEtherNeeded, tokens.amountToGive[i]);
            } else {
                expectedEtherAvailable = SafeMath.add(expectedEtherAvailable, tokens.amountToObtain[i]);
                require(
                    TokenTransferProxy(tokenTransferProxy).transferFrom(
                        tokens.tokenAddresses[i],
                        msg.sender,
                        this,
                        tokens.amountToGive[i]
                    ),
                    "TotlePrimary - proxy failed to transfer tokens from user"
                );
            }
        }

        // Make sure we have will have enough ETH after SELLs to cover our BUYs
        require(
            expectedEtherAvailable >= totalEtherNeeded,
            "TotlePrimary - not enough ether available to fill all orders"
        );
    }

    /// @dev Performs a single trade via the requested exchange handler
    /// @param buyOrSell Boolean value stating whether this is a buy or sell order
    /// @param initialRemaining The remaining value we have left to trade
    /// @param totalObtained The total amount we have obtained so far
    /// @param orders Struct containing all DEX orders
    /// @param index Value indicating the index of the specific DEX order we wish to execute
    /// @return Remaining value left after trade
    /// @return Total value obtained after trade
    function performTrade(bool buyOrSell, uint256 initialRemaining, uint256 totalObtained, DEXOrders orders, uint256 index)
        internal returns (uint256, uint256) {
        uint256 obtained = 0;
        uint256 remaining = initialRemaining;

        require(
            orders.exchangeFees[index] < MAX_EXCHANGE_FEE_PERCENTAGE,
            "TotlePrimary - exchange fee was above maximum"
        );

        uint256 amountToFill = getAmountToFill(remaining, orders, index);

        if(amountToFill > 0) {
            remaining = SafeMath.sub(remaining, amountToFill);

            if(buyOrSell == BUY) {
                obtained = ExchangeHandler(orders.exchanges[index]).performBuy.value(amountToFill)(
                    orders.orderAddresses[index],
                    orders.orderValues[index],
                    orders.exchangeFees[index],
                    amountToFill,
                    orders.v[index],
                    orders.r[index],
                    orders.s[index]
                );
            } else {
                require(
                    Token(orders.tokenForOrder[index]).transfer(
                        orders.exchanges[index],
                        amountToFill
                    ),
                    "TotlePrimary - token transfer to handler failed for sell"
                );
                obtained = ExchangeHandler(orders.exchanges[index]).performSell(
                    orders.orderAddresses[index],
                    orders.orderValues[index],
                    orders.exchangeFees[index],
                    amountToFill,
                    orders.v[index],
                    orders.r[index],
                    orders.s[index]
                );
            }
        }

        return (obtained == 0 ? initialRemaining: remaining, SafeMath.add(totalObtained, obtained));
    }

    /// @dev Get the amount of this order we are able to fill
    /// @param remaining Amount we have left to spend
    /// @param orders Struct containing all DEX orders
    /// @param index Value indicating the index of the specific DEX order we wish to execute
    /// @return Minimum of the amount we have left to spend and the available amount at the exchange
    function getAmountToFill(uint256 remaining, DEXOrders orders, uint256 index) internal returns (uint256) {

        uint256 availableAmount = ExchangeHandler(orders.exchanges[index]).getAvailableAmount(
            orders.orderAddresses[index],
            orders.orderValues[index],
            orders.exchangeFees[index],
            orders.v[index],
            orders.r[index],
            orders.s[index]
        );

        return Math.min256(remaining, availableAmount);
    }

    /// @dev Checks whether a given order was valid
    /// @param amountObtained Amount of the order which was obtained
    /// @param amountGiven Amount given in return for amountObtained
    /// @param amountToObtain Amount we intended to obtain
    /// @param amountToGive Amount we intended to give in return for amountToObtain
    /// @return Boolean value indicating whether this order was valid
    function orderWasValid(uint256 amountObtained, uint256 amountGiven, uint256 amountToObtain, uint256 amountToGive) internal pure returns (bool) {

        if(amountObtained > 0 && amountGiven > 0) {
            // NOTE - Check the edge cases here
            if(amountObtained > amountGiven) {
                return SafeMath.div(amountToObtain, amountToGive) <= SafeMath.div(amountObtained, amountGiven);
            } else {
                return SafeMath.div(amountToGive, amountToObtain) >= SafeMath.div(amountGiven, amountObtained);
            }
        }
        return false;
    }

    function() public payable {
        // Check in here that the sender is a contract! (to stop accidents)
        uint256 size;
        address sender = msg.sender;
        assembly {
            size := extcodesize(sender)
        }
        require(size > 0, "TotlePrimary - can only send ether from another contract");
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"tokenAddresses","type":"address[]"},{"name":"buyOrSell","type":"bool[]"},{"name":"amountToObtain","type":"uint256[]"},{"name":"amountToGive","type":"uint256[]"},{"name":"tokenForOrder","type":"address[]"},{"name":"exchanges","type":"address[]"},{"name":"orderAddresses","type":"address[8][]"},{"name":"orderValues","type":"uint256[6][]"},{"name":"exchangeFees","type":"uint256[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"uniqueID","type":"uint256"}],"name":"executeOrders","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"handler","type":"address"},{"name":"allowed","type":"bool"}],"name":"setHandler","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"handlerWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_EXCHANGE_FEE_PERCENTAGE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"proxy","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b506040516020806121f983398101806040528101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050612135806100c46000396000f300608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806364584b14146101245780638da5cb5b146104e15780639cb7de4b14610538578063c792433f14610587578063cb96b0d6146105e2578063f2fde38b1461060d575b600080339050803b9150600082111515610120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2063616e206f6e6c792073656e642065746881526020017f65722066726f6d20616e6f7468657220636f6e7472616374000000000000000081525060400191505060405180910390fd5b5050005b6104df60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610338578484839050610100020160088060200260405190810160405280929190826008602002808284378201915050505050815260200190600101906102f2565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156103b757848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610372565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190929190505050610650565b005b3480156104ed57600080fd5b506104f661086a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561054457600080fd5b50610585600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061088f565b005b34801561059357600080fd5b506105c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610945565b604051808215151515815260200191505060405180910390f35b3480156105ee57600080fd5b506105f7610965565b6040518082815260200191505060405180910390f35b34801561061957600080fd5b5061064e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610970565b005b8b518d5114801561066257508a518c51145b801561066f575089518b51145b1515610709576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d207472616465206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8751895114801561071b575086518851145b8015610728575085518751145b8015610735575084518651145b8015610742575083518551145b801561074f575082518451145b801561075c575081518351145b15156107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d206f72646572206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61085b6080604051908101604052808f81526020018e81526020018d81526020018c815250610100604051908101604052808c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815250610ac5565b50505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ea57600080fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60016020528060005260406000206000915054906101000a900460ff1681565b662386f26fc1000081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a0757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080610ada8a6113d4565b8960000151519750886000015151965034955060009450600093505b8784101561137757896060015184815181101515610b1057fe5b906020019060200201519250600091505b86851015610ec157886000015185815181101515610b3b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168a6000015185815181101515610b6d57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515610c28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f546f746c655072696d617279202d20746f6b656e4164647265737320213d207481526020017f6f6b656e466f724f72646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008a6020015187815181101515610c3e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610d2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f546f746c655072696d617279202d2068616e646c6572206e6f7420696e20776881526020017f6974656c6973740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000831115610e2b57600015158a6020015185815181101515610d4957fe5b9060200190602002015115151415610dfa57828610151515610df9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f6c65667420746f2066696c6c206e657874206f7264657200000000000000000081525060400191505060405180910390fd5b5b610e228a6020015185815181101515610e0f57fe5b9060200190602002015184848c89611757565b80935081945050505b610e36856001611e32565b945086851480610eb25750886000015185815181101515610e5357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168960000151610e83876001611e4e565b815181101515610e8f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610ebc57610ec1565b610b21565b610ee68a6060015185815181101515610ed657fe5b9060200190602002015184611e4e565b9050610f2a82828c6040015187815181101515610eff57fe5b906020019060200201518d6060015188815181101515610f1b57fe5b90602001906020020151611e67565b1515610fc4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f546f746c655072696d617279202d20616d6f756e74206f627461696e6564206681526020017f6f7220776173206e6f74206869676820656e6f7567680000000000000000000081525060400191505060405180910390fd5b600015158a6020015185815181101515610fda57fe5b906020019060200201511515141561119a57610ff68682611e4e565b955060008211156111955789600001518481518110151561101357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d60208110156110e957600080fd5b81019080805190602001909291905050501515611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f7220746f6b656e7320626f7567687420746f206d73672e73656e64657200000081525060400191505060405180910390fd5b5b61136a565b6111a48683611e32565b95506000831115611369578960000151848151811015156111c157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b505050506040513d602081101561129757600080fd5b81019080805190602001909291905050501515611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604b8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f722072656d61696e696e6720746f6b656e7320746f206d73672e73656e64657281526020017f2061667465722073656c6c00000000000000000000000000000000000000000081525060600191505060405180910390fd5b5b5b8380600101945050610af6565b60008611156113c8573373ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f193505050501580156113c6573d6000803e3d6000fd5b505b50505050505050505050565b600080600034925060009150600090505b8360000151518110156116b3576000151584602001518281518110151561140857fe5b90602001906020020151151514156114465761143f8285606001518381518110151561143057fe5b90602001906020020151611e32565b91506116a6565b61146b8385604001518381518110151561145c57fe5b90602001906020020151611e32565b9250600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea8560000151838151811015156114bd57fe5b9060200190602002015133308860600151868151811015156114db57fe5b906020019060200201516040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1580156115d057600080fd5b505af11580156115e4573d6000803e3d6000fd5b505050506040513d60208110156115fa57600080fd5b810190808051906020019092919050505015156116a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2070726f7879206661696c656420746f207481526020017f72616e7366657220746f6b656e732066726f6d2075736572000000000000000081525060400191505060405180910390fd5b5b80806001019150506113e5565b818310151515611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f617661696c61626c6520746f2066696c6c20616c6c206f72646572730000000081525060400191505060405180910390fd5b50505050565b6000806000806000809250889150662386f26fc1000087608001518781518110151561177f57fe5b90602001906020020151101515611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f746c655072696d617279202d2065786368616e676520666565207761732081526020017f61626f7665206d6178696d756d0000000000000000000000000000000000000081525060400191505060405180910390fd5b61182f828888611ecc565b90506000811115611e07576118448282611e4e565b9150600015158a15151415611a585786602001518681518110151561186557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663bdd5be2f8289604001518981518110151561189d57fe5b906020019060200201518a606001518a8151811015156118b957fe5b906020019060200201518b608001518b8151811015156118d557fe5b90602001906020020151868d60a001518d8151811015156118f257fe5b906020019060200201518e60c001518e81518110151561190e57fe5b906020019060200201518f60e001518f81518110151561192a57fe5b906020019060200201516040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b8381101561198a57808201518184015260208101905061196f565b5050505090500187600660200280838360005b838110156119b857808201518184015260208101905061199d565b505050509050018681526020018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019750505050505050506020604051808303818588803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b50505050506040513d6020811015611a4057600080fd5b81019080805190602001909291905050509250611e06565b866000015186815181101515611a6a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb886020015188815181101515611aa157fe5b90602001906020020151836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b3157600080fd5b505af1158015611b45573d6000803e3d6000fd5b505050506040513d6020811015611b5b57600080fd5b81019080805190602001909291905050501515611c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d20746f6b656e207472616e7366657220746f81526020017f2068616e646c6572206661696c656420666f722073656c6c000000000000000081525060400191505060405180910390fd5b866020015186815181101515611c1857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634981b3ca886040015188815181101515611c4f57fe5b90602001906020020151896060015189815181101515611c6b57fe5b906020019060200201518a608001518a815181101515611c8757fe5b90602001906020020151858c60a001518c815181101515611ca457fe5b906020019060200201518d60c001518d815181101515611cc057fe5b906020019060200201518e60e001518e815181101515611cdc57fe5b906020019060200201516040518863ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b83811015611d3c578082015181840152602081019050611d21565b5050505090500187600660200280838360005b83811015611d6a578082015181840152602081019050611d4f565b505050509050018681526020018581526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001975050505050505050602060405180830381600087803b158015611dc857600080fd5b505af1158015611ddc573d6000803e3d6000fd5b505050506040513d6020811015611df257600080fd5b810190808051906020019092919050505092505b5b60008314611e155781611e17565b885b611e218985611e32565b945094505050509550959350505050565b60008183019050828110151515611e4557fe5b80905092915050565b6000828211151515611e5c57fe5b818303905092915050565b60008085118015611e785750600084115b15611ebf5783851115611ea257611e8f85856120da565b611e9984846120da565b11159050611ec4565b611eac84866120da565b611eb683856120da565b10159050611ec4565b600090505b949350505050565b600080836020015183815181101515611ee157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634102bf5c856040015185815181101515611f1857fe5b90602001906020020151866060015186815181101515611f3457fe5b90602001906020020151876080015187815181101515611f5057fe5b906020019060200201518860a0015188815181101515611f6c57fe5b906020019060200201518960c0015189815181101515611f8857fe5b906020019060200201518a60e001518a815181101515611fa457fe5b906020019060200201516040518763ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018087600860200280838360005b83811015612004578082015181840152602081019050611fe9565b5050505090500186600660200280838360005b83811015612032578082015181840152602081019050612017565b505050509050018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019650505050505050602060405180830381600087803b15801561208957600080fd5b505af115801561209d573d6000803e3d6000fd5b505050506040513d60208110156120b357600080fd5b810190808051906020019092919050505090506120d085826120f0565b9150509392505050565b600081838115156120e757fe5b04905092915050565b60008183106120ff5781612101565b825b9050929150505600a165627a7a7230582042e5b1df16b8cccfab1a23ffb90dd4b115b24adba14e9d8305165f6ac9e5a2fe0029000000000000000000000000ca0ca9c0bafac4724daa5bdfccd105f63b194830

Deployed Bytecode

0x608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806364584b14146101245780638da5cb5b146104e15780639cb7de4b14610538578063c792433f14610587578063cb96b0d6146105e2578063f2fde38b1461060d575b600080339050803b9150600082111515610120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2063616e206f6e6c792073656e642065746881526020017f65722066726f6d20616e6f7468657220636f6e7472616374000000000000000081525060400191505060405180910390fd5b5050005b6104df60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610338578484839050610100020160088060200260405190810160405280929190826008602002808284378201915050505050815260200190600101906102f2565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156103b757848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610372565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190929190505050610650565b005b3480156104ed57600080fd5b506104f661086a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561054457600080fd5b50610585600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061088f565b005b34801561059357600080fd5b506105c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610945565b604051808215151515815260200191505060405180910390f35b3480156105ee57600080fd5b506105f7610965565b6040518082815260200191505060405180910390f35b34801561061957600080fd5b5061064e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610970565b005b8b518d5114801561066257508a518c51145b801561066f575089518b51145b1515610709576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d207472616465206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8751895114801561071b575086518851145b8015610728575085518751145b8015610735575084518651145b8015610742575083518551145b801561074f575082518451145b801561075c575081518351145b15156107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d206f72646572206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61085b6080604051908101604052808f81526020018e81526020018d81526020018c815250610100604051908101604052808c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815250610ac5565b50505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ea57600080fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60016020528060005260406000206000915054906101000a900460ff1681565b662386f26fc1000081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a0757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080610ada8a6113d4565b8960000151519750886000015151965034955060009450600093505b8784101561137757896060015184815181101515610b1057fe5b906020019060200201519250600091505b86851015610ec157886000015185815181101515610b3b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168a6000015185815181101515610b6d57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515610c28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f546f746c655072696d617279202d20746f6b656e4164647265737320213d207481526020017f6f6b656e466f724f72646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008a6020015187815181101515610c3e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610d2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f546f746c655072696d617279202d2068616e646c6572206e6f7420696e20776881526020017f6974656c6973740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000831115610e2b57600015158a6020015185815181101515610d4957fe5b9060200190602002015115151415610dfa57828610151515610df9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f6c65667420746f2066696c6c206e657874206f7264657200000000000000000081525060400191505060405180910390fd5b5b610e228a6020015185815181101515610e0f57fe5b9060200190602002015184848c89611757565b80935081945050505b610e36856001611e32565b945086851480610eb25750886000015185815181101515610e5357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168960000151610e83876001611e4e565b815181101515610e8f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610ebc57610ec1565b610b21565b610ee68a6060015185815181101515610ed657fe5b9060200190602002015184611e4e565b9050610f2a82828c6040015187815181101515610eff57fe5b906020019060200201518d6060015188815181101515610f1b57fe5b90602001906020020151611e67565b1515610fc4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f546f746c655072696d617279202d20616d6f756e74206f627461696e6564206681526020017f6f7220776173206e6f74206869676820656e6f7567680000000000000000000081525060400191505060405180910390fd5b600015158a6020015185815181101515610fda57fe5b906020019060200201511515141561119a57610ff68682611e4e565b955060008211156111955789600001518481518110151561101357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d60208110156110e957600080fd5b81019080805190602001909291905050501515611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f7220746f6b656e7320626f7567687420746f206d73672e73656e64657200000081525060400191505060405180910390fd5b5b61136a565b6111a48683611e32565b95506000831115611369578960000151848151811015156111c157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b505050506040513d602081101561129757600080fd5b81019080805190602001909291905050501515611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604b8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f722072656d61696e696e6720746f6b656e7320746f206d73672e73656e64657281526020017f2061667465722073656c6c00000000000000000000000000000000000000000081525060600191505060405180910390fd5b5b5b8380600101945050610af6565b60008611156113c8573373ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f193505050501580156113c6573d6000803e3d6000fd5b505b50505050505050505050565b600080600034925060009150600090505b8360000151518110156116b3576000151584602001518281518110151561140857fe5b90602001906020020151151514156114465761143f8285606001518381518110151561143057fe5b90602001906020020151611e32565b91506116a6565b61146b8385604001518381518110151561145c57fe5b90602001906020020151611e32565b9250600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea8560000151838151811015156114bd57fe5b9060200190602002015133308860600151868151811015156114db57fe5b906020019060200201516040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1580156115d057600080fd5b505af11580156115e4573d6000803e3d6000fd5b505050506040513d60208110156115fa57600080fd5b810190808051906020019092919050505015156116a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2070726f7879206661696c656420746f207481526020017f72616e7366657220746f6b656e732066726f6d2075736572000000000000000081525060400191505060405180910390fd5b5b80806001019150506113e5565b818310151515611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f617661696c61626c6520746f2066696c6c20616c6c206f72646572730000000081525060400191505060405180910390fd5b50505050565b6000806000806000809250889150662386f26fc1000087608001518781518110151561177f57fe5b90602001906020020151101515611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f746c655072696d617279202d2065786368616e676520666565207761732081526020017f61626f7665206d6178696d756d0000000000000000000000000000000000000081525060400191505060405180910390fd5b61182f828888611ecc565b90506000811115611e07576118448282611e4e565b9150600015158a15151415611a585786602001518681518110151561186557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663bdd5be2f8289604001518981518110151561189d57fe5b906020019060200201518a606001518a8151811015156118b957fe5b906020019060200201518b608001518b8151811015156118d557fe5b90602001906020020151868d60a001518d8151811015156118f257fe5b906020019060200201518e60c001518e81518110151561190e57fe5b906020019060200201518f60e001518f81518110151561192a57fe5b906020019060200201516040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b8381101561198a57808201518184015260208101905061196f565b5050505090500187600660200280838360005b838110156119b857808201518184015260208101905061199d565b505050509050018681526020018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019750505050505050506020604051808303818588803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b50505050506040513d6020811015611a4057600080fd5b81019080805190602001909291905050509250611e06565b866000015186815181101515611a6a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb886020015188815181101515611aa157fe5b90602001906020020151836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b3157600080fd5b505af1158015611b45573d6000803e3d6000fd5b505050506040513d6020811015611b5b57600080fd5b81019080805190602001909291905050501515611c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d20746f6b656e207472616e7366657220746f81526020017f2068616e646c6572206661696c656420666f722073656c6c000000000000000081525060400191505060405180910390fd5b866020015186815181101515611c1857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634981b3ca886040015188815181101515611c4f57fe5b90602001906020020151896060015189815181101515611c6b57fe5b906020019060200201518a608001518a815181101515611c8757fe5b90602001906020020151858c60a001518c815181101515611ca457fe5b906020019060200201518d60c001518d815181101515611cc057fe5b906020019060200201518e60e001518e815181101515611cdc57fe5b906020019060200201516040518863ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b83811015611d3c578082015181840152602081019050611d21565b5050505090500187600660200280838360005b83811015611d6a578082015181840152602081019050611d4f565b505050509050018681526020018581526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001975050505050505050602060405180830381600087803b158015611dc857600080fd5b505af1158015611ddc573d6000803e3d6000fd5b505050506040513d6020811015611df257600080fd5b810190808051906020019092919050505092505b5b60008314611e155781611e17565b885b611e218985611e32565b945094505050509550959350505050565b60008183019050828110151515611e4557fe5b80905092915050565b6000828211151515611e5c57fe5b818303905092915050565b60008085118015611e785750600084115b15611ebf5783851115611ea257611e8f85856120da565b611e9984846120da565b11159050611ec4565b611eac84866120da565b611eb683856120da565b10159050611ec4565b600090505b949350505050565b600080836020015183815181101515611ee157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634102bf5c856040015185815181101515611f1857fe5b90602001906020020151866060015186815181101515611f3457fe5b90602001906020020151876080015187815181101515611f5057fe5b906020019060200201518860a0015188815181101515611f6c57fe5b906020019060200201518960c0015189815181101515611f8857fe5b906020019060200201518a60e001518a815181101515611fa457fe5b906020019060200201516040518763ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018087600860200280838360005b83811015612004578082015181840152602081019050611fe9565b5050505090500186600660200280838360005b83811015612032578082015181840152602081019050612017565b505050509050018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019650505050505050602060405180830381600087803b15801561208957600080fd5b505af115801561209d573d6000803e3d6000fd5b505050506040513d60208110156120b357600080fd5b810190808051906020019092919050505090506120d085826120f0565b9150509392505050565b600081838115156120e757fe5b04905092915050565b60008183106120ff5781612101565b825b9050929150505600a165627a7a7230582042e5b1df16b8cccfab1a23ffb90dd4b115b24adba14e9d8305165f6ac9e5a2fe0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ca0ca9c0bafac4724daa5bdfccd105f63b194830

-----Decoded View---------------
Arg [0] : proxy (address): 0xCA0cA9C0BAFAc4724DAA5bdfccd105F63B194830

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ca0ca9c0bafac4724daa5bdfccd105f63b194830


Swarm Source

bzzr://42e5b1df16b8cccfab1a23ffb90dd4b115b24adba14e9d8305165f6ac9e5a2fe

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.