feat: support multi and aggregate orders
This commit is contained in:
@@ -103,17 +103,14 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
|||||||
|
|
||||||
/// @notice Bebop-specific errors
|
/// @notice Bebop-specific errors
|
||||||
error BebopExecutor__SettlementFailed();
|
error BebopExecutor__SettlementFailed();
|
||||||
error BebopExecutor__UnsupportedOrderType(uint8 orderType);
|
|
||||||
error BebopExecutor__InvalidDataLength();
|
error BebopExecutor__InvalidDataLength();
|
||||||
|
|
||||||
/// @notice The Bebop settlement contract address
|
/// @notice The Bebop settlement contract address
|
||||||
address public immutable bebopSettlement;
|
address public immutable bebopSettlement;
|
||||||
|
|
||||||
|
constructor(address _bebopSettlement, address _permit2)
|
||||||
constructor(
|
RestrictTransferFrom(_permit2)
|
||||||
address _bebopSettlement,
|
{
|
||||||
address _permit2
|
|
||||||
) RestrictTransferFrom(_permit2) {
|
|
||||||
bebopSettlement = _bebopSettlement;
|
bebopSettlement = _bebopSettlement;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,8 +153,24 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
|||||||
signatureType,
|
signatureType,
|
||||||
signature
|
signature
|
||||||
);
|
);
|
||||||
} else {
|
} else if (orderType == OrderType.Multi) {
|
||||||
revert BebopExecutor__UnsupportedOrderType(uint8(orderType));
|
calculatedAmount = _executeMultiRFQ(
|
||||||
|
tokenIn,
|
||||||
|
tokenOut,
|
||||||
|
givenAmount,
|
||||||
|
quoteData,
|
||||||
|
signatureType,
|
||||||
|
signature
|
||||||
|
);
|
||||||
|
} else if (orderType == OrderType.Aggregate) {
|
||||||
|
calculatedAmount = _executeAggregateRFQ(
|
||||||
|
tokenIn,
|
||||||
|
tokenOut,
|
||||||
|
givenAmount,
|
||||||
|
quoteData,
|
||||||
|
signatureType,
|
||||||
|
signature
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,6 +223,184 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
|||||||
amountOut = balanceAfter - balanceBefore;
|
amountOut = balanceAfter - balanceBefore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @dev Executes a Multi RFQ swap through Bebop settlement
|
||||||
|
function _executeMultiRFQ(
|
||||||
|
address tokenIn,
|
||||||
|
address tokenOut,
|
||||||
|
uint256 amountIn,
|
||||||
|
bytes memory quoteData,
|
||||||
|
uint8 signatureType,
|
||||||
|
bytes memory signature
|
||||||
|
) private returns (uint256 amountOut) {
|
||||||
|
// Decode the Multi order
|
||||||
|
IBebopSettlement.Multi memory order =
|
||||||
|
abi.decode(quoteData, (IBebopSettlement.Multi));
|
||||||
|
|
||||||
|
// Create signature struct
|
||||||
|
IBebopSettlement.MakerSignature memory sig = IBebopSettlement
|
||||||
|
.MakerSignature({
|
||||||
|
signatureType: signatureType,
|
||||||
|
signatureBytes: signature
|
||||||
|
});
|
||||||
|
|
||||||
|
// Find which token index we're swapping
|
||||||
|
uint256 tokenInIndex = type(uint256).max;
|
||||||
|
uint256 tokenOutIndex = type(uint256).max;
|
||||||
|
|
||||||
|
for (uint256 i = 0; i < order.taker_tokens.length; i++) {
|
||||||
|
if (order.taker_tokens[i] == tokenIn) {
|
||||||
|
tokenInIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint256 i = 0; i < order.maker_tokens.length; i++) {
|
||||||
|
if (order.maker_tokens[i] == tokenOut) {
|
||||||
|
tokenOutIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare filled amounts array (only fill the token we're swapping)
|
||||||
|
uint256[] memory filledTakerAmounts =
|
||||||
|
new uint256[](order.taker_tokens.length);
|
||||||
|
filledTakerAmounts[tokenInIndex] = amountIn;
|
||||||
|
|
||||||
|
// Record balance before swap
|
||||||
|
uint256 balanceBefore = tokenOut == address(0)
|
||||||
|
? order.receiver.balance
|
||||||
|
: IERC20(tokenOut).balanceOf(order.receiver);
|
||||||
|
|
||||||
|
// Execute the swap
|
||||||
|
uint256 ethValue = tokenIn == address(0) ? amountIn : 0;
|
||||||
|
|
||||||
|
try IBebopSettlement(bebopSettlement).swapMulti{value: ethValue}(
|
||||||
|
order, sig, filledTakerAmounts
|
||||||
|
) {
|
||||||
|
// Success
|
||||||
|
} catch {
|
||||||
|
revert BebopExecutor__SettlementFailed();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate actual amount received
|
||||||
|
uint256 balanceAfter = tokenOut == address(0)
|
||||||
|
? order.receiver.balance
|
||||||
|
: IERC20(tokenOut).balanceOf(order.receiver);
|
||||||
|
|
||||||
|
amountOut = balanceAfter - balanceBefore;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Executes an Aggregate RFQ swap through Bebop settlement
|
||||||
|
function _executeAggregateRFQ(
|
||||||
|
address tokenIn,
|
||||||
|
address tokenOut,
|
||||||
|
uint256 amountIn,
|
||||||
|
bytes memory quoteData,
|
||||||
|
uint8 signatureType,
|
||||||
|
bytes memory signatureData
|
||||||
|
) private returns (uint256 amountOut) {
|
||||||
|
// For aggregate orders, we need to decode both the order and multiple signatures
|
||||||
|
// The signatureData contains all maker signatures encoded
|
||||||
|
(
|
||||||
|
IBebopSettlement.Aggregate memory order,
|
||||||
|
IBebopSettlement.MakerSignature[] memory signatures
|
||||||
|
) = _decodeAggregateData(quoteData, signatureType, signatureData);
|
||||||
|
|
||||||
|
// Find which token index we're swapping
|
||||||
|
uint256 tokenInIndex = type(uint256).max;
|
||||||
|
for (uint256 i = 0; i < order.taker_tokens.length; i++) {
|
||||||
|
if (order.taker_tokens[i] == tokenIn) {
|
||||||
|
tokenInIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare filled amounts array
|
||||||
|
uint256[] memory filledTakerAmounts =
|
||||||
|
new uint256[](order.taker_tokens.length);
|
||||||
|
filledTakerAmounts[tokenInIndex] = amountIn;
|
||||||
|
|
||||||
|
// Record balance before swap for all possible output tokens from all makers
|
||||||
|
uint256 balanceBefore = tokenOut == address(0)
|
||||||
|
? order.receiver.balance
|
||||||
|
: IERC20(tokenOut).balanceOf(order.receiver);
|
||||||
|
|
||||||
|
// Execute the swap
|
||||||
|
uint256 ethValue = tokenIn == address(0) ? amountIn : 0;
|
||||||
|
|
||||||
|
try IBebopSettlement(bebopSettlement).swapAggregate{value: ethValue}(
|
||||||
|
order, signatures, filledTakerAmounts
|
||||||
|
) {
|
||||||
|
// Success
|
||||||
|
} catch {
|
||||||
|
revert BebopExecutor__SettlementFailed();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate actual amount received
|
||||||
|
uint256 balanceAfter = tokenOut == address(0)
|
||||||
|
? order.receiver.balance
|
||||||
|
: IERC20(tokenOut).balanceOf(order.receiver);
|
||||||
|
|
||||||
|
amountOut = balanceAfter - balanceBefore;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Decodes aggregate order data and signatures
|
||||||
|
function _decodeAggregateData(
|
||||||
|
bytes memory quoteData,
|
||||||
|
uint8 signatureType,
|
||||||
|
bytes memory signatureData
|
||||||
|
)
|
||||||
|
private
|
||||||
|
pure
|
||||||
|
returns (
|
||||||
|
IBebopSettlement.Aggregate memory order,
|
||||||
|
IBebopSettlement.MakerSignature[] memory signatures
|
||||||
|
)
|
||||||
|
{
|
||||||
|
order = abi.decode(quoteData, (IBebopSettlement.Aggregate));
|
||||||
|
|
||||||
|
// Decode multiple signatures
|
||||||
|
// First 4 bytes contain the number of signatures
|
||||||
|
uint32 numSignatures;
|
||||||
|
assembly {
|
||||||
|
numSignatures := mload(add(signatureData, 0x20))
|
||||||
|
numSignatures := and(numSignatures, 0xffffffff)
|
||||||
|
}
|
||||||
|
signatures = new IBebopSettlement.MakerSignature[](numSignatures);
|
||||||
|
|
||||||
|
uint256 offset = 4;
|
||||||
|
for (uint256 i = 0; i < numSignatures; i++) {
|
||||||
|
// Each signature is prefixed with its length
|
||||||
|
uint32 sigLength;
|
||||||
|
assembly {
|
||||||
|
let data := add(signatureData, add(0x20, offset))
|
||||||
|
sigLength := mload(data)
|
||||||
|
sigLength := and(sigLength, 0xffffffff)
|
||||||
|
}
|
||||||
|
offset += 4;
|
||||||
|
|
||||||
|
// Extract signature bytes
|
||||||
|
bytes memory sigBytes = new bytes(sigLength);
|
||||||
|
assembly {
|
||||||
|
let src := add(signatureData, add(0x20, offset))
|
||||||
|
let dst := add(sigBytes, 0x20)
|
||||||
|
|
||||||
|
// Copy sigLength bytes from src to dst
|
||||||
|
let end := add(dst, sigLength)
|
||||||
|
for { } lt(dst, end) { dst := add(dst, 0x20) src := add(src, 0x20) } {
|
||||||
|
mstore(dst, mload(src))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
signatures[i] = IBebopSettlement.MakerSignature({
|
||||||
|
signatureType: signatureType,
|
||||||
|
signatureBytes: sigBytes
|
||||||
|
});
|
||||||
|
|
||||||
|
offset += sigLength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// @dev Decodes quote data into Bebop order and signature structures
|
/// @dev Decodes quote data into Bebop order and signature structures
|
||||||
function _decodeQuoteData(
|
function _decodeQuoteData(
|
||||||
bytes memory quoteData,
|
bytes memory quoteData,
|
||||||
@@ -253,7 +444,8 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
|||||||
|
|
||||||
// Get the variable lengths so we know what to expect
|
// Get the variable lengths so we know what to expect
|
||||||
uint32 quoteDataLength = uint32(bytes4(data[42:46]));
|
uint32 quoteDataLength = uint32(bytes4(data[42:46]));
|
||||||
uint32 signatureLength = uint32(bytes4(data[47 + quoteDataLength:51 + quoteDataLength]));
|
uint32 signatureLength =
|
||||||
|
uint32(bytes4(data[47 + quoteDataLength:51 + quoteDataLength]));
|
||||||
|
|
||||||
// Make sure we got exactly what we expected, no more no less
|
// Make sure we got exactly what we expected, no more no less
|
||||||
uint256 expectedLength = 52 + quoteDataLength + signatureLength;
|
uint256 expectedLength = 52 + quoteDataLength + signatureLength;
|
||||||
@@ -272,7 +464,8 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
|||||||
|
|
||||||
// Signature stuff comes after the quote data
|
// Signature stuff comes after the quote data
|
||||||
signatureType = uint8(data[46 + quoteDataLength]);
|
signatureType = uint8(data[46 + quoteDataLength]);
|
||||||
signature = data[51 + quoteDataLength:51 + quoteDataLength + signatureLength];
|
signature =
|
||||||
|
data[51 + quoteDataLength:51 + quoteDataLength + signatureLength];
|
||||||
|
|
||||||
// Last byte tells us if we need approval
|
// Last byte tells us if we need approval
|
||||||
approvalNeeded = data[51 + quoteDataLength + signatureLength] != 0;
|
approvalNeeded = data[51 + quoteDataLength + signatureLength] != 0;
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ import {IHooks} from "@uniswap/v4-core/src/interfaces/IHooks.sol";
|
|||||||
import {PathKey} from "@uniswap/v4-periphery/src/libraries/PathKey.sol";
|
import {PathKey} from "@uniswap/v4-periphery/src/libraries/PathKey.sol";
|
||||||
import {IUnlockCallback} from
|
import {IUnlockCallback} from
|
||||||
"@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol";
|
"@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol";
|
||||||
import {SafeCast as V4SafeCast} from "@uniswap/v4-core/src/libraries/SafeCast.sol";
|
import {SafeCast as V4SafeCast} from
|
||||||
|
"@uniswap/v4-core/src/libraries/SafeCast.sol";
|
||||||
import {TransientStateLibrary} from
|
import {TransientStateLibrary} from
|
||||||
"@uniswap/v4-core/src/libraries/TransientStateLibrary.sol";
|
"@uniswap/v4-core/src/libraries/TransientStateLibrary.sol";
|
||||||
import "../RestrictTransferFrom.sol";
|
import "../RestrictTransferFrom.sol";
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ contract TychoRouterTestProtocolIntegration is TychoRouterTestSetup {
|
|||||||
|
|
||||||
vm.startPrank(ALICE);
|
vm.startPrank(ALICE);
|
||||||
IERC20(USDC_ADDR).approve(tychoRouterAddr, type(uint256).max);
|
IERC20(USDC_ADDR).approve(tychoRouterAddr, type(uint256).max);
|
||||||
bytes memory callData = loadCallDataFromFile("test_encode_bebop_rfq");
|
bytes memory callData = loadCallDataFromFile("test_encode_bebop_single");
|
||||||
(bool success,) = tychoRouterAddr.call(callData);
|
(bool success,) = tychoRouterAddr.call(callData);
|
||||||
|
|
||||||
uint256 finalBalance = IERC20(WETH_ADDR).balanceOf(ALICE);
|
uint256 finalBalance = IERC20(WETH_ADDR).balanceOf(ALICE);
|
||||||
|
|||||||
@@ -505,7 +505,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
|
|||||||
// Approve permit2
|
// Approve permit2
|
||||||
vm.startPrank(ALICE);
|
vm.startPrank(ALICE);
|
||||||
IERC20(USDC_ADDR).approve(tychoRouterAddr, type(uint256).max);
|
IERC20(USDC_ADDR).approve(tychoRouterAddr, type(uint256).max);
|
||||||
bytes memory callData = loadCallDataFromFile("test_encode_bebop_rfq");
|
bytes memory callData = loadCallDataFromFile("test_encode_bebop_single");
|
||||||
(bool success,) = tychoRouterAddr.call(callData);
|
(bool success,) = tychoRouterAddr.call(callData);
|
||||||
|
|
||||||
vm.stopPrank();
|
vm.stopPrank();
|
||||||
|
|||||||
@@ -3,23 +3,23 @@ test_single_encoding_strategy_ekubo:5c4b639c000000000000000000000000000000000000
|
|||||||
test_uniswap_v3_uniswap_v3:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000692e234dae75c793f67a35089c9d99245e1c58470b2260fac5e5542a773aa44fbcfedf7c193bc2c599a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc299ac8ca7087fa4a2a1fb6357269965a2014abc35010100000000000000000000
|
test_uniswap_v3_uniswap_v3:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000692e234dae75c793f67a35089c9d99245e1c58470b2260fac5e5542a773aa44fbcfedf7c193bc2c599a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc299ac8ca7087fa4a2a1fb6357269965a2014abc35010100000000000000000000
|
||||||
test_balancer_v2_uniswap_v2:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c80072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e004375dff511095cc5a197a54140a24efef3a416010000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
test_balancer_v2_uniswap_v2:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c80072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e004375dff511095cc5a197a54140a24efef3a416010000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
||||||
test_sequential_swap_strategy_encoder_no_permit2:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
test_sequential_swap_strategy_encoder_no_permit2:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
||||||
test_single_encoding_strategy_usv4_grouped_swap:30ace1b1000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000068683fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c800000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000412b98e55298bbf61b474644add5b9cfaea847720757b20aa99b4a9fe40c0275cc06d0404411dd1d8a8bbc9d6c172d2fa12e49221507d10b986d7761fdb00996541b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d23119330000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000000000000000
|
test_single_encoding_strategy_usv4_grouped_swap:30ace1b1000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000006868556700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf6f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041ffab34804b3f7c5589dcf1d3a1ca738ffc9fa28c90fa12d3df190dd6cf5688da70b57ebc0a46a972f070678b2d29f59bda80e8e7e6283db5cbe5af554073c7b01b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d23119330000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000000000000000
|
||||||
test_single_encoding_strategy_usv4_eth_out:30ace1b100000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e000000000000000000000000000000000000000000000000000000000068683fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c800000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004135f5ee1231bd08d20dd7a5b55f1580b887f1dfb110cc18113dec712d07139aca2889a30b8aa13911320cbb4070da6998c694ef354ddaeaed28a7c0c3930a36561b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c0000000000000000000000000000000000000000
|
test_single_encoding_strategy_usv4_eth_out:30ace1b100000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000000000000000000000000000000000006868556700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf6f00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000418d2506ec1d5392aeafa6a0393596c427c15c8416879fc257ada96d3ec4df08c341440a326bbaa8430c4b5c66ef73c93003c35abc125ef1bbeea7a3f04d2c5f2e1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c0000000000000000000000000000000000000000
|
||||||
test_sequential_swap_strategy_encoder:51bcc7b60000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041697fe1c9b400b96a07137c2e055dd542e7223e23d3b149fb25883f60d7ad9f070310150e12e4e4480f9b9631efaa277878fe184d90ff88a61dff697f019872c11c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
test_sequential_swap_strategy_encoder:51bcc7b60000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7200000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a2e11af0138879ed0b62726a34eeada3f883da36ec979e1136779a60b48ce2c03f52a5bd66643e0d77f44509625dfb148820912a48b6852623d434bb82c1bb5e1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_no_permit2:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
test_single_swap_strategy_encoder_no_permit2:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_no_transfer_in:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
test_single_swap_strategy_encoder_no_transfer_in:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
||||||
test_single_encoding_strategy_usv4_eth_in:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c800000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041ec5e3769e96baf7e6523b3e0a6b3b561d3d9d9a531ae6143c6f72d809bb84c52135e4fc5f319470613fc823a8c721cc5b92d56916078b41bd2770336f6a79e591b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000
|
test_single_encoding_strategy_usv4_eth_in:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556600000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf6e00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000412d2e27e74d3ab877cbb92639a88083994b08f40930a5b695bbb3ff5e2c2620ac3a16031944dcaa14e9f9bd123d0cc76f114c66469ce170ca78c1c1bf28d89a111c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000
|
||||||
test_sequential_strategy_cyclic_swap:51bcc7b60000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004112d6160e05665d7167aa64c0d3ee9edcde7c9e88308df3ab3d1020864d6859ab37020135bd3185b4ec921771ae0941154ee8db4090956bf660901d797d1f025b1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010000692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000000000
|
test_sequential_strategy_cyclic_swap:51bcc7b60000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006868556900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7100000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000414636108cd26fa9bdb0e235a1c085764f8aea24200260203d94ab883903dc32961490086c7f2558f4988bf2281e0beb86c1b83974e73d8fe8008f7180df9a5f701c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010000692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000000000
|
||||||
test_single_encoding_strategy_curve_st_eth:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff211eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeae7ab96520de3a18e5e111b5eaab095312d7fe84dc24316b9ae028f1497c275eb9192a3ea0f670220100010002cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
test_single_encoding_strategy_curve_st_eth:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff211eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeae7ab96520de3a18e5e111b5eaab095312d7fe84dc24316b9ae028f1497c275eb9192a3ea0f670220100010002cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000006d70b85442ed96492800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041697fe1c9b400b96a07137c2e055dd542e7223e23d3b149fb25883f60d7ad9f070310150e12e4e4480f9b9631efaa277878fe184d90ff88a61dff697f019872c11c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
test_single_swap_strategy_encoder:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000006d70b85442ed96492800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7200000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a2e11af0138879ed0b62726a34eeada3f883da36ec979e1136779a60b48ce2c03f52a5bd66643e0d77f44509625dfb148820912a48b6852623d434bb82c1bb5e1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
||||||
test_single_encoding_strategy_curve:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff21155c08ca52497e2f1534b59e2917bf524d4765257c02aaa39b223fe8d0a0e5c4f27ead9083c756cc277146b0a1d08b6844376df6d9da99ba7f1b19e710201000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
test_single_encoding_strategy_curve:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff21155c08ca52497e2f1534b59e2917bf524d4765257c02aaa39b223fe8d0a0e5c4f27ead9083c756cc277146b0a1d08b6844376df6d9da99ba7f1b19e710201000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_unwrap:30ace1b10000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000418ac985c46abfb5e71b61f03daf3957368d502c496ef6bd9b7ad251873a4b2c4523ae598a58beaa80b59ea309fdff7bd7061ce7b5e5e9111f20898084eab652b51b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000000000000000000000000000000
|
test_single_swap_strategy_encoder_unwrap:30ace1b10000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be00000000000000000000000000000000000000000000000000000000000006868556a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7200000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041b15c0c31fda44941e9a38589ae43097d230c40a738e262d4b3fc8ef99396ea631c86fd8e324dea1a2cb98d343bb92ed97979157afd19a28cbf5d4e9a5e246adf1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_wrap:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004160b72e55241549f19ecbfbd94d86f6f46be1109398789d38684d43b5b4e25fdb4f7abb9a82a947f5eab7af922edfd6a03040eb01cde767acc857933d88b43b051b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
test_single_swap_strategy_encoder_wrap:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7300000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004194868f832eef98933482d46252999d9aeb02c8ae3e605b653bd14704eccc7398227b5431ccd0f0512fef7ecd42aaea7abd2bd9d573d14f54fbeaa2bc581b08cd1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
||||||
test_split_output_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004112d6160e05665d7167aa64c0d3ee9edcde7c9e88308df3ab3d1020864d6859ab37020135bd3185b4ec921771ae0941154ee8db4090956bf660901d797d1f025b1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950100006e01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f56400001006e01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000
|
test_split_output_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006868556b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7300000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004146c2b6eebaec39b2b00153a0c9bad5900aaf59380b12c87b77c7d73a5471ce757608b61dbca3f17edc81484243970f516000decb32c00d3039af0600fa170d481c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950100006e01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f56400001006e01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000
|
||||||
test_split_input_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004112d6160e05665d7167aa64c0d3ee9edcde7c9e88308df3ab3d1020864d6859ab37020135bd3185b4ec921771ae0941154ee8db4090956bf660901d797d1f025b1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139006e00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f56400100006e00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d80100005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000100000000000000
|
test_split_input_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006868556b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7300000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004146c2b6eebaec39b2b00153a0c9bad5900aaf59380b12c87b77c7d73a5471ce757608b61dbca3f17edc81484243970f516000decb32c00d3039af0600fa170d481c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139006e00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f56400100006e00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d80100005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000100000000000000
|
||||||
test_split_swap_strategy_encoder:7c5538460000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c9000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041697fe1c9b400b96a07137c2e055dd542e7223e23d3b149fb25883f60d7ad9f070310150e12e4e4480f9b9631efaa277878fe184d90ff88a61dff697f019872c11c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950000005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950000005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20101005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010100000000000000000000000000000000000000000000000000000000
|
test_split_swap_strategy_encoder:7c5538460000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf74000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041181c44146d51b656f6c0c2c790b23ed7c6a0369f51fcf7ad926b2721633eb01b3e724bdb02bb4093e9f2833d3a891d605e9e644ea44b3a8008aa5a53dec5dab91c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950000005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950000005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20101005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010100000000000000000000000000000000000000000000000000000000
|
||||||
test_uniswap_v3_curve:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae460301000102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000
|
test_uniswap_v3_curve:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae460301000102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000
|
||||||
test_multi_protocol:51bcc7b600000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000412643d4c29d518ccf5c9aad4e4524079280d0b72ee61773d19d9b5fc4a32f557d3a3eb3f24a0ace0da150e12be87ffad121995e9bf37c019cea8e4c953d3ab4b61c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021400525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d01395010200691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001023ede3eca2a72b3aecc820e955b36f38437d013950071a0cb889707d426a7a386870a03bc70d1b0697598013ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000
|
test_multi_protocol:51bcc7b600000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf00000000000000000000000000000000000000000000000000000000000006868556900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7100000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000418fd6660ac08c4730aa9063bc6676f24d42abd36e6dbe52e24d3a3b56dfb8921246a2d356bf07df18e9a204cc1729a90dcab526b02a099079338584d447e2a4391b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021400525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d01395010200691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001023ede3eca2a72b3aecc820e955b36f38437d013950071a0cb889707d426a7a386870a03bc70d1b0697598013ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000
|
||||||
test_encode_balancer_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2ba100000625a3754423978a60c9317c58a424e3d5c6ee304399dbdb9c8ef030ab642b10820db8f560002000000000000000000141d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0102
|
test_encode_balancer_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2ba100000625a3754423978a60c9317c58a424e3d5c6ee304399dbdb9c8ef030ab642b10820db8f560002000000000000000000141d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0102
|
||||||
test_ekubo_encode_swap_multi:01ca4f73fe97d0b987a0d12b39bbd562c779bab6f60000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000001a36e2eb1c43200000032
|
test_ekubo_encode_swap_multi:01ca4f73fe97d0b987a0d12b39bbd562c779bab6f60000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000001a36e2eb1c43200000032
|
||||||
test_encode_uniswap_v4_sequential_swap:4c9edd5852cd905f086c759e8383e09bff1e68b32260fac5e5542a773aa44fbcfedf7c193bc2c5990101cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec70000640000012260fac5e5542a773aa44fbcfedf7c193bc2c599000bb800003c
|
test_encode_uniswap_v4_sequential_swap:4c9edd5852cd905f086c759e8383e09bff1e68b32260fac5e5542a773aa44fbcfedf7c193bc2c5990101cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec70000640000012260fac5e5542a773aa44fbcfedf7c193bc2c599000bb800003c
|
||||||
@@ -27,4 +27,6 @@ test_encode_uniswap_v4_simple_swap:4c9edd5852cd905f086c759e8383e09bff1e68b3dac17
|
|||||||
test_single_encoding_strategy_maverick:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000040d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000051a4ad4f68d0b91cfd19687c881e50f3a00242828c40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c67cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
test_single_encoding_strategy_maverick:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000040d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000051a4ad4f68d0b91cfd19687c881e50f3a00242828c40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c67cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
||||||
test_encode_maverick_v2:40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e01
|
test_encode_maverick_v2:40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e01
|
||||||
test_encode_uniswap_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb111d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0001
|
test_encode_uniswap_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb111d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0001
|
||||||
test_encode_bebop_rfq:a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20100000000081234567890abcdef0000000004aabbccdd01
|
test_encode_bebop_single:a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20100000000081234567890abcdef0000000004aabbccdd01
|
||||||
|
test_encode_bebop_aggregate:6b175474e89094c44da98b954eedeac495271d0f2260fac5e5542a773aa44fbcfedf7c193bc2c599000200000004deadbeef00000000140000000200000004aabbccdd00000004eeff001101
|
||||||
|
test_encode_bebop_multi:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48010100000008abcdef123456789000000000041122334401
|
||||||
|
|||||||
@@ -30,10 +30,9 @@ contract MockToken is ERC20 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
contract BebopExecutorExposed is BebopExecutor {
|
contract BebopExecutorExposed is BebopExecutor {
|
||||||
constructor(
|
constructor(address _bebopSettlement, address _permit2)
|
||||||
address _bebopSettlement,
|
BebopExecutor(_bebopSettlement, _permit2)
|
||||||
address _permit2
|
{}
|
||||||
) BebopExecutor(_bebopSettlement, _permit2) {}
|
|
||||||
|
|
||||||
function decodeParams(bytes calldata data)
|
function decodeParams(bytes calldata data)
|
||||||
external
|
external
|
||||||
@@ -96,6 +95,144 @@ contract MockBebopSettlement is Test, Constants {
|
|||||||
|
|
||||||
return filledMakerAmount;
|
return filledMakerAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function swapMulti(
|
||||||
|
IBebopSettlement.Multi calldata order,
|
||||||
|
IBebopSettlement.MakerSignature calldata, /* makerSignature */
|
||||||
|
uint256[] calldata filledTakerAmounts
|
||||||
|
) external payable returns (uint256[] memory filledMakerAmounts) {
|
||||||
|
// Basic validation
|
||||||
|
require(order.expiry >= block.timestamp, "Order expired");
|
||||||
|
require(
|
||||||
|
order.taker_tokens.length == filledTakerAmounts.length,
|
||||||
|
"Array length mismatch"
|
||||||
|
);
|
||||||
|
|
||||||
|
filledMakerAmounts = new uint256[](order.maker_tokens.length);
|
||||||
|
|
||||||
|
// Handle each token input
|
||||||
|
uint256 totalEthRequired = 0;
|
||||||
|
for (uint256 i = 0; i < order.taker_tokens.length; i++) {
|
||||||
|
if (filledTakerAmounts[i] == 0) continue;
|
||||||
|
|
||||||
|
require(
|
||||||
|
filledTakerAmounts[i] <= order.taker_amounts[i],
|
||||||
|
"Exceeds order amount"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (order.taker_tokens[i] == address(0)) {
|
||||||
|
// For ETH input, accumulate required ETH
|
||||||
|
totalEthRequired += filledTakerAmounts[i];
|
||||||
|
} else {
|
||||||
|
// For ERC20 input, transfer from sender
|
||||||
|
IERC20(order.taker_tokens[i]).transferFrom(
|
||||||
|
msg.sender, address(this), filledTakerAmounts[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate ETH sent
|
||||||
|
require(msg.value >= totalEthRequired, "Insufficient ETH sent");
|
||||||
|
|
||||||
|
// Calculate and distribute maker amounts
|
||||||
|
for (uint256 i = 0; i < order.maker_tokens.length; i++) {
|
||||||
|
// Find corresponding taker amount (assuming 1:1 token mapping for simplicity)
|
||||||
|
if (i < order.taker_tokens.length && filledTakerAmounts[i] > 0) {
|
||||||
|
filledMakerAmounts[i] = (
|
||||||
|
filledTakerAmounts[i] * order.maker_amounts[i]
|
||||||
|
) / order.taker_amounts[i];
|
||||||
|
|
||||||
|
if (order.maker_tokens[i] == address(0)) {
|
||||||
|
// For ETH output
|
||||||
|
vm.deal(
|
||||||
|
order.receiver,
|
||||||
|
order.receiver.balance + filledMakerAmounts[i]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// For ERC20 output
|
||||||
|
deal(
|
||||||
|
order.maker_tokens[i],
|
||||||
|
order.receiver,
|
||||||
|
IERC20(order.maker_tokens[i]).balanceOf(order.receiver)
|
||||||
|
+ filledMakerAmounts[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return filledMakerAmounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function swapAggregate(
|
||||||
|
IBebopSettlement.Aggregate calldata order,
|
||||||
|
IBebopSettlement.MakerSignature[] calldata, /* makerSignatures */
|
||||||
|
uint256[] calldata filledTakerAmounts
|
||||||
|
) external payable returns (uint256[][] memory filledMakerAmounts) {
|
||||||
|
// Basic validation
|
||||||
|
require(order.expiry >= block.timestamp, "Order expired");
|
||||||
|
require(
|
||||||
|
order.taker_tokens.length == filledTakerAmounts.length,
|
||||||
|
"Array length mismatch"
|
||||||
|
);
|
||||||
|
require(
|
||||||
|
order.maker_addresses.length == order.maker_tokens.length,
|
||||||
|
"Maker array mismatch"
|
||||||
|
);
|
||||||
|
|
||||||
|
filledMakerAmounts = new uint256[][](order.maker_addresses.length);
|
||||||
|
|
||||||
|
// Handle taker tokens
|
||||||
|
uint256 totalEthRequired = 0;
|
||||||
|
for (uint256 i = 0; i < order.taker_tokens.length; i++) {
|
||||||
|
if (filledTakerAmounts[i] == 0) continue;
|
||||||
|
|
||||||
|
require(
|
||||||
|
filledTakerAmounts[i] <= order.taker_amounts[i],
|
||||||
|
"Exceeds order amount"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (order.taker_tokens[i] == address(0)) {
|
||||||
|
totalEthRequired += filledTakerAmounts[i];
|
||||||
|
} else {
|
||||||
|
IERC20(order.taker_tokens[i]).transferFrom(
|
||||||
|
msg.sender, address(this), filledTakerAmounts[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require(msg.value >= totalEthRequired, "Insufficient ETH sent");
|
||||||
|
|
||||||
|
// Distribute to makers (simplified: assumes first taker token goes to all makers proportionally)
|
||||||
|
for (uint256 i = 0; i < order.maker_addresses.length; i++) {
|
||||||
|
filledMakerAmounts[i] = new uint256[](order.maker_tokens[i].length);
|
||||||
|
|
||||||
|
for (uint256 j = 0; j < order.maker_tokens[i].length; j++) {
|
||||||
|
if (filledTakerAmounts[0] > 0) {
|
||||||
|
// Simplified logic
|
||||||
|
filledMakerAmounts[i][j] = (
|
||||||
|
filledTakerAmounts[0] * order.maker_amounts[i][j]
|
||||||
|
) / order.taker_amounts[0];
|
||||||
|
|
||||||
|
if (order.maker_tokens[i][j] == address(0)) {
|
||||||
|
vm.deal(
|
||||||
|
order.receiver,
|
||||||
|
order.receiver.balance + filledMakerAmounts[i][j]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
deal(
|
||||||
|
order.maker_tokens[i][j],
|
||||||
|
order.receiver,
|
||||||
|
IERC20(order.maker_tokens[i][j]).balanceOf(
|
||||||
|
order.receiver
|
||||||
|
) + filledMakerAmounts[i][j]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return filledMakerAmounts;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
contract BebopExecutorTest is Constants, Permit2TestHelper, TestUtils {
|
contract BebopExecutorTest is Constants, Permit2TestHelper, TestUtils {
|
||||||
@@ -125,8 +262,7 @@ contract BebopExecutorTest is Constants, Permit2TestHelper, TestUtils {
|
|||||||
|
|
||||||
// Deploy Bebop executor
|
// Deploy Bebop executor
|
||||||
bebopExecutor = new BebopExecutorExposed(
|
bebopExecutor = new BebopExecutorExposed(
|
||||||
address(mockBebopSettlement),
|
address(mockBebopSettlement), PERMIT2_ADDRESS
|
||||||
PERMIT2_ADDRESS
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Fund test accounts
|
// Fund test accounts
|
||||||
@@ -400,10 +536,160 @@ contract BebopExecutorTest is Constants, Permit2TestHelper, TestUtils {
|
|||||||
WETH_ADDR,
|
WETH_ADDR,
|
||||||
USDC_ADDR,
|
USDC_ADDR,
|
||||||
uint8(RestrictTransferFrom.TransferType.Transfer)
|
uint8(RestrictTransferFrom.TransferType.Transfer)
|
||||||
// Missing rest of the data
|
|
||||||
);
|
);
|
||||||
|
// Missing rest of the data
|
||||||
|
|
||||||
vm.expectRevert(BebopExecutor.BebopExecutor__InvalidDataLength.selector);
|
vm.expectRevert(BebopExecutor.BebopExecutor__InvalidDataLength.selector);
|
||||||
bebopExecutor.decodeParams(tooShortParams);
|
bebopExecutor.decodeParams(tooShortParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testMultiRFQSwap() public {
|
||||||
|
uint256 amountIn = 1e18; // 1 WETH
|
||||||
|
uint256 expectedAmountOut = 3000e6; // 3000 USDC
|
||||||
|
|
||||||
|
// Create arrays for Multi order
|
||||||
|
address[] memory takerTokens = new address[](2);
|
||||||
|
takerTokens[0] = WETH_ADDR;
|
||||||
|
takerTokens[1] = DAI_ADDR; // Not used in this test
|
||||||
|
|
||||||
|
address[] memory makerTokens = new address[](2);
|
||||||
|
makerTokens[0] = USDC_ADDR;
|
||||||
|
makerTokens[1] = WBTC_ADDR; // Not used in this test
|
||||||
|
|
||||||
|
uint256[] memory takerAmounts = new uint256[](2);
|
||||||
|
takerAmounts[0] = amountIn;
|
||||||
|
takerAmounts[1] = 0;
|
||||||
|
|
||||||
|
uint256[] memory makerAmounts = new uint256[](2);
|
||||||
|
makerAmounts[0] = expectedAmountOut;
|
||||||
|
makerAmounts[1] = 0;
|
||||||
|
|
||||||
|
// Create a valid Bebop Multi order
|
||||||
|
IBebopSettlement.Multi memory order = IBebopSettlement.Multi({
|
||||||
|
expiry: block.timestamp + 3600,
|
||||||
|
taker_address: address(0),
|
||||||
|
maker_address: address(mockBebopSettlement),
|
||||||
|
maker_nonce: 1,
|
||||||
|
taker_tokens: takerTokens,
|
||||||
|
maker_tokens: makerTokens,
|
||||||
|
taker_amounts: takerAmounts,
|
||||||
|
maker_amounts: makerAmounts,
|
||||||
|
receiver: address(bebopExecutor),
|
||||||
|
packed_commands: 0,
|
||||||
|
flags: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
// Encode order as quote data
|
||||||
|
bytes memory quoteData = abi.encode(order);
|
||||||
|
bytes memory signature = hex"aabbccdd";
|
||||||
|
|
||||||
|
bytes memory params = abi.encodePacked(
|
||||||
|
WETH_ADDR,
|
||||||
|
USDC_ADDR,
|
||||||
|
uint8(RestrictTransferFrom.TransferType.Transfer),
|
||||||
|
uint8(1), // OrderType.Multi
|
||||||
|
uint32(quoteData.length),
|
||||||
|
quoteData,
|
||||||
|
uint8(0), // signatureType: ECDSA
|
||||||
|
uint32(signature.length),
|
||||||
|
signature,
|
||||||
|
uint8(1) // approvalNeeded: true
|
||||||
|
);
|
||||||
|
|
||||||
|
// Transfer WETH to executor first
|
||||||
|
WETH.transfer(address(bebopExecutor), amountIn);
|
||||||
|
|
||||||
|
// Execute swap
|
||||||
|
uint256 executorBalanceBefore = USDC.balanceOf(address(bebopExecutor));
|
||||||
|
uint256 amountOut = bebopExecutor.swap(amountIn, params);
|
||||||
|
uint256 executorBalanceAfter = USDC.balanceOf(address(bebopExecutor));
|
||||||
|
|
||||||
|
// Check results
|
||||||
|
assertGt(amountOut, 0);
|
||||||
|
assertEq(amountOut, expectedAmountOut);
|
||||||
|
assertEq(executorBalanceAfter - executorBalanceBefore, amountOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testAggregateRFQSwap() public {
|
||||||
|
uint256 amountIn = 1e18; // 1 WETH
|
||||||
|
uint256 expectedAmountOut = 3000e6; // 3000 USDC total from 2 makers
|
||||||
|
|
||||||
|
// Create arrays for Aggregate order
|
||||||
|
address[] memory takerTokens = new address[](1);
|
||||||
|
takerTokens[0] = WETH_ADDR;
|
||||||
|
|
||||||
|
uint256[] memory takerAmounts = new uint256[](1);
|
||||||
|
takerAmounts[0] = amountIn;
|
||||||
|
|
||||||
|
address[] memory makerAddresses = new address[](2);
|
||||||
|
makerAddresses[0] = address(mockBebopSettlement);
|
||||||
|
makerAddresses[1] = makeAddr("maker2");
|
||||||
|
|
||||||
|
address[][] memory makerTokens = new address[][](2);
|
||||||
|
makerTokens[0] = new address[](1);
|
||||||
|
makerTokens[0][0] = USDC_ADDR;
|
||||||
|
makerTokens[1] = new address[](1);
|
||||||
|
makerTokens[1][0] = USDC_ADDR;
|
||||||
|
|
||||||
|
uint256[][] memory makerAmounts = new uint256[][](2);
|
||||||
|
makerAmounts[0] = new uint256[](1);
|
||||||
|
makerAmounts[0][0] = 1500e6; // First maker provides 1500 USDC
|
||||||
|
makerAmounts[1] = new uint256[](1);
|
||||||
|
makerAmounts[1][0] = 1500e6; // Second maker provides 1500 USDC
|
||||||
|
|
||||||
|
// Create a valid Bebop Aggregate order
|
||||||
|
IBebopSettlement.Aggregate memory order = IBebopSettlement.Aggregate({
|
||||||
|
expiry: block.timestamp + 3600,
|
||||||
|
taker_address: address(0),
|
||||||
|
taker_nonce: 1,
|
||||||
|
taker_tokens: takerTokens,
|
||||||
|
taker_amounts: takerAmounts,
|
||||||
|
maker_addresses: makerAddresses,
|
||||||
|
maker_tokens: makerTokens,
|
||||||
|
maker_amounts: makerAmounts,
|
||||||
|
receiver: address(bebopExecutor),
|
||||||
|
packed_commands: 0,
|
||||||
|
flags: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
// Encode order as quote data
|
||||||
|
bytes memory quoteData = abi.encode(order);
|
||||||
|
|
||||||
|
// Encode multiple signatures (2 makers)
|
||||||
|
bytes memory sig1 = hex"aabbccdd";
|
||||||
|
bytes memory sig2 = hex"eeff0011";
|
||||||
|
bytes memory signatures = abi.encodePacked(
|
||||||
|
uint32(2), // number of signatures
|
||||||
|
uint32(sig1.length),
|
||||||
|
sig1,
|
||||||
|
uint32(sig2.length),
|
||||||
|
sig2
|
||||||
|
);
|
||||||
|
|
||||||
|
bytes memory params = abi.encodePacked(
|
||||||
|
WETH_ADDR,
|
||||||
|
USDC_ADDR,
|
||||||
|
uint8(RestrictTransferFrom.TransferType.Transfer),
|
||||||
|
uint8(2), // OrderType.Aggregate
|
||||||
|
uint32(quoteData.length),
|
||||||
|
quoteData,
|
||||||
|
uint8(0), // signatureType: ECDSA
|
||||||
|
uint32(signatures.length),
|
||||||
|
signatures,
|
||||||
|
uint8(1) // approvalNeeded: true
|
||||||
|
);
|
||||||
|
|
||||||
|
// Transfer WETH to executor first
|
||||||
|
WETH.transfer(address(bebopExecutor), amountIn);
|
||||||
|
|
||||||
|
// Execute swap
|
||||||
|
uint256 executorBalanceBefore = USDC.balanceOf(address(bebopExecutor));
|
||||||
|
uint256 amountOut = bebopExecutor.swap(amountIn, params);
|
||||||
|
uint256 executorBalanceAfter = USDC.balanceOf(address(bebopExecutor));
|
||||||
|
|
||||||
|
// Check results
|
||||||
|
assertGt(amountOut, 0);
|
||||||
|
assertEq(amountOut, expectedAmountOut);
|
||||||
|
assertEq(executorBalanceAfter - executorBalanceBefore, amountOut);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1667,7 +1667,7 @@ mod tests {
|
|||||||
use crate::encoding::evm::utils::write_calldata_to_file;
|
use crate::encoding::evm::utils::write_calldata_to_file;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_encode_bebop_rfq() {
|
fn test_encode_bebop_single() {
|
||||||
use alloy::hex;
|
use alloy::hex;
|
||||||
|
|
||||||
// Create static attributes for a Bebop RFQ quote
|
// Create static attributes for a Bebop RFQ quote
|
||||||
@@ -1742,7 +1742,168 @@ mod tests {
|
|||||||
))
|
))
|
||||||
);
|
);
|
||||||
|
|
||||||
write_calldata_to_file("test_encode_bebop_rfq", hex_swap.as_str());
|
write_calldata_to_file("test_encode_bebop_single", hex_swap.as_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_encode_bebop_multi() {
|
||||||
|
use alloy::hex;
|
||||||
|
|
||||||
|
// Create static attributes for a Bebop Multi RFQ quote
|
||||||
|
let mut static_attributes: HashMap<String, Bytes> = HashMap::new();
|
||||||
|
static_attributes
|
||||||
|
.insert("quote_data".into(), Bytes::from(hex::decode("abcdef1234567890").unwrap()));
|
||||||
|
static_attributes.insert("signature".into(), Bytes::from(hex::decode("11223344").unwrap()));
|
||||||
|
static_attributes.insert("order_type".into(), Bytes::from(vec![1u8])); // Multi order
|
||||||
|
|
||||||
|
let bebop_component = ProtocolComponent {
|
||||||
|
id: String::from("bebop"),
|
||||||
|
protocol_system: String::from("vm:bebop"),
|
||||||
|
static_attributes,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let token_in = Bytes::from("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); // WETH
|
||||||
|
let token_out = Bytes::from("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"); // USDC
|
||||||
|
let swap = Swap {
|
||||||
|
component: bebop_component,
|
||||||
|
token_in: token_in.clone(),
|
||||||
|
token_out: token_out.clone(),
|
||||||
|
split: 0f64,
|
||||||
|
};
|
||||||
|
|
||||||
|
let encoding_context = EncodingContext {
|
||||||
|
receiver: Bytes::from("0x1D96F2f6BeF1202E4Ce1Ff6Dad0c2CB002861d3e"), // BOB
|
||||||
|
exact_out: false,
|
||||||
|
router_address: Some(Bytes::zero(20)),
|
||||||
|
group_token_in: token_in.clone(),
|
||||||
|
group_token_out: token_out.clone(),
|
||||||
|
transfer_type: TransferType::Transfer,
|
||||||
|
};
|
||||||
|
|
||||||
|
let encoder = BebopSwapEncoder::new(
|
||||||
|
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
||||||
|
TychoCoreChain::Ethereum.into(),
|
||||||
|
Some(HashMap::from([(
|
||||||
|
"settlement_address".to_string(),
|
||||||
|
"0xbbbbbBB520d69a9775E85b458C58c648259FAD5F".to_string(),
|
||||||
|
)])),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let encoded_swap = encoder
|
||||||
|
.encode_swap(swap, encoding_context)
|
||||||
|
.unwrap();
|
||||||
|
let hex_swap = encode(&encoded_swap);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
hex_swap,
|
||||||
|
String::from(concat!(
|
||||||
|
// token in
|
||||||
|
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
|
||||||
|
// token out
|
||||||
|
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
||||||
|
// transfer type Transfer
|
||||||
|
"01",
|
||||||
|
// order type Multi
|
||||||
|
"01",
|
||||||
|
// quote data length (8 bytes = 0x00000008)
|
||||||
|
"00000008",
|
||||||
|
// quote data
|
||||||
|
"abcdef1234567890",
|
||||||
|
// signature type ECDSA (default 0)
|
||||||
|
"00",
|
||||||
|
// signature length (4 bytes = 0x00000004)
|
||||||
|
"00000004",
|
||||||
|
// signature
|
||||||
|
"11223344",
|
||||||
|
// approval needed
|
||||||
|
"01"
|
||||||
|
))
|
||||||
|
);
|
||||||
|
|
||||||
|
write_calldata_to_file("test_encode_bebop_multi", hex_swap.as_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_encode_bebop_aggregate() {
|
||||||
|
use alloy::hex;
|
||||||
|
|
||||||
|
// Create static attributes for a Bebop Aggregate RFQ quote
|
||||||
|
let mut static_attributes: HashMap<String, Bytes> = HashMap::new();
|
||||||
|
static_attributes
|
||||||
|
.insert("quote_data".into(), Bytes::from(hex::decode("deadbeef").unwrap()));
|
||||||
|
// For aggregate, signature contains multiple signatures encoded
|
||||||
|
static_attributes.insert("signature".into(), Bytes::from(hex::decode("0000000200000004aabbccdd00000004eeff0011").unwrap()));
|
||||||
|
static_attributes.insert("order_type".into(), Bytes::from(vec![2u8])); // Aggregate order
|
||||||
|
|
||||||
|
let bebop_component = ProtocolComponent {
|
||||||
|
id: String::from("bebop"),
|
||||||
|
protocol_system: String::from("vm:bebop"),
|
||||||
|
static_attributes,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let token_in = Bytes::from("0x6B175474E89094C44Da98b954EedeAC495271d0F"); // DAI
|
||||||
|
let token_out = Bytes::from("0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599"); // WBTC
|
||||||
|
let swap = Swap {
|
||||||
|
component: bebop_component,
|
||||||
|
token_in: token_in.clone(),
|
||||||
|
token_out: token_out.clone(),
|
||||||
|
split: 0f64,
|
||||||
|
};
|
||||||
|
|
||||||
|
let encoding_context = EncodingContext {
|
||||||
|
receiver: Bytes::from("0x1D96F2f6BeF1202E4Ce1Ff6Dad0c2CB002861d3e"), // BOB
|
||||||
|
exact_out: false,
|
||||||
|
router_address: Some(Bytes::zero(20)),
|
||||||
|
group_token_in: token_in.clone(),
|
||||||
|
group_token_out: token_out.clone(),
|
||||||
|
transfer_type: TransferType::TransferFrom,
|
||||||
|
};
|
||||||
|
|
||||||
|
let encoder = BebopSwapEncoder::new(
|
||||||
|
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
||||||
|
TychoCoreChain::Ethereum.into(),
|
||||||
|
Some(HashMap::from([(
|
||||||
|
"settlement_address".to_string(),
|
||||||
|
"0xbbbbbBB520d69a9775E85b458C58c648259FAD5F".to_string(),
|
||||||
|
)])),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let encoded_swap = encoder
|
||||||
|
.encode_swap(swap, encoding_context)
|
||||||
|
.unwrap();
|
||||||
|
let hex_swap = encode(&encoded_swap);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
hex_swap,
|
||||||
|
String::from(concat!(
|
||||||
|
// token in
|
||||||
|
"6b175474e89094c44da98b954eedeac495271d0f",
|
||||||
|
// token out
|
||||||
|
"2260fac5e5542a773aa44fbcfedf7c193bc2c599",
|
||||||
|
// transfer type TransferFrom
|
||||||
|
"00",
|
||||||
|
// order type Aggregate
|
||||||
|
"02",
|
||||||
|
// quote data length (4 bytes = 0x00000004)
|
||||||
|
"00000004",
|
||||||
|
// quote data
|
||||||
|
"deadbeef",
|
||||||
|
// signature type ECDSA (default 0)
|
||||||
|
"00",
|
||||||
|
// signature length (20 bytes for encoded signatures)
|
||||||
|
"00000014",
|
||||||
|
// encoded signatures (2 signatures)
|
||||||
|
"0000000200000004aabbccdd00000004eeff0011",
|
||||||
|
// approval needed
|
||||||
|
"01"
|
||||||
|
))
|
||||||
|
);
|
||||||
|
|
||||||
|
write_calldata_to_file("test_encode_bebop_aggregate", hex_swap.as_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user