feat: Extend Swap to hold user_data: Option<Bytes>

Took 25 minutes
This commit is contained in:
Diana Carvalho
2025-06-05 15:47:40 +01:00
parent 902c4cd4d2
commit eec50f8822
8 changed files with 142 additions and 4 deletions

View File

@@ -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];

View File

@@ -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![

View File

@@ -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();

View File

@@ -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, &eth, &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, &eth, &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, &eth, &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(

View File

@@ -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,
}],
})
};

View File

@@ -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`

View File

@@ -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);

View File

@@ -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<Bytes>,
}
impl Swap {
@@ -94,8 +96,9 @@ impl Swap {
token_in: Bytes,
token_out: Bytes,
split: f64,
user_data: Option<Bytes>,
) -> 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);
}
}