Skip to content

Commit 1b43993

Browse files
committed
feature: decouple strategyData from GenericSwapData
1 parent 1eb77cd commit 1b43993

File tree

6 files changed

+28
-19
lines changed

6 files changed

+28
-19
lines changed

contracts/GenericSwap.sol

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,20 @@ contract GenericSwap is IGenericSwap, TokenCollector, EIP712 {
3030
receive() external payable {}
3131

3232
/// @inheritdoc IGenericSwap
33-
function executeSwap(GenericSwapData calldata swapData, bytes calldata takerTokenPermit) external payable returns (uint256 returnAmount) {
34-
returnAmount = _executeSwap(swapData, msg.sender, takerTokenPermit);
33+
function executeSwap(
34+
GenericSwapData calldata swapData,
35+
bytes calldata strategyData,
36+
bytes calldata takerTokenPermit
37+
) external payable returns (uint256 returnAmount) {
38+
returnAmount = _executeSwap(swapData, strategyData, msg.sender, takerTokenPermit);
3539

3640
_emitGSExecuted(getGSDataHash(swapData), swapData, msg.sender, returnAmount);
3741
}
3842

3943
/// @inheritdoc IGenericSwap
4044
function executeSwapWithSig(
4145
GenericSwapData calldata swapData,
46+
bytes calldata strategyData,
4247
bytes calldata takerTokenPermit,
4348
address taker,
4449
bytes calldata takerSig
@@ -49,7 +54,7 @@ contract GenericSwap is IGenericSwap, TokenCollector, EIP712 {
4954
filledSwap[swapHash] = true;
5055
if (!SignatureValidator.validateSignature(taker, gs712Hash, takerSig)) revert InvalidSignature();
5156

52-
returnAmount = _executeSwap(swapData, taker, takerTokenPermit);
57+
returnAmount = _executeSwap(swapData, strategyData, taker, takerTokenPermit);
5358

5459
_emitGSExecuted(swapHash, swapData, taker, returnAmount);
5560
}
@@ -61,6 +66,7 @@ contract GenericSwap is IGenericSwap, TokenCollector, EIP712 {
6166
/// @return returnAmount The output amount of the swap.
6267
function _executeSwap(
6368
GenericSwapData calldata _swapData,
69+
bytes calldata strategyData,
6470
address _authorizedUser,
6571
bytes calldata _takerTokenPermit
6672
) private returns (uint256 returnAmount) {

contracts/interfaces/IGenericSwap.sol

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,25 @@ interface IGenericSwap {
6060

6161
/// @notice Executes a swap using provided swap data and taker token permit.
6262
/// @param swapData The swap data containing details of the swap.
63+
/// @param strategyData The strategy data contains the details on how to perform the swap.
6364
/// @param takerTokenPermit The permit for spending taker's tokens.
6465
/// @return returnAmount The amount of tokens returned from the swap.
65-
function executeSwap(GenericSwapData calldata swapData, bytes calldata takerTokenPermit) external payable returns (uint256 returnAmount);
66+
function executeSwap(
67+
GenericSwapData calldata swapData,
68+
bytes calldata strategyData,
69+
bytes calldata takerTokenPermit
70+
) external payable returns (uint256 returnAmount);
6671

6772
/// @notice Executes a swap using provided swap data, taker token permit, taker address, and signature.
6873
/// @param swapData The swap data containing details of the swap.
74+
/// @param strategyData The strategy data contains the details on how to perform the swap.
6975
/// @param takerTokenPermit The permit for spending taker's tokens.
7076
/// @param taker The address of the taker initiating the swap.
7177
/// @param takerSig The signature of the taker authorizing the swap.
7278
/// @return returnAmount The amount of tokens returned from the swap.
7379
function executeSwapWithSig(
7480
GenericSwapData calldata swapData,
81+
bytes calldata strategyData,
7582
bytes calldata takerTokenPermit,
7683
address taker,
7784
bytes calldata takerSig

contracts/libraries/GenericSwapData.sol

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
pragma solidity ^0.8.0;
33

44
string constant GS_DATA_TYPESTRING = string(
5-
"GenericSwapData(address maker,address takerToken,uint256 takerTokenAmount,address makerToken,uint256 makerTokenAmount,uint256 minMakerTokenAmount,uint256 expiry,uint256 salt,address recipient,bytes strategyData)"
5+
"GenericSwapData(address maker,address takerToken,uint256 takerTokenAmount,address makerToken,uint256 makerTokenAmount,uint256 minMakerTokenAmount,uint256 expiry,uint256 salt,address recipient)"
66
);
77

88
bytes32 constant GS_DATA_TYPEHASH = keccak256(bytes(GS_DATA_TYPESTRING));
@@ -17,7 +17,6 @@ struct GenericSwapData {
1717
uint256 expiry;
1818
uint256 salt;
1919
address payable recipient;
20-
bytes strategyData;
2120
}
2221

2322
// solhint-disable-next-line func-visibility
@@ -34,8 +33,7 @@ function getGSDataHash(GenericSwapData memory gsData) pure returns (bytes32) {
3433
gsData.minMakerTokenAmount,
3534
gsData.expiry,
3635
gsData.salt,
37-
gsData.recipient,
38-
keccak256(gsData.strategyData)
36+
gsData.recipient
3937
)
4038
);
4139
}

test/Signing.t.sol

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ contract testEIP712Signing is SigHelper {
4949
minMakerTokenAmount: abi.decode(vm.parseJson(genericSwapDataPayloadJson, "$.minMakerTokenAmount"), (uint256)),
5050
expiry: abi.decode(vm.parseJson(genericSwapDataPayloadJson, "$.expiry"), (uint256)),
5151
salt: abi.decode(vm.parseJson(genericSwapDataPayloadJson, "$.salt"), (uint256)),
52-
recipient: abi.decode(vm.parseJson(genericSwapDataPayloadJson, "$.recipient"), (address)),
53-
strategyData: abi.decode(vm.parseJson(genericSwapDataPayloadJson, "$.strategyData"), (bytes))
52+
recipient: abi.decode(vm.parseJson(genericSwapDataPayloadJson, "$.recipient"), (address))
5453
});
5554
uint256 signingKey = abi.decode(vm.parseJson(genericSwapDataPayloadJson, "$.signingKey"), (uint256));
5655
bytes memory sig = signGenericSwap(signingKey, genericSwapData, chainId, verifyingContract);

test/forkMainnet/GenericSwap.t.sol

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ contract GenericSwapTest is Test, Tokens, BalanceUtil, Permit2Helper, SigHelper
3939
uint24[] defaultV3Fees = [3000];
4040
bytes defaultTakerPermit;
4141
bytes alicePermit;
42+
bytes swapData;
4243
SmartOrderStrategy smartStrategy;
4344
GenericSwap genericSwap;
4445
GenericSwapData defaultGSData;
@@ -94,7 +95,7 @@ contract GenericSwapTest is Test, Tokens, BalanceUtil, Permit2Helper, SigHelper
9495
value: 0,
9596
data: routerPayload
9697
});
97-
bytes memory swapData = abi.encode(operations);
98+
swapData = abi.encode(operations);
9899

99100
deal(taker, 100 ether);
100101
setTokenBalanceAndApprove(taker, UNISWAP_PERMIT2_ADDRESS, tokens, 100000);
@@ -112,8 +113,7 @@ contract GenericSwapTest is Test, Tokens, BalanceUtil, Permit2Helper, SigHelper
112113
minMakerTokenAmount: minOutputAmount,
113114
expiry: defaultExpiry,
114115
salt: 5678,
115-
recipient: payable(taker),
116-
strategyData: swapData
116+
recipient: payable(taker)
117117
});
118118

119119
defaultTakerPermit = getTokenlonPermit2Data(taker, takerPrivateKey, defaultGSData.takerToken, address(genericSwap));
@@ -279,7 +279,7 @@ contract GenericSwapTest is Test, Tokens, BalanceUtil, Permit2Helper, SigHelper
279279
function testCannotSwapWithInvalidETHInput() public {
280280
// case1 : msg.value != 0 when takerToken is not ETH
281281
vm.expectRevert(IGenericSwap.InvalidMsgValue.selector);
282-
genericSwap.executeSwap{ value: 1 }(defaultGSData, defaultTakerPermit);
282+
genericSwap.executeSwap{ value: 1 }(defaultGSData, swapData, defaultTakerPermit);
283283

284284
// change input token as ETH and update amount
285285
GenericSwapData memory gsData = defaultGSData;
@@ -363,15 +363,15 @@ contract GenericSwapTest is Test, Tokens, BalanceUtil, Permit2Helper, SigHelper
363363

364364
vm.expectRevert(IGenericSwap.InvalidSignature.selector);
365365
// submit with user address as expected signer
366-
genericSwap.executeSwapWithSig(defaultGSData, defaultTakerPermit, taker, randomSig);
366+
genericSwap.executeSwapWithSig(defaultGSData, swapData, defaultTakerPermit, taker, randomSig);
367367
}
368368

369369
function testCannotReplayGenericSwapSig() public {
370370
bytes memory takerSig = signGenericSwap(takerPrivateKey, defaultGSData, address(genericSwap));
371-
genericSwap.executeSwapWithSig(defaultGSData, defaultTakerPermit, taker, takerSig);
371+
genericSwap.executeSwapWithSig(defaultGSData, swapData, defaultTakerPermit, taker, takerSig);
372372

373373
vm.expectRevert(IGenericSwap.AlreadyFilled.selector);
374-
genericSwap.executeSwapWithSig(defaultGSData, defaultTakerPermit, taker, takerSig);
374+
genericSwap.executeSwapWithSig(defaultGSData, swapData, defaultTakerPermit, taker, takerSig);
375375
}
376376

377377
function testLeaveOneWeiWithMultipleUsers() public {
@@ -434,7 +434,7 @@ contract GenericSwapTest is Test, Tokens, BalanceUtil, Permit2Helper, SigHelper
434434
);
435435

436436
vm.startPrank(alice);
437-
genericSwap.executeSwap(aliceGSData, alicePermit);
437+
genericSwap.executeSwap(aliceGSData, swapData, alicePermit);
438438
vm.stopPrank();
439439
vm.snapshotGasLastCall("GenericSwap", "executeSwap(): testLeaveOneWeiWithMultipleUsers(the second deposit)");
440440

test/utils/payload/genericSwapData.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
"expiry": 3376656000,
99
"salt": 123,
1010
"recipient": "0xdf5621f59CcD4A58cF487E0C4E3fCDd6Db67E4dA",
11-
"strategyData": "0xcbe324dfbf8d48a7ad9ef3cb0c2bdd411129db5238371b8609272f14921736fb0ab28dcede4f2e1e41393d575ffec60002e565bfbf5eaf896bc490a965c8452d08d9b71b",
1211
"expectedSig": "0xdfe4e0414baa9b0ac4edcefc1d8ceb18dc21230f6b93a83c91188a105d1d7ece7809ca3c67db499fd497e35ba271a0a6689f7683d41b5d4602a5bb7895537a2d1c",
1312
"signingKey": "0x1dc4f07f92fa1783042350ffe685439f857a8fdd837589c00c5299e287c4afcb",
1413
"chainId": 5,

0 commit comments

Comments
 (0)