let client = FyndClientBuilder::new(FYND_URL, RPC_URL)
.with_sender(sender)
.build()
.await?;
// 1. Quote
let quote = client
.quote(QuoteParams::new(
Order::new(
Bytes::copy_from_slice(sell_token.as_slice()),
Bytes::copy_from_slice(buy_token.as_slice()),
BigUint::from(SELL_AMOUNT),
OrderSide::Sell,
Bytes::copy_from_slice(sender.as_slice()),
None,
),
QuoteOptions::default()
.with_timeout_ms(5_000)
.with_encoding_options(EncodingOptions::new(SLIPPAGE)),
))
.await?;
println!("amount_out: {}", quote.amount_out());
// 2. Approve if needed (checks on-chain allowance, skips if sufficient)
if let Some(approval_payload) = client
.approval(
&ApprovalParams::new(
Bytes::copy_from_slice(sell_token.as_slice()),
BigUint::from(SELL_AMOUNT),
true,
),
&SigningHints::default(),
)
.await?
{
let sig = signer.sign_hash(&approval_payload.signing_hash()).await?;
client
.execute_approval(SignedApproval::assemble(approval_payload, sig))
.await?
.await?;
}
// 3. Sign and execute swap
let payload = client.swap_payload(quote, &SigningHints::default()).await?;
let sig = signer.sign_hash(&payload.signing_hash()).await?;
let receipt = client
.execute_swap(SignedSwap::assemble(payload, sig), &ExecutionOptions::default())
.await?
.await?;
println!("gas: {}", receipt.gas_cost());