Skip to content

Commit 56bb492

Browse files
committed
Refactor unit tests and add a few more test cases (gnosis/gp-v2-contracts#397)
This PR is a continuation from #390 and refactors the unit tests a little bit so they make more sense with the new interface, adding a couple more unit tests along the way. This was split into a separate PR to make it easier to review the changes in the parent PR. ### Test Plan This is the test plan!
1 parent 5fcc9b6 commit 56bb492

7 files changed

Lines changed: 541 additions & 424 deletions

File tree

src/contracts/test/GPv2SigningTestInterface.sol

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import "../libraries/GPv2Signing.sol";
77
import "../libraries/GPv2Trade.sol";
88

99
contract GPv2SigningTestInterface {
10+
using GPv2Signing for GPv2Order.Data;
1011
using GPv2Signing for GPv2Signing.RecoveredOrder;
1112

1213
bytes32 public constant DOMAIN_SEPARATOR =
@@ -17,49 +18,42 @@ contract GPv2SigningTestInterface {
1718
)
1819
);
1920

20-
function recoverOrdersFromTradesTest(
21+
function recoverOrderFromTradeTest(
2122
IERC20[] calldata tokens,
22-
GPv2Trade.Data[] calldata trades
23+
GPv2Trade.Data calldata trade
2324
)
2425
external
2526
view
26-
returns (
27-
GPv2Signing.RecoveredOrder[] memory recoveredOrders,
28-
uint256 mem,
29-
uint256 gas_
30-
)
27+
returns (GPv2Signing.RecoveredOrder memory recoveredOrder, uint256 mem)
3128
{
3229
bytes32 domainSeparator = DOMAIN_SEPARATOR;
30+
recoveredOrder = GPv2Signing.allocateRecoveredOrder();
3331

34-
recoveredOrders = new GPv2Signing.RecoveredOrder[](trades.length);
35-
for (uint256 i = 0; i < recoveredOrders.length; i++) {
36-
recoveredOrders[i].uid = new bytes(GPv2Order.UID_LENGTH);
37-
}
38-
39-
// NOTE: Solidity keeps a total memory count at address 0x40. Check
40-
// before and after decoding a trade to compute memory usage growth per
41-
// call to `decodeTrade`. Additionally, write 0 past the free memory
42-
// pointer so the size of `recoveredOrders` does not affect the gas
43-
// measurement.
32+
// NOTE: Solidity stores the free memory pointer at address 0x40. Read
33+
// it before and after calling `processOrder` to ensure that there are
34+
// no memory allocations.
4435
// solhint-disable-next-line no-inline-assembly
4536
assembly {
4637
mem := mload(0x40)
47-
mstore(mem, 0)
4838
}
49-
gas_ = gasleft();
5039

51-
for (uint256 i = 0; i < recoveredOrders.length; i++) {
52-
recoveredOrders[i].recoverOrderFromTrade(
53-
domainSeparator,
54-
tokens,
55-
trades[i]
56-
);
57-
}
40+
recoveredOrder.recoverOrderFromTrade(domainSeparator, tokens, trade);
5841

5942
// solhint-disable-next-line no-inline-assembly
6043
assembly {
6144
mem := sub(mload(0x40), mem)
6245
}
63-
gas_ = gas_ - gasleft();
46+
}
47+
48+
function recoverOrderSignerTest(
49+
GPv2Order.Data memory order,
50+
GPv2Signing.Scheme signingScheme,
51+
bytes calldata signature
52+
) external view returns (address owner) {
53+
(, owner) = order.recoverOrderSigner(
54+
DOMAIN_SEPARATOR,
55+
signingScheme,
56+
signature
57+
);
6458
}
6559
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// SPDX-License-Identifier: LGPL-3.0-or-later
2+
pragma solidity ^0.7.6;
3+
pragma abicoder v2;
4+
5+
import "../libraries/GPv2Order.sol";
6+
import "../libraries/GPv2Trade.sol";
7+
8+
contract GPv2TradeTestInterface {
9+
function extractOrderTest(
10+
IERC20[] calldata tokens,
11+
GPv2Trade.Data calldata trade
12+
) external pure returns (GPv2Order.Data memory order) {
13+
GPv2Trade.extractOrder(trade, tokens, order);
14+
}
15+
16+
function extractFlagsTest(uint256 flags)
17+
external
18+
pure
19+
returns (
20+
bytes32 kind,
21+
bool partiallyFillable,
22+
GPv2Signing.Scheme signingScheme
23+
)
24+
{
25+
return GPv2Trade.extractFlags(flags);
26+
}
27+
}

src/ts/settlement.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,13 @@ export type EncodedSettlement = [
137137
*/
138138
export const MAX_TRADES_IN_SETTLEMENT = 2 ** 16 - 1;
139139

140-
function encodeSigningScheme(scheme: SigningScheme): number {
140+
/**
141+
* Encodes signing scheme as a bitfield.
142+
*
143+
* @param scheme The signing scheme to encode.
144+
* @return The bitfield result.
145+
*/
146+
export function encodeSigningScheme(scheme: SigningScheme): number {
141147
switch (scheme) {
142148
case SigningScheme.EIP712:
143149
return 0b0000;
@@ -150,7 +156,13 @@ function encodeSigningScheme(scheme: SigningScheme): number {
150156
}
151157
}
152158

153-
function encodeOrderFlags(flags: OrderFlags): number {
159+
/**
160+
* Encodes order flags as a bitfield.
161+
*
162+
* @param flags The order flags to encode.
163+
* @return The bitfield result.
164+
*/
165+
export function encodeOrderFlags(flags: OrderFlags): number {
154166
let kind;
155167
switch (flags.kind) {
156168
case OrderKind.SELL:
@@ -167,7 +179,13 @@ function encodeOrderFlags(flags: OrderFlags): number {
167179
return kind | partiallyFillable;
168180
}
169181

170-
function encodeTradeFlags(flags: TradeFlags): number {
182+
/**
183+
* Encodes trade flags as a bitfield.
184+
*
185+
* @param flags The trade flags to encode.
186+
* @return The bitfield result.
187+
*/
188+
export function encodeTradeFlags(flags: TradeFlags): number {
171189
return encodeOrderFlags(flags) | encodeSigningScheme(flags.signingScheme);
172190
}
173191

0 commit comments

Comments
 (0)