test: add test_split_output_cyclic_swap in encoder, and testCyclicSplitOutputSwapIntegration integration test
This commit is contained in:
@@ -1350,8 +1350,9 @@ contract TychoRouterTest is TychoRouterTestSetup {
|
|||||||
|
|
||||||
vm.stopPrank();
|
vm.stopPrank();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function testCyclicSplitSwapIntegration() public {
|
function testCyclicSplitInputSwapIntegration() public {
|
||||||
deal(USDC_ADDR, ALICE, 100 * 10 ** 6);
|
deal(USDC_ADDR, ALICE, 100 * 10 ** 6);
|
||||||
|
|
||||||
// Approve permit2
|
// Approve permit2
|
||||||
@@ -1370,6 +1371,25 @@ contract TychoRouterTest is TychoRouterTestSetup {
|
|||||||
vm.stopPrank();
|
vm.stopPrank();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testCyclicSplitOutputSwapIntegration() public {
|
||||||
|
deal(USDC_ADDR, ALICE, 100 * 10 ** 6);
|
||||||
|
|
||||||
|
// Approve permit2
|
||||||
|
vm.startPrank(ALICE);
|
||||||
|
IERC20(USDC_ADDR).approve(PERMIT2_ADDRESS, type(uint256).max);
|
||||||
|
// Encoded solution generated using `test_cyclic_split_swap`
|
||||||
|
// but manually replacing the executor address
|
||||||
|
// `dD8559c917393FC8DD2b4dD289c52Ff445fDE1B0` with the one in this test
|
||||||
|
// `2e234DAe75C793f67A35089C9d99245E1C58470b`
|
||||||
|
(bool success,) = tychoRouterAddr.call(
|
||||||
|
hex"d499aa880000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005eea514000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd09f75e2bf2a4d11f3ab23f1389fcc1621c0cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000067f6be9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ede3eca2a72b3aecc820e955b36f38437d013950000000000000000000000000000000000000000000000000000000067cf389c000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000041c02ad8eceede50085f35ce8e8313ebbac9b379396c6e72a35bb4df0970cbdaaa1a91e6f787641af55b13b926199c844df42fdd2ae7bb287db7e5cc2a8bc1d7f51b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136005600010000005615deb798bb3e4dfa0139dfa1b3d433cc23b72fa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48b4e16d0168e52d35cacd2c6185b44281ec28c9dc3ede3eca2a72b3aecc820e955b36f38437d0139501006d01009999992e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f43ede3eca2a72b3aecc820e955b36f38437d0139588e6a0c2ddd26feeb64f039a2c41296fcb3f564000006d01000000002e234dae75c793f67a35089c9d99245e1c58470bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb83ede3eca2a72b3aecc820e955b36f38437d013958ad599c3a0ff1de082011efddc58f1908eb6e6d80000000000000000000000"
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEq(IERC20(USDC_ADDR).balanceOf(ALICE), 99525908);
|
||||||
|
|
||||||
|
vm.stopPrank();
|
||||||
|
}
|
||||||
|
|
||||||
// Base Network Tests
|
// Base Network Tests
|
||||||
// Make sure to set the RPC_URL to base network
|
// Make sure to set the RPC_URL to base network
|
||||||
function testSwapSingleBase() public {
|
function testSwapSingleBase() public {
|
||||||
|
|||||||
@@ -1412,4 +1412,111 @@ mod tests {
|
|||||||
|
|
||||||
println!("{}", hex::encode(&calldata));
|
println!("{}", hex::encode(&calldata));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_split_output_cyclic_swap() {
|
||||||
|
// This test has start and end tokens that are the same
|
||||||
|
// The flow is:
|
||||||
|
// ┌─── (USV3, 60% split) ───┐
|
||||||
|
// │ │
|
||||||
|
// USDC ──(USV2) ── WETH──| ├─> USDC
|
||||||
|
// │ │
|
||||||
|
// └─── WETH (USV3 Pool 2)───┘
|
||||||
|
|
||||||
|
// Set up a mock private key for signing (Alice's pk in our router tests)
|
||||||
|
let private_key =
|
||||||
|
"0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234".to_string();
|
||||||
|
|
||||||
|
let weth = Bytes::from_str("0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2").unwrap();
|
||||||
|
let usdc = Bytes::from_str("0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48").unwrap();
|
||||||
|
|
||||||
|
let swap_usdc_weth_v2 = Swap {
|
||||||
|
component: ProtocolComponent {
|
||||||
|
id: "0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc".to_string(), // USDC-WETH USV2
|
||||||
|
protocol_system: "uniswap_v2".to_string(),
|
||||||
|
static_attributes: {
|
||||||
|
let mut attrs = HashMap::new();
|
||||||
|
attrs.insert(
|
||||||
|
"fee".to_string(),
|
||||||
|
Bytes::from(BigInt::from(500).to_signed_bytes_be()),
|
||||||
|
);
|
||||||
|
attrs
|
||||||
|
},
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
token_in: usdc.clone(),
|
||||||
|
token_out: weth.clone(),
|
||||||
|
split: 0.0f64,
|
||||||
|
};
|
||||||
|
|
||||||
|
let swap_weth_usdc_v3_pool1 = Swap {
|
||||||
|
component: ProtocolComponent {
|
||||||
|
id: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640".to_string(), /* USDC-WETH USV3
|
||||||
|
* Pool 1 */
|
||||||
|
protocol_system: "uniswap_v3".to_string(),
|
||||||
|
static_attributes: {
|
||||||
|
let mut attrs = HashMap::new();
|
||||||
|
attrs.insert(
|
||||||
|
"fee".to_string(),
|
||||||
|
Bytes::from(BigInt::from(500).to_signed_bytes_be()),
|
||||||
|
);
|
||||||
|
attrs
|
||||||
|
},
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
token_in: weth.clone(),
|
||||||
|
token_out: usdc.clone(),
|
||||||
|
split: 0.6f64,
|
||||||
|
};
|
||||||
|
|
||||||
|
let swap_weth_usdc_v3_pool2 = Swap {
|
||||||
|
component: ProtocolComponent {
|
||||||
|
id: "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8".to_string(), /* USDC-WETH USV3
|
||||||
|
* Pool 2 */
|
||||||
|
protocol_system: "uniswap_v3".to_string(),
|
||||||
|
static_attributes: {
|
||||||
|
let mut attrs = HashMap::new();
|
||||||
|
attrs.insert(
|
||||||
|
"fee".to_string(),
|
||||||
|
Bytes::from(BigInt::from(3000).to_signed_bytes_be()),
|
||||||
|
);
|
||||||
|
attrs
|
||||||
|
},
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
token_in: weth.clone(),
|
||||||
|
token_out: usdc.clone(),
|
||||||
|
split: 0.0f64,
|
||||||
|
};
|
||||||
|
|
||||||
|
let swap_encoder_registry = get_swap_encoder_registry();
|
||||||
|
let encoder = SplitSwapStrategyEncoder::new(
|
||||||
|
eth_chain(),
|
||||||
|
swap_encoder_registry,
|
||||||
|
Some(private_key.clone()),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let solution = Solution {
|
||||||
|
exact_out: false,
|
||||||
|
given_token: usdc.clone(),
|
||||||
|
given_amount: BigUint::from_str("100000000").unwrap(), // 100 USDC (6 decimals)
|
||||||
|
checked_token: usdc.clone(),
|
||||||
|
expected_amount: None,
|
||||||
|
checked_amount: Some(BigUint::from_str("99525908").unwrap()), /* Expected output from
|
||||||
|
* test */
|
||||||
|
router_address: Bytes::from_str("0x3Ede3eCa2a72B3aeCC820E955B36f38437D01395").unwrap(),
|
||||||
|
sender: Bytes::from_str("0xcd09f75E2BF2A4d11F3AB23f1389FcC1621c0cc2").unwrap(),
|
||||||
|
receiver: Bytes::from_str("0xcd09f75E2BF2A4d11F3AB23f1389FcC1621c0cc2").unwrap(),
|
||||||
|
slippage: None,
|
||||||
|
swaps: vec![swap_usdc_weth_v2, swap_weth_usdc_v3_pool1, swap_weth_usdc_v3_pool2],
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let (calldata, _) = encoder
|
||||||
|
.encode_strategy(solution)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
println!("{}", hex::encode(&calldata));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user