Skip to content

Commit d63c7d4

Browse files
committedFeb 1, 2024
Bug fixes
1 parent 24cde90 commit d63c7d4

11 files changed

+51
-29
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
188845
1+
187839
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
210669
1+
208628
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
221076
1+
218396
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
275385
1+
272068
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
204195
1+
202154
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
155052
1+
154046
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
140619
1+
139613
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
164362
1+
163357

‎src/lib/V2DutchOrderLib.sol

+8-7
Original file line numberDiff line numberDiff line change
@@ -90,23 +90,23 @@ library CosignerExtraDataLib {
9090
function hasExclusiveFiller(bytes memory extraData) internal pure returns (bool flag) {
9191
if (extraData.length == 0) return false;
9292
assembly {
93-
flag := and(mload(extraData), EXCL_FILLER_FLAG_MASK)
93+
flag := and(mload(add(extraData, 32)), EXCL_FILLER_FLAG_MASK)
9494
}
9595
}
9696

9797
// "True" second bit of byte 1 signals that there is an input override
9898
function hasInputOverride(bytes memory extraData) internal pure returns (bool flag) {
9999
if (extraData.length == 0) return false;
100100
assembly {
101-
flag := and(mload(extraData), INPUT_OVERRIDE_FLAG_MASK)
101+
flag := and(mload(add(extraData, 32)), INPUT_OVERRIDE_FLAG_MASK)
102102
}
103103
}
104104

105105
// "True" third bit of byte 1 signals that there is an output override
106106
function hasOutputOverrides(bytes memory extraData) internal pure returns (bool flag) {
107107
if (extraData.length == 0) return false;
108108
assembly {
109-
flag := and(mload(extraData), OUTPUT_OVERRIDE_FLAG_MASK)
109+
flag := and(mload(add(extraData, 32)), OUTPUT_OVERRIDE_FLAG_MASK)
110110
}
111111
}
112112

@@ -116,16 +116,17 @@ library CosignerExtraDataLib {
116116
returns (address filler, uint256 inputOverride, uint256[] memory outputOverrides)
117117
{
118118
if (extraData.length == 0) return (filler, inputOverride, outputOverrides);
119+
// The first 32 bytes are length
119120
// The first byte (index 0) only contains flags of whether each field is included in the bytes
120-
// So we can start from index 1 to start decoding each field
121-
uint256 bytesOffset = 1;
121+
// So we can start from index 1 (after 32) to start decoding each field
122+
uint256 bytesOffset = 33;
122123

123124
if (hasExclusiveFiller(extraData)) {
124125
// an address is 20 bytes long
125126
require(extraData.length >= bytesOffset + 20);
126127
assembly {
127128
// it loads a full 32 bytes, shift right 96 bits so only the address remains
128-
filler := shr(mload(add(extraData, bytesOffset)), 96)
129+
filler := shr(96, mload(add(extraData, bytesOffset)))
129130
}
130131
bytesOffset += 20;
131132
}
@@ -148,7 +149,7 @@ library CosignerExtraDataLib {
148149
bytesOffset += 32;
149150

150151
// each element of the array is 32 bytes
151-
require(extraData.length == bytesOffset + length * 32);
152+
require(extraData.length == bytesOffset + (length - 1) * 32);
152153
outputOverrides = new uint256[](length);
153154

154155
uint256 outputOverride;

‎src/reactors/V2DutchOrderReactor.sol

+12-10
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,19 @@ contract V2DutchOrderReactor is BaseReactor {
100100
order.input.startAmount = inputOverride;
101101
}
102102

103-
if (outputOverrides.length != order.outputs.length) {
104-
revert InvalidOutputOverride();
105-
}
106-
for (uint256 i = 0; i < order.outputs.length; i++) {
107-
DutchOutput memory output = order.outputs[i];
108-
uint256 outputOverride = outputOverrides[i];
109-
if (outputOverride != 0) {
110-
if (outputOverride < output.startAmount) {
111-
revert InvalidOutputOverride();
103+
if (outputOverrides.length != 0) {
104+
if (outputOverrides.length != order.outputs.length) {
105+
revert InvalidOutputOverride();
106+
}
107+
for (uint256 i = 0; i < order.outputs.length; i++) {
108+
DutchOutput memory output = order.outputs[i];
109+
uint256 outputOverride = outputOverrides[i];
110+
if (outputOverride != 0) {
111+
if (outputOverride < output.startAmount) {
112+
revert InvalidOutputOverride();
113+
}
114+
output.startAmount = outputOverride;
112115
}
113-
output.startAmount = outputOverride;
114116
}
115117
}
116118
}

‎test/reactors/V2DutchOrderReactor.t.sol

+23-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {DeployPermit2} from "../util/DeployPermit2.sol";
66
import {
77
V2DutchOrder,
88
V2DutchOrderLib,
9+
CosignerExtraDataLib,
910
CosignerData,
1011
V2DutchOrderReactor,
1112
ResolvedOrder,
@@ -30,6 +31,7 @@ import {DutchOrder, BaseDutchOrderReactorTest} from "./BaseDutchOrderReactor.t.s
3031
contract V2DutchOrderTest is PermitSignature, DeployPermit2, BaseDutchOrderReactorTest {
3132
using OrderInfoBuilder for OrderInfo;
3233
using V2DutchOrderLib for V2DutchOrder;
34+
using CosignerExtraDataLib for bytes;
3335

3436
uint256 constant cosignerPrivateKey = 0x99999999;
3537

@@ -252,6 +254,20 @@ contract V2DutchOrderTest is PermitSignature, DeployPermit2, BaseDutchOrderReact
252254
assertEq(tokenIn.balanceOf(address(fillContract)), inputAmount);
253255
}
254256

257+
function testEncoding() public {
258+
bytes memory encodedBytes = encodeExtraCosignerData(address(1111111111111111), 22222222222222, ArrayBuilder.fill(3, 5));
259+
assertTrue(encodedBytes.hasExclusiveFiller());
260+
assertTrue(encodedBytes.hasInputOverride());
261+
assertTrue(encodedBytes.hasOutputOverrides());
262+
(address filler, uint256 input, uint256[] memory output) = encodedBytes.decodeExtraParameters();
263+
assertEq(filler, address(1111111111111111));
264+
assertEq(input, 22222222222222);
265+
assertEq(output.length, 3);
266+
assertEq(output[0], 5);
267+
assertEq(output[1], 5);
268+
assertEq(output[2], 5);
269+
}
270+
255271
function testExclusivity() public {
256272
uint256 inputAmount = 1 ether;
257273
tokenIn.mint(swapper, inputAmount);
@@ -299,7 +315,7 @@ contract V2DutchOrderTest is PermitSignature, DeployPermit2, BaseDutchOrderReact
299315
{
300316
bool hasExclusiveFiller = (exclusiveFiller != address(0));
301317
bool hasInputOverride = (inputOverride != 0);
302-
bool hasOutputOverrides = (outputOverrides.length == 0);
318+
bool hasOutputOverrides = (outputOverrides.length != 0);
303319

304320
bytes1 firstByte = 0x00;
305321
if (hasExclusiveFiller) firstByte |= 0x80;
@@ -309,8 +325,11 @@ contract V2DutchOrderTest is PermitSignature, DeployPermit2, BaseDutchOrderReact
309325
if (firstByte == 0x00) return "";
310326

311327
extraData = abi.encodePacked(firstByte);
312-
if (hasExclusiveFiller) bytes.concat(extraData, abi.encodePacked(exclusiveFiller));
313-
if (hasInputOverride) bytes.concat(extraData, abi.encodePacked(inputOverride));
314-
if (hasOutputOverrides) bytes.concat(extraData, abi.encode(outputOverrides));
328+
if (hasExclusiveFiller) extraData = bytes.concat(extraData, abi.encodePacked(exclusiveFiller));
329+
if (hasInputOverride) extraData = bytes.concat(extraData, abi.encodePacked(inputOverride));
330+
if (hasOutputOverrides) {
331+
extraData = bytes.concat(extraData, abi.encodePacked(outputOverrides.length));
332+
extraData = bytes.concat(extraData, abi.encodePacked(outputOverrides));
333+
}
315334
}
316335
}

0 commit comments

Comments
 (0)
Please sign in to comment.