From eec50f88222adb89154f127a98fd8da380025381 Mon Sep 17 00:00:00 2001 From: Diana Carvalho Date: Thu, 5 Jun 2025 15:47:40 +0100 Subject: [PATCH] feat: Extend Swap to hold user_data: Option Took 25 minutes --- examples/encoding-example/main.rs | 5 ++ src/encoding/evm/group_swaps.rs | 11 +++ .../evm/strategy_encoder/strategy_encoders.rs | 12 +++- .../strategy_encoder/strategy_validators.rs | 21 ++++++ .../transfer_optimizations.rs | 2 + .../evm/swap_encoder/swap_encoders.rs | 15 ++++ src/encoding/evm/tycho_encoders.rs | 69 ++++++++++++++++++- src/encoding/models.rs | 11 ++- 8 files changed, 142 insertions(+), 4 deletions(-) diff --git a/examples/encoding-example/main.rs b/examples/encoding-example/main.rs index ff10123..1eb1f44 100644 --- a/examples/encoding-example/main.rs +++ b/examples/encoding-example/main.rs @@ -42,6 +42,7 @@ fn main() { // Split defines the fraction of the amount to be swapped. A value of 0 indicates 100% of // the amount or the total remaining balance. split: 0f64, + user_data: None, }; // Then we create a solution object with the previous swap @@ -94,6 +95,7 @@ fn main() { token_in: weth.clone(), token_out: dai.clone(), split: 0.5f64, + user_data: None, }; let swap_weth_wbtc = Swap { component: ProtocolComponent { @@ -106,6 +108,7 @@ fn main() { // This represents the remaining 50%, but to avoid any rounding errors we set this to // 0 to signify "the remainder of the WETH value". It should still be very close to 50% split: 0f64, + user_data: None, }; let swap_dai_usdc = Swap { component: ProtocolComponent { @@ -116,6 +119,7 @@ fn main() { token_in: dai.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -126,6 +130,7 @@ fn main() { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let mut complex_solution = solution.clone(); complex_solution.swaps = vec![swap_weth_dai, swap_weth_wbtc, swap_dai_usdc, swap_wbtc_usdc]; diff --git a/src/encoding/evm/group_swaps.rs b/src/encoding/evm/group_swaps.rs index edd7568..4ba6760 100644 --- a/src/encoding/evm/group_swaps.rs +++ b/src/encoding/evm/group_swaps.rs @@ -105,6 +105,7 @@ mod tests { // This represents the remaining 50%, but to avoid any rounding errors we set this to // 0 to signify "the remainder of the WETH value". It should still be very close to 50% split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -114,6 +115,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let swap_usdc_dai = Swap { component: ProtocolComponent { @@ -123,6 +125,7 @@ mod tests { token_in: usdc.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }; let grouped_swaps = group_swaps(vec![ swap_weth_wbtc.clone(), @@ -174,6 +177,7 @@ mod tests { token_in: wbtc.clone(), token_out: weth.clone(), split: 0f64, + user_data: None, }; let swap_weth_usdc = Swap { component: ProtocolComponent { @@ -183,6 +187,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0.5f64, + user_data: None, }; let swap_weth_dai = Swap { component: ProtocolComponent { @@ -194,6 +199,7 @@ mod tests { // This represents the remaining 50%, but to avoid any rounding errors we set this to // 0 to signify "the remainder of the WETH value". It should still be very close to 50% split: 0f64, + user_data: None, }; let swap_dai_usdc = Swap { component: ProtocolComponent { @@ -203,6 +209,7 @@ mod tests { token_in: dai.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let grouped_swaps = group_swaps(vec![ swap_wbtc_weth.clone(), @@ -261,6 +268,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0.5f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -270,6 +278,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let swap_weth_dai = Swap { component: ProtocolComponent { @@ -281,6 +290,7 @@ mod tests { // This represents the remaining 50%, but to avoid any rounding errors we set this to // 0 to signify "the remainder of the WETH value". It should still be very close to 50% split: 0f64, + user_data: None, }; let swap_dai_usdc = Swap { component: ProtocolComponent { @@ -290,6 +300,7 @@ mod tests { token_in: dai.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let grouped_swaps = group_swaps(vec![ diff --git a/src/encoding/evm/strategy_encoder/strategy_encoders.rs b/src/encoding/evm/strategy_encoder/strategy_encoders.rs index 0d97447..20ccd59 100644 --- a/src/encoding/evm/strategy_encoder/strategy_encoders.rs +++ b/src/encoding/evm/strategy_encoder/strategy_encoders.rs @@ -558,6 +558,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }; let swap_encoder_registry = get_swap_encoder_registry(); let encoder = SingleSwapStrategyEncoder::new( @@ -618,6 +619,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }; let swap_encoder_registry = get_swap_encoder_registry(); let encoder = SingleSwapStrategyEncoder::new( @@ -688,6 +690,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -698,6 +701,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let swap_encoder_registry = get_swap_encoder_registry(); let encoder = SequentialSwapStrategyEncoder::new( @@ -789,6 +793,7 @@ mod tests { token_in: usdc.clone(), token_out: weth.clone(), split: 0.6f64, // 60% of input + user_data: None, }; // USDC -> WETH (Pool 2) - 40% of input (remaining) @@ -809,7 +814,8 @@ mod tests { }, token_in: usdc.clone(), token_out: weth.clone(), - split: 0f64, // Remaining 40% + split: 0f64, + user_data: None, // Remaining 40% }; // WETH -> USDC (Pool 2) @@ -831,6 +837,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0.0f64, + user_data: None, }; let swap_encoder_registry = get_swap_encoder_registry(); @@ -938,6 +945,7 @@ mod tests { token_in: usdc.clone(), token_out: weth.clone(), split: 0.0f64, + user_data: None, }; let swap_weth_usdc_v3_pool1 = Swap { @@ -958,6 +966,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0.6f64, + user_data: None, }; let swap_weth_usdc_v3_pool2 = Swap { @@ -978,6 +987,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0.0f64, + user_data: None, }; let swap_encoder_registry = get_swap_encoder_registry(); diff --git a/src/encoding/evm/strategy_encoder/strategy_validators.rs b/src/encoding/evm/strategy_encoder/strategy_validators.rs index b34256e..6350add 100644 --- a/src/encoding/evm/strategy_encoder/strategy_validators.rs +++ b/src/encoding/evm/strategy_encoder/strategy_validators.rs @@ -214,6 +214,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }]; let result = validator.validate_swap_path(&swaps, &weth, &dai, &None, ð, &weth); assert_eq!(result, Ok(())); @@ -236,6 +237,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.5f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -246,6 +248,7 @@ mod tests { token_in: dai.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }, ]; let result = validator.validate_swap_path(&swaps, &weth, &usdc, &None, ð, &weth); @@ -271,6 +274,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.5, + user_data: None, }, // This swap is disconnected from the WETH->DAI path Swap { @@ -282,6 +286,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0.0, + user_data: None, }, ]; let result = @@ -309,6 +314,7 @@ mod tests { token_in: usdc.clone(), token_out: weth.clone(), split: 0f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -319,6 +325,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }, ]; @@ -344,6 +351,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 1.0, + user_data: None, }]; let result = validator.validate_swap_path(&unreachable_swaps, &weth, &usdc, &None, ð, &weth); @@ -382,6 +390,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }]; let result = validator.validate_split_percentages(&swaps); assert_eq!(result, Ok(())); @@ -404,6 +413,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.5, + user_data: None, }, Swap { component: ProtocolComponent { @@ -414,6 +424,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.3, + user_data: None, }, Swap { component: ProtocolComponent { @@ -424,6 +435,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.0, // Remainder (20%) + user_data: None, }, ]; assert!(validator @@ -447,6 +459,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.7, + user_data: None, }, Swap { component: ProtocolComponent { @@ -457,6 +470,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.3, + user_data: None, }, ]; assert!(matches!( @@ -481,6 +495,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.0, + user_data: None, }, Swap { component: ProtocolComponent { @@ -491,6 +506,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.5, + user_data: None, }, ]; assert!(matches!( @@ -515,6 +531,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.6, + user_data: None, }, Swap { component: ProtocolComponent { @@ -525,6 +542,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.5, + user_data: None, }, Swap { component: ProtocolComponent { @@ -535,6 +553,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.0, + user_data: None, }, ]; assert!(matches!( @@ -559,6 +578,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }]; let result = validator.validate_swap_path( @@ -588,6 +608,7 @@ mod tests { token_in: usdc.clone(), token_out: weth.clone(), split: 0f64, + user_data: None, }]; let result = validator.validate_swap_path( diff --git a/src/encoding/evm/strategy_encoder/transfer_optimizations.rs b/src/encoding/evm/strategy_encoder/transfer_optimizations.rs index 6c925b5..d0c6529 100644 --- a/src/encoding/evm/strategy_encoder/transfer_optimizations.rs +++ b/src/encoding/evm/strategy_encoder/transfer_optimizations.rs @@ -178,6 +178,7 @@ mod tests { token_in: swap_token_in.clone(), token_out: dai(), split: 0f64, + user_data: None, }]; let swap = SwapGroup { protocol_system: protocol, @@ -243,6 +244,7 @@ mod tests { token_in: usdc(), token_out: dai(), split: 0f64, + user_data: None, }], }) }; diff --git a/src/encoding/evm/swap_encoder/swap_encoders.rs b/src/encoding/evm/swap_encoder/swap_encoders.rs index 94e2c8f..7d9dff4 100644 --- a/src/encoding/evm/swap_encoder/swap_encoders.rs +++ b/src/encoding/evm/swap_encoder/swap_encoders.rs @@ -601,6 +601,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { receiver: Bytes::from("0x1D96F2f6BeF1202E4Ce1Ff6Dad0c2CB002861d3e"), // BOB @@ -660,6 +661,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { receiver: Bytes::from("0x0000000000000000000000000000000000000001"), @@ -721,6 +723,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { // The receiver was generated with `makeAddr("bob") using forge` @@ -793,6 +796,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { // The receiver is ALICE to match the solidity tests @@ -865,6 +869,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { @@ -961,6 +966,7 @@ mod tests { token_in: usde_address.clone(), token_out: usdt_address.clone(), split: 0f64, + user_data: None, }; let second_swap = Swap { @@ -968,6 +974,7 @@ mod tests { token_in: usdt_address, token_out: wbtc_address.clone(), split: 0f64, + user_data: None, }; let encoder = UniswapV4SwapEncoder::new( @@ -1044,6 +1051,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { @@ -1116,6 +1124,7 @@ mod tests { token_in: group_token_in.clone(), token_out: intermediary_token.clone(), split: 0f64, + user_data: None, }; let second_swap = Swap { @@ -1131,6 +1140,7 @@ mod tests { token_in: intermediary_token.clone(), token_out: group_token_out.clone(), split: 0f64, + user_data: None, }; let first_encoded_swap = encoder @@ -1250,6 +1260,7 @@ mod tests { token_in: Bytes::from(token_in), token_out: Bytes::from(token_out), split: 0f64, + user_data: None, }; let encoder = CurveSwapEncoder::new( String::default(), @@ -1293,6 +1304,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { // The receiver was generated with `makeAddr("bob") using forge` @@ -1364,6 +1376,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { // The receiver was generated with `makeAddr("bob") using forge` @@ -1436,6 +1449,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { // The receiver was generated with `makeAddr("bob") using forge` @@ -1507,6 +1521,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoding_context = EncodingContext { // The receiver was generated with `makeAddr("bob") using forge` diff --git a/src/encoding/evm/tycho_encoders.rs b/src/encoding/evm/tycho_encoders.rs index ab492ae..805bcc4 100644 --- a/src/encoding/evm/tycho_encoders.rs +++ b/src/encoding/evm/tycho_encoders.rs @@ -435,6 +435,7 @@ mod tests { token_in: usdc().clone(), token_out: eth().clone(), split: 0f64, + user_data: None, } } @@ -455,6 +456,7 @@ mod tests { token_in: eth().clone(), token_out: pepe().clone(), split: 0f64, + user_data: None, } } @@ -502,6 +504,7 @@ mod tests { token_in: weth(), token_out: dai(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -566,6 +569,7 @@ mod tests { token_in: weth(), token_out: dai(), split: 0f64, + user_data: None, }; let swap_dai_usdc = Swap { @@ -577,6 +581,7 @@ mod tests { token_in: dai(), token_out: usdc(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -630,6 +635,7 @@ mod tests { token_in: weth(), token_out: dai(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -658,6 +664,7 @@ mod tests { token_in: weth(), token_out: dai(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -691,6 +698,7 @@ mod tests { token_in: eth(), token_out: dai(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -744,6 +752,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -771,6 +780,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -805,6 +815,7 @@ mod tests { token_in: dai(), token_out: eth(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -844,6 +855,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0.5f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -854,6 +866,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -864,6 +877,7 @@ mod tests { token_in: weth(), token_out: dai(), split: 0f64, + user_data: None, }, ]; @@ -896,6 +910,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -906,6 +921,7 @@ mod tests { token_in: weth(), token_out: usdc(), split: 0f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -916,6 +932,7 @@ mod tests { token_in: usdc(), token_out: dai(), split: 0f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -926,6 +943,7 @@ mod tests { token_in: dai(), token_out: wbtc(), split: 0f64, + user_data: None, }, ]; @@ -965,6 +983,7 @@ mod tests { token_in: weth(), token_out: dai(), split: 0f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -975,6 +994,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0.5f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -985,6 +1005,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0f64, + user_data: None, }, ]; @@ -1017,6 +1038,7 @@ mod tests { token_in: weth(), token_out: dai(), split: 0f64, + user_data: None, }, Swap { component: ProtocolComponent { @@ -1027,6 +1049,7 @@ mod tests { token_in: dai(), token_out: weth(), split: 0f64, + user_data: None, }, ]; @@ -1080,6 +1103,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -1139,6 +1163,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let solution = Solution { @@ -1262,6 +1287,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -1352,6 +1378,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -1436,6 +1463,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::None); @@ -1517,6 +1545,7 @@ mod tests { token_in: weth(), token_out: dai.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -1572,6 +1601,7 @@ mod tests { token_in: dai.clone(), token_out: weth(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -1637,6 +1667,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -1647,6 +1678,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -1705,6 +1737,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -1715,6 +1748,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -1817,6 +1851,7 @@ mod tests { token_in: usdc.clone(), token_out: weth.clone(), split: 0f64, + user_data: None, }; // WETH -> USDC (Pool 2) @@ -1838,6 +1873,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -1954,6 +1990,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -1964,6 +2001,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -2035,6 +2073,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -2053,6 +2092,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -2123,6 +2163,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdt = Swap { @@ -2151,6 +2192,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdt.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -2215,6 +2257,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { @@ -2226,6 +2269,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -2293,6 +2337,7 @@ mod tests { token_in: dai.clone(), token_out: weth.clone(), split: 0f64, + user_data: None, }; let balancer_swap_weth_wbtc = Swap { @@ -2306,6 +2351,7 @@ mod tests { token_in: weth.clone(), token_out: wbtc.clone(), split: 0f64, + user_data: None, }; let curve_swap_wbtc_usdt = Swap { @@ -2334,6 +2380,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdt.clone(), split: 0f64, + user_data: None, }; // Ekubo @@ -2355,6 +2402,7 @@ mod tests { token_in: usdt.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; // USV4 @@ -2379,6 +2427,7 @@ mod tests { token_in: usdc.clone(), token_out: eth.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -2455,6 +2504,7 @@ mod tests { token_in: weth.clone(), token_out: dai.clone(), split: 0.5f64, + user_data: None, }; let swap_weth_wbtc = Swap { component: ProtocolComponent { @@ -2468,6 +2518,7 @@ mod tests { // this to 0 to signify "the remainder of the WETH value". // It should still be very close to 50% split: 0f64, + user_data: None, }; let swap_dai_usdc = Swap { component: ProtocolComponent { @@ -2478,6 +2529,7 @@ mod tests { token_in: dai.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let swap_wbtc_usdc = Swap { component: ProtocolComponent { @@ -2488,6 +2540,7 @@ mod tests { token_in: wbtc.clone(), token_out: usdc.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -2556,6 +2609,7 @@ mod tests { token_in: usdc.clone(), token_out: weth.clone(), split: 0.6f64, // 60% of input + user_data: None, }; // USDC -> WETH (Pool 2) - 40% of input (remaining) @@ -2576,7 +2630,8 @@ mod tests { }, token_in: usdc.clone(), token_out: weth.clone(), - split: 0f64, // Remaining 40% + split: 0f64, + user_data: None, // Remaining 40% }; // WETH -> USDC (Pool 2) @@ -2598,6 +2653,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0.0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -2720,6 +2776,7 @@ mod tests { token_in: usdc.clone(), token_out: weth.clone(), split: 0.0f64, + user_data: None, }; let swap_weth_usdc_v3_pool1 = Swap { @@ -2740,6 +2797,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0.6f64, + user_data: None, }; let swap_weth_usdc_v3_pool2 = Swap { @@ -2760,6 +2818,7 @@ mod tests { token_in: weth.clone(), token_out: usdc.clone(), split: 0.0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -2893,6 +2952,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -2948,6 +3008,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -3016,6 +3077,7 @@ mod tests { token_in: eth.clone(), token_out: pepe.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -3086,6 +3148,7 @@ mod tests { token_in: usdc.clone(), token_out: eth.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -3164,6 +3227,7 @@ mod tests { token_in: usdc.clone(), token_out: eth.clone(), split: 0f64, + user_data: None, }; let swap_eth_pepe = Swap { @@ -3177,6 +3241,7 @@ mod tests { token_in: eth.clone(), token_out: pepe.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFromPermit2); @@ -3285,6 +3350,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); @@ -3355,6 +3421,7 @@ mod tests { token_in: token_in.clone(), token_out: token_out.clone(), split: 0f64, + user_data: None, }; let encoder = get_tycho_router_encoder(UserTransferType::TransferFrom); diff --git a/src/encoding/models.rs b/src/encoding/models.rs index b8e03f4..060e828 100644 --- a/src/encoding/models.rs +++ b/src/encoding/models.rs @@ -86,6 +86,8 @@ pub struct Swap { /// Decimal of the amount to be swapped in this operation (for example, 0.5 means 50%) #[serde(default)] pub split: f64, + /// Optional user data to be passed to encoding. + pub user_data: Option, } impl Swap { @@ -94,8 +96,9 @@ impl Swap { token_in: Bytes, token_out: Bytes, split: f64, + user_data: Option, ) -> Self { - Self { component: component.into(), token_in, token_out, split } + Self { component: component.into(), token_in, token_out, split, user_data } } } @@ -295,10 +298,14 @@ mod tests { id: "i-am-an-id".to_string(), protocol_system: "uniswap_v2".to_string(), }; - let swap = Swap::new(component, Bytes::from("0x12"), Bytes::from("34"), 0.5); + let user_data = Some(Bytes::from("0x1234")); + let swap = + Swap::new(component, Bytes::from("0x12"), Bytes::from("34"), 0.5, user_data.clone()); assert_eq!(swap.token_in, Bytes::from("0x12")); assert_eq!(swap.token_out, Bytes::from("0x34")); assert_eq!(swap.component.protocol_system, "uniswap_v2"); assert_eq!(swap.component.id, "i-am-an-id"); + assert_eq!(swap.split, 0.5); + assert_eq!(swap.user_data, user_data); } }