Skip to main content
Retrieve the transaction history for a wallet address. This endpoint returns a paginated list of transactions including transfers, swaps, and other on-chain activity.
Transaction history is currently only supported for embedded wallets on Solana mainnet (network ID 101). Responses are cached for 5 seconds.

Parameters

ParameterTypeRequiredDescription
chainNamestringYesThe blockchain type (SOL for Solana)
addressstringYesThe wallet address to fetch transactions for
networkIdnumberYesThe network ID (101 for Solana mainnet)
limitnumberNoNumber of transactions to return (1-100)
offsetstringNoPagination offset from previous response

Response

The response includes an array of transactions and a nextOffset for pagination:
PropertyTypeDescription
transactionsarrayList of transaction objects
nextOffsetstringOffset to fetch the next page of transactions
Each transaction object contains:
PropertyTypeDescription
transactionHashstringThe transaction hash
blockNumbernumberBlock number of the transaction
transactionTimestampstringISO 8601 timestamp of the transaction
blockHashstringHash of the block containing the transaction
blockExplorerUrlsstring[]URLs to view the transaction on block explorers
fromAddressstringSender address
toAddressstringRecipient address
labelsstring[]Transaction type labels: sent, receive, or swap
assetTransfersarrayDetails of assets transferred in the transaction
chainNamestringThe blockchain type
networkIdnumberThe network ID
Each asset transfer contains:
PropertyTypeDescription
tokenAddressstringContract address of the token (empty for native tokens)
fromAddressstringSender address for this transfer
toAddressstringRecipient address for this transfer
amountnumberAmount transferred
metadataobjectToken metadata (name, symbol, decimals, imageUri)
import { useDynamicContext } from "@dynamic-labs/sdk-react-core";
import { useEffect, useState } from "react";

interface Transaction {
  transactionHash: string;
  blockNumber: number;
  transactionTimestamp: string;
  fromAddress: string;
  toAddress: string;
  labels: string[];
  blockExplorerUrls: string[];
  assetTransfers: {
    tokenAddress?: string;
    fromAddress: string;
    toAddress: string;
    amount: number;
    metadata?: {
      name?: string;
      symbol?: string;
      decimals?: number;
      imageUri?: string;
    };
  }[];
}

const WalletTransactions = () => {
  const { primaryWallet, authToken } = useDynamicContext();
  const [transactions, setTransactions] = useState<Transaction[]>([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    const fetchTransactions = async () => {
      if (!primaryWallet || !authToken) return;

      setLoading(true);
      try {
        const response = await fetch(
          `https://app.dynamic.xyz/api/v0/sdk/${process.env.NEXT_PUBLIC_DYNAMIC_ENVIRONMENT_ID}/chains/SOL/transactions/${primaryWallet.address}?networkId=101&limit=10`,
          {
            headers: {
              Authorization: `Bearer ${authToken}`,
            },
          }
        );

        const data = await response.json();
        setTransactions(data.transactions);
      } catch (error) {
        console.error("Failed to fetch transactions:", error);
      } finally {
        setLoading(false);
      }
    };

    fetchTransactions();
  }, [primaryWallet, authToken]);

  if (loading) return <div>Loading transactions...</div>;

  return (
    <div>
      <h2>Transaction History</h2>
      {transactions.map((tx) => (
        <div key={tx.transactionHash}>
          <p>Hash: {tx.transactionHash}</p>
          <p>Type: {tx.labels.join(", ")}</p>
          <p>Date: {new Date(tx.transactionTimestamp).toLocaleString()}</p>
          {tx.assetTransfers.map((transfer, i) => (
            <p key={i}>
              {transfer.metadata?.symbol}: {transfer.amount}
            </p>
          ))}
          <a href={tx.blockExplorerUrls[0]} target="_blank" rel="noopener noreferrer">
            View on Explorer
          </a>
        </div>
      ))}
    </div>
  );
};