feat: Support new transfer logic in encoding
The transfer from the user into the router is supposed to happen in the router (we only support this in the executors for callback constrained protocols). This is necessary because of some security concerns that were found in the audit. This way we reduce the space of attack. - Refactored TransferOptimization not to handle TransferTypes anymore but just return bools. - Split get_transfer_type into get_transfers and get_in_between_transfer. Updates tests - Updated the strategies to use this - Updated function signatures to pass transfer_from and funds_receiver - Updated SwapEncoders to handle this - SplitSwapStrategy just assumes all tokens are sent to and from the router at all times Took 2 hours 46 minutes
This commit is contained in:
@@ -1,28 +1,28 @@
|
|||||||
test_uniswap_v3_uniswap_v2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000bf00692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb8004375dff511095cc5a197a54140a24efef3a416cbcdf9626bc03e24f779434178a73a0b4bad62ed000100525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010500
|
test_uniswap_v3_uniswap_v2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c0006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb8004375dff511095cc5a197a54140a24efef3a416cbcdf9626bc03e24f779434178a73a0b4bad62ed00010000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100
|
||||||
test_single_encoding_strategy_ekubo:20144a070000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000071a0cb889707d426a7a386870a03bc70d1b069759805cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000000000000000000000000000000000
|
test_single_encoding_strategy_ekubo:20144a070000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000072a0cb889707d426a7a386870a03bc70d1b06975980000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c0000000000000000000000000000000000000000000000000000
|
||||||
test_uniswap_v3_uniswap_v3:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000100692e234dae75c793f67a35089c9d99245e1c58470b2260fac5e5542a773aa44fbcfedf7c193bc2c599a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc299ac8ca7087fa4a2a1fb6357269965a2014abc35010000000000000000000000
|
test_uniswap_v3_uniswap_v3:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000d8006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000100006a2e234dae75c793f67a35089c9d99245e1c58470b2260fac5e5542a773aa44fbcfedf7c193bc2c599a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc299ac8ca7087fa4a2a1fb6357269965a2014abc350100010000000000000000
|
||||||
test_balancer_v2_uniswap_v2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c80072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e004375dff511095cc5a197a54140a24efef3a416010300525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20105000000000000000000000000000000000000000000000000
|
test_balancer_v2_uniswap_v2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c80072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e004375dff511095cc5a197a54140a24efef3a416010000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100000000000000000000000000000000000000000000000000
|
||||||
test_sequential_swap_strategy_encoder_no_permit2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000100525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20105000000000000000000000000000000000000000000000000
|
test_sequential_swap_strategy_encoder_no_permit2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100000000000000000000000000000000000000000000000000
|
||||||
test_single_encoding_strategy_usv4_grouped_swap:30ace1b1000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000068402a3900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a44100000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000419facefe3089c4d8177dc12ace73e275369649112be2bead25fcd035707a50de67aed574499636214e89fd88bf2907096140c552cecf3a93305d37b8e922166e61c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d23119330002cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000000000000000
|
test_single_encoding_strategy_usv4_grouped_swap:30ace1b1000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000004112ff786cc8a8d24dfe6871e6c581f898b84a73bf68e93825d00425d0e90a03da63d709c708de1e54427deac6eb71c6602528be1a0768868f453446afc04f00d01c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d2311933000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f400000000000000000000000000000000000000000000000000
|
||||||
test_single_encoding_strategy_usv4_eth_out:7c55384600000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a368000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041488f1442a33f67d75f1c0ecf8c4787e26e497d41a006914d5dbccb7cdd4022256dc21c65ea07eba53897ebafe6e7186737b0aca604ca0425875429254ce3858c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300710001000000f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000002cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c00000000000000000000000000
|
test_single_encoding_strategy_usv4_eth_out:7c55384600000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e0000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f90000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000418f3422d7328230aea76c4de1731793a8bd744961c9796297abefd7fe5e22820a73117fb461de9eee74d1644876084f0b1683d4916851df285fba8ae8f48cf6671c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007400720001000000f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000
|
||||||
test_sequential_swap_strategy_encoder:51bcc7b60000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000410d2f0434c42a97db27f008ae4e52187ed01dc74853b13698650aef603f1ea6e8722bb06280aab52379efd2c4945019497abc7c87583f8c6e4f38a081677c0bb61b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000200525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20105000000000000000000000000000000000000000000000000
|
test_sequential_swap_strategy_encoder:51bcc7b60000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000004110339de0a348f6dc0822b93a4b3764aabd9a7fdd3b248c3baae2a341158a1ff138941375145748d7a6f194808e5a68299882ef00b89bddb95f3d9215fe5db39f1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100000000000000000000000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_no_permit2:20144a070000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
test_single_swap_strategy_encoder_no_permit2:20144a070000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_no_transfer_in:20144a070000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
test_single_swap_strategy_encoder_no_transfer_in:20144a070000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
||||||
test_single_encoding_strategy_usv4_eth_in:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a8f9b660b644e089fade56f08c23e15ac3cc99137345ef8ce0c06bfeb2d0c36f1d32cfe9e03cb6527aae9d525dd5a47e07c8c712dd98bf964a95f3cca0811f8d1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330105cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000
|
test_single_encoding_strategy_usv4_eth_in:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000004159eb2cc8eae51e324934272b75187fb7973da58e1fbb52fd1d7c5871995177e26dfd6f50a879b9e3c71295bc2e3ceba72e3293e1382b8057b6690f652c3d6e0a1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006df62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933010000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f400000000000000000000000000000000000000
|
||||||
test_sequential_strategy_cyclic_swap:51bcc7b60000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004187214fb9e717d84472b7ef79ec8c0c29a806a5ff6e6267dbebb06f9482d0e7be2247d4d2bcb423c91a47819b6130d7b1d436a344e6a1d0751778ffee57c8bff71c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010200692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000000000
|
test_sequential_strategy_cyclic_swap:51bcc7b60000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041220e558f9cb5c8b8e33d592acf1526fe2a56feceb2fc437fff2c443ecc27febc2bae93737bf02a9f65cafa3bc465d6bf96753549be5d1411aa8174f9bf85c1141c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8006a2e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010100006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d80000010000000000000000
|
||||||
test_single_encoding_strategy_curve_st_eth:20144a070000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff211eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeae7ab96520de3a18e5e111b5eaab095312d7fe84dc24316b9ae028f1497c275eb9192a3ea0f670220100010005cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
test_single_encoding_strategy_curve_st_eth:20144a070000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff211eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeae7ab96520de3a18e5e111b5eaab095312d7fe84dc24316b9ae028f1497c275eb9192a3ea0f670220100010000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000006b56051582a970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000410d2f0434c42a97db27f008ae4e52187ed01dc74853b13698650aef603f1ea6e8722bb06280aab52379efd2c4945019497abc7c87583f8c6e4f38a081677c0bb61b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200020000000000000000000000000000
|
test_single_swap_strategy_encoder:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000006b56051582a970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000004110339de0a348f6dc0822b93a4b3764aabd9a7fdd3b248c3baae2a341158a1ff138941375145748d7a6f194808e5a68299882ef00b89bddb95f3d9215fe5db39f1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
||||||
test_single_encoding_strategy_curve:20144a070000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff21155c08ca52497e2f1534b59e2917bf524d4765257c02aaa39b223fe8d0a0e5c4f27ead9083c756cc277146b0a1d08b6844376df6d9da99ba7f1b19e710201000103cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
test_single_encoding_strategy_curve:20144a070000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff21155c08ca52497e2f1534b59e2917bf524d4765257c02aaa39b223fe8d0a0e5c4f27ead9083c756cc277146b0a1d08b6844376df6d9da99ba7f1b19e710201000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_unwrap:30ace1b10000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be00000000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a375087487c7481609a5e3ac4d7a493cc4749f4c16f23a17ca3cdbad6d816bd860f88a7bc4e1dff2cfa23bf80a82d65910fd0dfb660f9aea22c69795b8c04acb1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501020000000000000000000000000000
|
test_single_swap_strategy_encoder_unwrap:30ace1b10000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb110000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be0000000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041ff461fe60fbd9ac8baec2452c4a242f4e4258cb54aa5df5a3cfa4c889be2897628c42ab59513d9aa4d491e22196979e3c1bd4637944f898decee9ae8596586bc1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000000000000000000000000000000
|
||||||
test_single_swap_strategy_encoder_wrap:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a8f9b660b644e089fade56f08c23e15ac3cc99137345ef8ce0c06bfeb2d0c36f1d32cfe9e03cb6527aae9d525dd5a47e07c8c712dd98bf964a95f3cca0811f8d1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
test_single_swap_strategy_encoder_wrap:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684c57f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1f9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000004159eb2cc8eae51e324934272b75187fb7973da58e1fbb52fd1d7c5871995177e26dfd6f50a879b9e3c71295bc2e3ceba72e3293e1382b8057b6690f652c3d6e0a1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
|
||||||
test_split_output_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004187214fb9e717d84472b7ef79ec8c0c29a806a5ff6e6267dbebb06f9482d0e7be2247d4d2bcb423c91a47819b6130d7b1d436a344e6a1d0751778ffee57c8bff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950102006e01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f56400000006e01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000000000000000000
|
test_split_output_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684c57f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1fa0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000418a77e8497940ec9340946d582c7c1fc77ec54d7f2d6b682f2a86694a7836ff553c72e31bd305d158cf97fccf29391b0f7a92ff3dffc3279d09f7a4e4a27314921b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950101006f01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f5640000001006f01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d80000010000000000
|
||||||
test_split_input_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36800000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004187214fb9e717d84472b7ef79ec8c0c29a806a5ff6e6267dbebb06f9482d0e7be2247d4d2bcb423c91a47819b6130d7b1d436a344e6a1d0751778ffee57c8bff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139006e00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f56400102006e00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d80102005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000
|
test_split_input_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684c57f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1fa0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000418a77e8497940ec9340946d582c7c1fc77ec54d7f2d6b682f2a86694a7836ff553c72e31bd305d158cf97fccf29391b0f7a92ff3dffc3279d09f7a4e4a27314921b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b006f00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010001006f00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d8010001005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000
|
||||||
test_split_swap_strategy_encoder:7c5538460000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000006840296000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a3680000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000410d2f0434c42a97db27f008ae4e52187ed01dc74853b13698650aef603f1ea6e8722bb06280aab52379efd2c4945019497abc7c87583f8c6e4f38a081677c0bb61b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950002005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950002005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010000000000000000000000000000000000000000000000000000000000
|
test_split_swap_strategy_encoder:7c5538460000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684c57f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1fa0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000411127f13839fe5565558bcbdbd7900f23e1374c99164598d4653eefb4ef66f7e85bd3112c15b9e6f3035119daee4c8b8a1220da90a594ed5eb8613892f8a0171e1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950001005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950001005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20101005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010100000000000000000000000000000000000000000000000000000000
|
||||||
test_uniswap_v3_curve:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000100691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae460301000105cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000
|
test_uniswap_v3_curve:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000d7006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed00010000691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae460301000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000
|
||||||
test_multi_protocol:51bcc7b600000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf00000000000000000000000000000000000000000000000000000000000006840296100000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006818a36900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041d129cab2cc52c54ea03cb937f9bb6ab52b6dbd445f917125e8c582e6685174d86135080d059adf0c0eec2e685a8e9801a263cc21097c9b68887db853ca9a7c651c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021400525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501020072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d01395010500691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001053ede3eca2a72b3aecc820e955b36f38437d013950071a0cb889707d426a7a386870a03bc70d1b0697598003ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000
|
test_multi_protocol:51bcc7b600000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb110000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf0000000000000000000000000000000000000000000000000000000000000684c57f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006824d1fa000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000419731903580c1d9c9909aad47a91667359491e74c0e41a5aecfd40ff760a61a422d6694e613889897ab59341ea22116436db9f8267450b8af94e463d5402e700c1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021600525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d01395010000691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001003ede3eca2a72b3aecc820e955b36f38437d013950072a0cb889707d426a7a386870a03bc70d1b069759800013ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006df62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c00000000000000000000
|
||||||
test_encode_balancer_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2ba100000625a3754423978a60c9317c58a424e3d5c6ee304399dbdb9c8ef030ab642b10820db8f560002000000000000000000141d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0105
|
test_encode_balancer_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2ba100000625a3754423978a60c9317c58a424e3d5c6ee304399dbdb9c8ef030ab642b10820db8f560002000000000000000000141d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0100
|
||||||
test_ekubo_encode_swap_multi:00ca4f73fe97d0b987a0d12b39bbd562c779bab6f60000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000001a36e2eb1c43200000032
|
test_ekubo_encode_swap_multi:0001ca4f73fe97d0b987a0d12b39bbd562c779bab6f60000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000001a36e2eb1c43200000032
|
||||||
test_encode_uniswap_v4_sequential_swap:4c9edd5852cd905f086c759e8383e09bff1e68b32260fac5e5542a773aa44fbcfedf7c193bc2c5990100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec70000640000012260fac5e5542a773aa44fbcfedf7c193bc2c599000bb800003c
|
test_encode_uniswap_v4_sequential_swap:4c9edd5852cd905f086c759e8383e09bff1e68b32260fac5e5542a773aa44fbcfedf7c193bc2c599010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec70000640000012260fac5e5542a773aa44fbcfedf7c193bc2c599000bb800003c
|
||||||
test_encode_uniswap_v4_simple_swap:4c9edd5852cd905f086c759e8383e09bff1e68b3dac17f958d2ee523a2206206994597c13d831ec70100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec7000064000001
|
test_encode_uniswap_v4_simple_swap:4c9edd5852cd905f086c759e8383e09bff1e68b3dac17f958d2ee523a2206206994597c13d831ec7010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec7000064000001
|
||||||
test_single_encoding_strategy_maverick:20144a070000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000040d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000051a4ad4f68d0b91cfd19687c881e50f3a00242828c40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c67cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc201000000000000000000000000000000
|
test_single_encoding_strategy_maverick:20144a070000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000040d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000014cf6d2fe3e1b326114b07d22a6f6bb59e346c6700000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000051a4ad4f68d0b91cfd19687c881e50f3a00242828c40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c67cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
|
||||||
test_encode_maverick_v2:40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e00
|
test_encode_maverick_v2:40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e01
|
||||||
|
|||||||
@@ -34,11 +34,12 @@ pub static IN_TRANSFER_REQUIRED_PROTOCOLS: LazyLock<HashSet<&'static str>> = Laz
|
|||||||
set
|
set
|
||||||
});
|
});
|
||||||
|
|
||||||
// The protocols here are a subset of the ones defined in IN_TRANSFER_REQUIRED_PROTOCOLS. The tokens
|
// The protocols here are a subset of the ones defined in IN_TRANSFER_REQUIRED_PROTOCOLS. The in
|
||||||
// can not be sent directly from the previous pool into a pool of this protocol. The tokens need to
|
// transfer needs to be performed inside the callback logic. This means, the tokens can not be sent
|
||||||
// be sent to the router and only then transferred into the pool. This is the case for uniswap v3
|
// directly from the previous pool into a pool of this protocol. The tokens need to be sent to the
|
||||||
// because of the callback logic. The only way for this to work it would be to call the second swap
|
// router and only then transferred into the pool. This is the case for uniswap v3 because of the
|
||||||
// during the callback of the first swap. This is currently not supported.
|
// callback logic. The only way for this to work it would be to call the second swap during the
|
||||||
|
// callback of the first swap. This is currently not supported.
|
||||||
pub static CALLBACK_CONSTRAINED_PROTOCOLS: LazyLock<HashSet<&'static str>> = LazyLock::new(|| {
|
pub static CALLBACK_CONSTRAINED_PROTOCOLS: LazyLock<HashSet<&'static str>> = LazyLock::new(|| {
|
||||||
let mut set = HashSet::new();
|
let mut set = HashSet::new();
|
||||||
set.insert("uniswap_v3");
|
set.insert("uniswap_v3");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::{collections::HashSet, str::FromStr};
|
use std::{collections::HashSet, str::FromStr};
|
||||||
|
|
||||||
use alloy_primitives::{aliases::U24, U256, U8};
|
use alloy_primitives::{aliases::U24, Address, U256, U8};
|
||||||
use alloy_sol_types::SolValue;
|
use alloy_sol_types::SolValue;
|
||||||
use tycho_common::Bytes;
|
use tycho_common::Bytes;
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@ use crate::encoding::{
|
|||||||
errors::EncodingError,
|
errors::EncodingError,
|
||||||
evm::{
|
evm::{
|
||||||
approvals::permit2::Permit2,
|
approvals::permit2::Permit2,
|
||||||
|
constants::CALLBACK_CONSTRAINED_PROTOCOLS,
|
||||||
group_swaps::group_swaps,
|
group_swaps::group_swaps,
|
||||||
strategy_encoder::{
|
strategy_encoder::{
|
||||||
strategy_validators::{SequentialSwapValidator, SplitSwapValidator, SwapValidator},
|
strategy_validators::{SequentialSwapValidator, SplitSwapValidator, SwapValidator},
|
||||||
@@ -58,7 +59,6 @@ impl SingleSwapStrategyEncoder {
|
|||||||
"singleSwap(uint256,address,address,uint256,bool,bool,address,bytes)".to_string(),
|
"singleSwap(uint256,address,address,uint256,bool,bool,address,bytes)".to_string(),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
let permit2_is_active = permit2.is_some();
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
permit2,
|
permit2,
|
||||||
selector,
|
selector,
|
||||||
@@ -67,7 +67,6 @@ impl SingleSwapStrategyEncoder {
|
|||||||
transfer_optimization: TransferOptimization::new(
|
transfer_optimization: TransferOptimization::new(
|
||||||
chain.native_token()?,
|
chain.native_token()?,
|
||||||
chain.wrapped_token()?,
|
chain.wrapped_token()?,
|
||||||
permit2_is_active,
|
|
||||||
token_in_already_in_router,
|
token_in_already_in_router,
|
||||||
router_address,
|
router_address,
|
||||||
),
|
),
|
||||||
@@ -125,16 +124,17 @@ impl StrategyEncoder for SingleSwapStrategyEncoder {
|
|||||||
let swap_receiver =
|
let swap_receiver =
|
||||||
if !unwrap { solution.receiver.clone() } else { self.router_address.clone() };
|
if !unwrap { solution.receiver.clone() } else { self.router_address.clone() };
|
||||||
|
|
||||||
let transfer_type = self
|
let (mut transfer_from, mut funds_receiver, transfer) = self
|
||||||
.transfer_optimization
|
.transfer_optimization
|
||||||
.get_transfer_type(grouped_swap.clone(), solution.given_token.clone(), wrap, false);
|
.get_transfers(grouped_swap.clone(), wrap);
|
||||||
let encoding_context = EncodingContext {
|
let encoding_context = EncodingContext {
|
||||||
receiver: swap_receiver.clone(),
|
receiver: swap_receiver.clone(),
|
||||||
exact_out: solution.exact_out,
|
exact_out: solution.exact_out,
|
||||||
router_address: Some(self.router_address.clone()),
|
router_address: Some(self.router_address.clone()),
|
||||||
group_token_in: grouped_swap.token_in.clone(),
|
group_token_in: grouped_swap.token_in.clone(),
|
||||||
group_token_out: grouped_swap.token_out.clone(),
|
group_token_out: grouped_swap.token_out.clone(),
|
||||||
transfer_type: transfer_type.clone(),
|
transfer_from,
|
||||||
|
transfer,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut grouped_protocol_data: Vec<u8> = vec![];
|
let mut grouped_protocol_data: Vec<u8> = vec![];
|
||||||
@@ -148,7 +148,19 @@ impl StrategyEncoder for SingleSwapStrategyEncoder {
|
|||||||
.map_err(|_| EncodingError::FatalError("Invalid executor address".to_string()))?,
|
.map_err(|_| EncodingError::FatalError("Invalid executor address".to_string()))?,
|
||||||
grouped_protocol_data,
|
grouped_protocol_data,
|
||||||
);
|
);
|
||||||
|
if CALLBACK_CONSTRAINED_PROTOCOLS.contains(
|
||||||
|
&grouped_swaps[0]
|
||||||
|
.protocol_system
|
||||||
|
.as_str(),
|
||||||
|
) {
|
||||||
|
// The first swap is from a callback constrained protocol. This means that the in
|
||||||
|
// transfer needs to happen at callback time and not before.
|
||||||
|
transfer_from = false;
|
||||||
|
funds_receiver = Address::ZERO.to_string();
|
||||||
|
}
|
||||||
|
let funds_receiver = Address::from_str(&funds_receiver).map_err(|_| {
|
||||||
|
EncodingError::FatalError(format!("Invalid funds receiver address: {funds_receiver}"))
|
||||||
|
})?;
|
||||||
let method_calldata = if let Some(permit2) = self.permit2.clone() {
|
let method_calldata = if let Some(permit2) = self.permit2.clone() {
|
||||||
let (permit, signature) = permit2.get_permit(
|
let (permit, signature) = permit2.get_permit(
|
||||||
&self.router_address,
|
&self.router_address,
|
||||||
@@ -164,6 +176,8 @@ impl StrategyEncoder for SingleSwapStrategyEncoder {
|
|||||||
wrap,
|
wrap,
|
||||||
unwrap,
|
unwrap,
|
||||||
bytes_to_address(&solution.receiver)?,
|
bytes_to_address(&solution.receiver)?,
|
||||||
|
transfer_from,
|
||||||
|
funds_receiver,
|
||||||
permit,
|
permit,
|
||||||
signature.as_bytes().to_vec(),
|
signature.as_bytes().to_vec(),
|
||||||
swap_data,
|
swap_data,
|
||||||
@@ -178,6 +192,8 @@ impl StrategyEncoder for SingleSwapStrategyEncoder {
|
|||||||
wrap,
|
wrap,
|
||||||
unwrap,
|
unwrap,
|
||||||
bytes_to_address(&solution.receiver)?,
|
bytes_to_address(&solution.receiver)?,
|
||||||
|
transfer_from,
|
||||||
|
funds_receiver,
|
||||||
swap_data,
|
swap_data,
|
||||||
)
|
)
|
||||||
.abi_encode()
|
.abi_encode()
|
||||||
@@ -239,7 +255,6 @@ impl SequentialSwapStrategyEncoder {
|
|||||||
.to_string(),
|
.to_string(),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
let permit2_is_active = permit2.is_some();
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
permit2,
|
permit2,
|
||||||
selector,
|
selector,
|
||||||
@@ -251,7 +266,6 @@ impl SequentialSwapStrategyEncoder {
|
|||||||
transfer_optimization: TransferOptimization::new(
|
transfer_optimization: TransferOptimization::new(
|
||||||
chain.native_token()?,
|
chain.native_token()?,
|
||||||
chain.wrapped_token()?,
|
chain.wrapped_token()?,
|
||||||
permit2_is_active,
|
|
||||||
token_in_already_in_router,
|
token_in_already_in_router,
|
||||||
router_address,
|
router_address,
|
||||||
),
|
),
|
||||||
@@ -292,6 +306,9 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
|
|||||||
NativeAction::Unwrap => unwrap = true,
|
NativeAction::Unwrap => unwrap = true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let (mut transfer_from, mut funds_receiver, transfer) = self
|
||||||
|
.transfer_optimization
|
||||||
|
.get_transfers(grouped_swaps[0].clone(), wrap);
|
||||||
|
|
||||||
let mut swaps = vec![];
|
let mut swaps = vec![];
|
||||||
let mut next_in_between_swap_optimization_allowed = true;
|
let mut next_in_between_swap_optimization_allowed = true;
|
||||||
@@ -311,21 +328,21 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
|
|||||||
.transfer_optimization
|
.transfer_optimization
|
||||||
.get_receiver(solution.receiver.clone(), next_swap)?;
|
.get_receiver(solution.receiver.clone(), next_swap)?;
|
||||||
next_in_between_swap_optimization_allowed = next_swap_optimization;
|
next_in_between_swap_optimization_allowed = next_swap_optimization;
|
||||||
let transfer_type = self
|
|
||||||
.transfer_optimization
|
let in_between_transfer = if i == 0 {
|
||||||
.get_transfer_type(
|
transfer
|
||||||
grouped_swap.clone(),
|
} else {
|
||||||
solution.given_token.clone(),
|
self.transfer_optimization
|
||||||
wrap,
|
.get_in_between_transfer(&protocol, in_between_swap_optimization_allowed)
|
||||||
in_between_swap_optimization_allowed,
|
};
|
||||||
);
|
|
||||||
let encoding_context = EncodingContext {
|
let encoding_context = EncodingContext {
|
||||||
receiver: swap_receiver.clone(),
|
receiver: swap_receiver.clone(),
|
||||||
exact_out: solution.exact_out,
|
exact_out: solution.exact_out,
|
||||||
router_address: Some(self.router_address.clone()),
|
router_address: Some(self.router_address.clone()),
|
||||||
group_token_in: grouped_swap.token_in.clone(),
|
group_token_in: grouped_swap.token_in.clone(),
|
||||||
group_token_out: grouped_swap.token_out.clone(),
|
group_token_out: grouped_swap.token_out.clone(),
|
||||||
transfer_type: transfer_type.clone(),
|
transfer_from: if i == 0 { transfer_from } else { false },
|
||||||
|
transfer: in_between_transfer,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut grouped_protocol_data: Vec<u8> = vec![];
|
let mut grouped_protocol_data: Vec<u8> = vec![];
|
||||||
@@ -344,6 +361,19 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
|
|||||||
swaps.push(swap_data);
|
swaps.push(swap_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if CALLBACK_CONSTRAINED_PROTOCOLS.contains(
|
||||||
|
&grouped_swaps[0]
|
||||||
|
.protocol_system
|
||||||
|
.as_str(),
|
||||||
|
) {
|
||||||
|
// The first swap is from a callback constrained protocol. This means that the in
|
||||||
|
// transfer needs to happen at callback time and not before.
|
||||||
|
transfer_from = false;
|
||||||
|
funds_receiver = Address::ZERO.to_string();
|
||||||
|
}
|
||||||
|
let funds_receiver = Address::from_str(&funds_receiver).map_err(|_| {
|
||||||
|
EncodingError::FatalError(format!("Invalid funds receiver address: {funds_receiver}"))
|
||||||
|
})?;
|
||||||
let encoded_swaps = ple_encode(swaps);
|
let encoded_swaps = ple_encode(swaps);
|
||||||
let method_calldata = if let Some(permit2) = self.permit2.clone() {
|
let method_calldata = if let Some(permit2) = self.permit2.clone() {
|
||||||
let (permit, signature) = permit2.get_permit(
|
let (permit, signature) = permit2.get_permit(
|
||||||
@@ -360,6 +390,8 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
|
|||||||
wrap,
|
wrap,
|
||||||
unwrap,
|
unwrap,
|
||||||
bytes_to_address(&solution.receiver)?,
|
bytes_to_address(&solution.receiver)?,
|
||||||
|
transfer_from,
|
||||||
|
funds_receiver,
|
||||||
permit,
|
permit,
|
||||||
signature.as_bytes().to_vec(),
|
signature.as_bytes().to_vec(),
|
||||||
encoded_swaps,
|
encoded_swaps,
|
||||||
@@ -374,6 +406,8 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
|
|||||||
wrap,
|
wrap,
|
||||||
unwrap,
|
unwrap,
|
||||||
bytes_to_address(&solution.receiver)?,
|
bytes_to_address(&solution.receiver)?,
|
||||||
|
transfer_from,
|
||||||
|
funds_receiver,
|
||||||
encoded_swaps,
|
encoded_swaps,
|
||||||
)
|
)
|
||||||
.abi_encode()
|
.abi_encode()
|
||||||
@@ -435,7 +469,6 @@ impl SplitSwapStrategyEncoder {
|
|||||||
.to_string(),
|
.to_string(),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
let permit2_is_active = permit2.is_some();
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
permit2,
|
permit2,
|
||||||
selector,
|
selector,
|
||||||
@@ -447,7 +480,6 @@ impl SplitSwapStrategyEncoder {
|
|||||||
transfer_optimization: TransferOptimization::new(
|
transfer_optimization: TransferOptimization::new(
|
||||||
chain.native_token()?,
|
chain.native_token()?,
|
||||||
chain.wrapped_token()?,
|
chain.wrapped_token()?,
|
||||||
permit2_is_active,
|
|
||||||
token_in_already_in_router,
|
token_in_already_in_router,
|
||||||
router_address,
|
router_address,
|
||||||
),
|
),
|
||||||
@@ -553,16 +585,17 @@ impl StrategyEncoder for SplitSwapStrategyEncoder {
|
|||||||
} else {
|
} else {
|
||||||
self.router_address.clone()
|
self.router_address.clone()
|
||||||
};
|
};
|
||||||
let transfer_type = self
|
let transfer = self
|
||||||
.transfer_optimization
|
.transfer_optimization
|
||||||
.get_transfer_type(grouped_swap.clone(), solution.given_token.clone(), wrap, false);
|
.get_in_between_transfer(&protocol, false);
|
||||||
let encoding_context = EncodingContext {
|
let encoding_context = EncodingContext {
|
||||||
receiver: swap_receiver.clone(),
|
receiver: swap_receiver.clone(),
|
||||||
exact_out: solution.exact_out,
|
exact_out: solution.exact_out,
|
||||||
router_address: Some(self.router_address.clone()),
|
router_address: Some(self.router_address.clone()),
|
||||||
group_token_in: grouped_swap.token_in.clone(),
|
group_token_in: grouped_swap.token_in.clone(),
|
||||||
group_token_out: grouped_swap.token_out.clone(),
|
group_token_out: grouped_swap.token_out.clone(),
|
||||||
transfer_type: transfer_type.clone(),
|
transfer_from: false,
|
||||||
|
transfer,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut grouped_protocol_data: Vec<u8> = vec![];
|
let mut grouped_protocol_data: Vec<u8> = vec![];
|
||||||
@@ -757,6 +790,8 @@ mod tests {
|
|||||||
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
||||||
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001", // transfer from
|
||||||
|
"000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11", // funds receiver
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
@@ -772,13 +807,13 @@ mod tests {
|
|||||||
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
|
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"02", // transfer type
|
"00", // transfer false
|
||||||
"0000000000000000000000000000", // padding
|
"0000000000000000000000000000", // padding
|
||||||
));
|
));
|
||||||
let hex_calldata = encode(&calldata);
|
let hex_calldata = encode(&calldata);
|
||||||
|
|
||||||
assert_eq!(hex_calldata[..456], expected_input);
|
assert_eq!(hex_calldata[..584], expected_input);
|
||||||
assert_eq!(hex_calldata[1224..], expected_swap);
|
assert_eq!(hex_calldata[1352..], expected_swap);
|
||||||
if expected_amount.is_some() & slippage.is_some() & checked_amount.is_none() {
|
if expected_amount.is_some() & slippage.is_some() & checked_amount.is_none() {
|
||||||
// only write to file for 1 test case
|
// only write to file for 1 test case
|
||||||
write_calldata_to_file(
|
write_calldata_to_file(
|
||||||
@@ -847,7 +882,9 @@ mod tests {
|
|||||||
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
||||||
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"0000000000000000000000000000000000000000000000000000000000000100", // offset of swap bytes
|
"0000000000000000000000000000000000000000000000000000000000000001", // transfer from
|
||||||
|
"000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11", // funds receiver
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000140", // offset of swap bytes
|
||||||
"0000000000000000000000000000000000000000000000000000000000000052", // length of swap bytes without padding
|
"0000000000000000000000000000000000000000000000000000000000000052", // length of swap bytes without padding
|
||||||
|
|
||||||
// Swap data
|
// Swap data
|
||||||
@@ -856,7 +893,7 @@ mod tests {
|
|||||||
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
|
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"01", // transfer type
|
"00", // transfer false
|
||||||
"0000000000000000000000000000", // padding
|
"0000000000000000000000000000", // padding
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
@@ -929,7 +966,9 @@ mod tests {
|
|||||||
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
||||||
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"0000000000000000000000000000000000000000000000000000000000000100", // offset of swap bytes
|
"0000000000000000000000000000000000000000000000000000000000000000", // transfer from
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", // funds receiver
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000140", // offset of swap bytes
|
||||||
"0000000000000000000000000000000000000000000000000000000000000052", // length of swap bytes without padding
|
"0000000000000000000000000000000000000000000000000000000000000052", // length of swap bytes without padding
|
||||||
|
|
||||||
// Swap data
|
// Swap data
|
||||||
@@ -938,7 +977,7 @@ mod tests {
|
|||||||
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
|
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"00", // transfer type
|
"01", // transfer true
|
||||||
"0000000000000000000000000000", // padding
|
"0000000000000000000000000000", // padding
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
@@ -1199,7 +1238,9 @@ mod tests {
|
|||||||
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
||||||
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"0000000000000000000000000000000000000000000000000000000000000100", /* length ple
|
"0000000000000000000000000000000000000000000000000000000000000001", /* transfer from */
|
||||||
|
"000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940", /* funds receiver */
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000140", /* length ple
|
||||||
* encode */
|
* encode */
|
||||||
"00000000000000000000000000000000000000000000000000000000000000a8",
|
"00000000000000000000000000000000000000000000000000000000000000a8",
|
||||||
// swap 1
|
// swap 1
|
||||||
@@ -1209,7 +1250,7 @@ mod tests {
|
|||||||
"bb2b8038a1640196fbe3e38816f3e67cba72d940", // component id
|
"bb2b8038a1640196fbe3e38816f3e67cba72d940", // component id
|
||||||
"004375dff511095cc5a197a54140a24efef3a416", // receiver (next pool)
|
"004375dff511095cc5a197a54140a24efef3a416", // receiver (next pool)
|
||||||
"00", // zero to one
|
"00", // zero to one
|
||||||
"01", // transfer type
|
"00", // transfer false
|
||||||
// swap 2
|
// swap 2
|
||||||
"0052", // swap length
|
"0052", // swap length
|
||||||
"5615deb798bb3e4dfa0139dfa1b3d433cc23b72f", // executor address
|
"5615deb798bb3e4dfa0139dfa1b3d433cc23b72f", // executor address
|
||||||
@@ -1217,7 +1258,7 @@ mod tests {
|
|||||||
"004375dff511095cc5a197a54140a24efef3a416", // component id
|
"004375dff511095cc5a197a54140a24efef3a416", // component id
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver (final user)
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver (final user)
|
||||||
"01", // zero to one
|
"01", // zero to one
|
||||||
"05", // transfer type - None
|
"00", // transfer false
|
||||||
"000000000000000000000000000000000000000000000000", // padding
|
"000000000000000000000000000000000000000000000000", // padding
|
||||||
));
|
));
|
||||||
|
|
||||||
@@ -1323,12 +1364,14 @@ mod tests {
|
|||||||
"0000000000000000000000000000000000000000000000000000000000000000", // wrap action
|
"0000000000000000000000000000000000000000000000000000000000000000", // wrap action
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap action
|
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap action
|
||||||
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", // transfer from
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", // funds receiver
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
let expected_swaps = [
|
let expected_swaps = [
|
||||||
"00000000000000000000000000000000000000000000000000000000000000d6", // length of ple encoded swaps without padding
|
"00000000000000000000000000000000000000000000000000000000000000d8", // length of ple encoded swaps without padding
|
||||||
"0069", // ple encoded swaps
|
"006a", // ple encoded swaps
|
||||||
"2e234dae75c793f67a35089c9d99245e1c58470b", // executor address
|
"2e234dae75c793f67a35089c9d99245e1c58470b", // executor address
|
||||||
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token in
|
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token in
|
||||||
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token out
|
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token out
|
||||||
@@ -1336,8 +1379,9 @@ mod tests {
|
|||||||
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
||||||
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
|
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
|
||||||
"01", // zero2one
|
"01", // zero2one
|
||||||
"02", // transfer type
|
"01", // transfer from true
|
||||||
"0069", // ple encoded swaps
|
"00", // transfer false
|
||||||
|
"006a", // ple encoded swaps
|
||||||
"2e234dae75c793f67a35089c9d99245e1c58470b", // executor address
|
"2e234dae75c793f67a35089c9d99245e1c58470b", // executor address
|
||||||
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in
|
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in
|
||||||
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token out
|
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token out
|
||||||
@@ -1345,13 +1389,14 @@ mod tests {
|
|||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
|
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"00", // transfer type
|
"00", // transfer from false
|
||||||
"00000000000000000000", // padding
|
"01", // transfer true
|
||||||
|
"0000000000000000", // padding
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
assert_eq!(hex_calldata[..456], expected_input);
|
assert_eq!(hex_calldata[..584], expected_input);
|
||||||
assert_eq!(hex_calldata[1224..], expected_swaps);
|
assert_eq!(hex_calldata[1352..], expected_swaps);
|
||||||
write_calldata_to_file("test_sequential_strategy_cyclic_swap", hex_calldata.as_str());
|
write_calldata_to_file("test_sequential_strategy_cyclic_swap", hex_calldata.as_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2040,8 +2085,8 @@ mod tests {
|
|||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
let expected_swaps = [
|
let expected_swaps = [
|
||||||
"0000000000000000000000000000000000000000000000000000000000000139", // length of ple encoded swaps without padding
|
"000000000000000000000000000000000000000000000000000000000000013b", // length of ple encoded swaps without padding
|
||||||
"006e", // ple encoded swaps
|
"006f", // ple encoded swaps
|
||||||
"00", // token in index
|
"00", // token in index
|
||||||
"01", // token out index
|
"01", // token out index
|
||||||
"999999", // split
|
"999999", // split
|
||||||
@@ -2052,8 +2097,9 @@ mod tests {
|
|||||||
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
||||||
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
|
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
|
||||||
"01", // zero2one
|
"01", // zero2one
|
||||||
"02", // transfer type
|
"00", // transfer from false
|
||||||
"006e", // ple encoded swaps
|
"01", // transfer true
|
||||||
|
"006f", // ple encoded swaps
|
||||||
"00", // token in index
|
"00", // token in index
|
||||||
"01", // token out index
|
"01", // token out index
|
||||||
"000000", // split
|
"000000", // split
|
||||||
@@ -2064,7 +2110,8 @@ mod tests {
|
|||||||
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
||||||
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
|
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
|
||||||
"01", // zero2one
|
"01", // zero2one
|
||||||
"02", // transfer type
|
"00", // transfer from false
|
||||||
|
"01", // transfer true
|
||||||
"0057", // ple encoded swaps
|
"0057", // ple encoded swaps
|
||||||
"01", // token in index
|
"01", // token in index
|
||||||
"00", // token out index
|
"00", // token out index
|
||||||
@@ -2074,8 +2121,8 @@ mod tests {
|
|||||||
"b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id,
|
"b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id,
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"00", // transfer type
|
"01", // transfer true
|
||||||
"00000000000000" // padding
|
"0000000000" // padding
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
assert_eq!(hex_calldata[..520], expected_input);
|
assert_eq!(hex_calldata[..520], expected_input);
|
||||||
@@ -2204,7 +2251,7 @@ mod tests {
|
|||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
let expected_swaps = [
|
let expected_swaps = [
|
||||||
"0000000000000000000000000000000000000000000000000000000000000139", // length of ple encoded swaps without padding
|
"000000000000000000000000000000000000000000000000000000000000013b", // length of ple encoded swaps without padding
|
||||||
"0057", // ple encoded swaps
|
"0057", // ple encoded swaps
|
||||||
"00", // token in index
|
"00", // token in index
|
||||||
"01", // token out index
|
"01", // token out index
|
||||||
@@ -2214,8 +2261,8 @@ mod tests {
|
|||||||
"b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id
|
"b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id
|
||||||
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
|
||||||
"01", // zero2one
|
"01", // zero2one
|
||||||
"02", // transfer type
|
"01", // transfer true
|
||||||
"006e", // ple encoded swaps
|
"006f", // ple encoded swaps
|
||||||
"01", // token in index
|
"01", // token in index
|
||||||
"00", // token out index
|
"00", // token out index
|
||||||
"999999", // split
|
"999999", // split
|
||||||
@@ -2226,8 +2273,9 @@ mod tests {
|
|||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
|
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"00", // transfer type
|
"00", // transfer from false
|
||||||
"006e", // ple encoded swaps
|
"01", // transfer true
|
||||||
|
"006f", // ple encoded swaps
|
||||||
"01", // token in index
|
"01", // token in index
|
||||||
"00", // token out index
|
"00", // token out index
|
||||||
"000000", // split
|
"000000", // split
|
||||||
@@ -2238,8 +2286,9 @@ mod tests {
|
|||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
|
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"00", // transfer type
|
"00", // transfer from false
|
||||||
"00000000000000" // padding
|
"01", // transfer true
|
||||||
|
"0000000000" // padding
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
@@ -2600,6 +2649,8 @@ mod tests {
|
|||||||
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // wrap
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap
|
||||||
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", // transfer from
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", // funds receiver
|
||||||
]
|
]
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
@@ -2608,14 +2659,15 @@ mod tests {
|
|||||||
|
|
||||||
let expected_swaps = String::from(concat!(
|
let expected_swaps = String::from(concat!(
|
||||||
// length of ple encoded swaps without padding
|
// length of ple encoded swaps without padding
|
||||||
"0000000000000000000000000000000000000000000000000000000000000086",
|
"0000000000000000000000000000000000000000000000000000000000000087",
|
||||||
// Swap data header
|
// Swap data header
|
||||||
"f62849f9a0b5bf2913b396098f7c7019b51a820a", // executor address
|
"f62849f9a0b5bf2913b396098f7c7019b51a820a", // executor address
|
||||||
// Protocol data
|
// Protocol data
|
||||||
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // group token in
|
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // group token in
|
||||||
"6982508145454ce325ddbe47a25d4ec3d2311933", // group token in
|
"6982508145454ce325ddbe47a25d4ec3d2311933", // group token in
|
||||||
"00", // zero2one
|
"00", // zero2one
|
||||||
"02", // transfer type (transfer to router)
|
"01", // transfer from true
|
||||||
|
"00", // transfer false
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
|
||||||
// First pool params
|
// First pool params
|
||||||
"0000000000000000000000000000000000000000", // intermediary token (ETH)
|
"0000000000000000000000000000000000000000", // intermediary token (ETH)
|
||||||
@@ -2625,13 +2677,13 @@ mod tests {
|
|||||||
"6982508145454ce325ddbe47a25d4ec3d2311933", // intermediary token (PEPE)
|
"6982508145454ce325ddbe47a25d4ec3d2311933", // intermediary token (PEPE)
|
||||||
"0061a8", // fee
|
"0061a8", // fee
|
||||||
"0001f4", // tick spacing
|
"0001f4", // tick spacing
|
||||||
"0000000000000000000000000000000000000000000000000000" // padding
|
"00000000000000000000000000000000000000000000000000" // padding
|
||||||
));
|
));
|
||||||
|
|
||||||
let hex_calldata = encode(&calldata);
|
let hex_calldata = encode(&calldata);
|
||||||
|
|
||||||
assert_eq!(hex_calldata[..456], expected_input);
|
assert_eq!(hex_calldata[..584], expected_input);
|
||||||
assert_eq!(hex_calldata[1224..], expected_swaps);
|
assert_eq!(hex_calldata[1352..], expected_swaps);
|
||||||
write_calldata_to_file(
|
write_calldata_to_file(
|
||||||
"test_single_encoding_strategy_usv4_grouped_swap",
|
"test_single_encoding_strategy_usv4_grouped_swap",
|
||||||
hex_calldata.as_str(),
|
hex_calldata.as_str(),
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ use crate::encoding::{
|
|||||||
constants::{CALLBACK_CONSTRAINED_PROTOCOLS, IN_TRANSFER_REQUIRED_PROTOCOLS},
|
constants::{CALLBACK_CONSTRAINED_PROTOCOLS, IN_TRANSFER_REQUIRED_PROTOCOLS},
|
||||||
group_swaps::SwapGroup,
|
group_swaps::SwapGroup,
|
||||||
},
|
},
|
||||||
models::TransferType,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A struct that defines how the tokens will be transferred into the given pool given the solution.
|
/// A struct that defines how the tokens will be transferred into the given pool given the solution.
|
||||||
@@ -16,7 +15,6 @@ use crate::encoding::{
|
|||||||
pub struct TransferOptimization {
|
pub struct TransferOptimization {
|
||||||
native_token: Bytes,
|
native_token: Bytes,
|
||||||
wrapped_token: Bytes,
|
wrapped_token: Bytes,
|
||||||
permit2: bool,
|
|
||||||
token_in_already_in_router: bool,
|
token_in_already_in_router: bool,
|
||||||
router_address: Bytes,
|
router_address: Bytes,
|
||||||
}
|
}
|
||||||
@@ -25,69 +23,65 @@ impl TransferOptimization {
|
|||||||
pub fn new(
|
pub fn new(
|
||||||
native_token: Bytes,
|
native_token: Bytes,
|
||||||
wrapped_token: Bytes,
|
wrapped_token: Bytes,
|
||||||
permit2: bool,
|
|
||||||
token_in_already_in_router: bool,
|
token_in_already_in_router: bool,
|
||||||
router_address: Bytes,
|
router_address: Bytes,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
TransferOptimization {
|
TransferOptimization {
|
||||||
native_token,
|
native_token,
|
||||||
wrapped_token,
|
wrapped_token,
|
||||||
permit2,
|
|
||||||
token_in_already_in_router,
|
token_in_already_in_router,
|
||||||
router_address,
|
router_address,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the transfer method that should be used for the given swap and solution.
|
/// Returns the information about the necessary transfers.
|
||||||
pub fn get_transfer_type(
|
/// Returns (bool, String, bool) where:
|
||||||
&self,
|
/// * bool: true if a transfer from the user is needed, false otherwise (it might use regular
|
||||||
swap: SwapGroup,
|
/// approvals or permit2)
|
||||||
given_token: Bytes,
|
/// * String: the address to transfer from (if not needed it's the zero address)
|
||||||
wrap: bool,
|
/// * bool: true if the tokens are already in the router and there only needs to be a transfer
|
||||||
in_between_swap_optimization: bool,
|
/// from the router into the pool
|
||||||
) -> TransferType {
|
pub fn get_transfers(&self, swap: SwapGroup, wrap: bool) -> (bool, String, bool) {
|
||||||
|
let zero_address = Bytes::from([0u8; 20]).to_string();
|
||||||
let in_transfer_required: bool =
|
let in_transfer_required: bool =
|
||||||
IN_TRANSFER_REQUIRED_PROTOCOLS.contains(&swap.protocol_system.as_str());
|
IN_TRANSFER_REQUIRED_PROTOCOLS.contains(&swap.protocol_system.as_str());
|
||||||
|
|
||||||
let is_first_swap = swap.token_in == given_token;
|
|
||||||
|
|
||||||
if swap.token_in == self.native_token {
|
if swap.token_in == self.native_token {
|
||||||
// Funds are already in router. All protocols currently take care of native transfers.
|
// Funds are already in router. All protocols currently take care of native transfers.
|
||||||
TransferType::None
|
(false, zero_address, false)
|
||||||
} else if (swap.token_in == self.wrapped_token) && wrap {
|
} else if (swap.token_in == self.wrapped_token) && wrap {
|
||||||
// Wrapping already happened in the router so we can just use a normal transfer.
|
// Wrapping already happened in the router so, we just do a normal transfer.
|
||||||
TransferType::TransferToProtocol
|
(false, zero_address, true)
|
||||||
} else if is_first_swap {
|
} else if in_transfer_required {
|
||||||
if in_transfer_required {
|
|
||||||
if self.token_in_already_in_router {
|
if self.token_in_already_in_router {
|
||||||
// Transfer from router to pool.
|
// Transfer from router to pool.
|
||||||
TransferType::TransferToProtocol
|
(false, zero_address, true)
|
||||||
} else if self.permit2 {
|
|
||||||
// Transfer from swapper to pool using permit2.
|
|
||||||
TransferType::TransferPermit2ToProtocol
|
|
||||||
} else {
|
} else {
|
||||||
// Transfer from swapper to pool.
|
// Transfer from swapper to pool
|
||||||
TransferType::TransferFromToProtocol
|
(true, swap.swaps[0].component.id.clone(), false)
|
||||||
}
|
}
|
||||||
// in transfer is not necessary for these protocols. Only make a transfer if the
|
// in transfer is not necessary for these protocols. Only make a transfer if the
|
||||||
// tokens are not already in the router
|
// tokens are not already in the router
|
||||||
} else if !self.token_in_already_in_router {
|
} else if !self.token_in_already_in_router {
|
||||||
if self.permit2 {
|
|
||||||
// Transfer from swapper to router using permit2.
|
// Transfer from swapper to router using permit2.
|
||||||
TransferType::TransferPermit2ToRouter
|
(true, self.router_address.to_string(), false)
|
||||||
} else {
|
} else {
|
||||||
// Transfer from swapper to router.
|
(false, zero_address, false)
|
||||||
TransferType::TransferFromToRouter
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
TransferType::None
|
|
||||||
}
|
}
|
||||||
// all other swaps
|
|
||||||
} else if !in_transfer_required || in_between_swap_optimization {
|
pub fn get_in_between_transfer(
|
||||||
|
&self,
|
||||||
|
protocol_system: &str,
|
||||||
|
in_between_swap_optimization: bool,
|
||||||
|
) -> bool {
|
||||||
|
let in_transfer_required: bool = IN_TRANSFER_REQUIRED_PROTOCOLS.contains(protocol_system);
|
||||||
|
|
||||||
|
if !in_transfer_required || in_between_swap_optimization {
|
||||||
// funds should already be in the router or in the next pool
|
// funds should already be in the router or in the next pool
|
||||||
TransferType::None
|
false
|
||||||
} else {
|
} else {
|
||||||
TransferType::TransferToProtocol
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,146 +149,68 @@ mod tests {
|
|||||||
Bytes::from("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f")
|
Bytes::from("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
fn zero_address() -> String {
|
||||||
fn test_first_swap_transfer_from_permit2() {
|
Bytes::from([0u8; 20]).to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[rstest]
|
||||||
|
// WETH -(univ2)-> DAI we expect a transfer from the user to the protocol
|
||||||
|
#[case(weth(), "uniswap_v2".to_string(), false, false, true, "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11", false)]
|
||||||
|
// Native token swap. No transfer is needed
|
||||||
|
#[case(eth(), "uniswap_v2".to_string(),false, false, false, zero_address(), false)]
|
||||||
|
// ETH -(wrap)-> WETH -(univ2)-> DAI. Only a transfer from the router into the protocol is
|
||||||
|
// needed
|
||||||
|
#[case(weth(), "uniswap_v2".to_string(),true, false, false, zero_address(), true)]
|
||||||
|
// USDC -(univ2)-> DAI and the tokens are already in the router. Only a transfer from the router
|
||||||
|
// to the protocol is needed
|
||||||
|
#[case(usdc(), "uniswap_v2".to_string(),false, true, false, zero_address(), true)]
|
||||||
|
// USDC -(curve)-> DAI and the tokens are already in the router. No transfer is needed
|
||||||
|
#[case(usdc(), "vm:curve".to_string(),false, true, false, zero_address(), false)]
|
||||||
|
fn test_get_transfers(
|
||||||
|
#[case] token_in: Bytes,
|
||||||
|
#[case] protocol: String,
|
||||||
|
#[case] wrap: bool,
|
||||||
|
#[case] token_in_already_in_router: bool,
|
||||||
|
#[case] expected_transfer_from: bool,
|
||||||
|
#[case] expected_receiver: String,
|
||||||
|
#[case] expected_transfer: bool,
|
||||||
|
) {
|
||||||
// The swap token is the same as the given token, which is not the native token
|
// The swap token is the same as the given token, which is not the native token
|
||||||
let swap = SwapGroup {
|
let swaps = vec![Swap {
|
||||||
|
component: ProtocolComponent {
|
||||||
protocol_system: "uniswap_v2".to_string(),
|
protocol_system: "uniswap_v2".to_string(),
|
||||||
token_in: weth(),
|
id: "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11".to_string(),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
token_in: token_in.clone(),
|
||||||
token_out: dai(),
|
token_out: dai(),
|
||||||
split: 0f64,
|
split: 0f64,
|
||||||
swaps: vec![],
|
}];
|
||||||
};
|
let swap =
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), true, false, router_address());
|
SwapGroup { protocol_system: protocol, token_in, token_out: dai(), split: 0f64, swaps };
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), weth(), false, false);
|
let optimization =
|
||||||
assert_eq!(transfer_method, TransferType::TransferPermit2ToProtocol);
|
TransferOptimization::new(eth(), weth(), token_in_already_in_router, router_address());
|
||||||
|
let (transfer_from, receiver, transfer) = optimization.get_transfers(swap.clone(), wrap);
|
||||||
|
assert_eq!(transfer_from, expected_transfer_from);
|
||||||
|
assert_eq!(receiver, expected_receiver);
|
||||||
|
assert_eq!(transfer, expected_transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[rstest]
|
||||||
fn test_first_swap_transfer_from() {
|
// tokens need to be transferred into the pool
|
||||||
// The swap token is the same as the given token, which is not the native token
|
#[case("uniswap_v2", false, true)]
|
||||||
let swap = SwapGroup {
|
// tokens are already in the pool (optimization)
|
||||||
protocol_system: "uniswap_v2".to_string(),
|
#[case("uniswap_v2", true, false)]
|
||||||
token_in: weth(),
|
// tokens are already in the router and don't need a transfer
|
||||||
token_out: dai(),
|
#[case("vm:curve", false, false)]
|
||||||
split: 0f64,
|
fn test_get_in_between_transfers(
|
||||||
swaps: vec![],
|
#[case] protocol: &str,
|
||||||
};
|
#[case] in_between_swap_optimization: bool,
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, false, router_address());
|
#[case] expected_transfer: bool,
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), weth(), false, false);
|
) {
|
||||||
assert_eq!(transfer_method, TransferType::TransferFromToProtocol);
|
let optimization = TransferOptimization::new(eth(), weth(), false, router_address());
|
||||||
}
|
let transfer = optimization.get_in_between_transfer(protocol, in_between_swap_optimization);
|
||||||
|
assert_eq!(transfer, expected_transfer);
|
||||||
#[test]
|
|
||||||
fn test_first_swap_native() {
|
|
||||||
// The swap token is the same as the given token, and it's the native token.
|
|
||||||
// No transfer action is needed.
|
|
||||||
let swap = SwapGroup {
|
|
||||||
protocol_system: "uniswap_v2".to_string(),
|
|
||||||
token_in: eth(),
|
|
||||||
token_out: dai(),
|
|
||||||
split: 0f64,
|
|
||||||
swaps: vec![],
|
|
||||||
};
|
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, false, router_address());
|
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), eth(), false, false);
|
|
||||||
assert_eq!(transfer_method, TransferType::None);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_first_swap_wrapped() {
|
|
||||||
// The swap token is NOT the same as the given token, but we are wrapping.
|
|
||||||
// Since the swap's token in is the wrapped token - this is the first swap.
|
|
||||||
let swap = SwapGroup {
|
|
||||||
protocol_system: "uniswap_v2".to_string(),
|
|
||||||
token_in: weth(),
|
|
||||||
token_out: dai(),
|
|
||||||
split: 0f64,
|
|
||||||
swaps: vec![],
|
|
||||||
};
|
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, false, router_address());
|
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), eth(), true, false);
|
|
||||||
assert_eq!(transfer_method, TransferType::TransferToProtocol);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_not_first_swap() {
|
|
||||||
// The swap token is NOT the same as the given token, and we are NOT wrapping.
|
|
||||||
// Thus, this is not the first swap.
|
|
||||||
let swap = SwapGroup {
|
|
||||||
protocol_system: "uniswap_v2".to_string(),
|
|
||||||
token_in: usdc(),
|
|
||||||
token_out: dai(),
|
|
||||||
split: 0f64,
|
|
||||||
swaps: vec![],
|
|
||||||
};
|
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, false, router_address());
|
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), weth(), false, false);
|
|
||||||
assert_eq!(transfer_method, TransferType::TransferToProtocol);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_not_first_swap_funds_in_router() {
|
|
||||||
// Not the first swap and the protocol requires the funds to be in the router (which they
|
|
||||||
// already are, so the transfer type is None)
|
|
||||||
let swap = SwapGroup {
|
|
||||||
protocol_system: "vm:curve".to_string(),
|
|
||||||
token_in: usdc(),
|
|
||||||
token_out: dai(),
|
|
||||||
split: 0f64,
|
|
||||||
swaps: vec![],
|
|
||||||
};
|
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, false, router_address());
|
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), weth(), false, false);
|
|
||||||
assert_eq!(transfer_method, TransferType::None);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_not_first_swap_in_between_swap_optimization() {
|
|
||||||
// Not the first swap and the in between swaps are optimized. The funds should already be in
|
|
||||||
// the next pool or in the router
|
|
||||||
let swap = SwapGroup {
|
|
||||||
protocol_system: "uniswap_v2".to_string(),
|
|
||||||
token_in: usdc(),
|
|
||||||
token_out: dai(),
|
|
||||||
split: 0f64,
|
|
||||||
swaps: vec![],
|
|
||||||
};
|
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, false, router_address());
|
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), weth(), false, true);
|
|
||||||
assert_eq!(transfer_method, TransferType::None);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_first_swap_tokens_already_in_router_optimization() {
|
|
||||||
// It is the first swap, tokens are already in the router and the protocol requires the
|
|
||||||
// transfer in
|
|
||||||
let swap = SwapGroup {
|
|
||||||
protocol_system: "uniswap_v2".to_string(),
|
|
||||||
token_in: usdc(),
|
|
||||||
token_out: dai(),
|
|
||||||
split: 0f64,
|
|
||||||
swaps: vec![],
|
|
||||||
};
|
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, true, router_address());
|
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), usdc(), false, false);
|
|
||||||
assert_eq!(transfer_method, TransferType::TransferToProtocol);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_first_swap_tokens_already_in_router_no_transfer_needed_optimization() {
|
|
||||||
// It is the first swap, tokens are already in the router and the protocol does not require
|
|
||||||
// the transfer in
|
|
||||||
let swap = SwapGroup {
|
|
||||||
protocol_system: "vm:curve".to_string(),
|
|
||||||
token_in: usdc(),
|
|
||||||
token_out: dai(),
|
|
||||||
split: 0f64,
|
|
||||||
swaps: vec![],
|
|
||||||
};
|
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, true, router_address());
|
|
||||||
let transfer_method = optimization.get_transfer_type(swap.clone(), usdc(), false, false);
|
|
||||||
assert_eq!(transfer_method, TransferType::None);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn receiver() -> Bytes {
|
fn receiver() -> Bytes {
|
||||||
@@ -319,7 +235,7 @@ mod tests {
|
|||||||
#[case] expected_receiver: Bytes,
|
#[case] expected_receiver: Bytes,
|
||||||
#[case] expected_optimization: bool,
|
#[case] expected_optimization: bool,
|
||||||
) {
|
) {
|
||||||
let optimization = TransferOptimization::new(eth(), weth(), false, false, router_address());
|
let optimization = TransferOptimization::new(eth(), weth(), false, router_address());
|
||||||
|
|
||||||
let next_swap = if protocol.is_none() {
|
let next_swap = if protocol.is_none() {
|
||||||
None
|
None
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ impl SwapEncoder for UniswapV2SwapEncoder {
|
|||||||
component_id,
|
component_id,
|
||||||
bytes_to_address(&encoding_context.receiver)?,
|
bytes_to_address(&encoding_context.receiver)?,
|
||||||
zero_to_one,
|
zero_to_one,
|
||||||
(encoding_context.transfer_type as u8).to_be_bytes(),
|
encoding_context.transfer,
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(args.abi_encode_packed())
|
Ok(args.abi_encode_packed())
|
||||||
@@ -129,7 +129,8 @@ impl SwapEncoder for UniswapV3SwapEncoder {
|
|||||||
bytes_to_address(&encoding_context.receiver)?,
|
bytes_to_address(&encoding_context.receiver)?,
|
||||||
component_id,
|
component_id,
|
||||||
zero_to_one,
|
zero_to_one,
|
||||||
(encoding_context.transfer_type as u8).to_be_bytes(),
|
encoding_context.transfer_from,
|
||||||
|
encoding_context.transfer,
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(args.abi_encode_packed())
|
Ok(args.abi_encode_packed())
|
||||||
@@ -206,7 +207,8 @@ impl SwapEncoder for UniswapV4SwapEncoder {
|
|||||||
group_token_in_address,
|
group_token_in_address,
|
||||||
group_token_out_address,
|
group_token_out_address,
|
||||||
zero_to_one,
|
zero_to_one,
|
||||||
(encoding_context.transfer_type as u8).to_be_bytes(),
|
encoding_context.transfer_from,
|
||||||
|
encoding_context.transfer,
|
||||||
bytes_to_address(&encoding_context.receiver)?,
|
bytes_to_address(&encoding_context.receiver)?,
|
||||||
pool_params,
|
pool_params,
|
||||||
);
|
);
|
||||||
@@ -282,7 +284,7 @@ impl SwapEncoder for BalancerV2SwapEncoder {
|
|||||||
component_id,
|
component_id,
|
||||||
bytes_to_address(&encoding_context.receiver)?,
|
bytes_to_address(&encoding_context.receiver)?,
|
||||||
approval_needed,
|
approval_needed,
|
||||||
(encoding_context.transfer_type as u8).to_be_bytes(),
|
encoding_context.transfer,
|
||||||
);
|
);
|
||||||
Ok(args.abi_encode_packed())
|
Ok(args.abi_encode_packed())
|
||||||
}
|
}
|
||||||
@@ -344,7 +346,8 @@ impl SwapEncoder for EkuboSwapEncoder {
|
|||||||
let mut encoded = vec![];
|
let mut encoded = vec![];
|
||||||
|
|
||||||
if encoding_context.group_token_in == swap.token_in {
|
if encoding_context.group_token_in == swap.token_in {
|
||||||
encoded.extend((encoding_context.transfer_type as u8).to_be_bytes());
|
encoded.extend((encoding_context.transfer_from as u8).to_be_bytes());
|
||||||
|
encoded.extend((encoding_context.transfer as u8).to_be_bytes());
|
||||||
encoded.extend(bytes_to_address(&encoding_context.receiver)?);
|
encoded.extend(bytes_to_address(&encoding_context.receiver)?);
|
||||||
encoded.extend(bytes_to_address(&swap.token_in)?);
|
encoded.extend(bytes_to_address(&swap.token_in)?);
|
||||||
}
|
}
|
||||||
@@ -575,7 +578,7 @@ impl SwapEncoder for CurveSwapEncoder {
|
|||||||
i.to_be_bytes::<1>(),
|
i.to_be_bytes::<1>(),
|
||||||
j.to_be_bytes::<1>(),
|
j.to_be_bytes::<1>(),
|
||||||
approval_needed,
|
approval_needed,
|
||||||
(encoding_context.transfer_type as u8).to_be_bytes(),
|
encoding_context.transfer,
|
||||||
bytes_to_address(&encoding_context.receiver)?,
|
bytes_to_address(&encoding_context.receiver)?,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -620,7 +623,7 @@ impl SwapEncoder for MaverickV2SwapEncoder {
|
|||||||
bytes_to_address(&swap.token_in)?,
|
bytes_to_address(&swap.token_in)?,
|
||||||
component_id,
|
component_id,
|
||||||
bytes_to_address(&encoding_context.receiver)?,
|
bytes_to_address(&encoding_context.receiver)?,
|
||||||
(encoding_context.transfer_type as u8).to_be_bytes(),
|
encoding_context.transfer,
|
||||||
);
|
);
|
||||||
Ok(args.abi_encode_packed())
|
Ok(args.abi_encode_packed())
|
||||||
}
|
}
|
||||||
@@ -645,7 +648,7 @@ mod tests {
|
|||||||
};
|
};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::encoding::{evm::utils::write_calldata_to_file, models::TransferType};
|
use crate::encoding::evm::utils::write_calldata_to_file;
|
||||||
|
|
||||||
mod uniswap_v2 {
|
mod uniswap_v2 {
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -670,7 +673,8 @@ mod tests {
|
|||||||
router_address: Some(Bytes::zero(20)),
|
router_address: Some(Bytes::zero(20)),
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = UniswapV2SwapEncoder::new(
|
let encoder = UniswapV2SwapEncoder::new(
|
||||||
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
||||||
@@ -693,8 +697,8 @@ mod tests {
|
|||||||
"0000000000000000000000000000000000000001",
|
"0000000000000000000000000000000000000001",
|
||||||
// zero for one
|
// zero for one
|
||||||
"00",
|
"00",
|
||||||
// transfer type (transfer)
|
// transfer true
|
||||||
"00",
|
"01",
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -728,7 +732,8 @@ mod tests {
|
|||||||
router_address: Some(Bytes::zero(20)),
|
router_address: Some(Bytes::zero(20)),
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = UniswapV3SwapEncoder::new(
|
let encoder = UniswapV3SwapEncoder::new(
|
||||||
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
||||||
@@ -755,8 +760,10 @@ mod tests {
|
|||||||
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
|
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
|
||||||
// zero for one
|
// zero for one
|
||||||
"00",
|
"00",
|
||||||
// transfer type (transfer)
|
// transfer from false
|
||||||
"00",
|
"00",
|
||||||
|
// transfer true
|
||||||
|
"01",
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -790,7 +797,8 @@ mod tests {
|
|||||||
router_address: Some(Bytes::zero(20)),
|
router_address: Some(Bytes::zero(20)),
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::None,
|
transfer: false,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = BalancerV2SwapEncoder::new(
|
let encoder = BalancerV2SwapEncoder::new(
|
||||||
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
||||||
@@ -819,8 +827,8 @@ mod tests {
|
|||||||
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
|
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
|
||||||
// approval needed
|
// approval needed
|
||||||
"01",
|
"01",
|
||||||
// transfer type
|
// transfer false
|
||||||
"05"
|
"00",
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
write_calldata_to_file("test_encode_balancer_v2", hex_swap.as_str());
|
write_calldata_to_file("test_encode_balancer_v2", hex_swap.as_str());
|
||||||
@@ -864,7 +872,8 @@ mod tests {
|
|||||||
|
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = UniswapV4SwapEncoder::new(
|
let encoder = UniswapV4SwapEncoder::new(
|
||||||
String::from("0xF62849F9A0B5Bf2913b396098F7c7019b51A820a"),
|
String::from("0xF62849F9A0B5Bf2913b396098F7c7019b51A820a"),
|
||||||
@@ -886,8 +895,10 @@ mod tests {
|
|||||||
"dac17f958d2ee523a2206206994597c13d831ec7",
|
"dac17f958d2ee523a2206206994597c13d831ec7",
|
||||||
// zero for one
|
// zero for one
|
||||||
"01",
|
"01",
|
||||||
// transfer type
|
// transfer from false
|
||||||
"00",
|
"00",
|
||||||
|
// transfer true
|
||||||
|
"01",
|
||||||
// receiver
|
// receiver
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
|
||||||
// pool params:
|
// pool params:
|
||||||
@@ -935,7 +946,8 @@ mod tests {
|
|||||||
group_token_in: group_token_in.clone(),
|
group_token_in: group_token_in.clone(),
|
||||||
// Token out is the same as the group token out
|
// Token out is the same as the group token out
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
let encoder = UniswapV4SwapEncoder::new(
|
let encoder = UniswapV4SwapEncoder::new(
|
||||||
@@ -978,7 +990,8 @@ mod tests {
|
|||||||
router_address: Some(router_address.clone()),
|
router_address: Some(router_address.clone()),
|
||||||
group_token_in: usde_address.clone(),
|
group_token_in: usde_address.clone(),
|
||||||
group_token_out: wbtc_address.clone(),
|
group_token_out: wbtc_address.clone(),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Setup - First sequence: USDE -> USDT
|
// Setup - First sequence: USDE -> USDT
|
||||||
@@ -1056,8 +1069,10 @@ mod tests {
|
|||||||
"2260fac5e5542a773aa44fbcfedf7c193bc2c599",
|
"2260fac5e5542a773aa44fbcfedf7c193bc2c599",
|
||||||
// zero for one
|
// zero for one
|
||||||
"01",
|
"01",
|
||||||
// transfer type
|
// transfer from false
|
||||||
"00",
|
"00",
|
||||||
|
// transfer true
|
||||||
|
"01",
|
||||||
// receiver
|
// receiver
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
|
||||||
// pool params:
|
// pool params:
|
||||||
@@ -1113,7 +1128,8 @@ mod tests {
|
|||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
exact_out: false,
|
exact_out: false,
|
||||||
router_address: Some(Bytes::default()),
|
router_address: Some(Bytes::default()),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
let encoder =
|
let encoder =
|
||||||
@@ -1129,8 +1145,10 @@ mod tests {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
hex_swap,
|
hex_swap,
|
||||||
concat!(
|
concat!(
|
||||||
// transfer type
|
// transfer from false
|
||||||
"00",
|
"00",
|
||||||
|
// transfer true
|
||||||
|
"01",
|
||||||
// receiver
|
// receiver
|
||||||
"ca4f73fe97d0b987a0d12b39bbd562c779bab6f6",
|
"ca4f73fe97d0b987a0d12b39bbd562c779bab6f6",
|
||||||
// group token in
|
// group token in
|
||||||
@@ -1159,7 +1177,8 @@ mod tests {
|
|||||||
group_token_out: group_token_out.clone(),
|
group_token_out: group_token_out.clone(),
|
||||||
exact_out: false,
|
exact_out: false,
|
||||||
router_address: Some(Bytes::default()),
|
router_address: Some(Bytes::default()),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
let first_swap = Swap {
|
let first_swap = Swap {
|
||||||
@@ -1209,8 +1228,10 @@ mod tests {
|
|||||||
combined_hex,
|
combined_hex,
|
||||||
// transfer type
|
// transfer type
|
||||||
concat!(
|
concat!(
|
||||||
// transfer type
|
// transfer from false
|
||||||
"00",
|
"00",
|
||||||
|
// transfer true
|
||||||
|
"01",
|
||||||
// receiver
|
// receiver
|
||||||
"ca4f73fe97d0b987a0d12b39bbd562c779bab6f6",
|
"ca4f73fe97d0b987a0d12b39bbd562c779bab6f6",
|
||||||
// group token in
|
// group token in
|
||||||
@@ -1355,7 +1376,8 @@ mod tests {
|
|||||||
router_address: None,
|
router_address: None,
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::None,
|
transfer: false,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = CurveSwapEncoder::new(
|
let encoder = CurveSwapEncoder::new(
|
||||||
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
|
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
|
||||||
@@ -1385,8 +1407,8 @@ mod tests {
|
|||||||
"01",
|
"01",
|
||||||
// approval needed
|
// approval needed
|
||||||
"01",
|
"01",
|
||||||
// transfer type
|
// transfer false
|
||||||
"05",
|
"00",
|
||||||
// receiver,
|
// receiver,
|
||||||
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e"
|
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e"
|
||||||
))
|
))
|
||||||
@@ -1425,7 +1447,8 @@ mod tests {
|
|||||||
router_address: None,
|
router_address: None,
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::None,
|
transfer: false,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = CurveSwapEncoder::new(
|
let encoder = CurveSwapEncoder::new(
|
||||||
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
|
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
|
||||||
@@ -1455,8 +1478,8 @@ mod tests {
|
|||||||
"00",
|
"00",
|
||||||
// approval needed
|
// approval needed
|
||||||
"01",
|
"01",
|
||||||
// transfer type
|
// transfer false
|
||||||
"05",
|
"00",
|
||||||
// receiver
|
// receiver
|
||||||
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e"
|
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e"
|
||||||
))
|
))
|
||||||
@@ -1496,7 +1519,8 @@ mod tests {
|
|||||||
router_address: None,
|
router_address: None,
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::None,
|
transfer: false,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = CurveSwapEncoder::new(
|
let encoder = CurveSwapEncoder::new(
|
||||||
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
|
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
|
||||||
@@ -1535,8 +1559,8 @@ mod tests {
|
|||||||
"01",
|
"01",
|
||||||
// approval needed
|
// approval needed
|
||||||
"01",
|
"01",
|
||||||
// transfer type
|
// transfer false
|
||||||
"05",
|
"00",
|
||||||
// receiver
|
// receiver
|
||||||
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e"
|
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e"
|
||||||
))
|
))
|
||||||
@@ -1567,7 +1591,8 @@ mod tests {
|
|||||||
router_address: Some(Bytes::default()),
|
router_address: Some(Bytes::default()),
|
||||||
group_token_in: token_in.clone(),
|
group_token_in: token_in.clone(),
|
||||||
group_token_out: token_out.clone(),
|
group_token_out: token_out.clone(),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let encoder = MaverickV2SwapEncoder::new(
|
let encoder = MaverickV2SwapEncoder::new(
|
||||||
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
|
||||||
@@ -1590,8 +1615,8 @@ mod tests {
|
|||||||
"14Cf6D2Fe3E1B326114b07d22A6F6bb59e346c67",
|
"14Cf6D2Fe3E1B326114b07d22A6F6bb59e346c67",
|
||||||
// receiver
|
// receiver
|
||||||
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
|
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
|
||||||
// transfer from router to protocol
|
// transfer true
|
||||||
"00",
|
"01",
|
||||||
))
|
))
|
||||||
.to_lowercase()
|
.to_lowercase()
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use crate::encoding::{
|
|||||||
},
|
},
|
||||||
swap_encoder::swap_encoder_registry::SwapEncoderRegistry,
|
swap_encoder::swap_encoder_registry::SwapEncoderRegistry,
|
||||||
},
|
},
|
||||||
models::{Chain, EncodingContext, NativeAction, Solution, Transaction, TransferType},
|
models::{Chain, EncodingContext, NativeAction, Solution, Transaction},
|
||||||
strategy_encoder::StrategyEncoder,
|
strategy_encoder::StrategyEncoder,
|
||||||
tycho_encoder::TychoEncoder,
|
tycho_encoder::TychoEncoder,
|
||||||
};
|
};
|
||||||
@@ -279,7 +279,8 @@ impl TychoExecutorEncoder {
|
|||||||
router_address: None,
|
router_address: None,
|
||||||
group_token_in: grouped_swap.token_in.clone(),
|
group_token_in: grouped_swap.token_in.clone(),
|
||||||
group_token_out: grouped_swap.token_out.clone(),
|
group_token_out: grouped_swap.token_out.clone(),
|
||||||
transfer_type: TransferType::TransferToProtocol,
|
transfer: true,
|
||||||
|
transfer_from: false,
|
||||||
};
|
};
|
||||||
let protocol_data = swap_encoder.encode_swap(swap.clone(), encoding_context.clone())?;
|
let protocol_data = swap_encoder.encode_swap(swap.clone(), encoding_context.clone())?;
|
||||||
grouped_protocol_data.extend(protocol_data);
|
grouped_protocol_data.extend(protocol_data);
|
||||||
@@ -1059,8 +1060,8 @@ mod tests {
|
|||||||
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
|
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
|
||||||
// zero for one
|
// zero for one
|
||||||
"00",
|
"00",
|
||||||
// transfer type
|
// transfer true
|
||||||
"00",
|
"01",
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1147,8 +1148,10 @@ mod tests {
|
|||||||
"6982508145454ce325ddbe47a25d4ec3d2311933",
|
"6982508145454ce325ddbe47a25d4ec3d2311933",
|
||||||
// zero for one
|
// zero for one
|
||||||
"00",
|
"00",
|
||||||
// transfer type
|
// transfer from false
|
||||||
"00",
|
"00",
|
||||||
|
// transfer true
|
||||||
|
"01",
|
||||||
// receiver
|
// receiver
|
||||||
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
|
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
|
||||||
// first pool intermediary token (ETH)
|
// first pool intermediary token (ETH)
|
||||||
|
|||||||
@@ -96,27 +96,6 @@ pub struct Transaction {
|
|||||||
pub data: Vec<u8>,
|
pub data: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents the type of transfer to be performed into the pool.
|
|
||||||
///
|
|
||||||
/// # Fields
|
|
||||||
///
|
|
||||||
/// * `TransferToProtocol`: Transfer the token from the router into the protocol.
|
|
||||||
/// * `TransferFromToProtocol`: Transfer the token from the sender to the protocol.
|
|
||||||
/// * `TransferPermit2ToProtocol`: Transfer the token from the sender to the protocol using Permit2.
|
|
||||||
/// * `TransferFromToRouter`: Transfer the token from the sender to the router.
|
|
||||||
/// * `TransferPermit2ToRouter`: Transfer the token from the sender to the router using Permit2.
|
|
||||||
/// * `None`: No transfer is needed. Tokens are already in the pool.
|
|
||||||
#[repr(u8)]
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
|
||||||
pub enum TransferType {
|
|
||||||
TransferToProtocol = 0,
|
|
||||||
TransferFromToProtocol = 1,
|
|
||||||
TransferPermit2ToProtocol = 2,
|
|
||||||
TransferFromToRouter = 3,
|
|
||||||
TransferPermit2ToRouter = 4,
|
|
||||||
None = 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Represents necessary attributes for encoding an order.
|
/// Represents necessary attributes for encoding an order.
|
||||||
///
|
///
|
||||||
/// # Fields
|
/// # Fields
|
||||||
@@ -127,6 +106,8 @@ pub enum TransferType {
|
|||||||
/// solution does not require router address.
|
/// solution does not require router address.
|
||||||
/// * `group_token_in`: Token to be used as the input for the group swap.
|
/// * `group_token_in`: Token to be used as the input for the group swap.
|
||||||
/// * `group_token_out`: Token to be used as the output for the group swap.
|
/// * `group_token_out`: Token to be used as the output for the group swap.
|
||||||
|
/// * `transfer_from`: true if the solution requires a transfer from the user to the router or pool.
|
||||||
|
/// * `transfer`: true if the solution requires a transfer from the router to the pool.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct EncodingContext {
|
pub struct EncodingContext {
|
||||||
pub receiver: Bytes,
|
pub receiver: Bytes,
|
||||||
@@ -134,7 +115,8 @@ pub struct EncodingContext {
|
|||||||
pub router_address: Option<Bytes>,
|
pub router_address: Option<Bytes>,
|
||||||
pub group_token_in: Bytes,
|
pub group_token_in: Bytes,
|
||||||
pub group_token_out: Bytes,
|
pub group_token_out: Bytes,
|
||||||
pub transfer_type: TransferType,
|
pub transfer_from: bool,
|
||||||
|
pub transfer: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Hash)]
|
#[derive(Clone, PartialEq, Eq, Hash)]
|
||||||
|
|||||||
Reference in New Issue
Block a user