@@ -18,11 +18,11 @@ contract Exchange {
18
18
uint public constant CHUNK_SIZE = 100 ;
19
19
20
20
struct Order {
21
- uint index;
21
+ uint64 index;
22
22
address maker;
23
23
24
24
// tokens per ether
25
- uint price;
25
+ uint32 price;
26
26
27
27
// buy order: amount in wei
28
28
// sell order: token amount
@@ -32,42 +32,43 @@ contract Exchange {
32
32
Order[] public buyTokenOrders;
33
33
Order[] public sellTokenOrders;
34
34
35
- uint [] private activeBuyOrders;
36
- uint [] private activeSellOrders;
35
+ uint64 [] private activeBuyOrders;
36
+ uint64 [] private activeSellOrders;
37
37
38
38
/* used to stop executing matchMultiple when running out of gas.
39
39
actual is much less, just leaving enough matchMultipleOrders() to finish TODO: fine tune & test it*/
40
40
uint32 private constant ORDER_MATCH_WORST_GAS = 100000 ;
41
41
42
- event NewOrder (uint indexed orderId , address indexed maker , uint price , uint tokenAmount ,
42
+ event NewOrder (uint64 indexed orderId , address indexed maker , uint32 price , uint tokenAmount ,
43
43
uint weiAmount );
44
44
45
- event OrderFill (address indexed tokenBuyer , address indexed tokenSeller , uint buyTokenOrderId ,
46
- uint sellTokenOrderId , uint price , uint weiAmount , uint tokenAmount );
45
+ event OrderFill (address indexed tokenBuyer , address indexed tokenSeller , uint64 buyTokenOrderId ,
46
+ uint64 sellTokenOrderId , uint32 price , uint weiAmount , uint tokenAmount );
47
47
48
- event CancelledOrder (uint indexed orderId , address indexed maker , uint tokenAmount , uint weiAmount );
48
+ event CancelledOrder (uint64 indexed orderId , address indexed maker , uint tokenAmount , uint weiAmount );
49
49
50
50
function Exchange (AugmintTokenInterface _augmintToken ) public {
51
51
augmintToken = _augmintToken;
52
52
}
53
53
54
- function placeBuyTokenOrder (uint price ) external payable returns (uint orderId ) {
54
+ function placeBuyTokenOrder (uint32 price ) external payable returns (uint64 orderId ) {
55
55
require (price > 0 );
56
56
require (msg .value > 0 );
57
57
58
- orderId = buyTokenOrders.push (Order (activeBuyOrders.length , msg .sender , price, msg .value )) - 1 ;
58
+ uint64 index = uint64 (activeBuyOrders.length );
59
+ orderId = uint64 (buyTokenOrders.push (Order (index, msg .sender , price, msg .value )) - 1 );
59
60
activeBuyOrders.push (orderId);
60
61
61
62
NewOrder (orderId, msg .sender , price, 0 , msg .value );
62
63
}
63
64
64
65
/* this function requires previous approval to transfer tokens */
65
- function placeSellTokenOrder (uint price , uint tokenAmount ) external returns (uint orderId ) {
66
+ function placeSellTokenOrder (uint32 price , uint tokenAmount ) external returns (uint orderId ) {
66
67
augmintToken.transferFrom (msg .sender , this , tokenAmount);
67
68
return _placeSellTokenOrder (msg .sender , price, tokenAmount);
68
69
}
69
70
70
- function cancelBuyTokenOrder (uint buyTokenId ) external {
71
+ function cancelBuyTokenOrder (uint64 buyTokenId ) external {
71
72
Order storage order = buyTokenOrders[buyTokenId];
72
73
require (order.maker == msg .sender );
73
74
@@ -80,7 +81,7 @@ contract Exchange {
80
81
CancelledOrder (buyTokenId, msg .sender , 0 , amount);
81
82
}
82
83
83
- function cancelSellTokenOrder (uint sellTokenId ) external {
84
+ function cancelSellTokenOrder (uint64 sellTokenId ) external {
84
85
Order storage order = sellTokenOrders[sellTokenId];
85
86
require (order.maker == msg .sender );
86
87
@@ -97,15 +98,15 @@ contract Exchange {
97
98
trade price meets in the middle
98
99
reverts if any of the orders have been removed
99
100
*/
100
- function matchOrders (uint buyTokenId , uint sellTokenId ) external {
101
+ function matchOrders (uint64 buyTokenId , uint64 sellTokenId ) external {
101
102
_fillOrder (buyTokenId, sellTokenId);
102
103
}
103
104
104
105
/* matches as many orders as possible from the passed orders
105
106
Runs as long as gas is available for the call.
106
107
Stops if any match is invalid (case when any of the orders removed after client generated the match list sent)
107
108
*/
108
- function matchMultipleOrders (uint [] buyTokenIds , uint [] sellTokenIds ) external returns (uint matchCount ) {
109
+ function matchMultipleOrders (uint64 [] buyTokenIds , uint64 [] sellTokenIds ) external returns (uint matchCount ) {
109
110
uint len = buyTokenIds.length ;
110
111
require (len == sellTokenIds.length );
111
112
for (uint i = 0 ; i < len && msg .gas > ORDER_MATCH_WORST_GAS; i++ ) {
@@ -144,17 +145,17 @@ contract Exchange {
144
145
*/
145
146
function transferNotification (address maker , uint tokenAmount , uint price ) public {
146
147
require (msg .sender == address (augmintToken));
147
- _placeSellTokenOrder (maker, price, tokenAmount);
148
+ _placeSellTokenOrder (maker, uint32 ( price) , tokenAmount);
148
149
}
149
150
150
- function _fillOrder (uint buyTokenId , uint sellTokenId ) private {
151
+ function _fillOrder (uint64 buyTokenId , uint64 sellTokenId ) private {
151
152
Order storage buy = buyTokenOrders[buyTokenId];
152
153
Order storage sell = sellTokenOrders[sellTokenId];
153
154
154
155
require (buy.price >= sell.price);
155
156
156
157
// meet in the middle
157
- uint price = buy.price.add (sell.price).div (2 );
158
+ uint price = uint ( buy.price) .add (sell.price).div (2 );
158
159
159
160
uint sellWei = sell.amount.mul (1 ether).div (price);
160
161
@@ -182,16 +183,17 @@ contract Exchange {
182
183
sell.maker.transfer (tradedWei);
183
184
184
185
OrderFill (buy.maker, sell.maker, buyTokenId,
185
- sellTokenId, price, tradedWei, tradedTokens);
186
+ sellTokenId, uint32 ( price) , tradedWei, tradedTokens);
186
187
}
187
188
188
189
189
- function _placeSellTokenOrder (address maker , uint price , uint tokenAmount )
190
- private returns (uint orderId ) {
190
+ function _placeSellTokenOrder (address maker , uint32 price , uint tokenAmount )
191
+ private returns (uint64 orderId ) {
191
192
require (price > 0 );
192
193
require (tokenAmount > 0 );
193
194
194
- orderId = sellTokenOrders.push (Order (activeSellOrders.length , maker, price, tokenAmount)) - 1 ;
195
+ uint64 index = uint64 (activeSellOrders.length );
196
+ orderId = uint64 (sellTokenOrders.push (Order (index, maker, price, tokenAmount)) - 1 );
195
197
activeSellOrders.push (orderId);
196
198
197
199
NewOrder (orderId, maker, price, tokenAmount, 0 );
@@ -205,7 +207,7 @@ contract Exchange {
205
207
_removeOrder (activeSellOrders, order.index);
206
208
}
207
209
208
- function _removeOrder (uint [] storage orders , uint index ) private {
210
+ function _removeOrder (uint64 [] storage orders , uint64 index ) private {
209
211
if (index < orders.length - 1 ) {
210
212
orders[index] = orders[orders.length - 1 ];
211
213
}
0 commit comments