Address Contract Partially Verified
Address
0x1cE7AE555139c5EF5A57CC8d814a867ee6Ee33D8
Balance
634.7504 ETH
Nonce
1
Code Size
8651 bytes
Creator
0x44a93F55...3B20 at tx 0x386439ac...b42bb6
Indexed Transactions
0
Contract Bytecode
8651 bytes
0x6060604052361561014e5763ffffffff60e060020a6000350416630a19b14a81146101665780630e136b19146101b557806319774d43146101dc578063278b8c0e146102105780632d804ca2146102515780632e1a7d4d1461029e578063338b5dea146102b657806338ec18c3146102da5780633c2e2a75146102fb57806348d64fd514610326578063508493bc1461034757806354fd4d501461037e57806359015ed5146103a85780636a1db1bf146103d35780636a523c5e146103eb5780636c86888b146104015780636ff968c31461046d57806371ffcb161461049c5780638da5cb5b146104bd5780639e281a98146104ec578063b719d03214610510578063be3dd1311461053f578063d0e30db014610590578063ddca3f431461059a578063e6213127146105bf578063f2fde38b146105e5578063f7888aec14610606578063fb6e155f1461063d575b341561015957600080fd5b6101645b600080fd5b565b005b341561017157600080fd5b610164600160a060020a0360043581169060243590604435811690606435906084359060a4359060c4351660ff60e43516610104356101243561014435610698565b005b34156101c057600080fd5b6101c8610921565b604051901515815260200160405180910390f35b34156101e757600080fd5b6101fe600160a060020a0360043516602435610931565b60405190815260200160405180910390f35b341561021b57600080fd5b610164600160a060020a03600435811690602435906044351660643560843560a43560ff60c4351660e4356101043561094e565b005b341561025c57600080fd5b6101fe600160a060020a0360043581169060243590604435811690606435906084359060a4359060c43516610b74565b60405190815260200160405180910390f35b34156102a957600080fd5b610164600435610c39565b005b34156102c157600080fd5b610164600160a060020a0360043516602435610d6f565b005b34156102e557600080fd5b610164600160a060020a0360043516610ee8565b005b341561030657600080fd5b610164600160a060020a036004358116906024359060443516610f30565b005b341561033157600080fd5b610164600160a060020a03600435166110e3565b005b341561035257600080fd5b6101fe600160a060020a036004358116906024351661112b565b60405190815260200160405180910390f35b341561038957600080fd5b610391611148565b60405161ffff909116815260200160405180910390f35b34156103b357600080fd5b6103bb61116b565b60405191825260208201526040908101905180910390f35b34156103de57600080fd5b61016460043561120f565b005b610164600160a060020a0360043516611243565b005b341561040c57600080fd5b6101c8600160a060020a0360043581169060243590604435811690606435906084359060a4359060c43581169060ff60e4351690610104359061012435906101443590610164351661134f565b604051901515815260200160405180910390f35b341561047857600080fd5b6104806113b6565b604051600160a060020a03909116815260200160405180910390f35b34156104a757600080fd5b610164600160a060020a03600435166113c5565b005b34156104c857600080fd5b610480611422565b604051600160a060020a03909116815260200160405180910390f35b34156104f757600080fd5b610164600160a060020a0360043516602435611431565b005b341561051b57600080fd5b6104806115d9565b604051600160a060020a03909116815260200160405180910390f35b341561054a57600080fd5b61016460046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506115e895505050505050565b005b610164611970565b005b34156105a557600080fd5b6101fe611a3e565b60405190815260200160405180910390f35b34156105ca57600080fd5b6101646004351515600160a060020a0360243516611a44565b005b34156105f057600080fd5b610164600160a060020a0360043516611ab5565b005b341561061157600080fd5b6101fe600160a060020a0360043581169060243516611b12565b60405190815260200160405180910390f35b341561064857600080fd5b6101fe600160a060020a0360043581169060243590604435811690606435906084359060a4359060c4351660ff60e435166101043561012435611b3f565b60405190815260200160405180910390f35b60006002308d8d8d8d8d8d6000604051602001526040516c01000000000000000000000000600160a060020a0398891681028252968816870260148201526028810195909552929095169093026048830152605c820192909252607c810192909252609c82015260bc0160206040518083038160008661646e5a03f1151561071f57600080fd5b50506040518051915050600160a060020a0386166001826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0160405180910390208787876040518060005260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f115156107d157600080fd5b505060206040510351600160a060020a03161415806107ef57508743115b806108275750600160a060020a03861660009081526006602090815260408083208484529091529020548b906108259084611d3d565b115b1561083157600080fd5b6108408c8c8c8c8a3388611d65565b600160a060020a038616600090815260066020908152604080832084845290915290205461086e9083611d3d565b600160a060020a03871660009081526006602090815260408083208584529091529020557f3314c351c2a2a45771640a1442b843167a4da29bd543612311c031bbfb4ffa988c838c8e8d83028115156108c357fe5b048a338d604051600160a060020a03978816815260208101969096529386166040808701919091526060860193909352908516608085015290931660a083015260c082015260e001905180910390a15b505050505050505050505050565b60085460a060020a900460ff1681565b600660209081526000928352604080842090915290825290205481565b60006002308b8b8b8b8b8b6000604051602001526040516c01000000000000000000000000600160a060020a0398891681028252968816870260148201526028810195909552929095169093026048830152605c820192909252607c810192909252609c82015260bc0160206040518083038160008661646e5a03f115156109d557600080fd5b50506040518051915050600160a060020a0333166001826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0160405180910390208686866040518060005260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f11515610a8757600080fd5b505060206040510351600160a060020a031614610aa357600080fd5b33600160a060020a0381166000908152600660209081526040808320858452909152908190208b90557f1e0b760c386003e9cb9bcf4fcf3997886042859d9b6ed6320e804597fcdb28b0918c918c918c918c918c918c91908c908c908c9051600160a060020a039a8b16815260208101999099529689166040808a01919091526060890196909652608088019490945260a087019290925290951660c085015260ff90941660e084015261010083019390935261012082015261014001905180910390a15b50505050505050505050565b6000806002308a8a8a8a8a8a6000604051602001526040516c01000000000000000000000000600160a060020a0398891681028252968816870260148201526028810195909552929095169093026048830152605c820192909252607c810192909252609c82015260bc0160206040518083038160008661646e5a03f11515610bfc57600080fd5b50506040518051600160a060020a038516600090815260066020908152604080832084845290915290205493509150505b50979650505050505050565b33600160a060020a03166000908152600080516020612180833981519152602052604090205481901015610c6c57600080fd5b33600160a060020a031660009081526000805160206121808339815191526020526040902054610c9c9082612139565b33600160a060020a03166000818152600080516020612180833981519152602052604090819020929092559082905160006040518083038185876187965a03f1925050501515610ceb57600080fd5b33600160a060020a03811660009081526000805160206121808339815191526020526040808220547ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567939185919051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a15b50565b60085460a060020a900460ff1615610d8657600080fd5b600160a060020a0382161515610d9b57600080fd5b81600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610e0557600080fd5b6102c65a03f11515610e1657600080fd5b505050604051805190501515610e2b57600080fd5b600160a060020a0380831660009081526005602090815260408083203390941683529290522054610e5c9082611d3d565b600160a060020a038381166000908152600560209081526040808320339485168452909152908190208390557fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79285929185919051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a15b5b5050565b60005433600160a060020a03908116911614610f0357600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60085460009060a060020a900460ff1615610f4a57600080fd5b600160a060020a0384161515610f5f57600080fd5b600160a060020a0382161515610f7457600080fd5b60008311610f8157600080fd5b50336000600160a060020a0382166354fd4d5082604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fca57600080fd5b6102c65a03f11515610fdb57600080fd5b5050506040518051905061ffff16111515610ff557600080fd5b83600160a060020a03166323b872dd33308660006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561105f57600080fd5b6102c65a03f1151561107057600080fd5b50505060405180519050151561108557600080fd5b600160a060020a038085166000908152600560209081526040808320938616835292905220546110b59084611d3d565b600160a060020a038086166000908152600560209081526040808320938716835292905220555b5b50505050565b60005433600160a060020a039081169116146110fe57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600560209081526000928352604080842090915290825290205481565b6008547501000000000000000000000000000000000000000000900461ffff1681565b6002546000908190600160a060020a03161561120357600254600160a060020a031663ea08ec2c3360006040516040015260405160e060020a63ffffffff8416028152600160a060020a0390911660048201526024016040805180830381600087803b15156111d957600080fd5b6102c65a03f115156111ea57600080fd5b505050604051805190602001805190509150915061120a565b5060009050805b5b9091565b60005433600160a060020a0390811691161461122a57600080fd5b60045481111561123957600080fd5b60048190555b5b50565b60085460009060a060020a900460ff161561125d57600080fd5b600160a060020a038216151561127257600080fd5b6000341161127f57600080fd5b50336000600160a060020a0382166354fd4d5082604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156112c857600080fd5b6102c65a03f115156112d957600080fd5b5050506040518051905061ffff161115156112f357600080fd5b600160a060020a038216600090815260008051602061218083398151915260205260409020546113239034611d3d565b600160a060020a038316600090815260008051602061218083398151915260205260409020555b5b5050565b600160a060020a03808d166000908152600560209081526040808320938516835292905290812054839010806113955750826113938e8e8e8e8e8e8e8e8e8e611b3f565b105b156113a2575060006113a6565b5060015b9c9b505050505050505050505050565b600754600160a060020a031681565b60005433600160a060020a039081169116146113e057600080fd5b600160a060020a03811615156113f557600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600054600160a060020a031681565b600160a060020a038216151561144657600080fd5b600160a060020a03808316600090815260056020908152604080832033909416835292905220548190101561147a57600080fd5b600160a060020a03808316600090815260056020908152604080832033909416835292905220546114ab9082612139565b600160a060020a03808416600081815260056020908152604080832033958616845290915280822094909455909263a9059cbb92918591516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561152a57600080fd5b6102c65a03f1151561153b57600080fd5b50505060405180519050151561155057600080fd5b600160a060020a03808316600090815260056020908152604080832033948516845290915290819020547ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679285929091859151600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a15b5050565b600854600160a060020a031681565b60075460009081908190819081908190600160a060020a0316151561160c57600080fd5b600754600160a060020a03169550600094505b60148561ffff1610156116d25785600160a060020a0316636ff968c36000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561167257600080fd5b6102c65a03f1151561168357600080fd5b50505060405180519050935030600160a060020a031684600160a060020a031614156116ae57600080fd5b600160a060020a03841615156116c3576116d2565b8395505b60019094019361161f565b33600160a060020a031660009081526000805160206121808339815191526020526040812054935083111561178a57600160a060020a0333818116600090815260008051602061218083398151915260205260408082209190915591881691636a523c5e9186915160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b151561177457600080fd5b6125ee5a03f1151561178557600080fd5b505050505b600094505b86518561ffff16101561192957868561ffff16815181106117ac57fe5b906020019060200201519150600160a060020a03821615156117cd57600080fd5b50600160a060020a03808216600090815260056020908152604080832033909416835292905220548015156118015761191e565b81600160a060020a031663095ea7b3878360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561185e57600080fd5b6102c65a03f1151561186f57600080fd5b50505060405180519050151561188457600080fd5b600160a060020a03808316600090815260056020908152604080832033808616855292528083209290925591881691633c2e2a7591859185915160e060020a63ffffffff8616028152600160a060020a03938416600482015260248101929092529091166044820152606401600060405180830381600087803b151561190957600080fd5b6102c65a03f1151561191a57600080fd5b5050505b60019094019361178f565b7f0e3e9a671666295c299b941a07625839915442794bf73a484b24bb3e221270c333604051600160a060020a03909116815260200160405180910390a15b50505050505050565b60085460a060020a900460ff161561198757600080fd5b33600160a060020a0316600090815260008051602061218083398151915260205260409020546119b79034611d3d565b33600160a060020a038116600090815260008051602061218083398151915260205260408082208490557fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d793919291349151600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a15b5b565b60045481565b60005433600160a060020a03908116911614611a5f57600080fd5b6008805474ff0000000000000000000000000000000000000000191660a060020a841515021790556007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5050565b60005433600160a060020a03908116911614611ad057600080fd5b600160a060020a0381161515611ae557600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600160a060020a038083166000908152600560209081526040808320938516835292905220545b92915050565b6000806000806002308f8f8f8f8f8f6000604051602001526040516c01000000000000000000000000600160a060020a0398891681028252968816870260148201526028810195909552929095169093026048830152605c820192909252607c810192909252609c82015260bc0160206040518083038160008661646e5a03f11515611bca57600080fd5b50506040518051935050600160a060020a0388166001846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0160405180910390208989896040518060005260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f11515611c7c57600080fd5b505060206040510351600160a060020a0316141580611c9a57508943115b15611ca85760009350611d2c565b600160a060020a0388166000908152600660209081526040808320868452909152902054611cd7908e90612139565b600160a060020a03808e166000908152600560209081526040808320938d16835292905220549092508b90611d0c908f612150565b811515611d1557fe5b04905080821015611d2857819350611d2c565b8093505b5050509a9950505050505050505050565b6000828201838110801590611d525750828110155b1515611d5a57fe5b8091505b5092915050565b6000806000806000670de0b6b3a7640000611d8287600454612150565b811515611d8b57fe5b049450600093508a611d9d8a88612150565b811515611da657fe5b6002549190049350600160a060020a031615611e9057600254600160a060020a031663e97fe114898960006040516040015260405160e060020a63ffffffff8516028152600160a060020a039283166004820152911660248201526044016040805180830381600087803b1515611e1c57600080fd5b6102c65a03f11515611e2d57600080fd5b50505060405180519060200180519050915091506064821115611e4f57600091505b6064811115611e5c575060005b6064611e6b8684606403612150565b811515611e7457fe5b0494506064611e838287612150565b811515611e8c57fe5b0493505b600160a060020a03808d166000908152600560209081526040808320938c1683529290522054611ec990611ec48887611d3d565b611d3d565b600160a060020a038d811660009081526005602090815260408083208d851684529091528082209390935590891681522054611f0e90611f098888611d3d565b612139565b600160a060020a03808e1660009081526005602081815260408084208d861685528252808420959095558e84168352908152838220928c168252919091522054611f589084612139565b600160a060020a038b811660009081526005602090815260408083208d851684529091528082209390935590891681522054611f949084611d3d565b600560008c600160a060020a0316600160a060020a03168152602001908152602001600020600089600160a060020a0316600160a060020a0316815260200190815260200160002081905550612050600560008e600160a060020a0316600160a060020a031681526020019081526020016000206000600160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002054611ec48787612139565b611d3d565b600160a060020a03808e16600090815260056020908152604080832060015485168452909152902091909155600354161561091357600354600160a060020a031663f0fc14388d888d878d8d8c8c60405160e060020a63ffffffff8b16028152600160a060020a039889166004820152602481019790975294871660448701526064860193909352908516608485015290931660a483015260c482019290925260e481019190915261010401600060405180830381600087803b151561211557600080fd5b6102c65a03f1151561212657600080fd5b5050505b5b505050505050505050505050565b60008282111561214557fe5b508082035b92915050565b6000828202831580611d52575082848281151561216957fe5b04145b1515611d5a57fe5b8091505b5092915050560005b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bca165627a7a7230582077f218d396cd040a425e3dc0d8a1d2b99db2d2b265a225a4134ec6bed3adc3810029
Verified Source Code Partial Match
Compiler: v0.4.13+commit.0fb4cb1a
Optimization: Yes (200 runs)
TokenStore.sol 371 lines
pragma solidity ^0.4.11;
// 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 {
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);
}
}
Write Contract 28 functions
These functions modify contract state and require a wallet transaction to execute.
amountFilled 0x2d804ca2
address _tokenGet
uint256 _amountGet
address _tokenGive
uint256 _amountGive
uint256 _expires
uint256 _nonce
address _user
returns: uint256
availableVolume 0xfb6e155f
address _tokenGet
uint256 _amountGet
address _tokenGive
uint256 _amountGive
uint256 _expires
uint256 _nonce
address _user
uint8 _v
bytes32 _r
bytes32 _s
returns: uint256
balanceOf 0xf7888aec
address _token
address _user
returns: uint256
cancelOrder 0x278b8c0e
address _tokenGet
uint256 _amountGet
address _tokenGive
uint256 _amountGive
uint256 _expires
uint256 _nonce
uint8 _v
bytes32 _r
bytes32 _s
changeAccountModifiers 0x38ec18c3
address _accountModifiers
changeFee 0x6a1db1bf
uint256 _fee
changeFeeAccount 0x71ffcb16
address _feeAccount
changeTradeTracker 0x48d64fd5
address _tradeTracker
deposit 0xd0e30db0
No parameters
depositForUser 0x6a523c5e
address _user
depositToken 0x338b5dea
address _token
uint256 _amount
depositTokenForUser 0x3c2e2a75
address _token
uint256 _amount
address _user
deprecate 0xe6213127
bool _deprecated
address _successor
deprecated 0x0e136b19
No parameters
returns: bool
fee 0xddca3f43
No parameters
returns: uint256
getAccountModifiers 0x59015ed5
No parameters
returns: uint256, uint256
migrateFunds 0xbe3dd131
address[] _tokens
orderFills 0x19774d43
address
bytes32
returns: uint256
owner 0x8da5cb5b
No parameters
returns: address
predecessor 0xb719d032
No parameters
returns: address
successor 0x6ff968c3
No parameters
returns: address
testTrade 0x6c86888b
address _tokenGet
uint256 _amountGet
address _tokenGive
uint256 _amountGive
uint256 _expires
uint256 _nonce
address _user
uint8 _v
bytes32 _r
bytes32 _s
uint256 _amount
address _sender
returns: bool
tokens 0x508493bc
address
address
returns: uint256
trade 0x0a19b14a
address _tokenGet
uint256 _amountGet
address _tokenGive
uint256 _amountGive
uint256 _expires
uint256 _nonce
address _user
uint8 _v
bytes32 _r
bytes32 _s
uint256 _amount
transferOwnership 0xf2fde38b
address _newOwner
version 0x54fd4d50
No parameters
returns: uint16
withdraw 0x2e1a7d4d
uint256 _amount
withdrawToken 0x9e281a98
address _token
uint256 _amount
Token Balances (4)
View Transfers →Recent Transactions
No transactions found for this address