feat: Bring back TransferType and simplify encoding logic

Took 1 hour 53 minutes
This commit is contained in:
Diana Carvalho
2025-05-16 16:59:35 +01:00
parent 9b59b8b434
commit 38748925b3
6 changed files with 230 additions and 309 deletions

View File

@@ -1,29 +1,29 @@
test_uniswap_v3_uniswap_v2:59e3efbb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c0006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb8004375dff511095cc5a197a54140a24efef3a416cbcdf9626bc03e24f779434178a73a0b4bad62ed00010000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100 test_uniswap_v3_uniswap_v2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000bf00692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb8004375dff511095cc5a197a54140a24efef3a416cbcdf9626bc03e24f779434178a73a0b4bad62ed000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010200
test_single_encoding_strategy_ekubo:cc60c6230000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000072a0cb889707d426a7a386870a03bc70d1b06975980000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c0000000000000000000000000000000000000000000000000000 test_single_encoding_strategy_ekubo:20144a070000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000071a0cb889707d426a7a386870a03bc70d1b069759802cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000000000000000000000000000000000
test_uniswap_v3_uniswap_v3:59e3efbb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000d8006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000100006a2e234dae75c793f67a35089c9d99245e1c58470b2260fac5e5542a773aa44fbcfedf7c193bc2c599a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc299ac8ca7087fa4a2a1fb6357269965a2014abc350100010000000000000000 test_uniswap_v3_uniswap_v3:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000692e234dae75c793f67a35089c9d99245e1c58470b2260fac5e5542a773aa44fbcfedf7c193bc2c599a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc299ac8ca7087fa4a2a1fb6357269965a2014abc35010100000000000000000000
test_balancer_v2_uniswap_v2:59e3efbb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c70071c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e004375dff511095cc5a197a54140a24efef3a4160100525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010000000000000000000000000000000000000000000000000000 test_balancer_v2_uniswap_v2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c80072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e004375dff511095cc5a197a54140a24efef3a416010000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
test_sequential_swap_strategy_encoder_no_permit2:59e3efbb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100000000000000000000000000000000000000000000000000 test_sequential_swap_strategy_encoder_no_permit2:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
test_single_encoding_strategy_usv4_grouped_swap:a93aabdf000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000684d7e5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f862000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041dca332cf6bf055844312c26de68cf6c13c623e3075d5146a8bd16ecbd9bf04777c860b348ed95a00dcde7101ba2529716ec1a4181ea2d12f19f4303070fa0d8c1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d2311933000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f400000000000000000000000000000000000000000000000000 test_single_encoding_strategy_usv4_grouped_swap:30ace1b1000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000005064ff624d54346285543f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000410fa9c637031c3ab6898496918d2d431cf4a85b8f9fa9b18562528fffead3a3790c5f8a32866004f9275e0eb1f45c0954c373f101c0618e6885b04e3c559f782c1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb486982508145454ce325ddbe47a25d4ec3d23119330000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c6982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000000000000000
test_single_encoding_strategy_usv4_eth_out:308f3ce000000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e0000000000000000000000000000000000000000000000000000000000684d7e5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f862000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041df141aa6b1e7114b4759f64a7caf0fa98abe3e888bf5bba627e6164a74fed18f54d937a3c481aa1d20102f43af4eddc2335799c4c364857c9c67a92c4aad96731b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007400720001000000f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000 test_single_encoding_strategy_usv4_eth_out:7c55384600000000000000000000000000000000000000000000000000000000b2d05e00000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81490b4f29aade000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000b2d05e0000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004104b5583d7915973bc9f0f07d7d33ba6f3fb777ceaee0dd2c023cecb8764e8e72257e0255a7e04bb30096137a0fde38a8191f27b6fcaae371e7ec1799a1f43e441b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300710001000000f62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c00000000000000000000000000
test_sequential_swap_strategy_encoder:740bae0c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041b796d9bcd8b1eac1ae64d47ed6761f0155efe363064a86f6b14276d9b5bec20f321e2b45e6e849ea77da6c9217d5c97f9ed99ac117e421ae4355feda62f610181b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20100000000000000000000000000000000000000000000000000 test_sequential_swap_strategy_encoder:51bcc7b60000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041261b12a8bd804743e33746b765070f89e4a08bbe8339fce19ea7d180782c1fc82693906dccc47520368b341d3ca32cfe655625bea8f6844d2d95b61492f741881b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a800525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d940004375dff511095cc5a197a54140a24efef3a416000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20102000000000000000000000000000000000000000000000000
test_single_swap_strategy_encoder_no_permit2:cc60c6230000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000 test_single_swap_strategy_encoder_no_permit2:20144a070000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
test_single_swap_strategy_encoder_no_transfer_in:cc60c6230000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000 test_single_swap_strategy_encoder_no_transfer_in:20144a070000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000058e7926ee858a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
test_single_encoding_strategy_usv4_eth_in:a93aabdf0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684d7e5a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f862000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041858aedce4f7702229e93d1b5af9511ca0fa7e51bf766f04810ce14cbeffaec823cd4295b467eea641536412f84b2f8f3118197dd719bb83494185fcbbc6925541b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006df62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933010000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f400000000000000000000000000000000000000 test_single_encoding_strategy_usv4_eth_in:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000000000000000000000007e0a55d4322a6e93c2379c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a0b72c7e3b647030d4af52974b437f041cdc78474e91115b614f3ee00f573a64797fb56364e9643beaf8effff491bf464388d81c71bc3f2cedd8b8e38b554b7b1b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cf62849f9a0b5bf2913b396098f7c7019b51a820a00000000000000000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330102cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc26982508145454ce325ddbe47a25d4ec3d23119330061a80001f40000000000000000000000000000000000000000
test_sequential_strategy_cyclic_swap:740bae0c0000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041c5fde4fbb5914f434f5165ec8914873e635ecd74fec6eff68a4fb23c9231e33e5c505a6582e0835cd325c84f77d9c7fe0610c347714ba0c33b631e7b8633feed1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8006a2e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010100006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d80000010000000000000000 test_sequential_strategy_cyclic_swap:51bcc7b60000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ec8f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041f8df51365aa2a34a1658af57e7add49b53e6f0bdab9b27a00578f07a9b78367224ea5f4b0b79092c6d1361512d60433af612822b910fd6d7eea7caa184ebbb041c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010000692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000000000
test_single_encoding_strategy_curve_st_eth:cc60c6230000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000681d1499e622d69689cdf9004d05ec547d650ff211eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeae7ab96520de3a18e5e111b5eaab095312d7fe84dc24316b9ae028f1497c275eb9192a3ea0f6702201000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000 test_single_encoding_strategy_curve_st_eth:20144a070000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff211eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeae7ab96520de3a18e5e111b5eaab095312d7fe84dc24316b9ae028f1497c275eb9192a3ea0f6702201000100cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2020000000000000000000000000000000000000000000000
test_single_swap_strategy_encoder:a93aabdf0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000006b56051582a970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041b796d9bcd8b1eac1ae64d47ed6761f0155efe363064a86f6b14276d9b5bec20f321e2b45e6e849ea77da6c9217d5c97f9ed99ac117e421ae4355feda62f610181b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000 test_single_swap_strategy_encoder:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000006b56051582a970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041261b12a8bd804743e33746b765070f89e4a08bbe8339fce19ea7d180782c1fc82693906dccc47520368b341d3ca32cfe655625bea8f6844d2d95b61492f741881b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
test_single_encoding_strategy_curve:cc60c6230000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000681d1499e622d69689cdf9004d05ec547d650ff21155c08ca52497e2f1534b59e2917bf524d4765257c02aaa39b223fe8d0a0e5c4f27ead9083c756cc277146b0a1d08b6844376df6d9da99ba7f1b19e7102010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000 test_single_encoding_strategy_curve:20144a070000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000055c08ca52497e2f1534b59e2917bf524d4765257000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000691d1499e622d69689cdf9004d05ec547d650ff21155c08ca52497e2f1534b59e2917bf524d4765257c02aaa39b223fe8d0a0e5c4f27ead9083c756cc277146b0a1d08b6844376df6d9da99ba7f1b19e7102010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000
test_single_swap_strategy_encoder_unwrap:a93aabdf0000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb110000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be0000000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041a6dbc15148f2822173b5ca2070656da74ccc296371af94a2a43aebcb31877a702f07a5d8367939ee89c68b21a2345ab263df1dbadba4fba38614cba9caaea2e01c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000000000000000000000000000000 test_single_swap_strategy_encoder_unwrap:30ace1b10000000000000000000000000000000000000000000000a2a15d09519be000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000a2a15d09519be0000000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041579f177eccf39425b9a755adc0c961a0eeff873edcff1dc49ee507f4a3ef10ee36924ff24edd567694929826c77ca3b23a072154b7d815c88352671e480099bf1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000000000000000000000000000000
test_single_swap_strategy_encoder_wrap:a93aabdf0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041e841b50cf915823a9e2cf908c12a570318ff52573bc1aec4194e4b1d50b2e2da377fab53e5d3bfabd06a2c9966405f094e27f41d23fe975a8fdf90ac581f990e1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000 test_single_swap_strategy_encoder_wrap:30ace1b10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000059fb7d3830e6fc064b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000041a0b72c7e3b647030d4af52974b437f041cdc78474e91115b614f3ee00f573a64797fb56364e9643beaf8effff491bf464388d81c71bc3f2cedd8b8e38b554b7b1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb11cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000000000000000000000
test_split_output_cyclic_swap:308f3ce00000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041c5fde4fbb5914f434f5165ec8914873e635ecd74fec6eff68a4fb23c9231e33e5c505a6582e0835cd325c84f77d9c7fe0610c347714ba0c33b631e7b8633feed1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950101006f01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f5640000001006f01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d80000010000000000 test_split_output_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005e703f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041f8df51365aa2a34a1658af57e7add49b53e6f0bdab9b27a00578f07a9b78367224ea5f4b0b79092c6d1361512d60433af612822b910fd6d7eea7caa184ebbb041c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d013950100006e01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc288e6a0c2ddd26feeb64f039a2c41296fcb3f56400001006e01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb8cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc28ad599c3a0ff1de082011efddc58f1908eb6e6d8000100000000000000
test_split_input_cyclic_swap:308f3ce00000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041c5fde4fbb5914f434f5165ec8914873e635ecd74fec6eff68a4fb23c9231e33e5c505a6582e0835cd325c84f77d9c7fe0610c347714ba0c33b631e7b8633feed1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b006f00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f5640010001006f00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d8010001005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200010000000000 test_split_input_cyclic_swap:7c5538460000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005ef619b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041f8df51365aa2a34a1658af57e7add49b53e6f0bdab9b27a00578f07a9b78367224ea5f4b0b79092c6d1361512d60433af612822b910fd6d7eea7caa184ebbb041c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139006e00019999992e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f56400100006e00010000002e234dae75c793f67a35089c9d99245e1c58470ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d80100005701000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b4e16d0168e52d35cacd2c6185b44281ec28c9dccd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000100000000000000
test_split_swap_strategy_encoder:308f3ce00000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684d7e5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f863000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041b796d9bcd8b1eac1ae64d47ed6761f0155efe363064a86f6b14276d9b5bec20f321e2b45e6e849ea77da6c9217d5c97f9ed99ac117e421ae4355feda62f610181b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950001005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950001005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20101005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010100000000000000000000000000000000000000000000000000000000 test_split_swap_strategy_encoder:7c5538460000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000018f61ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000684eed6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827676f000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041261b12a8bd804743e33746b765070f89e4a08bbe8339fce19ea7d180782c1fc82693906dccc47520368b341d3ca32cfe655625bea8f6844d2d95b61492f741881b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164005700028000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d013950000005700010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2bb2b8038a1640196fbe3e38816f3e67cba72d9403ede3eca2a72b3aecc820e955b36f38437d013950000005702030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fae461ca67b15dc8dc81ce7615e0320da1a9ab8d5cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20101005701030000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f2260fac5e5542a773aa44fbcfedf7c193bc2c599004375dff511095cc5a197a54140a24efef3a416cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2010100000000000000000000000000000000000000000000000000000000
test_uniswap_v3_curve:59e3efbb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000d6006a2e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed00010000681d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000 test_uniswap_v3_curve:e8a980d70000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000018f61ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000d600692e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599000bb83ede3eca2a72b3aecc820e955b36f38437d01395cbcdf9626bc03e24f779434178a73a0b4bad62ed000000691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae4603010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20200000000000000000000
test_multi_protocol:740bae0c00000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb110000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf0000000000000000000000000000000000000000000000000000000000000684d7e5c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006825f864000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000041feb3be192e9ce02a58daeb6787e0f5a4069e44b8683e31de9eb7cdcf809adb6e667f573e1aaab6b091ab1bf5b64adc8b9df6a5193b98768de8dd93a77ee5ae181c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021400525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000071c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d013950100681d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae46030100013ede3eca2a72b3aecc820e955b36f38437d013950072a0cb889707d426a7a386870a03bc70d1b069759800013ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006df62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000 test_multi_protocol:51bcc7b600000000000000000000000000000000000000000000005150ae84a8cdf000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2958f36da71a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000005150ae84a8cdf0000000000000000000000000000000000000000000000000000000000000684eed6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d01395000000000000000000000000000000000000000000000000000000006827677000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000415d142a1f86e6baa6613d0c8a18d8882027cbeee05c02654ca66fcaaff9cba33f0d17c80da2eaf4084cbe19ea63cca2b453a2c8d46c17cc9f8d3a417a78c534901b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021400525615deb798bb3e4dfa0139dfa1b3d433cc23b72f6b175474e89094c44da98b954eedeac495271d0fa478c2975ab1ea89e8196811f51a7b7ade33eb113ede3eca2a72b3aecc820e955b36f38437d0139501000072c7183455a4c133ae270771860664b6b7ec320bb1c02aaa39b223fe8d0a0e5c4f27ead9083c756cc22260fac5e5542a773aa44fbcfedf7c193bc2c599a6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e3ede3eca2a72b3aecc820e955b36f38437d01395010200691d1499e622d69689cdf9004d05ec547d650ff2112260fac5e5542a773aa44fbcfedf7c193bc2c599dac17f958d2ee523a2206206994597c13d831ec7d51a44d3fae010294c616388b506acda1bfaae46030100013ede3eca2a72b3aecc820e955b36f38437d01395020071a0cb889707d426a7a386870a03bc70d1b0697598013ede3eca2a72b3aecc820e955b36f38437d01395dac17f958d2ee523a2206206994597c13d831ec7a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001a36e2eb1c43200000032006cf62849f9a0b5bf2913b396098f7c7019b51a820aa0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc20000000000000000000000000000000000000000000bb800003c000000000000000000000000
test_encode_balancer_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2ba100000625a3754423978a60c9317c58a424e3d5c6ee304399dbdb9c8ef030ab642b10820db8f560002000000000000000000141d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e01 test_encode_balancer_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2ba100000625a3754423978a60c9317c58a424e3d5c6ee304399dbdb9c8ef030ab642b10820db8f560002000000000000000000141d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0102
test_ekubo_encode_swap_multi:0001ca4f73fe97d0b987a0d12b39bbd562c779bab6f60000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000001a36e2eb1c43200000032 test_ekubo_encode_swap_multi:01ca4f73fe97d0b987a0d12b39bbd562c779bab6f60000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4851d02a5948496a67827242eabc5725531342527c000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000001a36e2eb1c43200000032
test_encode_uniswap_v4_sequential_swap:4c9edd5852cd905f086c759e8383e09bff1e68b32260fac5e5542a773aa44fbcfedf7c193bc2c599010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec70000640000012260fac5e5542a773aa44fbcfedf7c193bc2c599000bb800003c test_encode_uniswap_v4_sequential_swap:4c9edd5852cd905f086c759e8383e09bff1e68b32260fac5e5542a773aa44fbcfedf7c193bc2c5990101cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec70000640000012260fac5e5542a773aa44fbcfedf7c193bc2c599000bb800003c
test_encode_uniswap_v4_simple_swap:4c9edd5852cd905f086c759e8383e09bff1e68b3dac17f958d2ee523a2206206994597c13d831ec7010001cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec7000064000001 test_encode_uniswap_v4_simple_swap:4c9edd5852cd905f086c759e8383e09bff1e68b3dac17f958d2ee523a2206206994597c13d831ec70101cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2dac17f958d2ee523a2206206994597c13d831ec7000064000001
test_single_encoding_strategy_maverick:cc60c6230000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000040d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000014cf6d2fe3e1b326114b07d22a6f6bb59e346c6700000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000051a4ad4f68d0b91cfd19687c881e50f3a00242828c40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c67cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000 test_single_encoding_strategy_maverick:20144a070000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000040d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000051a4ad4f68d0b91cfd19687c881e50f3a00242828c40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c67cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc200000000000000000000000000000000
test_encode_maverick_v2:40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e01 test_encode_maverick_v2:40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f14cf6d2fe3e1b326114b07d22a6f6bb59e346c671d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e01
test_encode_uniswap_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb111d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0001 test_encode_uniswap_v2:c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a478c2975ab1ea89e8196811f51a7b7ade33eb111d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e0001

View File

@@ -1,6 +1,6 @@
use std::{collections::HashSet, str::FromStr}; use std::{collections::HashSet, str::FromStr};
use alloy_primitives::{aliases::U24, Address, U256, U8}; use alloy_primitives::{aliases::U24, U256, U8};
use alloy_sol_types::SolValue; use alloy_sol_types::SolValue;
use tycho_common::Bytes; use tycho_common::Bytes;
@@ -8,7 +8,6 @@ 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},
@@ -52,12 +51,11 @@ impl SingleSwapStrategyEncoder {
token_in_already_in_router: bool, token_in_already_in_router: bool,
) -> Result<Self, EncodingError> { ) -> Result<Self, EncodingError> {
let (permit2, selector) = if let Some(swapper_pk) = swapper_pk { let (permit2, selector) = if let Some(swapper_pk) = swapper_pk {
(Some(Permit2::new(swapper_pk, chain.clone())?), "singleSwapPermit2(uint256,address,address,uint256,bool,bool,address,bool,address,((address,uint160,uint48,uint48),address,uint256),bytes,bytes)".to_string()) (Some(Permit2::new(swapper_pk, chain.clone())?), "singleSwapPermit2(uint256,address,address,uint256,bool,bool,address,((address,uint160,uint48,uint48),address,uint256),bytes,bytes)".to_string())
} else { } else {
( (
None, None,
"singleSwap(uint256,address,address,uint256,bool,bool,address,bool,address,bytes)" "singleSwap(uint256,address,address,uint256,bool,bool,address,bytes)".to_string(),
.to_string(),
) )
}; };
Ok(Self { Ok(Self {
@@ -125,17 +123,16 @@ 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 (mut transfer_from_needed, mut token_in_receiver, transfer_needed) = self let transfer = self
.transfer_optimization .transfer_optimization
.get_transfers(grouped_swap.clone(), wrap); .get_transfers(grouped_swap.clone(), solution.given_token.clone(), wrap, 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_from_needed, transfer,
transfer_needed,
}; };
let mut grouped_protocol_data: Vec<u8> = vec![]; let mut grouped_protocol_data: Vec<u8> = vec![];
@@ -149,21 +146,7 @@ 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_needed = false;
token_in_receiver = Address::ZERO.to_string();
}
let token_in_receiver = Address::from_str(&token_in_receiver).map_err(|_| {
EncodingError::FatalError(format!(
"Invalid funds receiver address: {token_in_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,
@@ -179,8 +162,6 @@ impl StrategyEncoder for SingleSwapStrategyEncoder {
wrap, wrap,
unwrap, unwrap,
bytes_to_address(&solution.receiver)?, bytes_to_address(&solution.receiver)?,
transfer_from_needed,
token_in_receiver,
permit, permit,
signature.as_bytes().to_vec(), signature.as_bytes().to_vec(),
swap_data, swap_data,
@@ -195,8 +176,6 @@ impl StrategyEncoder for SingleSwapStrategyEncoder {
wrap, wrap,
unwrap, unwrap,
bytes_to_address(&solution.receiver)?, bytes_to_address(&solution.receiver)?,
transfer_from_needed,
token_in_receiver,
swap_data, swap_data,
) )
.abi_encode() .abi_encode()
@@ -250,11 +229,11 @@ impl SequentialSwapStrategyEncoder {
token_in_already_in_router: bool, token_in_already_in_router: bool,
) -> Result<Self, EncodingError> { ) -> Result<Self, EncodingError> {
let (permit2, selector) = if let Some(swapper_pk) = swapper_pk { let (permit2, selector) = if let Some(swapper_pk) = swapper_pk {
(Some(Permit2::new(swapper_pk, chain.clone())?), "sequentialSwapPermit2(uint256,address,address,uint256,bool,bool,address,bool,address,((address,uint160,uint48,uint48),address,uint256),bytes,bytes)".to_string()) (Some(Permit2::new(swapper_pk, chain.clone())?), "sequentialSwapPermit2(uint256,address,address,uint256,bool,bool,address,((address,uint160,uint48,uint48),address,uint256),bytes,bytes)".to_string())
} else { } else {
( (
None, None,
"sequentialSwap(uint256,address,address,uint256,bool,bool,address,bool,address,bytes)" "sequentialSwap(uint256,address,address,uint256,bool,bool,address,bytes)"
.to_string(), .to_string(),
) )
}; };
@@ -309,9 +288,6 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
NativeAction::Unwrap => unwrap = true, NativeAction::Unwrap => unwrap = true,
} }
} }
let (mut transfer_from_needed, mut token_in_receiver, transfer_needed) = 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;
@@ -332,20 +308,21 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
.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 in_between_transfer = if i == 0 { let transfer = self
transfer_needed .transfer_optimization
} else { .get_transfers(
self.transfer_optimization grouped_swap.clone(),
.get_in_between_transfer(&protocol, in_between_swap_optimization_allowed) solution.given_token.clone(),
}; wrap,
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_from_needed: if i == 0 { transfer_from_needed } else { false }, transfer,
transfer_needed: in_between_transfer,
}; };
let mut grouped_protocol_data: Vec<u8> = vec![]; let mut grouped_protocol_data: Vec<u8> = vec![];
@@ -364,21 +341,6 @@ 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_needed = false;
token_in_receiver = Address::ZERO.to_string();
}
let token_in_receiver = Address::from_str(&token_in_receiver).map_err(|_| {
EncodingError::FatalError(format!(
"Invalid funds receiver address: {token_in_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(
@@ -395,8 +357,6 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
wrap, wrap,
unwrap, unwrap,
bytes_to_address(&solution.receiver)?, bytes_to_address(&solution.receiver)?,
transfer_from_needed,
token_in_receiver,
permit, permit,
signature.as_bytes().to_vec(), signature.as_bytes().to_vec(),
encoded_swaps, encoded_swaps,
@@ -411,8 +371,6 @@ impl StrategyEncoder for SequentialSwapStrategyEncoder {
wrap, wrap,
unwrap, unwrap,
bytes_to_address(&solution.receiver)?, bytes_to_address(&solution.receiver)?,
transfer_from_needed,
token_in_receiver,
encoded_swaps, encoded_swaps,
) )
.abi_encode() .abi_encode()
@@ -466,11 +424,11 @@ impl SplitSwapStrategyEncoder {
token_in_already_in_router: bool, token_in_already_in_router: bool,
) -> Result<Self, EncodingError> { ) -> Result<Self, EncodingError> {
let (permit2, selector) = if let Some(swapper_pk) = swapper_pk { let (permit2, selector) = if let Some(swapper_pk) = swapper_pk {
(Some(Permit2::new(swapper_pk, chain.clone())?), "splitSwapPermit2(uint256,address,address,uint256,bool,bool,uint256,address,bool,((address,uint160,uint48,uint48),address,uint256),bytes,bytes)".to_string()) (Some(Permit2::new(swapper_pk, chain.clone())?), "splitSwapPermit2(uint256,address,address,uint256,bool,bool,uint256,address,((address,uint160,uint48,uint48),address,uint256),bytes,bytes)".to_string())
} else { } else {
( (
None, None,
"splitSwap(uint256,address,address,uint256,bool,bool,uint256,address,bool,bytes)" "splitSwap(uint256,address,address,uint256,bool,bool,uint256,address,bytes)"
.to_string(), .to_string(),
) )
}; };
@@ -574,9 +532,6 @@ impl StrategyEncoder for SplitSwapStrategyEncoder {
tokens.push(solution.checked_token.clone()); tokens.push(solution.checked_token.clone());
} }
let (transfer_from_needed, _token_in_receiver, _transfer_needed) = self
.transfer_optimization
.get_transfers(grouped_swaps[0].clone(), wrap);
let mut swaps = vec![]; let mut swaps = vec![];
for grouped_swap in grouped_swaps.iter() { for grouped_swap in grouped_swaps.iter() {
let protocol = grouped_swap.protocol_system.clone(); let protocol = grouped_swap.protocol_system.clone();
@@ -593,17 +548,16 @@ impl StrategyEncoder for SplitSwapStrategyEncoder {
} else { } else {
self.router_address.clone() self.router_address.clone()
}; };
let transfer_needed = self let transfer = self
.transfer_optimization .transfer_optimization
.get_in_between_transfer(&protocol, false); .get_transfers(grouped_swap.clone(), solution.given_token.clone(), wrap, 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_from_needed: false, transfer,
transfer_needed,
}; };
let mut grouped_protocol_data: Vec<u8> = vec![]; let mut grouped_protocol_data: Vec<u8> = vec![];
@@ -647,7 +601,6 @@ impl StrategyEncoder for SplitSwapStrategyEncoder {
unwrap, unwrap,
U256::from(tokens_len), U256::from(tokens_len),
bytes_to_address(&solution.receiver)?, bytes_to_address(&solution.receiver)?,
transfer_from_needed,
permit, permit,
signature.as_bytes().to_vec(), signature.as_bytes().to_vec(),
encoded_swaps, encoded_swaps,
@@ -663,7 +616,6 @@ impl StrategyEncoder for SplitSwapStrategyEncoder {
unwrap, unwrap,
U256::from(tokens_len), U256::from(tokens_len),
bytes_to_address(&solution.receiver)?, bytes_to_address(&solution.receiver)?,
transfer_from_needed,
encoded_swaps, encoded_swaps,
) )
.abi_encode() .abi_encode()
@@ -792,7 +744,7 @@ mod tests {
.unwrap(); .unwrap();
let expected_min_amount_encoded = hex::encode(U256::abi_encode(&expected_min_amount)); let expected_min_amount_encoded = hex::encode(U256::abi_encode(&expected_min_amount));
let expected_input = [ let expected_input = [
"a93aabdf", // Function selector "30ace1b1", // Function selector
"0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in "0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in
"000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in "000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in
"0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", // token out "0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", // token out
@@ -800,8 +752,6 @@ mod tests {
"0000000000000000000000000000000000000000000000000000000000000000", // wrap "0000000000000000000000000000000000000000000000000000000000000000", // wrap
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap "0000000000000000000000000000000000000000000000000000000000000000", // unwrap
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"0000000000000000000000000000000000000000000000000000000000000001", // transfer from
"000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11", // funds receiver
] ]
.join(""); .join("");
@@ -817,13 +767,13 @@ mod tests {
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id "a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"00", // zero2one "00", // zero2one
"00", // transfer false "00", // transfer type TransferFrom
"0000000000000000000000000000", // padding "0000000000000000000000000000", // padding
)); ));
let hex_calldata = encode(&calldata); let hex_calldata = encode(&calldata);
assert_eq!(hex_calldata[..584], expected_input); assert_eq!(hex_calldata[..456], expected_input);
assert_eq!(hex_calldata[1352..], expected_swap); assert_eq!(hex_calldata[1224..], 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(
@@ -884,7 +834,7 @@ mod tests {
.unwrap(); .unwrap();
let expected_min_amount_encoded = hex::encode(U256::abi_encode(&expected_min_amount)); let expected_min_amount_encoded = hex::encode(U256::abi_encode(&expected_min_amount));
let expected_input = [ let expected_input = [
"cc60c623", // Function selector "20144a07", // Function selector
"0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in "0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in
"000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in "000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in
"0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", // token out "0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", // token out
@@ -892,9 +842,7 @@ mod tests {
"0000000000000000000000000000000000000000000000000000000000000000", // wrap "0000000000000000000000000000000000000000000000000000000000000000", // wrap
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap "0000000000000000000000000000000000000000000000000000000000000000", // unwrap
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"0000000000000000000000000000000000000000000000000000000000000001", // transfer from "0000000000000000000000000000000000000000000000000000000000000100", // offset of swap bytes
"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
@@ -903,7 +851,7 @@ mod tests {
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id "a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"00", // zero2one "00", // zero2one
"00", // transfer false "00", // transfer type TransferFrom
"0000000000000000000000000000", // padding "0000000000000000000000000000", // padding
] ]
.join(""); .join("");
@@ -968,7 +916,7 @@ mod tests {
.unwrap(); .unwrap();
let expected_min_amount_encoded = hex::encode(U256::abi_encode(&expected_min_amount)); let expected_min_amount_encoded = hex::encode(U256::abi_encode(&expected_min_amount));
let expected_input = [ let expected_input = [
"cc60c623", // Function selector "20144a07", // Function selector
"0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in "0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in
"000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in "000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in
"0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", // token out "0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", // token out
@@ -976,9 +924,7 @@ mod tests {
"0000000000000000000000000000000000000000000000000000000000000000", // wrap "0000000000000000000000000000000000000000000000000000000000000000", // wrap
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap "0000000000000000000000000000000000000000000000000000000000000000", // unwrap
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"0000000000000000000000000000000000000000000000000000000000000000", // transfer from "0000000000000000000000000000000000000000000000000000000000000100", // offset of swap bytes
"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
@@ -987,7 +933,7 @@ mod tests {
"a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id "a478c2975ab1ea89e8196811f51a7b7ade33eb11", // component id
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"00", // zero2one "00", // zero2one
"01", // transfer true "01", // transfer type Transfer
"0000000000000000000000000000", // padding "0000000000000000000000000000", // padding
] ]
.join(""); .join("");
@@ -1240,7 +1186,7 @@ mod tests {
let hex_calldata = encode(&calldata); let hex_calldata = encode(&calldata);
let expected = String::from(concat!( let expected = String::from(concat!(
"59e3efbb", /* function selector */ "e8a980d7", /* function selector */
"0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in "0000000000000000000000000000000000000000000000000de0b6b3a7640000", // amount in
"000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in "000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token ou "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token ou
@@ -1248,9 +1194,7 @@ mod tests {
"0000000000000000000000000000000000000000000000000000000000000000", // wrap "0000000000000000000000000000000000000000000000000000000000000000", // wrap
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap "0000000000000000000000000000000000000000000000000000000000000000", // unwrap
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"0000000000000000000000000000000000000000000000000000000000000001", /* transfer from */ "0000000000000000000000000000000000000000000000000000000000000100", /* length ple
"000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940", /* funds receiver */
"0000000000000000000000000000000000000000000000000000000000000140", /* length ple
* encode */ * encode */
"00000000000000000000000000000000000000000000000000000000000000a8", "00000000000000000000000000000000000000000000000000000000000000a8",
// swap 1 // swap 1
@@ -1260,7 +1204,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
"00", // transfer false "00", // transfer type TransferFrom
// swap 2 // swap 2
"0052", // swap length "0052", // swap length
"5615deb798bb3e4dfa0139dfa1b3d433cc23b72f", // executor address "5615deb798bb3e4dfa0139dfa1b3d433cc23b72f", // executor address
@@ -1268,7 +1212,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
"00", // transfer false "02", // transfer type None
"000000000000000000000000000000000000000000000000", // padding "000000000000000000000000000000000000000000000000", // padding
)); ));
@@ -1366,7 +1310,7 @@ mod tests {
.unwrap(); .unwrap();
let hex_calldata = hex::encode(&calldata); let hex_calldata = hex::encode(&calldata);
let expected_input = [ let expected_input = [
"740bae0c", // selector "51bcc7b6", // selector
"0000000000000000000000000000000000000000000000000000000005f5e100", // given amount "0000000000000000000000000000000000000000000000000000000005f5e100", // given amount
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // given token "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // given token
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // checked token "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // checked token
@@ -1374,14 +1318,12 @@ 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 = [
"00000000000000000000000000000000000000000000000000000000000000d8", // length of ple encoded swaps without padding "00000000000000000000000000000000000000000000000000000000000000d6", // length of ple encoded swaps without padding
"006a", // ple encoded swaps "0069", // ple encoded swaps
"2e234dae75c793f67a35089c9d99245e1c58470b", // executor address "2e234dae75c793f67a35089c9d99245e1c58470b", // executor address
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token in "a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token in
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token out "c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token out
@@ -1389,9 +1331,8 @@ mod tests {
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver "3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id "88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
"01", // zero2one "01", // zero2one
"01", // transfer from true "00", // transfer type TransferFrom
"00", // transfer false "0069", // ple encoded swaps
"006a", // ple encoded swaps
"2e234dae75c793f67a35089c9d99245e1c58470b", // executor address "2e234dae75c793f67a35089c9d99245e1c58470b", // executor address
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in "c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // token in
"a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token out "a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token out
@@ -1399,14 +1340,13 @@ mod tests {
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id "8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
"00", // zero2one "00", // zero2one
"00", // transfer from false "01", // transfer type Transfer
"01", // transfer true "00000000000000000000", // padding
"0000000000000000", // padding
] ]
.join(""); .join("");
assert_eq!(hex_calldata[..584], expected_input); assert_eq!(hex_calldata[..456], expected_input);
assert_eq!(hex_calldata[1352..], expected_swaps); assert_eq!(hex_calldata[1224..], 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());
} }
@@ -2083,7 +2023,7 @@ mod tests {
let hex_calldata = hex::encode(&calldata); let hex_calldata = hex::encode(&calldata);
let expected_input = [ let expected_input = [
"308f3ce0", // selector "7c553846", // selector
"0000000000000000000000000000000000000000000000000000000005f5e100", // given amount "0000000000000000000000000000000000000000000000000000000005f5e100", // given amount
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // given token "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // given token
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // checked token "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // checked token
@@ -2092,12 +2032,11 @@ mod tests {
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap action "0000000000000000000000000000000000000000000000000000000000000000", // unwrap action
"0000000000000000000000000000000000000000000000000000000000000002", // tokens length "0000000000000000000000000000000000000000000000000000000000000002", // tokens length
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"0000000000000000000000000000000000000000000000000000000000000001", // transfer from
] ]
.join(""); .join("");
let expected_swaps = [ let expected_swaps = [
"000000000000000000000000000000000000000000000000000000000000013b", // length of ple encoded swaps without padding "0000000000000000000000000000000000000000000000000000000000000139", // length of ple encoded swaps without padding
"006f", // ple encoded swaps "006e", // ple encoded swaps
"00", // token in index "00", // token in index
"01", // token out index "01", // token out index
"999999", // split "999999", // split
@@ -2108,9 +2047,8 @@ mod tests {
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver "3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id "88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
"01", // zero2one "01", // zero2one
"00", // transfer from false "00", // transfer type TransferFrom
"01", // transfer true "006e", // ple encoded swaps
"006f", // ple encoded swaps
"00", // token in index "00", // token in index
"01", // token out index "01", // token out index
"000000", // split "000000", // split
@@ -2121,8 +2059,7 @@ mod tests {
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver "3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id "8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
"01", // zero2one "01", // zero2one
"00", // transfer from false "00", // transfer type TransferFrom
"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
@@ -2132,12 +2069,12 @@ mod tests {
"b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id, "b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id,
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"00", // zero2one "00", // zero2one
"01", // transfer true "01", // transfer type Transfer
"0000000000" // padding "00000000000000" // padding
] ]
.join(""); .join("");
assert_eq!(hex_calldata[..584], expected_input); assert_eq!(hex_calldata[..520], expected_input);
assert_eq!(hex_calldata[1352..], expected_swaps); assert_eq!(hex_calldata[1288..], expected_swaps);
write_calldata_to_file("test_split_input_cyclic_swap", hex_calldata.as_str()); write_calldata_to_file("test_split_input_cyclic_swap", hex_calldata.as_str());
} }
@@ -2249,7 +2186,7 @@ mod tests {
let hex_calldata = hex::encode(&calldata); let hex_calldata = hex::encode(&calldata);
let expected_input = [ let expected_input = [
"308f3ce0", // selector "7c553846", // selector
"0000000000000000000000000000000000000000000000000000000005f5e100", // given amount "0000000000000000000000000000000000000000000000000000000005f5e100", // given amount
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // given token "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // given token
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // checked token "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // checked token
@@ -2258,12 +2195,11 @@ mod tests {
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap action "0000000000000000000000000000000000000000000000000000000000000000", // unwrap action
"0000000000000000000000000000000000000000000000000000000000000002", // tokens length "0000000000000000000000000000000000000000000000000000000000000002", // tokens length
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"0000000000000000000000000000000000000000000000000000000000000001", // transfer from
] ]
.join(""); .join("");
let expected_swaps = [ let expected_swaps = [
"000000000000000000000000000000000000000000000000000000000000013b", // length of ple encoded swaps without padding "0000000000000000000000000000000000000000000000000000000000000139", // 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
@@ -2273,8 +2209,8 @@ mod tests {
"b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id "b4e16d0168e52d35cacd2c6185b44281ec28c9dc", // component id
"3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver "3ede3eca2a72b3aecc820e955b36f38437d01395", // receiver
"01", // zero2one "01", // zero2one
"01", // transfer true "00", // transfer type TransferFrom
"006f", // ple encoded swaps "006e", // ple encoded swaps
"01", // token in index "01", // token in index
"00", // token out index "00", // token out index
"999999", // split "999999", // split
@@ -2285,9 +2221,8 @@ mod tests {
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id "88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", // component id
"00", // zero2one "00", // zero2one
"00", // transfer from false "01", // transfer type Transfer
"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
"000000", // split "000000", // split
@@ -2298,14 +2233,13 @@ mod tests {
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id "8ad599c3a0ff1de082011efddc58f1908eb6e6d8", // component id
"00", // zero2one "00", // zero2one
"00", // transfer from false "01", // transfer type Transfer
"01", // transfer true "00000000000000" // padding
"0000000000" // padding
] ]
.join(""); .join("");
assert_eq!(hex_calldata[..584], expected_input); assert_eq!(hex_calldata[..520], expected_input);
assert_eq!(hex_calldata[1352..], expected_swaps); assert_eq!(hex_calldata[1288..], expected_swaps);
write_calldata_to_file("test_split_output_cyclic_swap", hex_calldata.as_str()); write_calldata_to_file("test_split_output_cyclic_swap", hex_calldata.as_str());
} }
} }
@@ -2653,7 +2587,7 @@ mod tests {
.unwrap(); .unwrap();
let expected_input = [ let expected_input = [
"a93aabdf", // Function selector (single swap) "30ace1b1", // Function selector (single swap)
"000000000000000000000000000000000000000000000000000000003b9aca00", // amount in "000000000000000000000000000000000000000000000000000000003b9aca00", // amount in
"000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token in "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // token in
"0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933", // token out "0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933", // token out
@@ -2661,8 +2595,6 @@ mod tests {
"0000000000000000000000000000000000000000000000000000000000000000", // wrap "0000000000000000000000000000000000000000000000000000000000000000", // wrap
"0000000000000000000000000000000000000000000000000000000000000000", // unwrap "0000000000000000000000000000000000000000000000000000000000000000", // unwrap
"000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
"0000000000000000000000000000000000000000000000000000000000000000", // transfer from
"0000000000000000000000000000000000000000000000000000000000000000", // funds receiver
] ]
.join(""); .join("");
@@ -2671,15 +2603,14 @@ 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
"0000000000000000000000000000000000000000000000000000000000000087", "0000000000000000000000000000000000000000000000000000000000000086",
// 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
"01", // transfer from true "00", // transfer type TransferFrom
"00", // transfer false
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", // receiver
// First pool params // First pool params
"0000000000000000000000000000000000000000", // intermediary token (ETH) "0000000000000000000000000000000000000000", // intermediary token (ETH)
@@ -2689,13 +2620,13 @@ mod tests {
"6982508145454ce325ddbe47a25d4ec3d2311933", // intermediary token (PEPE) "6982508145454ce325ddbe47a25d4ec3d2311933", // intermediary token (PEPE)
"0061a8", // fee "0061a8", // fee
"0001f4", // tick spacing "0001f4", // tick spacing
"00000000000000000000000000000000000000000000000000" // padding "0000000000000000000000000000000000000000000000000000" // padding
)); ));
let hex_calldata = encode(&calldata); let hex_calldata = encode(&calldata);
assert_eq!(hex_calldata[..584], expected_input); assert_eq!(hex_calldata[..456], expected_input);
assert_eq!(hex_calldata[1352..], expected_swaps); assert_eq!(hex_calldata[1224..], 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(),

View File

@@ -8,6 +8,7 @@ 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.
@@ -34,54 +35,47 @@ impl TransferOptimization {
} }
} }
/// Returns the information about the necessary transfers. /// Returns the transfer type that should be used for the first transfer.
/// Returns (bool, String, bool) where: pub fn get_transfers(
/// * bool: true if a transfer from the user is needed, false otherwise (it might use regular &self,
/// approvals or permit2) swap: SwapGroup,
/// * String: the address to transfer from (if not needed it's the zero address) given_token: Bytes,
/// * bool: true if the tokens are already in the router and there only needs to be a transfer wrap: bool,
/// from the router into the pool in_between_swap_optimization: bool,
pub fn get_transfers(&self, swap: SwapGroup, wrap: bool) -> (bool, String, bool) { ) -> TransferType {
let zero_address = Bytes::from([0u8; 20]).to_string(); let is_first_swap = swap.token_in == given_token;
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());
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.
(false, zero_address, false) TransferType::None
} 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 just do a normal transfer. // Wrapping already happened in the router so, we just do a normal transfer.
(false, zero_address, true) TransferType::Transfer
} else if in_transfer_required { } else if is_first_swap {
if self.token_in_already_in_router { if in_transfer_required {
// Transfer from router to pool. if self.token_in_already_in_router {
(false, zero_address, true) // Transfer from router to pool.
TransferType::Transfer
} else {
// Transfer from swapper to pool
TransferType::TransferFrom
}
// in transfer is not necessary for these protocols. Only make a transfer from the
// swapper to the router if the tokens are not already in the router
} else if !self.token_in_already_in_router {
// Transfer from swapper to router using.
TransferType::TransferFrom
} else { } else {
// Transfer from swapper to pool TransferType::None
(true, swap.swaps[0].component.id.clone(), false)
} }
// in transfer is not necessary for these protocols. Only make a transfer from the swapper // all other swaps that not the first one
// to the router if the tokens are not already in the router } else if !in_transfer_required || in_between_swap_optimization {
} else if !self.token_in_already_in_router {
// Transfer from swapper to router using.
(true, self.router_address.to_string(), false)
} else {
(false, zero_address, false)
}
}
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
false TransferType::None
} else { } else {
true TransferType::Transfer
} }
} }
@@ -149,31 +143,35 @@ mod tests {
Bytes::from("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f") Bytes::from("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f")
} }
fn zero_address() -> String {
Bytes::from([0u8; 20]).to_string()
}
#[rstest] #[rstest]
// First swap tests
// WETH -(univ2)-> DAI we expect a transfer from the user to the protocol // WETH -(univ2)-> DAI we expect a transfer from the user to the protocol
#[case(weth(), "uniswap_v2".to_string(), false, false, true, "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11", false)] #[case(weth(), weth(), "uniswap_v2".to_string(), false, false,false, TransferType::TransferFrom)]
// Native token swap. No transfer is needed // Native token swap. No transfer is needed
#[case(eth(), "uniswap_v2".to_string(),false, false, false, zero_address(), false)] #[case(eth(), eth(), "uniswap_v2".to_string(),false, false,false, TransferType::None)]
// ETH -(wrap)-> WETH -(univ2)-> DAI. Only a transfer from the router into the protocol is // ETH -(wrap)-> WETH -(univ2)-> DAI. Only a transfer from the router into the protocol is
// needed // needed
#[case(weth(), "uniswap_v2".to_string(),true, false, false, zero_address(), true)] #[case(eth(), weth(), "uniswap_v2".to_string(),true, false,false,TransferType::Transfer)]
// USDC -(univ2)-> DAI and the tokens are already in the router. Only a transfer from the router // USDC -(univ2)-> DAI and the tokens are already in the router. Only a transfer from the router
// to the protocol is needed // to the protocol is needed
#[case(usdc(), "uniswap_v2".to_string(),false, true, false, zero_address(), true)] #[case(usdc(), usdc(), "uniswap_v2".to_string(),false, true,false, TransferType::Transfer)]
// USDC -(curve)-> DAI and the tokens are already in the router. No transfer is needed // 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)] #[case(usdc(), usdc(), "vm:curve".to_string(),false, true, false,TransferType::None)]
// other swaps tests
// tokens need to be transferred into the pool
#[case(weth(), usdc(), "uniswap_v2".to_string(), false, false,false, TransferType::Transfer)]
// tokens are already in the pool (optimization)
#[case(weth(), usdc(), "uniswap_v2".to_string(), false, false, true, TransferType::None)]
// tokens are already in the router and don't need a transfer
#[case(weth(), usdc(), "vm:curve".to_string(), false, false, false, TransferType::None)]
fn test_get_transfers( fn test_get_transfers(
#[case] token_in: Bytes, #[case] given_token: Bytes,
#[case] swap_token_in: Bytes,
#[case] protocol: String, #[case] protocol: String,
#[case] wrap: bool, #[case] wrap: bool,
#[case] token_in_already_in_router: bool, #[case] token_in_already_in_router: bool,
#[case] expected_transfer_from: bool, #[case] in_between_swap_optimization: bool,
#[case] expected_receiver: String, #[case] expected_transfer: TransferType,
#[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 swaps = vec![Swap { let swaps = vec![Swap {
@@ -182,34 +180,25 @@ mod tests {
id: "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11".to_string(), id: "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11".to_string(),
..Default::default() ..Default::default()
}, },
token_in: token_in.clone(), token_in: swap_token_in.clone(),
token_out: dai(), token_out: dai(),
split: 0f64, split: 0f64,
}]; }];
let swap = let swap = SwapGroup {
SwapGroup { protocol_system: protocol, token_in, token_out: dai(), split: 0f64, swaps }; protocol_system: protocol,
token_in: swap_token_in,
token_out: dai(),
split: 0f64,
swaps,
};
let optimization = let optimization =
TransferOptimization::new(eth(), weth(), token_in_already_in_router, router_address()); TransferOptimization::new(eth(), weth(), token_in_already_in_router, router_address());
let (transfer_from, receiver, transfer) = optimization.get_transfers(swap.clone(), wrap); let transfer = optimization.get_transfers(
assert_eq!(transfer_from, expected_transfer_from); swap.clone(),
assert_eq!(receiver, expected_receiver); given_token,
assert_eq!(transfer, expected_transfer); wrap,
} in_between_swap_optimization,
);
#[rstest]
// tokens need to be transferred into the pool
#[case("uniswap_v2", false, true)]
// tokens are already in the pool (optimization)
#[case("uniswap_v2", true, false)]
// tokens are already in the router and don't need a transfer
#[case("vm:curve", false, false)]
fn test_get_in_between_transfers(
#[case] protocol: &str,
#[case] in_between_swap_optimization: bool,
#[case] expected_transfer: bool,
) {
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); assert_eq!(transfer, expected_transfer);
} }

View File

@@ -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_needed, (encoding_context.transfer as u8).to_be_bytes(),
); );
Ok(args.abi_encode_packed()) Ok(args.abi_encode_packed())
@@ -129,8 +129,7 @@ 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_from_needed, (encoding_context.transfer as u8).to_be_bytes(),
encoding_context.transfer_needed,
); );
Ok(args.abi_encode_packed()) Ok(args.abi_encode_packed())
@@ -207,8 +206,7 @@ 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_from_needed, (encoding_context.transfer as u8).to_be_bytes(),
encoding_context.transfer_needed,
bytes_to_address(&encoding_context.receiver)?, bytes_to_address(&encoding_context.receiver)?,
pool_params, pool_params,
); );
@@ -284,6 +282,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 as u8).to_be_bytes(),
); );
Ok(args.abi_encode_packed()) Ok(args.abi_encode_packed())
} }
@@ -345,8 +344,7 @@ 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_from_needed as u8).to_be_bytes()); encoded.extend((encoding_context.transfer as u8).to_be_bytes());
encoded.extend((encoding_context.transfer_needed 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)?);
} }
@@ -578,6 +576,7 @@ impl SwapEncoder for CurveSwapEncoder {
j.to_be_bytes::<1>(), j.to_be_bytes::<1>(),
approval_needed, approval_needed,
bytes_to_address(&encoding_context.receiver)?, bytes_to_address(&encoding_context.receiver)?,
(encoding_context.transfer as u8).to_be_bytes(),
); );
Ok(args.abi_encode_packed()) Ok(args.abi_encode_packed())
@@ -621,7 +620,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_needed, (encoding_context.transfer as u8).to_be_bytes(),
); );
Ok(args.abi_encode_packed()) Ok(args.abi_encode_packed())
} }
@@ -646,7 +645,7 @@ mod tests {
}; };
use super::*; use super::*;
use crate::encoding::evm::utils::write_calldata_to_file; use crate::encoding::{evm::utils::write_calldata_to_file, models::TransferType};
mod uniswap_v2 { mod uniswap_v2 {
use super::*; use super::*;
@@ -671,8 +670,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
let encoder = UniswapV2SwapEncoder::new( let encoder = UniswapV2SwapEncoder::new(
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"), String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
@@ -695,7 +693,7 @@ mod tests {
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e", "1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
// zero for one // zero for one
"00", "00",
// transfer true // transfer type Transfer
"01", "01",
)) ))
); );
@@ -731,8 +729,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
let encoder = UniswapV3SwapEncoder::new( let encoder = UniswapV3SwapEncoder::new(
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"), String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
@@ -759,9 +756,7 @@ mod tests {
"88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", "88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
// zero for one // zero for one
"00", "00",
// transfer from false // transfer type Transfer
"00",
// transfer true
"01", "01",
)) ))
); );
@@ -796,8 +791,7 @@ 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_needed: false, transfer: TransferType::None,
transfer_from_needed: false,
}; };
let encoder = BalancerV2SwapEncoder::new( let encoder = BalancerV2SwapEncoder::new(
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"), String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),
@@ -825,7 +819,9 @@ mod tests {
// receiver // receiver
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e", "1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
// approval needed // approval needed
"01" "01",
// transfer type None
"02"
)) ))
); );
write_calldata_to_file("test_encode_balancer_v2", hex_swap.as_str()); write_calldata_to_file("test_encode_balancer_v2", hex_swap.as_str());
@@ -869,8 +865,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
let encoder = UniswapV4SwapEncoder::new( let encoder = UniswapV4SwapEncoder::new(
String::from("0xF62849F9A0B5Bf2913b396098F7c7019b51A820a"), String::from("0xF62849F9A0B5Bf2913b396098F7c7019b51A820a"),
@@ -892,9 +887,7 @@ mod tests {
"dac17f958d2ee523a2206206994597c13d831ec7", "dac17f958d2ee523a2206206994597c13d831ec7",
// zero for one // zero for one
"01", "01",
// transfer from false // transfer type Transfer
"00",
// transfer true
"01", "01",
// receiver // receiver
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
@@ -943,8 +936,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
let encoder = UniswapV4SwapEncoder::new( let encoder = UniswapV4SwapEncoder::new(
@@ -987,8 +979,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
// Setup - First sequence: USDE -> USDT // Setup - First sequence: USDE -> USDT
@@ -1066,9 +1057,7 @@ mod tests {
"2260fac5e5542a773aa44fbcfedf7c193bc2c599", "2260fac5e5542a773aa44fbcfedf7c193bc2c599",
// zero for one // zero for one
"01", "01",
// transfer from false // transfer type Transfer
"00",
// transfer true
"01", "01",
// receiver // receiver
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",
@@ -1125,8 +1114,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
let encoder = let encoder =
@@ -1142,9 +1130,7 @@ mod tests {
assert_eq!( assert_eq!(
hex_swap, hex_swap,
concat!( concat!(
// transfer from false // transfer type Transfer
"00",
// transfer true
"01", "01",
// receiver // receiver
"ca4f73fe97d0b987a0d12b39bbd562c779bab6f6", "ca4f73fe97d0b987a0d12b39bbd562c779bab6f6",
@@ -1174,8 +1160,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
let first_swap = Swap { let first_swap = Swap {
@@ -1225,9 +1210,7 @@ mod tests {
combined_hex, combined_hex,
// transfer type // transfer type
concat!( concat!(
// transfer from false // transfer type Transfer
"00",
// transfer true
"01", "01",
// receiver // receiver
"ca4f73fe97d0b987a0d12b39bbd562c779bab6f6", "ca4f73fe97d0b987a0d12b39bbd562c779bab6f6",
@@ -1373,8 +1356,7 @@ 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_needed: false, transfer: TransferType::None,
transfer_from_needed: false,
}; };
let encoder = CurveSwapEncoder::new( let encoder = CurveSwapEncoder::new(
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"), String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
@@ -1405,7 +1387,9 @@ mod tests {
// approval needed // approval needed
"01", "01",
// receiver, // receiver,
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e" "1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
// transfer type None
"02",
)) ))
); );
} }
@@ -1442,8 +1426,7 @@ 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_needed: false, transfer: TransferType::None,
transfer_from_needed: false,
}; };
let encoder = CurveSwapEncoder::new( let encoder = CurveSwapEncoder::new(
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"), String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
@@ -1474,7 +1457,9 @@ mod tests {
// approval needed // approval needed
"01", "01",
// receiver // receiver
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e" "1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
// transfer type None
"02",
)) ))
); );
} }
@@ -1512,8 +1497,7 @@ 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_needed: false, transfer: TransferType::None,
transfer_from_needed: false,
}; };
let encoder = CurveSwapEncoder::new( let encoder = CurveSwapEncoder::new(
String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"), String::from("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"),
@@ -1553,7 +1537,9 @@ mod tests {
// approval needed // approval needed
"01", "01",
// receiver // receiver
"1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e" "1d96f2f6bef1202e4ce1ff6dad0c2cb002861d3e",
// transfer type None
"02",
)) ))
); );
} }
@@ -1582,8 +1568,7 @@ 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_needed: true, transfer: TransferType::Transfer,
transfer_from_needed: false,
}; };
let encoder = MaverickV2SwapEncoder::new( let encoder = MaverickV2SwapEncoder::new(
String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"), String::from("0x543778987b293C7E8Cf0722BB2e935ba6f4068D4"),

View File

@@ -6,14 +6,14 @@ use tycho_common::Bytes;
use crate::encoding::{ use crate::encoding::{
errors::EncodingError, errors::EncodingError,
evm::{ evm::{
constants::GROUPABLE_PROTOCOLS, constants::{GROUPABLE_PROTOCOLS, IN_TRANSFER_REQUIRED_PROTOCOLS},
group_swaps::group_swaps, group_swaps::group_swaps,
strategy_encoder::strategy_encoders::{ strategy_encoder::strategy_encoders::{
SequentialSwapStrategyEncoder, SingleSwapStrategyEncoder, SplitSwapStrategyEncoder, SequentialSwapStrategyEncoder, SingleSwapStrategyEncoder, SplitSwapStrategyEncoder,
}, },
swap_encoder::swap_encoder_registry::SwapEncoderRegistry, swap_encoder::swap_encoder_registry::SwapEncoderRegistry,
}, },
models::{Chain, EncodingContext, NativeAction, Solution, Transaction}, models::{Chain, EncodingContext, NativeAction, Solution, Transaction, TransferType},
strategy_encoder::StrategyEncoder, strategy_encoder::StrategyEncoder,
tycho_encoder::TychoEncoder, tycho_encoder::TychoEncoder,
}; };
@@ -273,14 +273,20 @@ impl TychoExecutorEncoder {
let mut grouped_protocol_data: Vec<u8> = vec![]; let mut grouped_protocol_data: Vec<u8> = vec![];
for swap in grouped_swap.swaps.iter() { for swap in grouped_swap.swaps.iter() {
let transfer = if IN_TRANSFER_REQUIRED_PROTOCOLS
.contains(&swap.component.protocol_system.as_str())
{
TransferType::Transfer
} else {
TransferType::None
};
let encoding_context = EncodingContext { let encoding_context = EncodingContext {
receiver: receiver.clone(), receiver: receiver.clone(),
exact_out: solution.exact_out, exact_out: solution.exact_out,
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_needed: true, transfer,
transfer_from_needed: 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);
@@ -462,7 +468,7 @@ mod tests {
Bytes::from_str("0x3ede3eca2a72b3aecc820e955b36f38437d01395").unwrap() Bytes::from_str("0x3ede3eca2a72b3aecc820e955b36f38437d01395").unwrap()
); );
// single swap selector // single swap selector
assert_eq!(&hex::encode(transactions[0].clone().data)[..8], "cc60c623"); assert_eq!(&hex::encode(transactions[0].clone().data)[..8], "20144a07");
} }
#[test] #[test]
@@ -487,7 +493,7 @@ mod tests {
let transactions = transactions.unwrap(); let transactions = transactions.unwrap();
assert_eq!(transactions.len(), 1); assert_eq!(transactions.len(), 1);
// single swap selector // single swap selector
assert_eq!(&hex::encode(transactions[0].clone().data)[..8], "cc60c623"); assert_eq!(&hex::encode(transactions[0].clone().data)[..8], "20144a07");
} }
#[test] #[test]
@@ -534,7 +540,7 @@ mod tests {
assert_eq!(transactions.len(), 1); assert_eq!(transactions.len(), 1);
assert_eq!(transactions[0].value, eth_amount_in); assert_eq!(transactions[0].value, eth_amount_in);
// sequential swap selector // sequential swap selector
assert_eq!(&hex::encode(transactions[0].clone().data)[..8], "59e3efbb"); assert_eq!(&hex::encode(transactions[0].clone().data)[..8], "e8a980d7");
} }
#[test] #[test]
@@ -1148,9 +1154,7 @@ mod tests {
"6982508145454ce325ddbe47a25d4ec3d2311933", "6982508145454ce325ddbe47a25d4ec3d2311933",
// zero for one // zero for one
"00", "00",
// transfer from false // transfer type Transfer
"00",
// transfer true
"01", "01",
// receiver // receiver
"cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2", "cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2",

View File

@@ -106,9 +106,7 @@ pub struct Transaction {
/// 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_needed`: true if the solution requires a transfer from the user to the router /// * `transfer`: Type of transfer to be performed. See `TransferType` for more details.
/// or pool.
/// * `transfer_needed`: 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,
@@ -116,8 +114,22 @@ 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_from_needed: bool, pub transfer: TransferType,
pub transfer_needed: bool, }
/// Represents the type of transfer to be performed into the pool.
///
/// # Fields
///
/// * `Transfer`: Transfer the token from the router into the protocol.
/// * `TransferFrom`: Transfer the token from the sender to the protocol/router.
/// * `None`: No transfer is needed. Tokens are already in the pool.
#[repr(u8)]
#[derive(Clone, Debug, PartialEq)]
pub enum TransferType {
TransferFrom = 0,
Transfer = 1,
None = 2,
} }
#[derive(Clone, PartialEq, Eq, Hash)] #[derive(Clone, PartialEq, Eq, Hash)]