Atomic arb cycle. Caller specifies the route; contract just executes.
Returns the final amount of principal_token received (must be >= min_amount_out
or the transaction reverts).
fn cycle_swap(
env: soroban_sdk::Env,
user: soroban_sdk::Address,
principal_token: soroban_sdk::Address,
amount_in: i128,
min_amount_out: i128,
hops: soroban_sdk::Vec,
) -> i128
Read-only: simulate the cycle without state changes. Returns the expected final amount given current pool state, OR errors if a hop would fail. Off-chain caller should use this to pre-validate before firing cycle_swap.
NOTE: This is a placeholder; actual implementation requires read-only
venue interfaces (e.g., Aqua's estimate_swap). Will be filled in v0.2.
fn estimate_cycle(
env: soroban_sdk::Env,
_principal_token: soroban_sdk::Address,
_amount_in: i128,
_hops: soroban_sdk::Vec,
) -> i128