@@ -246,8 +246,78 @@ contract CowWrapperHelpersTest is Test {
246246 assertEq (result, expected);
247247 }
248248
249+ function test_verifyAndBuildWrapperData_RevertsOnSettlementMismatch () public {
250+ MockSettlement differentSettlement = new MockSettlement (CowAuthentication (address (wrapperAuth)));
251+ MockWrapper differentWrapper = new MockWrapper (CowSettlement (address (differentSettlement)), 4 );
252+ wrapperAuth.addSolver (address (differentWrapper));
253+
254+ CowWrapperHelpers.WrapperCall[] memory wrapperCalls = new CowWrapperHelpers.WrapperCall [](2 );
255+ wrapperCalls[0 ] = CowWrapperHelpers.WrapperCall ({target: address (wrapper1), data: hex "deadbeef " });
256+ wrapperCalls[1 ] = CowWrapperHelpers.WrapperCall ({target: address (differentWrapper), data: hex "cafebabe " });
257+
258+ vm.expectRevert (
259+ abi.encodeWithSelector (
260+ CowWrapperHelpers.SettlementMismatch.selector , 1 , address (mockSettlement), address (differentSettlement)
261+ )
262+ );
263+ helpers.verifyAndBuildWrapperData (wrapperCalls);
264+ }
265+
249266 function test_immutableAuthenticators () public view {
250267 assertEq (address (helpers.WRAPPER_AUTHENTICATOR ()), address (wrapperAuth));
251268 assertEq (address (helpers.SOLVER_AUTHENTICATOR ()), address (solverAuth));
252269 }
270+
271+ function test_verifyAndBuildWrapperData_RevertsOnWrapperDataTooLong_FirstWrapper () public {
272+ // Create data that's exactly 65536 bytes (exceeds uint16 max of 65535)
273+ bytes memory tooLongData = new bytes (65536 );
274+
275+ // Create a wrapper that consumes all bytes passed to it
276+ MockWrapper largeWrapper = new MockWrapper (CowSettlement (address (mockSettlement)), 65536 );
277+ wrapperAuth.addSolver (address (largeWrapper));
278+
279+ CowWrapperHelpers.WrapperCall[] memory wrapperCalls = new CowWrapperHelpers.WrapperCall [](1 );
280+ wrapperCalls[0 ] = CowWrapperHelpers.WrapperCall ({target: address (largeWrapper), data: tooLongData});
281+
282+ vm.expectRevert (abi.encodeWithSelector (CowWrapperHelpers.WrapperDataTooLong.selector , 0 , 65536 ));
283+ helpers.verifyAndBuildWrapperData (wrapperCalls);
284+ }
285+
286+ function test_verifyAndBuildWrapperData_RevertsOnWrapperDataTooLong_SecondWrapper () public {
287+ // Create data that's exactly 65536 bytes for the second wrapper
288+ bytes memory tooLongData = new bytes (65536 );
289+
290+ // Create a wrapper that consumes all bytes passed to it
291+ MockWrapper largeWrapper = new MockWrapper (CowSettlement (address (mockSettlement)), 65536 );
292+ wrapperAuth.addSolver (address (largeWrapper));
293+
294+ CowWrapperHelpers.WrapperCall[] memory wrapperCalls = new CowWrapperHelpers.WrapperCall [](2 );
295+ wrapperCalls[0 ] = CowWrapperHelpers.WrapperCall ({target: address (wrapper1), data: hex "deadbeef " });
296+ wrapperCalls[1 ] = CowWrapperHelpers.WrapperCall ({target: address (largeWrapper), data: tooLongData});
297+
298+ vm.expectRevert (abi.encodeWithSelector (CowWrapperHelpers.WrapperDataTooLong.selector , 1 , 65536 ));
299+ helpers.verifyAndBuildWrapperData (wrapperCalls);
300+ }
301+
302+ function test_verifyAndBuildWrapperData_SucceedsWithMaxLengthData () public {
303+ // Create data that's exactly 65535 bytes (max valid uint16)
304+ bytes memory maxLengthData = new bytes (65535 );
305+
306+ // Create a wrapper that consumes all bytes
307+ MockWrapper largeWrapper = new MockWrapper (CowSettlement (address (mockSettlement)), 65535 );
308+ wrapperAuth.addSolver (address (largeWrapper));
309+
310+ CowWrapperHelpers.WrapperCall[] memory wrapperCalls = new CowWrapperHelpers.WrapperCall [](1 );
311+ wrapperCalls[0 ] = CowWrapperHelpers.WrapperCall ({target: address (largeWrapper), data: maxLengthData});
312+
313+ // Should not revert - 65535 is the max valid length
314+ bytes memory result = helpers.verifyAndBuildWrapperData (wrapperCalls);
315+
316+ // Verify the length prefix is correct (first 2 bytes)
317+ bytes2 lengthPrefix;
318+ assembly {
319+ lengthPrefix := mload (add (result, 32 ))
320+ }
321+ assertEq (uint16 (lengthPrefix), 65535 );
322+ }
253323}
0 commit comments