Skip to content

Commit be9ac72

Browse files
committed
exchange: narrower types to reduce storage use
1 parent 79eff01 commit be9ac72

File tree

1 file changed

+25
-23
lines changed

1 file changed

+25
-23
lines changed

contracts/Exchange.sol

+25-23
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ contract Exchange {
1818
uint public constant CHUNK_SIZE = 100;
1919

2020
struct Order {
21-
uint index;
21+
uint64 index;
2222
address maker;
2323

2424
// tokens per ether
25-
uint price;
25+
uint32 price;
2626

2727
// buy order: amount in wei
2828
// sell order: token amount
@@ -32,42 +32,43 @@ contract Exchange {
3232
Order[] public buyTokenOrders;
3333
Order[] public sellTokenOrders;
3434

35-
uint[] private activeBuyOrders;
36-
uint[] private activeSellOrders;
35+
uint64[] private activeBuyOrders;
36+
uint64[] private activeSellOrders;
3737

3838
/* used to stop executing matchMultiple when running out of gas.
3939
actual is much less, just leaving enough matchMultipleOrders() to finish TODO: fine tune & test it*/
4040
uint32 private constant ORDER_MATCH_WORST_GAS = 100000;
4141

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,
4343
uint weiAmount);
4444

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);
4747

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);
4949

5050
function Exchange(AugmintTokenInterface _augmintToken) public {
5151
augmintToken = _augmintToken;
5252
}
5353

54-
function placeBuyTokenOrder(uint price) external payable returns (uint orderId) {
54+
function placeBuyTokenOrder(uint32 price) external payable returns (uint64 orderId) {
5555
require(price > 0);
5656
require(msg.value > 0);
5757

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);
5960
activeBuyOrders.push(orderId);
6061

6162
NewOrder(orderId, msg.sender, price, 0, msg.value);
6263
}
6364

6465
/* 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) {
6667
augmintToken.transferFrom(msg.sender, this, tokenAmount);
6768
return _placeSellTokenOrder(msg.sender, price, tokenAmount);
6869
}
6970

70-
function cancelBuyTokenOrder(uint buyTokenId) external {
71+
function cancelBuyTokenOrder(uint64 buyTokenId) external {
7172
Order storage order = buyTokenOrders[buyTokenId];
7273
require(order.maker == msg.sender);
7374

@@ -80,7 +81,7 @@ contract Exchange {
8081
CancelledOrder(buyTokenId, msg.sender, 0, amount);
8182
}
8283

83-
function cancelSellTokenOrder(uint sellTokenId) external {
84+
function cancelSellTokenOrder(uint64 sellTokenId) external {
8485
Order storage order = sellTokenOrders[sellTokenId];
8586
require(order.maker == msg.sender);
8687

@@ -97,15 +98,15 @@ contract Exchange {
9798
trade price meets in the middle
9899
reverts if any of the orders have been removed
99100
*/
100-
function matchOrders(uint buyTokenId, uint sellTokenId) external {
101+
function matchOrders(uint64 buyTokenId, uint64 sellTokenId) external {
101102
_fillOrder(buyTokenId, sellTokenId);
102103
}
103104

104105
/* matches as many orders as possible from the passed orders
105106
Runs as long as gas is available for the call.
106107
Stops if any match is invalid (case when any of the orders removed after client generated the match list sent)
107108
*/
108-
function matchMultipleOrders(uint[] buyTokenIds, uint[] sellTokenIds) external returns(uint matchCount) {
109+
function matchMultipleOrders(uint64[] buyTokenIds, uint64[] sellTokenIds) external returns(uint matchCount) {
109110
uint len = buyTokenIds.length;
110111
require(len == sellTokenIds.length);
111112
for (uint i = 0; i < len && msg.gas > ORDER_MATCH_WORST_GAS; i++) {
@@ -144,17 +145,17 @@ contract Exchange {
144145
*/
145146
function transferNotification(address maker, uint tokenAmount, uint price) public {
146147
require(msg.sender == address(augmintToken));
147-
_placeSellTokenOrder(maker, price, tokenAmount);
148+
_placeSellTokenOrder(maker, uint32(price), tokenAmount);
148149
}
149150

150-
function _fillOrder(uint buyTokenId, uint sellTokenId) private {
151+
function _fillOrder(uint64 buyTokenId, uint64 sellTokenId) private {
151152
Order storage buy = buyTokenOrders[buyTokenId];
152153
Order storage sell = sellTokenOrders[sellTokenId];
153154

154155
require(buy.price >= sell.price);
155156

156157
// 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);
158159

159160
uint sellWei = sell.amount.mul(1 ether).div(price);
160161

@@ -182,16 +183,17 @@ contract Exchange {
182183
sell.maker.transfer(tradedWei);
183184

184185
OrderFill(buy.maker, sell.maker, buyTokenId,
185-
sellTokenId, price, tradedWei, tradedTokens);
186+
sellTokenId, uint32(price), tradedWei, tradedTokens);
186187
}
187188

188189

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) {
191192
require(price > 0);
192193
require(tokenAmount > 0);
193194

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);
195197
activeSellOrders.push(orderId);
196198

197199
NewOrder(orderId, maker, price, tokenAmount, 0);
@@ -205,7 +207,7 @@ contract Exchange {
205207
_removeOrder(activeSellOrders, order.index);
206208
}
207209

208-
function _removeOrder(uint[] storage orders, uint index) private {
210+
function _removeOrder(uint64[] storage orders, uint64 index) private {
209211
if (index < orders.length - 1) {
210212
orders[index] = orders[orders.length - 1];
211213
}

0 commit comments

Comments
 (0)