Skip to main content

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.

Complete SVM zap examples: same-chain and cross-chain.

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-SVMSVM-to-EVM
destChainId7565164EVM chain ID (e.g., 42161)
destTokenSPL addressEVM address (0x...)
recipientSolana addressEVM address (0x...)
SettlementSecondsMinutes (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);
}