5
5
TODO:
6
6
- deduct fee
7
7
- consider take funcs (frequent rate changes with takeBuyToken? send more and send back remainder?)
8
- - uint32 for addedTime?
9
8
*/
10
9
pragma solidity 0.4.19 ;
11
10
@@ -19,57 +18,58 @@ contract Exchange {
19
18
uint public constant CHUNK_SIZE = 100 ;
20
19
21
20
struct Order {
22
- uint index;
21
+ uint64 index;
23
22
address maker;
24
- uint addedTime;
25
23
26
24
// tokens per ether
27
- uint price;
25
+ uint32 price;
28
26
29
27
// buy order: amount in wei
30
28
// sell order: token amount
31
29
uint amount;
32
30
}
33
31
34
- Order[] public buyTokenOrders;
35
- Order[] public sellTokenOrders;
32
+ uint64 public orderCount;
33
+ mapping (uint64 => Order) public buyTokenOrders;
34
+ mapping (uint64 => Order) public sellTokenOrders;
36
35
37
- uint [] private activeBuyOrders;
38
- uint [] private activeSellOrders;
36
+ uint64 [] private activeBuyOrders;
37
+ uint64 [] private activeSellOrders;
39
38
40
39
/* used to stop executing matchMultiple when running out of gas.
41
40
actual is much less, just leaving enough matchMultipleOrders() to finish TODO: fine tune & test it*/
42
41
uint32 private constant ORDER_MATCH_WORST_GAS = 100000 ;
43
42
44
- event NewOrder (uint indexed orderId , address indexed maker , uint price , uint tokenAmount ,
43
+ event NewOrder (uint64 indexed orderId , address indexed maker , uint32 price , uint tokenAmount ,
45
44
uint weiAmount );
46
45
47
- event OrderFill (address indexed tokenBuyer , address indexed tokenSeller , uint buyTokenOrderId ,
48
- uint sellTokenOrderId , uint price , uint weiAmount , uint tokenAmount );
46
+ event OrderFill (address indexed tokenBuyer , address indexed tokenSeller , uint64 buyTokenOrderId ,
47
+ uint64 sellTokenOrderId , uint32 price , uint weiAmount , uint tokenAmount );
49
48
50
- event CancelledOrder (uint indexed orderId , address indexed maker , uint tokenAmount , uint weiAmount );
49
+ event CancelledOrder (uint64 indexed orderId , address indexed maker , uint tokenAmount , uint weiAmount );
51
50
52
51
function Exchange (AugmintTokenInterface _augmintToken ) public {
53
52
augmintToken = _augmintToken;
54
53
}
55
54
56
- function placeBuyTokenOrder (uint price ) external payable returns (uint orderId ) {
55
+ function placeBuyTokenOrder (uint32 price ) external payable returns (uint64 orderId ) {
57
56
require (price > 0 );
58
57
require (msg .value > 0 );
59
58
60
- orderId = buyTokenOrders.push (Order (activeBuyOrders.length , msg .sender , now , price, msg .value )) - 1 ;
59
+ orderId = ++ orderCount;
60
+ buyTokenOrders[orderId] = Order (uint64 (activeBuyOrders.length ), msg .sender , price, msg .value );
61
61
activeBuyOrders.push (orderId);
62
62
63
63
NewOrder (orderId, msg .sender , price, 0 , msg .value );
64
64
}
65
65
66
66
/* this function requires previous approval to transfer tokens */
67
- function placeSellTokenOrder (uint price , uint tokenAmount ) external returns (uint orderId ) {
67
+ function placeSellTokenOrder (uint32 price , uint tokenAmount ) external returns (uint orderId ) {
68
68
augmintToken.transferFrom (msg .sender , this , tokenAmount);
69
69
return _placeSellTokenOrder (msg .sender , price, tokenAmount);
70
70
}
71
71
72
- function cancelBuyTokenOrder (uint buyTokenId ) external {
72
+ function cancelBuyTokenOrder (uint64 buyTokenId ) external {
73
73
Order storage order = buyTokenOrders[buyTokenId];
74
74
require (order.maker == msg .sender );
75
75
@@ -82,7 +82,7 @@ contract Exchange {
82
82
CancelledOrder (buyTokenId, msg .sender , 0 , amount);
83
83
}
84
84
85
- function cancelSellTokenOrder (uint sellTokenId ) external {
85
+ function cancelSellTokenOrder (uint64 sellTokenId ) external {
86
86
Order storage order = sellTokenOrders[sellTokenId];
87
87
require (order.maker == msg .sender );
88
88
@@ -99,15 +99,15 @@ contract Exchange {
99
99
trade price meets in the middle
100
100
reverts if any of the orders have been removed
101
101
*/
102
- function matchOrders (uint buyTokenId , uint sellTokenId ) external {
102
+ function matchOrders (uint64 buyTokenId , uint64 sellTokenId ) external {
103
103
_fillOrder (buyTokenId, sellTokenId);
104
104
}
105
105
106
106
/* matches as many orders as possible from the passed orders
107
107
Runs as long as gas is available for the call.
108
108
Stops if any match is invalid (case when any of the orders removed after client generated the match list sent)
109
109
*/
110
- function matchMultipleOrders (uint [] buyTokenIds , uint [] sellTokenIds ) external returns (uint matchCount ) {
110
+ function matchMultipleOrders (uint64 [] buyTokenIds , uint64 [] sellTokenIds ) external returns (uint matchCount ) {
111
111
uint len = buyTokenIds.length ;
112
112
require (len == sellTokenIds.length );
113
113
for (uint i = 0 ; i < len && msg .gas > ORDER_MATCH_WORST_GAS; i++ ) {
@@ -121,20 +121,20 @@ contract Exchange {
121
121
}
122
122
123
123
// returns CHUNK_SIZE orders starting from offset
124
- // orders are encoded as [id, maker, addedTime, price, amount]
125
- function getActiveBuyOrders (uint offset ) external view returns (uint [5 ][CHUNK_SIZE] response) {
124
+ // orders are encoded as [id, maker, price, amount]
125
+ function getActiveBuyOrders (uint offset ) external view returns (uint [4 ][CHUNK_SIZE] response) {
126
126
for (uint8 i = 0 ; i < CHUNK_SIZE && i + offset < activeBuyOrders.length ; i++ ) {
127
- uint orderId = activeBuyOrders[offset + i];
127
+ uint64 orderId = activeBuyOrders[offset + i];
128
128
Order storage order = buyTokenOrders[orderId];
129
- response[i] = [orderId, uint (order.maker), order.addedTime, order. price, order.amount];
129
+ response[i] = [orderId, uint (order.maker), order.price, order.amount];
130
130
}
131
131
}
132
132
133
- function getActiveSellOrders (uint offset ) external view returns (uint [5 ][CHUNK_SIZE] response) {
133
+ function getActiveSellOrders (uint offset ) external view returns (uint [4 ][CHUNK_SIZE] response) {
134
134
for (uint8 i = 0 ; i < CHUNK_SIZE && i + offset < activeSellOrders.length ; i++ ) {
135
- uint orderId = activeSellOrders[offset + i];
135
+ uint64 orderId = activeSellOrders[offset + i];
136
136
Order storage order = sellTokenOrders[orderId];
137
- response[i] = [orderId, uint (order.maker), order.addedTime, order. price, order.amount];
137
+ response[i] = [orderId, uint (order.maker), order.price, order.amount];
138
138
}
139
139
}
140
140
@@ -146,17 +146,17 @@ contract Exchange {
146
146
*/
147
147
function transferNotification (address maker , uint tokenAmount , uint price ) public {
148
148
require (msg .sender == address (augmintToken));
149
- _placeSellTokenOrder (maker, price, tokenAmount);
149
+ _placeSellTokenOrder (maker, uint32 ( price) , tokenAmount);
150
150
}
151
151
152
- function _fillOrder (uint buyTokenId , uint sellTokenId ) private {
152
+ function _fillOrder (uint64 buyTokenId , uint64 sellTokenId ) private {
153
153
Order storage buy = buyTokenOrders[buyTokenId];
154
154
Order storage sell = sellTokenOrders[sellTokenId];
155
155
156
156
require (buy.price >= sell.price);
157
157
158
158
// meet in the middle
159
- uint price = buy.price.add (sell.price).div (2 );
159
+ uint price = uint ( buy.price) .add (sell.price).div (2 );
160
160
161
161
uint sellWei = sell.amount.mul (1 ether).div (price);
162
162
@@ -184,16 +184,17 @@ contract Exchange {
184
184
sell.maker.transfer (tradedWei);
185
185
186
186
OrderFill (buy.maker, sell.maker, buyTokenId,
187
- sellTokenId, price, tradedWei, tradedTokens);
187
+ sellTokenId, uint32 ( price) , tradedWei, tradedTokens);
188
188
}
189
189
190
190
191
- function _placeSellTokenOrder (address maker , uint price , uint tokenAmount )
192
- private returns (uint orderId ) {
191
+ function _placeSellTokenOrder (address maker , uint32 price , uint tokenAmount )
192
+ private returns (uint64 orderId ) {
193
193
require (price > 0 );
194
194
require (tokenAmount > 0 );
195
195
196
- orderId = sellTokenOrders.push (Order (activeSellOrders.length , maker, now , price, tokenAmount)) - 1 ;
196
+ orderId = ++ orderCount;
197
+ sellTokenOrders[orderId] = Order (uint64 (activeSellOrders.length ), maker, price, tokenAmount);
197
198
activeSellOrders.push (orderId);
198
199
199
200
NewOrder (orderId, maker, price, tokenAmount, 0 );
@@ -207,7 +208,7 @@ contract Exchange {
207
208
_removeOrder (activeSellOrders, order.index);
208
209
}
209
210
210
- function _removeOrder (uint [] storage orders , uint index ) private {
211
+ function _removeOrder (uint64 [] storage orders , uint64 index ) private {
211
212
if (index < orders.length - 1 ) {
212
213
orders[index] = orders[orders.length - 1 ];
213
214
}
0 commit comments