Contract 0xe17dbb844ba602e189889d941d1297184ce63664

 

Contract Overview

Balance:
0.596288271620158499 Ether

EtherValue:
$88.19 (@ $147.90/ETH)

Token:
TxHash Block Age From To Value [TxFee]
0x123dbe0cefc0effa205130a69194010dae4ac5bcf446b4c92c5c69df83fd88ef724658741 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.00281622 Ether0.00075048
0xc0364b4f3ddb182107e79d8246b2a45b2c2b9fb9b7542f704b8c0cad7bcf71d2724657046 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.00375496 Ether0.00075048
0x3d040971f704556ce19d0b017a04b18995b343f94087cd9fe8eeff13274c1494724656847 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.000375496 Ether0.00075048
0x277a6382b946bc8ec536cf202fe70d66288229adbd9a4d3e3339c8422c506638724655651 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.005632439999 Ether0.000167185
0xddea3367547289f1e7a1c0b0b0d539b5f23337753cf8b8ca1bc3e88160525734724655153 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.004130455999 Ether0.000167185
0x707b26b5c9665203015b4ab1dde2792a4bc60023cf8fdab1b403843680e61300724654355 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.004130455999 Ether0.000167185
0x62e00b230e56f008a411dcd33150b06f248cc3dde58f8b673738b2844e2283f1724654057 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.004130455999 Ether0.000167185
0xcbe4625b063e18c0a2a7be5e54b45a13f81cf72953a06a017f91e7d2726de568724653657 mins ago0xb1fc19c413f56c387fa6d9a1f15eb7867fa34e1c IN  0xe17dbb844ba602e189889d941d1297184ce636640.06144489036 Ether0.00081492
0xc37e939f2285fe42907673b6b8c82280bbfb4d8775143f53e92ce8dd86d9c2e3724653459 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.004130455999 Ether0.000100311
0x5728b00933a1f16a012799a3055a729c2427817cf15fb4720a20c396764d3e1172465301 hr 1 min ago0x23742a5997852a992965cad73d1fc9f136149cbf IN  0xe17dbb844ba602e189889d941d1297184ce636640.01506 Ether0.000444264
0xb02115a98a261a2f59f1b4e8bf1b180491dedda7f2ab41fbcb2cf8ca58f5ff2672465251 hr 2 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.004130455999 Ether0.000100311
0x836c79dee739c70bd090fd872673c52c6c7392be2ce414aa827c29af5f29f21572464961 hr 15 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.004130455999 Ether0.000100311
0x0d5c6e6499064858a96875e5810754b78e36013a4c8d47f051b8d9ce1046901672464751 hr 24 mins ago0x6f92ef9c248ebde6df47781436aec60f1e73144c IN  0xe17dbb844ba602e189889d941d1297184ce636640.0006777 Ether0.001303872
0x22769034558721e9a3135536a8359354d6c2ecee0d0bb91f45e705e8064680d872464531 hr 30 mins ago0x8c5c0bfa318d7a706759fa676047bdb2312e647a IN  0xe17dbb844ba602e189889d941d1297184ce636640.000000009036 Ether0.000489456
0xac1d970f4080c4f5831559c0c9f84a8dd6af1959a04a5e6b56a58330d14c543772464031 hr 48 mins ago0xd5b2ad714054400c4524531419b987b52d2d949e IN  0xe17dbb844ba602e189889d941d1297184ce636640 Ether0.00179607
0x6658608cd9ce1ca44ce66750607620598609ae29eabade6d2463a75d9691446e72463991 hr 49 mins ago0xd5b2ad714054400c4524531419b987b52d2d949e IN  0xe17dbb844ba602e189889d941d1297184ce636640 Ether0.00209671
0x1d4723a8c2f79d6733c3cefa2c3d70d54e519b351ef02732dad6dd6e5c0e2d9972462932 hrs 21 mins ago0xb1fc19c413f56c387fa6d9a1f15eb7867fa34e1c IN  0xe17dbb844ba602e189889d941d1297184ce636640.08583557903 Ether0.000166225
0x875c27746b0b14a9eb2d308a29b9fc52bf434e75b22eaec88be3ec8e193fcf9f72460683 hrs 31 mins ago0xa43bcc7016b21012e3018ac0bfbac2fa585dbcab IN  0xe17dbb844ba602e189889d941d1297184ce636640 Ether0.00175527
0x188d32b15e3b948635c3eeb5464b091d3f3184444518434c39b7f6613ff88bd772460643 hrs 31 mins ago0xa43bcc7016b21012e3018ac0bfbac2fa585dbcab IN  0xe17dbb844ba602e189889d941d1297184ce636640 Ether0.00190527
0xeacb9735b8225b34581e2767cc1ee5293b9330da6df0ecff793e239e62664dd272460593 hrs 33 mins ago0xa43bcc7016b21012e3018ac0bfbac2fa585dbcab IN  0xe17dbb844ba602e189889d941d1297184ce636640.00229916 Ether0.00147116
0xaf4516def875b637ee88e749e41c15b3bb872d17f4845348e11b8f451d64aa2772460573 hrs 34 mins ago0xa43bcc7016b21012e3018ac0bfbac2fa585dbcab IN  0xe17dbb844ba602e189889d941d1297184ce636640.000229916 Ether0.00147052
0x25bf664f9e7b088f225f18212c134e86376a847b920702397801b0a106f55a3472460573 hrs 34 mins ago0xa43bcc7016b21012e3018ac0bfbac2fa585dbcab IN  0xe17dbb844ba602e189889d941d1297184ce636640.000229916 Ether0.00147052
0x1fcb28899690ae7d75dfaec7ed39db83b6a783c9518102894ec4993f3898d5a972460573 hrs 34 mins ago0xa43bcc7016b21012e3018ac0bfbac2fa585dbcab IN  0xe17dbb844ba602e189889d941d1297184ce636640.000229916 Ether0.00147052
0x1f76705fdaa7837783516b15aeb3f1e53a821f69dc707be78cd23c986a7cb5f472460543 hrs 35 mins ago0xa43bcc7016b21012e3018ac0bfbac2fa585dbcab IN  0xe17dbb844ba602e189889d941d1297184ce636640.000229916 Ether0.00162052
0x27541194106ce9873ace1a18620fc0ae30d3254d708c99d4067d830dc1770f5f72460433 hrs 39 mins ago0x03882e4dc1b6d5521b3403cb686d5b9b0157dabd IN  0xe17dbb844ba602e189889d941d1297184ce636640.0343368 Ether0.00058243
[ Download CSV Export 

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

Parent TxHash Block Age From To Value
0x123dbe0cefc0effa205130a69194010dae4ac5bcf446b4c92c5c69df83fd88ef724658741 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.00281622 Ether
0xc0364b4f3ddb182107e79d8246b2a45b2c2b9fb9b7542f704b8c0cad7bcf71d2724657046 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.00375496 Ether
0x3d040971f704556ce19d0b017a04b18995b343f94087cd9fe8eeff13274c1494724656847 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.000375496 Ether
0xcbe4625b063e18c0a2a7be5e54b45a13f81cf72953a06a017f91e7d2726de568724653657 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.06144489036 Ether
0x5728b00933a1f16a012799a3055a729c2427817cf15fb4720a20c396764d3e1172465301 hr 1 min ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.01506 Ether
0x0d5c6e6499064858a96875e5810754b78e36013a4c8d47f051b8d9ce1046901672464751 hr 24 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.0006777 Ether
0x22769034558721e9a3135536a8359354d6c2ecee0d0bb91f45e705e8064680d872464531 hr 30 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.000000009036 Ether
0xac1d970f4080c4f5831559c0c9f84a8dd6af1959a04a5e6b56a58330d14c543772464031 hr 48 mins ago0xe17dbb844ba602e189889d941d1297184ce636640xd5b2ad714054400c4524531419b987b52d2d949e0.09052 Ether
0xac1d970f4080c4f5831559c0c9f84a8dd6af1959a04a5e6b56a58330d14c543772464031 hr 48 mins ago0x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80xe17dbb844ba602e189889d941d1297184ce636640.09052 Ether
0x6658608cd9ce1ca44ce66750607620598609ae29eabade6d2463a75d9691446e72463991 hr 49 mins ago0xe17dbb844ba602e189889d941d1297184ce636640xd5b2ad714054400c4524531419b987b52d2d949e0.01008709 Ether
0x6658608cd9ce1ca44ce66750607620598609ae29eabade6d2463a75d9691446e72463991 hr 49 mins ago0x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80xe17dbb844ba602e189889d941d1297184ce636640.01008709 Ether
0x875c27746b0b14a9eb2d308a29b9fc52bf434e75b22eaec88be3ec8e193fcf9f72460683 hrs 31 mins ago0xe17dbb844ba602e189889d941d1297184ce636640xa43bcc7016b21012e3018ac0bfbac2fa585dbcab0.0003509 Ether
0x875c27746b0b14a9eb2d308a29b9fc52bf434e75b22eaec88be3ec8e193fcf9f72460683 hrs 31 mins ago0x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80xe17dbb844ba602e189889d941d1297184ce636640.0003509 Ether
0x188d32b15e3b948635c3eeb5464b091d3f3184444518434c39b7f6613ff88bd772460643 hrs 31 mins ago0xe17dbb844ba602e189889d941d1297184ce636640xa43bcc7016b21012e3018ac0bfbac2fa585dbcab0.00003509 Ether
0x188d32b15e3b948635c3eeb5464b091d3f3184444518434c39b7f6613ff88bd772460643 hrs 31 mins ago0x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80xe17dbb844ba602e189889d941d1297184ce636640.00337355539515104 Ether
0xeacb9735b8225b34581e2767cc1ee5293b9330da6df0ecff793e239e62664dd272460593 hrs 33 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.00229916 Ether
0xaf4516def875b637ee88e749e41c15b3bb872d17f4845348e11b8f451d64aa2772460573 hrs 34 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.000229916 Ether
0x25bf664f9e7b088f225f18212c134e86376a847b920702397801b0a106f55a3472460573 hrs 34 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.000229916 Ether
0x1fcb28899690ae7d75dfaec7ed39db83b6a783c9518102894ec4993f3898d5a972460573 hrs 34 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.000229916 Ether
0x1f76705fdaa7837783516b15aeb3f1e53a821f69dc707be78cd23c986a7cb5f472460543 hrs 35 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.000229916 Ether
0x27541194106ce9873ace1a18620fc0ae30d3254d708c99d4067d830dc1770f5f72460433 hrs 39 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.0343368 Ether
0x1d8d54a39f4d66743a2ddd62425ef9b29fcb172b9230db47e1af00141eb22aee72460373 hrs 42 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.1754992 Ether
0xa67c818529e8373e07928fc378ccaad476a4c1bf6ca83a7fa0ff0f232ee3b6f472460323 hrs 44 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.1373472 Ether
0x9f5268b5e15f01fb3032c8780e10b14af7103532b50cc5b4421e28de1550eded72460293 hrs 45 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.19076 Ether
0xfa33b66b5b0441c2bfbe52db5bd51b799c77bf8c5383d1c73d2d73cbba375bc872460193 hrs 48 mins ago0xe17dbb844ba602e189889d941d1297184ce636640x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d80.2060208 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

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


Contract Source Code
pragma solidity ^0.4.19;

// ERC20 token protocol, see more details at
// https://theethereum.wiki/w/index.php/ERC20_Token_Standard
// And also https://github.com/ethereum/eips/issues/20

contract Token {

  string public name;
  string public symbol;
  uint8 public decimals;

  function totalSupply() constant returns (uint256 supply);
  function balanceOf(address _owner) constant returns (uint256 balance);
  function transfer(address _to, uint256 _value) returns (bool success);
  function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
  function approve(address _spender, uint256 _value) returns (bool success);
  function allowance(address _owner, address _spender) constant returns (uint256 remaining);

  event Transfer(address indexed _from, address indexed _to, uint256 _value);
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

// Safe mathematics to make the code more readable

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

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

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

// Ownable interface to simplify owner checks

contract Ownable {
  address public owner;

  function Ownable() {
    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  function transferOwnership(address _newOwner) onlyOwner {
    require(_newOwner != address(0));
    owner = _newOwner;
  }
}

// Interface for trading discounts and rebates for specific accounts

contract AccountModifiersInterface {
  function accountModifiers(address _user) constant returns(uint takeFeeDiscount, uint rebatePercentage);
  function tradeModifiers(address _maker, address _taker) constant returns(uint takeFeeDiscount, uint rebatePercentage);
}

// Interface for trade tacker

contract TradeTrackerInterface {
  function tradeComplete(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive, address _get, address _give, uint _takerFee, uint _makerRebate);
}

// Exchange contract

contract TokenStore is SafeMath, Ownable {

  // The account that will receive fees
  address feeAccount;

  // The account that stores fee discounts/rebates
  address accountModifiers;

  // Trade tracker account
  address tradeTracker;

  // We charge only the takers and this is the fee, percentage times 1 ether
  uint public fee;

  // Mapping of token addresses to mapping of account balances (token 0 means Ether)
  mapping (address => mapping (address => uint)) public tokens;

  // Mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled)
  mapping (address => mapping (bytes32 => uint)) public orderFills;

  // Address of a next and previous versions of the contract, also status of the contract
  // can be used for user-triggered fund migrations
  address public successor;
  address public predecessor;
  bool public deprecated;
  uint16 public version;

  // Logging events
  // Note: Order creation is handled off-chain, see explanation further below
  event Cancel(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s);
  event Trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address get, address give, uint nonce);
  event Deposit(address token, address user, uint amount, uint balance);
  event Withdraw(address token, address user, uint amount, uint balance);
  event FundsMigrated(address user);

  function TokenStore(uint _fee, address _predecessor) {
    feeAccount = owner;
    fee = _fee;
    predecessor = _predecessor;
    deprecated = false;
    if (predecessor != address(0)) {
      version = TokenStore(predecessor).version() + 1;
    } else {
      version = 1;
    }
  }

  // Throw on default handler to prevent direct transactions of Ether
  function() {
    revert();
  }

  modifier deprecable() {
    require(!deprecated);
    _;
  }

  function deprecate(bool _deprecated, address _successor) onlyOwner {
    deprecated = _deprecated;
    successor = _successor;
  }

  function changeFeeAccount(address _feeAccount) onlyOwner {
    require(_feeAccount != address(0));
    feeAccount = _feeAccount;
  }

  function changeAccountModifiers(address _accountModifiers) onlyOwner {
    accountModifiers = _accountModifiers;
  }

  function changeTradeTracker(address _tradeTracker) onlyOwner {
    tradeTracker = _tradeTracker;
  }

  // Fee can only be decreased!
  function changeFee(uint _fee) onlyOwner {
    require(_fee <= fee);
    fee = _fee;
  }

  // Allows a user to get her current discount/rebate
  function getAccountModifiers() constant returns(uint takeFeeDiscount, uint rebatePercentage) {
    if (accountModifiers != address(0)) {
      return AccountModifiersInterface(accountModifiers).accountModifiers(msg.sender);
    } else {
      return (0, 0);
    }
  }

  ////////////////////////////////////////////////////////////////////////////////
  // Deposits, withdrawals, balances
  ////////////////////////////////////////////////////////////////////////////////

  function deposit() payable deprecable {
    tokens[0][msg.sender] = safeAdd(tokens[0][msg.sender], msg.value);
    Deposit(0, msg.sender, msg.value, tokens[0][msg.sender]);
  }

  function withdraw(uint _amount) {
    require(tokens[0][msg.sender] >= _amount);
    tokens[0][msg.sender] = safeSub(tokens[0][msg.sender], _amount);
    if (!msg.sender.call.value(_amount)()) {
      revert();
    }
    Withdraw(0, msg.sender, _amount, tokens[0][msg.sender]);
  }

  function depositToken(address _token, uint _amount) deprecable {
    // Note that Token(_token).approve(this, _amount) needs to be called
    // first or this contract will not be able to do the transfer.
    require(_token != 0);
    if (!Token(_token).transferFrom(msg.sender, this, _amount)) {
      revert();
    }
    tokens[_token][msg.sender] = safeAdd(tokens[_token][msg.sender], _amount);
    Deposit(_token, msg.sender, _amount, tokens[_token][msg.sender]);
  }

  function withdrawToken(address _token, uint _amount) {
    require(_token != 0);
    require(tokens[_token][msg.sender] >= _amount);
    tokens[_token][msg.sender] = safeSub(tokens[_token][msg.sender], _amount);
    if (!Token(_token).transfer(msg.sender, _amount)) {
      revert();
    }
    Withdraw(_token, msg.sender, _amount, tokens[_token][msg.sender]);
  }

  function balanceOf(address _token, address _user) constant returns (uint) {
    return tokens[_token][_user];
  }

  ////////////////////////////////////////////////////////////////////////////////
  // Trading
  ////////////////////////////////////////////////////////////////////////////////

  // Note: Order creation happens off-chain but the orders are signed by creators,
  // we validate the contents and the creator address in the logic below

  function trade(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive,
      uint _expires, uint _nonce, address _user, uint8 _v, bytes32 _r, bytes32 _s, uint _amount) {
    bytes32 hash = sha256(this, _tokenGet, _amountGet, _tokenGive, _amountGive, _expires, _nonce);
    // Check order signatures and expiration, also check if not fulfilled yet
		if (ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash), _v, _r, _s) != _user ||
      block.number > _expires ||
      safeAdd(orderFills[_user][hash], _amount) > _amountGet) {
      revert();
    }
    tradeBalances(_tokenGet, _amountGet, _tokenGive, _amountGive, _user, msg.sender, _amount);
    orderFills[_user][hash] = safeAdd(orderFills[_user][hash], _amount);
    Trade(_tokenGet, _amount, _tokenGive, _amountGive * _amount / _amountGet, _user, msg.sender, _nonce);
  }

  function tradeBalances(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive,
      address _user, address _caller, uint _amount) private {

    uint feeTakeValue = safeMul(_amount, fee) / (1 ether);
    uint rebateValue = 0;
    uint tokenGiveValue = safeMul(_amountGive, _amount) / _amountGet; // Proportionate to request ratio

    // Apply modifiers
    if (accountModifiers != address(0)) {
      var (feeTakeDiscount, rebatePercentage) = AccountModifiersInterface(accountModifiers).tradeModifiers(_user, _caller);
      // Check that the discounts/rebates are never higher then 100%
      if (feeTakeDiscount > 100) {
        feeTakeDiscount = 0;
      }
      if (rebatePercentage > 100) {
        rebatePercentage = 0;
      }
      feeTakeValue = safeMul(feeTakeValue, 100 - feeTakeDiscount) / 100;  // discounted fee
      rebateValue = safeMul(rebatePercentage, feeTakeValue) / 100;        // % of actual taker fee
    }

    tokens[_tokenGet][_user] = safeAdd(tokens[_tokenGet][_user], safeAdd(_amount, rebateValue));
    tokens[_tokenGet][_caller] = safeSub(tokens[_tokenGet][_caller], safeAdd(_amount, feeTakeValue));
    tokens[_tokenGive][_user] = safeSub(tokens[_tokenGive][_user], tokenGiveValue);
    tokens[_tokenGive][_caller] = safeAdd(tokens[_tokenGive][_caller], tokenGiveValue);
    tokens[_tokenGet][feeAccount] = safeAdd(tokens[_tokenGet][feeAccount], safeSub(feeTakeValue, rebateValue));

    if (tradeTracker != address(0)) {
      TradeTrackerInterface(tradeTracker).tradeComplete(_tokenGet, _amount, _tokenGive, tokenGiveValue, _user, _caller, feeTakeValue, rebateValue);
    }
  }

  function testTrade(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive, uint _expires,
      uint _nonce, address _user, uint8 _v, bytes32 _r, bytes32 _s, uint _amount, address _sender) constant returns(bool) {
    if (tokens[_tokenGet][_sender] < _amount ||
      availableVolume(_tokenGet, _amountGet, _tokenGive, _amountGive, _expires, _nonce, _user, _v, _r, _s) < _amount) {
      return false;
    }
    return true;
  }

  function availableVolume(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive, uint _expires,
      uint _nonce, address _user, uint8 _v, bytes32 _r, bytes32 _s) constant returns(uint) {
    bytes32 hash = sha256(this, _tokenGet, _amountGet, _tokenGive, _amountGive, _expires, _nonce);
    if (ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash), _v, _r, _s) != _user ||
      block.number > _expires) {
      return 0;
    }
    uint available1 = safeSub(_amountGet, orderFills[_user][hash]);
    uint available2 = safeMul(tokens[_tokenGive][_user], _amountGet) / _amountGive;
    if (available1 < available2) return available1;
    return available2;
  }

  function amountFilled(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive, uint _expires,
      uint _nonce, address _user) constant returns(uint) {
    bytes32 hash = sha256(this, _tokenGet, _amountGet, _tokenGive, _amountGive, _expires, _nonce);
    return orderFills[_user][hash];
  }

  function cancelOrder(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive, uint _expires,
      uint _nonce, uint8 _v, bytes32 _r, bytes32 _s) {
    bytes32 hash = sha256(this, _tokenGet, _amountGet, _tokenGive, _amountGive, _expires, _nonce);
    if (!(ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash), _v, _r, _s) == msg.sender)) {
      revert();
    }
    orderFills[msg.sender][hash] = _amountGet;
    Cancel(_tokenGet, _amountGet, _tokenGive, _amountGive, _expires, _nonce, msg.sender, _v, _r, _s);
  }

  ////////////////////////////////////////////////////////////////////////////////
  // Migrations
  ////////////////////////////////////////////////////////////////////////////////

  // User-triggered (!) fund migrations in case contract got updated
  // Similar to withdraw but we use a successor account instead
  // As we don't store user tokens list on chain, it has to be passed from the outside
  function migrateFunds(address[] _tokens) {

    // Get the latest successor in the chain
    require(successor != address(0));
    TokenStore newExchange = TokenStore(successor);
    for (uint16 n = 0; n < 20; n++) {  // We will look past 20 contracts in the future
      address nextSuccessor = newExchange.successor();
      if (nextSuccessor == address(this)) {  // Circular succession
        revert();
      }
      if (nextSuccessor == address(0)) { // We reached the newest, stop
        break;
      }
      newExchange = TokenStore(nextSuccessor);
    }

    // Ether
    uint etherAmount = tokens[0][msg.sender];
    if (etherAmount > 0) {
      tokens[0][msg.sender] = 0;
      newExchange.depositForUser.value(etherAmount)(msg.sender);
    }

    // Tokens
    for (n = 0; n < _tokens.length; n++) {
      address token = _tokens[n];
      require(token != address(0)); // 0 = Ether, we handle it above
      uint tokenAmount = tokens[token][msg.sender];
      if (tokenAmount == 0) {
        continue;
      }
      if (!Token(token).approve(newExchange, tokenAmount)) {
        revert();
      }
      tokens[token][msg.sender] = 0;
      newExchange.depositTokenForUser(token, tokenAmount, msg.sender);
    }

    FundsMigrated(msg.sender);
  }

  // This is used for migrations only. To be called by previous exchange only,
  // user-triggered, on behalf of the user called the migrateFunds method.
  // Note that it does exactly the same as depositToken, but as this is called
  // by a previous generation of exchange itself, we credit internally not the
  // previous exchange, but the user it was called for.
  function depositForUser(address _user) payable deprecable {
    require(_user != address(0));
    require(msg.value > 0);
    TokenStore caller = TokenStore(msg.sender);
    require(caller.version() > 0); // Make sure it's an exchange account
    tokens[0][_user] = safeAdd(tokens[0][_user], msg.value);
  }

  function depositTokenForUser(address _token, uint _amount, address _user) deprecable {
    require(_token != address(0));
    require(_user != address(0));
    require(_amount > 0);
    TokenStore caller = TokenStore(msg.sender);
    require(caller.version() > 0); // Make sure it's an exchange account
    if (!Token(_token).transferFrom(msg.sender, this, _amount)) {
      revert();
    }
    tokens[_token][_user] = safeAdd(tokens[_token][_user], _amount);
  }
}

contract InstantTrade is SafeMath, Ownable {

  // This is needed so we can withdraw funds from other smart contracts
  function() payable {
  }
  
  // End to end trading in a single call
  function instantTrade(address _tokenGet, uint _amountGet, address _tokenGive, uint _amountGive,
      uint _expires, uint _nonce, address _user, uint8 _v, bytes32 _r, bytes32 _s, uint _amount, address _store) payable {
    
    // Fix max fee (0.4%) and always reserve it
    uint totalValue = safeMul(_amount, 1004) / 1000;
    
    // Paying with Ethereum or token? Deposit to the actual store
    if (_tokenGet == address(0)) {
      // Check amount of ether sent to make sure it's correct
      if (msg.value != totalValue) {
        revert();
      }
      TokenStore(_store).deposit.value(totalValue)();
    } else {
      // Assuming user already approved transfer, transfer first to this contract
      if (!Token(_tokenGet).transferFrom(msg.sender, this, totalValue)) {
        revert();
      }
      // Allow now actual store to deposit
      if (!Token(_tokenGet).approve(_store, totalValue)) {
        revert();
      }
      TokenStore(_store).depositToken(_tokenGet, totalValue);
    }
    
    // Trade
    TokenStore(_store).trade(_tokenGet, _amountGet, _tokenGive, _amountGive,
      _expires, _nonce, _user, _v, _r, _s, _amount);
    
    // Check how much did we get and how much should we send back
    totalValue = TokenStore(_store).balanceOf(_tokenGive, this);
    uint customerValue = safeMul(_amountGive, _amount) / _amountGet;
    
    // Now withdraw all the funds into this contract and then pass to the user
    if (_tokenGive == address(0)) {
      TokenStore(_store).withdraw(totalValue);
      msg.sender.transfer(customerValue);
    } else {
      TokenStore(_store).withdrawToken(_tokenGive, totalValue);
      if (!Token(_tokenGive).transfer(msg.sender, customerValue)) {
        revert();
      }
    }
  }
  
  function withdrawFees(address _token) onlyOwner {
    if (_token == address(0)) {
      msg.sender.transfer(this.balance);
    } else {
      uint amount = Token(_token).balanceOf(this);
      if (!Token(_token).transfer(msg.sender, amount)) {
        revert();
      }
    }
  }  
}

Contract ABI
[{"constant":false,"inputs":[{"name":"_tokenGet","type":"address"},{"name":"_amountGet","type":"uint256"},{"name":"_tokenGive","type":"address"},{"name":"_amountGive","type":"uint256"},{"name":"_expires","type":"uint256"},{"name":"_nonce","type":"uint256"},{"name":"_user","type":"address"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"},{"name":"_amount","type":"uint256"},{"name":"_store","type":"address"}],"name":"instantTrade","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"withdrawFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"}]

Contract Creation Code
6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f41806100536000396000f300608060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806308e05b8514610064578063164e68de146101555780638da5cb5b14610198578063f2fde38b146101ef575b005b610153600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291908035600019169060200190929190803560001916906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610232565b005b34801561016157600080fd5b50610196600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b28565b005b3480156101a457600080fd5b506101ad610de3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101fb57600080fd5b50610230600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e08565b005b6000806103e8610244856103ec610ee2565b81151561024d57fe5b049150600073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16141561031557813414151561029357600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b1580156102f757600080fd5b505af115801561030b573d6000803e3d6000fd5b50505050506105d7565b8d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d602081101561041657600080fd5b8101908080519060200190929190505050151561043257600080fd5b8d73ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156104d557600080fd5b505af11580156104e9573d6000803e3d6000fd5b505050506040513d60208110156104ff57600080fd5b8101908080519060200190929190505050151561051b57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663338b5dea8f846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156105be57600080fd5b505af11580156105d2573d6000803e3d6000fd5b505050505b8273ffffffffffffffffffffffffffffffffffffffff16630a19b14a8f8f8f8f8f8f8f8f8f8f8f6040518c63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018560ff1660ff168152602001846000191660001916815260200183600019166000191681526020018281526020019b505050505050505050505050600060405180830381600087803b15801561073057600080fd5b505af1158015610744573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663f7888aec8d306040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561081757600080fd5b505af115801561082b573d6000803e3d6000fd5b505050506040513d602081101561084157600080fd5b810190808051906020019092919050505091508c61085f8c86610ee2565b81151561086857fe5b049050600073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161415610973578273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561090f57600080fd5b505af1158015610923573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561096d573d6000803e3d6000fd5b50610b18565b8273ffffffffffffffffffffffffffffffffffffffff16639e281a988d846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610a1657600080fd5b505af1158015610a2a573d6000803e3d6000fd5b505050508b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ad157600080fd5b505af1158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b81019080805190602001909291905050501515610b1757600080fd5b5b5050505050505050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b8557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c1d573373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015610c17573d6000803e3d6000fd5b50610ddf565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610cb857600080fd5b505af1158015610ccc573d6000803e3d6000fd5b505050506040513d6020811015610ce257600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d9857600080fd5b505af1158015610dac573d6000803e3d6000fd5b505050506040513d6020811015610dc257600080fd5b81019080805190602001909291905050501515610dde57600080fd5b5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e6357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610e9f57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008082840290506000841480610f035750828482811515610f0057fe5b04145b1515610f0b57fe5b80915050929150505600a165627a7a7230582081a354272428a9b8d3f961d3793825f26e08c07debe709d8815e1c110f5698c20029


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