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
|
||||
error BebopExecutor__SettlementFailed();
|
||||
error BebopExecutor__UnsupportedOrderType(uint8 orderType);
|
||||
error BebopExecutor__InvalidDataLength();
|
||||
|
||||
/// @notice The Bebop settlement contract address
|
||||
address public immutable bebopSettlement;
|
||||
|
||||
|
||||
constructor(
|
||||
address _bebopSettlement,
|
||||
address _permit2
|
||||
) RestrictTransferFrom(_permit2) {
|
||||
constructor(address _bebopSettlement, address _permit2)
|
||||
RestrictTransferFrom(_permit2)
|
||||
{
|
||||
bebopSettlement = _bebopSettlement;
|
||||
}
|
||||
|
||||
@@ -156,8 +153,24 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
||||
signatureType,
|
||||
signature
|
||||
);
|
||||
} else {
|
||||
revert BebopExecutor__UnsupportedOrderType(uint8(orderType));
|
||||
} else if (orderType == OrderType.Multi) {
|
||||
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;
|
||||
}
|
||||
|
||||
/// @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
|
||||
function _decodeQuoteData(
|
||||
bytes memory quoteData,
|
||||
@@ -253,7 +444,8 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
||||
|
||||
// Get the variable lengths so we know what to expect
|
||||
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
|
||||
uint256 expectedLength = 52 + quoteDataLength + signatureLength;
|
||||
@@ -266,14 +458,15 @@ contract BebopExecutor is IExecutor, IExecutorErrors, RestrictTransferFrom {
|
||||
tokenOut = address(bytes20(data[20:40]));
|
||||
transferType = TransferType(uint8(data[40]));
|
||||
orderType = OrderType(uint8(data[41]));
|
||||
|
||||
|
||||
// Quote data starts after the length field
|
||||
quoteData = data[46:46 + quoteDataLength];
|
||||
|
||||
|
||||
// Signature stuff comes after the quote data
|
||||
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
|
||||
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 {IUnlockCallback} from
|
||||
"@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
|
||||
"@uniswap/v4-core/src/libraries/TransientStateLibrary.sol";
|
||||
import "../RestrictTransferFrom.sol";
|
||||
|
||||
@@ -299,10 +299,10 @@ contract TychoRouterTestProtocolIntegration is TychoRouterTestSetup {
|
||||
function testSingleBebopIntegration() public {
|
||||
deal(USDC_ADDR, ALICE, 1000 * 10 ** 6);
|
||||
uint256 expAmountOut = 1; // Expected minimum WETH amount out
|
||||
|
||||
|
||||
vm.startPrank(ALICE);
|
||||
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);
|
||||
|
||||
uint256 finalBalance = IERC20(WETH_ADDR).balanceOf(ALICE);
|
||||
|
||||
@@ -505,7 +505,7 @@ contract TychoRouterSequentialSwapTest is TychoRouterTestSetup {
|
||||
// Approve permit2
|
||||
vm.startPrank(ALICE);
|
||||
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);
|
||||
|
||||
vm.stopPrank();
|
||||
|
||||
@@ -3,23 +3,23 @@ test_single_encoding_strategy_ekubo:5c4b639c000000000000000000000000000000000000
|
||||
test_uniswap_v3_uniswap_v3:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000692e234dae75c793f67a35089c9d99245e1c58470b2260fac5e5542a773aa44fbcfedf7c193bc2c599a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc299ac8ca7087fa4a2a1fb6357269965a2014abc35010100000000000000000000
|
||||
test_balancer_v2_uniswap_v2:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c80072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e004375dff511095cc5a197a54140a24efef3a416010000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
||||
test_sequential_swap_strategy_encoder_no_permit2:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
||||
test_single_encoding_strategy_usv4_grouped_swap:30ace1b1000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000068683fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c800000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000412b98e55298bbf61b474644add5b9cfaea847720757b20aa99b4a9fe40c0275cc06d0404411dd1d8a8bbc9d6c172d2fa12e49221507d10b986d7761fdb00996541b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d23119330000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000000000000000
|
||||
test_single_encoding_strategy_usv4_eth_out:30ace1b100000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e000000000000000000000000000000000000000000000000000000000068683fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c800000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004135f5ee1231bd08d20dd7a5b55f1580b887f1dfb110cc18113dec712d07139aca2889a30b8aa13911320cbb4070da6998c694ef354ddaeaed28a7c0c3930a36561b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c0000000000000000000000000000000000000000
|
||||
test_sequential_swap_strategy_encoder:51bcc7b60000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041697fe1c9b400b96a07137c2e055dd542e7223e23d3b149fb25883f60d7ad9f070310150e12e4e4480f9b9631efaa277878fe184d90ff88a61dff697f019872c11c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
||||
test_single_encoding_strategy_usv4_grouped_swap:30ace1b1000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000006868556700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf6f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041ffab34804b3f7c5589dcf1d3a1ca738ffc9fa28c90fa12d3df190dd6cf5688da70b57ebc0a46a972f070678b2d29f59bda80e8e7e6283db5cbe5af554073c7b01b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d23119330000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000000000000000
|
||||
test_single_encoding_strategy_usv4_eth_out:30ace1b100000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000000000000000000000000000000000006868556700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf6f00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000418d2506ec1d5392aeafa6a0393596c427c15c8416879fc257ada96d3ec4df08c341440a326bbaa8430c4b5c66ef73c93003c35abc125ef1bbeea7a3f04d2c5f2e1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c0000000000000000000000000000000000000000
|
||||
test_sequential_swap_strategy_encoder:51bcc7b60000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7200000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a2e11af0138879ed0b62726a34eeada3f883da36ec979e1136779a60b48ce2c03f52a5bd66643e0d77f44509625dfb148820912a48b6852623d434bb82c1bb5e1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
|
||||
test_single_swap_strategy_encoder_no_permit2:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
||||
test_single_swap_strategy_encoder_no_transfer_in:5c4b639c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
||||
test_single_encoding_strategy_usv4_eth_in:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c800000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041ec5e3769e96baf7e6523b3e0a6b3b561d3d9d9a531ae6143c6f72d809bb84c52135e4fc5f319470613fc823a8c721cc5b92d56916078b41bd2770336f6a79e591b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000
|
||||
test_sequential_strategy_cyclic_swap:51bcc7b60000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004112d6160e05665d7167aa64c0d3ee9edcde7c9e88308df3ab3d1020864d6859ab37020135bd3185b4ec921771ae0941154ee8db4090956bf660901d797d1f025b1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010000692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000000000
|
||||
test_single_encoding_strategy_usv4_eth_in:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556600000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf6e00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000412d2e27e74d3ab877cbb92639a88083994b08f40930a5b695bbb3ff5e2c2620ac3a16031944dcaa14e9f9bd123d0cc76f114c66469ce170ca78c1c1bf28d89a111c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000
|
||||
test_sequential_strategy_cyclic_swap:51bcc7b60000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006868556900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7100000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000414636108cd26fa9bdb0e235a1c085764f8aea24200260203d94ab883903dc32961490086c7f2558f4988bf2281e0beb86c1b83974e73d8fe8008f7180df9a5f701c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010000692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000000000
|
||||
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_swap_strategy_encoder_unwrap:30ace1b10000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000418ac985c46abfb5e71b61f03daf3957368d502c496ef6bd9b7ad251873a4b2c4523ae598a58beaa80b59ea309fdff7bd7061ce7b5e5e9111f20898084eab652b51b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000000000000000000000000000000
|
||||
test_single_swap_strategy_encoder_wrap:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004160b72e55241549f19ecbfbd94d86f6f46be1109398789d38684d43b5b4e25fdb4f7abb9a82a947f5eab7af922edfd6a03040eb01cde767acc857933d88b43b051b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
||||
test_split_output_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004112d6160e05665d7167aa64c0d3ee9edcde7c9e88308df3ab3d1020864d6859ab37020135bd3185b4ec921771ae0941154ee8db4090956bf660901d797d1f025b1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950100006e01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f56400001006e01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000
|
||||
test_split_input_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004112d6160e05665d7167aa64c0d3ee9edcde7c9e88308df3ab3d1020864d6859ab37020135bd3185b4ec921771ae0941154ee8db4090956bf660901d797d1f025b1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139006e00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f56400100006e00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d80100005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000100000000000000
|
||||
test_split_swap_strategy_encoder:7c5538460000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c9000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041697fe1c9b400b96a07137c2e055dd542e7223e23d3b149fb25883f60d7ad9f070310150e12e4e4480f9b9631efaa277878fe184d90ff88a61dff697f019872c11c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950000005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950000005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20101005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010100000000000000000000000000000000000000000000000000000000
|
||||
test_single_swap_strategy_encoder_unwrap:30ace1b10000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be00000000000000000000000000000000000000000000000000000000000006868556a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7200000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041b15c0c31fda44941e9a38589ae43097d230c40a738e262d4b3fc8ef99396ea631c86fd8e324dea1a2cb98d343bb92ed97979157afd19a28cbf5d4e9a5e246adf1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000000000000000000000000000000
|
||||
test_single_swap_strategy_encoder_wrap:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7300000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004194868f832eef98933482d46252999d9aeb02c8ae3e605b653bd14704eccc7398227b5431ccd0f0512fef7ecd42aaea7abd2bd9d573d14f54fbeaa2bc581b08cd1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
||||
test_split_output_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006868556b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7300000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004146c2b6eebaec39b2b00153a0c9bad5900aaf59380b12c87b77c7d73a5471ce757608b61dbca3f17edc81484243970f516000decb32c00d3039af0600fa170d481c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950100006e01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f56400001006e01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000
|
||||
test_split_input_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006868556b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7300000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004146c2b6eebaec39b2b00153a0c9bad5900aaf59380b12c87b77c7d73a5471ce757608b61dbca3f17edc81484243970f516000decb32c00d3039af0600fa170d481c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139006e00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f56400100006e00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d80100005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000100000000000000
|
||||
test_split_swap_strategy_encoder:7c5538460000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006868556c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf74000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041181c44146d51b656f6c0c2c790b23ed7c6a0369f51fcf7ad926b2721633eb01b3e724bdb02bb4093e9f2833d3a891d605e9e644ea44b3a8008aa5a53dec5dab91c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950000005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950000005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20101005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010100000000000000000000000000000000000000000000000000000000
|
||||
test_uniswap_v3_curve:e21dd0d30000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae460301000102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000
|
||||
test_multi_protocol:51bcc7b600000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000000000000000000000000000000000000068683fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840b9c900000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000412643d4c29d518ccf5c9aad4e4524079280d0b72ee61773d19d9b5fc4a32f557d3a3eb3f24a0ace0da150e12be87ffad121995e9bf37c019cea8e4c953d3ab4b61c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021400525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d01395010200691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001023ede3eca2a72b3aecc820e955b36f38437d013950071a0cb889707d426a7a386870a03bc70d1b0697598013ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000
|
||||
test_multi_protocol:51bcc7b600000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf00000000000000000000000000000000000000000000000000000000000006868556900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006840cf7100000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000418fd6660ac08c4730aa9063bc6676f24d42abd36e6dbe52e24d3a3b56dfb8921246a2d356bf07df18e9a204cc1729a90dcab526b02a099079338584d447e2a4391b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021400525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d01395010200691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001023ede3eca2a72b3aecc820e955b36f38437d013950071a0cb889707d426a7a386870a03bc70d1b0697598013ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000
|
||||
test_encode_balancer_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2ba100000625a3754423978a60c9317c58a424e3d5c6ee304399dbdb9c8ef030ab642b10820db8f560002000000000000000000141d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0102
|
||||
test_ekubo_encode_swap_multi:01ca4f73fe97d0b987a0d12b39bbd562c779bab6f60000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000001a36e2eb1c43200000032
|
||||
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_encode_maverick_v2:40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e01
|
||||
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 {
|
||||
constructor(
|
||||
address _bebopSettlement,
|
||||
address _permit2
|
||||
) BebopExecutor(_bebopSettlement, _permit2) {}
|
||||
constructor(address _bebopSettlement, address _permit2)
|
||||
BebopExecutor(_bebopSettlement, _permit2)
|
||||
{}
|
||||
|
||||
function decodeParams(bytes calldata data)
|
||||
external
|
||||
@@ -96,6 +95,144 @@ contract MockBebopSettlement is Test, Constants {
|
||||
|
||||
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 {
|
||||
@@ -125,8 +262,7 @@ contract BebopExecutorTest is Constants, Permit2TestHelper, TestUtils {
|
||||
|
||||
// Deploy Bebop executor
|
||||
bebopExecutor = new BebopExecutorExposed(
|
||||
address(mockBebopSettlement),
|
||||
PERMIT2_ADDRESS
|
||||
address(mockBebopSettlement), PERMIT2_ADDRESS
|
||||
);
|
||||
|
||||
// Fund test accounts
|
||||
@@ -391,7 +527,7 @@ contract BebopExecutorTest is Constants, Permit2TestHelper, TestUtils {
|
||||
|
||||
// Add extra bytes at the end, this should fail
|
||||
bytes memory invalidParams = abi.encodePacked(validParams, hex"ff");
|
||||
|
||||
|
||||
vm.expectRevert(BebopExecutor.BebopExecutor__InvalidDataLength.selector);
|
||||
bebopExecutor.decodeParams(invalidParams);
|
||||
|
||||
@@ -400,10 +536,160 @@ contract BebopExecutorTest is Constants, Permit2TestHelper, TestUtils {
|
||||
WETH_ADDR,
|
||||
USDC_ADDR,
|
||||
uint8(RestrictTransferFrom.TransferType.Transfer)
|
||||
// Missing rest of the data
|
||||
);
|
||||
|
||||
// Missing rest of the data
|
||||
|
||||
vm.expectRevert(BebopExecutor.BebopExecutor__InvalidDataLength.selector);
|
||||
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;
|
||||
|
||||
#[test]
|
||||
fn test_encode_bebop_rfq() {
|
||||
fn test_encode_bebop_single() {
|
||||
use alloy::hex;
|
||||
|
||||
// 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