import { DZapClient, Services } from "@dzap/sdk";
import {
TradeQuotesRequest,
TradeBuildTxnRequest,
ApprovalModes,
PermitTypes,
} from "@dzap/sdk";
const dZap = DZapClient.getInstance();
// Step 1: Get quotes
const quotesRequest: TradeQuotesRequest = {
integratorId: "dzap",
fromChain: 42161, // Arbitrum
data: [
{
amount: "1000000", // 1 USDC
srcToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum
destToken: "0x4200000000000000000000000000000000000006", // WETH on Base
toChain: 8453, // Base
slippage: 1,
},
],
account: userAccount,
};
const quotes = await dZap.getTradeQuotes(quotesRequest);
const pairKey = Object.keys(quotes)[0];
const recommendedSource = quotes[pairKey].recommendedSource;
// Step 2: Check allowances and handle approvals
const tokens = [
{
address: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831" as HexString,
amount: BigInt("1000000"),
},
];
// Check current allowances
const allowanceCheck = await dZap.getAllowance({
chainId: 42161,
sender: userAccount,
tokens: tokens,
service: Services.trade,
mode: ApprovalModes.AutoPermit, // Automatically selects optimal approval method
});
console.log("Allowance check:", allowanceCheck.data);
let permitData: string | undefined;
// Handle approvals if needed
const isApprovalNeeded =
allowanceCheck.data[quotesRequest.srcToken].approvalNeeded;
const isSignatureNeeded =
allowanceCheck.data[quotesRequest.srcToken].signatureNeeded;
if (isApprovalNeeded) {
await dZap.approve({
chainId: 42161,
signer: signer,
sender: userAccount,
tokens: tokens,
service: Services.trade,
mode: ApprovalModes.AutoPermit, // Uses optimal approval strategy
approvalTxnCallback: async ({ txnDetails, address }) => {
console.log(`Approval for ${address}:`, txnDetails);
},
});
console.log("Approvals completed");
}
// Handle permit signatures if possible (gasless)
if (isSignatureNeeded) {
const signatures = await dZap.sign({
chainId: 42161,
sender: userAccount,
tokens: tokens.map((t) => ({
address: t.address,
amount: t.amount.toString(),
})),
signer: signer,
service: Services.trade,
permitType: PermitTypes.AutoPermit, // Automatically selects optimal permit type
signatureCallback: async (res) => {
permitData = res.permitData;
},
});
permitData = signatures.data;
console.log("Permits signed");
}
// Step 3: Build trade request from selected quote
const request: TradeBuildTxnRequest = {
integratorId: "dzap",
fromChain: 42161,
sender: userAccount,
refundee: userAccount,
data: [
{
amount: "1000000",
srcToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
srcDecimals: 6,
destToken: "0x4200000000000000000000000000000000000006",
destDecimals: 18,
toChain: 8453,
selectedRoute: recommendedSource,
recipient: userAccount,
slippage: 1,
permitData: permitData, // Include permit data if available
},
],
};
// Step 4: Execute the trade
const tradeResult = await dZap.trade({
request: request,
signer: signer,
});
if (tradeResult.status === "success") {
console.log("✅ Trade executed successfully!");
console.log("Transaction hash:", tradeResult.txnHash);
// Monitor cross-chain progress
const status = await dZap.getTradeTxnStatus({
txHash: tradeResult.txnHash!,
chainId: "42161",
});
console.log("Trade status:", status);
} else {
console.error("❌ Trade failed:", tradeResult.errorMsg);
}