Complete SVM zap examples: same-chain and cross-chain.Documentation Index
Fetch the complete documentation index at: https://docs.dzap.io/llms.txt
Use this file to discover all available pages before exploring further.
SVM to SVM Zap
Deposit USDC into Jupiter Lend on Solana.1. Get Quote
import { DZapClient } from "@dzapio/sdk";
const dZap = DZapClient.getInstance();
const zapQuote = await dZap.getZapQuote({
srcChainId: 7565164, // Solana
destChainId: 7565164, // Same chain
account: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
srcToken: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
destToken: "9BEcn9aPEmhSPbPQeFGjidRiEKki46fVQDyPpSQXPA2D", // Jupiter Lend USDC
amount: "959349", // 0.96 USDC (6 decimals)
recipient: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
refundee: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
slippage: 1,
});
console.log("Zap route:", zapQuote.data.path.map((p) => p.protocol.name).join(" → "));
2. Execute Zap
const zapResult = await dZap.zap({
request: {
srcChainId: 7565164,
destChainId: 7565164,
account: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
srcToken: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
destToken: "9BEcn9aPEmhSPbPQeFGjidRiEKki46fVQDyPpSQXPA2D",
amount: "959349",
recipient: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
refundee: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
slippage: 1,
},
signer: wallet,
});
const step = zapResult.steps[0].data;
SVM to EVM Zap (Cross-Chain)
Bridge USDC from Solana to a lending position on Arbitrum.1. Get Quote
const crossChainQuote = await dZap.getZapQuote({
srcChainId: 7565164, // Solana
destChainId: 42161, // Arbitrum
account: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
srcToken: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC on Solana
destToken: "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8", // Aave USDC on Arbitrum
amount: "959349", // 0.96 USDC (6 decimals)
recipient: "0x46b24b781f9Ac1344e594A313671e5CDb1459646", // EVM recipient
refundee: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v", // Solana refund address
slippage: 1,
});
console.log("Cross-chain route:", crossChainQuote.data.path.map((p) => p.protocol.name).join(" → "));
2. Execute Zap
const zapResult = await dZap.zap({
request: {
srcChainId: 7565164,
destChainId: 42161,
account: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
srcToken: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
destToken: "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8",
amount: "959349",
recipient: "0x46b24b781f9Ac1344e594A313671e5CDb1459646",
refundee: "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v",
slippage: 1,
},
signer: wallet,
});
const step = zapResult.steps[0].data;
Key Differences
| SVM-to-SVM | SVM-to-EVM | |
|---|---|---|
destChainId | 7565164 | EVM chain ID (e.g., 42161) |
destToken | SPL address | EVM address (0x...) |
recipient | Solana address | EVM address (0x...) |
| Settlement | Seconds | Minutes (bridge) |
3. Sign and Send
import { Connection, VersionedTransaction } from "@solana/web3.js";
const connection = new Connection("https://api.mainnet-beta.solana.com");
// Deserialize base64 transactions
const txBuffers = step.data.map((b64) =>
VersionedTransaction.deserialize(Buffer.from(b64, "base64"))
);
if (step.isJitoTx) {
// Submit via Jito block engine
const signed = await wallet.signTransaction(txBuffers[0]);
await fetch("https://mainnet.block-engine.jito.wtf/api/v1/transactions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "sendTransaction",
params: [Buffer.from(signed.serialize()).toString("base64"), { encoding: "base64" }],
}),
});
} else if (txBuffers.length === 1) {
// Single transaction - standard RPC
const signed = await wallet.signTransaction(txBuffers[0]);
const sig = await connection.sendRawTransaction(signed.serialize());
await connection.confirmTransaction(sig, "confirmed");
console.log("Signature:", sig);
} else {
// Multiple transactions - sign all at once
const signedAll = await wallet.signAllTransactions(txBuffers);
for (const tx of signedAll) {
const sig = await connection.sendRawTransaction(tx.serialize());
await connection.confirmTransaction(sig, "confirmed");
console.log("Signature:", sig);
}
}
4. Track
const status = await dZap.getZapTxnStatus({
chainId: 7565164,
txnHash: step.txnId,
});
console.log("Status:", status.status);
// Poll for completion
async function waitForZap(txnId: string, timeoutMs = 60_000) {
const interval = 5_000;
const start = Date.now();
while (Date.now() - start < timeoutMs) {
const status = await dZap.getZapTxnStatus({
chainId: 7565164,
txnHash: txnId,
});
if (status.status === "COMPLETED") return status;
if (status.status === "FAILED") throw new Error("Zap failed");
if (status.status === "REFUNDED") {
console.log("Zap refunded");
return status;
}
await new Promise((r) => setTimeout(r, interval));
}
throw new Error("Zap timed out");
}
const finalStatus = await waitForZap(step.txnId);
console.log("Zap complete:", finalStatus.status);
Advanced Examples
Cross-Chain Liquidity Provision (EVM to EVM)
Bridge USDC from Base to Arbitrum and provide liquidity to Uniswap V3:const crossChainLpQuote = await dZap.getZapQuote({
srcChainId: 8453, // Base
destChainId: 42161, // Arbitrum
account: userAddress,
srcToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base
destToken: "0xC6962004f452bE9203591991D15f6b388e09E8D0", // Uniswap V3 ETH/USDC LP
amount: "1000000000", // 1000 USDC
recipient: userAddress,
slippage: 2, // Higher slippage for cross-chain
});
console.log("Cross-chain LP quote:");
console.log(`Expected LP tokens: ${crossChainLpQuote.data.output[0].amount}`);
console.log(`Steps required: ${crossChainLpQuote.data.path.length}`);
Full Example
import { DZapClient } from "@dzapio/sdk";
import { Connection, VersionedTransaction } from "@solana/web3.js";
const dZap = DZapClient.getInstance();
const connection = new Connection("https://api.mainnet-beta.solana.com");
const solanaAddress = "8AsEhwyveydfzqnuUTjoCYjpxydpKPUXLqgyKdTPWV8v";
async function svmZap(isCrossChain: boolean) {
// 1. Get quote
const zapQuote = await dZap.getZapQuote({
srcChainId: 7565164,
destChainId: isCrossChain ? 42161 : 7565164,
account: solanaAddress,
srcToken: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
destToken: isCrossChain
? "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8" // Aave on Arbitrum
: "9BEcn9aPEmhSPbPQeFGjidRiEKki46fVQDyPpSQXPA2D", // Jupiter Lend
amount: "959349",
recipient: isCrossChain ? "0x46b24b781f9Ac1344e594A313671e5CDb1459646" : solanaAddress,
refundee: solanaAddress,
slippage: 1,
});
console.log("Route:", zapQuote.data.path.map((p) => p.protocol.name).join(" → "));
// 2. Execute zap
const zapResult = await dZap.zap({
request: {
srcChainId: 7565164,
destChainId: isCrossChain ? 42161 : 7565164,
account: solanaAddress,
srcToken: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
destToken: isCrossChain
? "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8"
: "9BEcn9aPEmhSPbPQeFGjidRiEKki46fVQDyPpSQXPA2D",
amount: "959349",
recipient: isCrossChain ? "0x46b24b781f9Ac1344e594A313671e5CDb1459646" : solanaAddress,
refundee: solanaAddress,
slippage: 1,
},
signer: wallet,
});
const step = zapResult.steps[0].data;
// 3. Sign and send
const txBuffers = step.data.map((b64) =>
VersionedTransaction.deserialize(Buffer.from(b64, "base64"))
);
if (step.isJitoTx) {
const signed = await wallet.signTransaction(txBuffers[0]);
await fetch("https://mainnet.block-engine.jito.wtf/api/v1/transactions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "sendTransaction",
params: [Buffer.from(signed.serialize()).toString("base64"), { encoding: "base64" }],
}),
});
} else if (txBuffers.length === 1) {
const signed = await wallet.signTransaction(txBuffers[0]);
const sig = await connection.sendRawTransaction(signed.serialize());
await connection.confirmTransaction(sig, "confirmed");
console.log("Signature:", sig);
} else {
const signedAll = await wallet.signAllTransactions(txBuffers);
for (const tx of signedAll) {
const sig = await connection.sendRawTransaction(tx.serialize());
await connection.confirmTransaction(sig, "confirmed");
console.log("Signature:", sig);
}
}
// 4. Track
const finalStatus = await waitForZap(step.txnId);
console.log("Zap status:", finalStatus.status);
}