跳转到主要内容
增强版交易 API V1 正在通过新解析器类型进行改进以扩大覆盖范围。我们计划在不久的将来推出功能增强的 V2 版本。

概述

增强版交易 API 将复杂的 Solana 交易转换为人类可读的数据。无需处理原始指令数据和账户列表,您可以获得关于以下内容的结构化信息:
  • 交易中发生了什么(转账、交换、NFT 活动)
  • 涉及了哪些账户
  • 转移了多少 SOL 或代币
  • 相关的元数据(例如,代币铸造地址、代币名称、代币符号等)
核心由 getTransactionsForAddress RPC 方法驱动。

API 参考

查看详细的交易历史 API 文档

关联代币账户

在 Solana 上,您的钱包并不直接持有代币。相反,您的钱包拥有代币账户,而这些代币账户存储您的代币。 当有人向您发送 USDC 时,它会进入您的 USDC 代币账户,而不是您的主钱包地址。
此方法的独特之处在于它允许您查询完整的代币历史。您可以查询一个钱包的完整历史记录,包括关联代币地址 (ATA)。 像 getSignaturesForAddress 这样的原生 RPC 方法不包括 ATA。 token-accounts 过滤器让您可以控制此行为:
  • none(默认):仅返回直接引用钱包地址的交易。当您只关心直接的钱包交互时使用此选项。
  • balanceChanged(推荐):返回引用钱包地址或修改钱包拥有的代币账户余额的交易。这样可以过滤掉垃圾信息和无关操作,如手续费收取或委托,给您清晰展示有意义的钱包活动。
  • all:返回所有引用钱包地址或任何钱包拥有的代币账户的交易。
旧交易的限制token-accounts 过滤器依赖于代币余额元数据中的 owner 字段,该字段在插槽 111,491,819(约 2022 年 12 月)之前不可用。涉及在此插槽之前活动的代币账户的交易可能会从 balanceChangedall 结果中缺失。有关解决方法及完整代码示例,请参阅 getTransactionsForAddress 教程

网络支持

网络支持保留期
主网无限
开发网2 周
测试网不适用

快速入门

检索任何 Solana 地址的交易历史记录:
const fetchWalletTransactions = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K"; // Replace with target wallet
  const url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY`;
  
  const response = await fetch(url);
  const transactions = await response.json();
  console.log("Wallet transactions:", transactions);
};

fetchWalletTransactions();

按交易类型筛选

仅获取特定交易类型,例如 NFT 销售、代币转账或交换:
const fetchNftSales = async () => {
  const tokenAddress = "GjUG1BATg5V4bdAr1csKys1XK9fmrbntgb1iV7rAkn94"; // NFT mint address
  const url = `https://api-mainnet.helius-rpc.com/v0/addresses/${tokenAddress}/transactions?api-key=YOUR_API_KEY&type=NFT_SALE`;
  
  const response = await fetch(url);
  const nftSales = await response.json();
  console.log("NFT sale transactions:", nftSales);
};
查看所有可用类型

分页

对于高交易量地址,实施分页以获取所有交易:
const fetchAllTransactions = async () => {
  const walletAddress = "2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha"; // Replace with target wallet
  const baseUrl = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY`;
  let url = baseUrl;
  let lastSignature = null;
  let allTransactions = [];
  
  while (true) {
    if (lastSignature) {
      url = baseUrl + `&before-signature=${lastSignature}`;
    }
    
    const response = await fetch(url);
    
    // Check response status
    if (!response.ok) {
      console.error(`API error: ${response.status}`);
      break;
    }
    
    const transactions = await response.json();
    
    if (transactions && transactions.length > 0) {
      console.log(`Fetched batch of ${transactions.length} transactions`);
      allTransactions = [...allTransactions, ...transactions];
      lastSignature = transactions[transactions.length - 1].signature;
    } else {
      console.log(`Finished! Total transactions: ${allTransactions.length}`);
      break;
    }
  }
  
  return allTransactions;
};

API 参考

参数描述默认值示例
limit返回的交易数量 (1-100)10&limit=25
before-signature获取此签名之前的交易 (与 sort-order=desc 一起使用)-&before-signature=sig123...
after-signature获取此签名之后的交易 (与 sort-order=asc 一起使用)-&after-signature=sig456...
type按交易类型筛选-&type=NFT_SALE
sort-order结果排序顺序desc&sort-order=asc
token-accounts筛选相关代币帐户的交易none&token-accounts=balanceChanged
commitment承诺级别finalized&commitment=confirmed

时间筛选

参数描述示例
gt-time此 Unix 时间戳之后的交易&gt-time=1656442333
gte-time此 Unix 时间戳或之后的交易&gte-time=1656442333
lt-time此 Unix 时间戳之前的交易&lt-time=1656442333
lte-time此 Unix 时间戳或之前的交易&lte-time=1656442333

基于槽位的筛选

参数描述示例
gt-slot此槽之后的交易&gt-slot=148277128
gte-slot此槽及其之后的交易&gte-slot=148277128
lt-slot此槽之前的交易&lt-slot=148277128
lte-slot此槽及其之前的交易&lte-slot=148277128
过滤提示:
  • 时间参数使用 Unix 时间戳(自纪元以来的秒数)
  • 槽参数使用 Solana 槽号
  • 您不能在同一请求中组合基于时间和基于槽的过滤器
  • 使用 sort-order=asc 进行升序(最旧的优先)或使用 sort-order=desc 进行降序(最新的优先)

高级过滤示例

按时间范围过滤

获取特定时间窗口内的交易:
const fetchRecentTransactions = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  const now = Math.floor(Date.now() / 1000);
  const oneDayAgo = now - (24 * 60 * 60);
  
  const url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&gte-time=${oneDayAgo}&lte-time=${now}`;
  
  const response = await fetch(url);
  const transactions = await response.json();
  console.log("Transactions from last 24 hours:", transactions);
};

按槽范围过滤

获取特定槽范围内的交易:
const fetchTransactionsBySlotRange = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  const startSlot = 148000000;
  const endSlot = 148100000;
  
  const url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&gte-slot=${startSlot}&lte-slot=${endSlot}`;
  
  const response = await fetch(url);
  const transactions = await response.json();
  console.log(`Transactions between slots ${startSlot} and ${endSlot}:`, transactions);
};

更改排序顺序

获取升序交易(最旧的优先):
const fetchOldestTransactions = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  const url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&sort-order=asc&limit=10`;
  
  const response = await fetch(url);
  const transactions = await response.json();
  console.log("10 oldest transactions:", transactions);
};

包含相关代币账户的转账

查询钱包的完整历史,包括关联的代币地址(ATAs):
const fetchTransactionsWithATA = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  
  const url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&token-accounts=balanceChanged&sort-order=desc&limit=50`;
  
  const response = await fetch(url);
  const transactions = await response.json();
  console.log("Most recent transactions (including ATA transfers)", transactions);
};

结合多个过滤器

结合类型过滤与时间范围和自定义排序顺序:
const fetchFilteredTransactionsAdvanced = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  
  // Get NFT sales from the last 7 days, oldest first
  const now = Math.floor(Date.now() / 1000);
  const sevenDaysAgo = now - (7 * 24 * 60 * 60);
  
  const url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&type=NFT_SALE&gte-time=${sevenDaysAgo}&sort-order=asc&limit=50`;
  
  const response = await fetch(url);
  const transactions = await response.json();
  console.log("NFT sales from last 7 days (oldest first):", transactions);
};

使用时间过滤的分页

使用时间过滤分页浏览结果:
const fetchAllTransactionsInTimeRange = async () => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  const startTime = Math.floor(new Date('2024-01-01').getTime() / 1000);
  const endTime = Math.floor(new Date('2024-01-31').getTime() / 1000);
  
  let beforeSignature = null;
  let allTransactions = [];
  
  while (true) {
    let url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&gte-time=${startTime}&lte-time=${endTime}&limit=100`;
    
    if (beforeSignature) {
      url += `&before-signature=${beforeSignature}`;
    }
    
    const response = await fetch(url);
    const transactions = await response.json();
    
    if (!Array.isArray(transactions) || transactions.length === 0) {
      break;
    }
    
    allTransactions = [...allTransactions, ...transactions];
    beforeSignature = transactions[transactions.length - 1].signature;
    
    console.log(`Fetched ${transactions.length} transactions, total: ${allTransactions.length}`);
  }
  
  console.log(`Total transactions in time range: ${allTransactions.length}`);
  return allTransactions;
};
性能提示
  • 当您知道大致时间段时,使用时间或槽过滤器来减少搜索空间
  • 结合 limit 参数来控制页面大小
  • 当您想按时间顺序处理交易时,使用 sort-order=asc
  • 时间过滤器对日期范围更直观,而槽过滤器对区块链特定查询更有用

类型过滤注意事项

运行时类型过滤类型过滤在运行时进行,这意味着 API 会按顺序搜索交易,直到找到至少 50 个匹配项目。如果 API 无法在搜索期间找到匹配的交易,它将返回一条错误信息,并附上继续搜索的说明。
使用类型过滤时,可能会遇到在当前搜索窗口中找不到匹配交易的情况。在这种情况下,API 会返回如下错误响应:
{
  "error": "Failed to find events within the search period. To continue search, query the API again with the `before-signature` parameter set to 2UKbsu95YzxGjUGYRg2znozmmVADVgmnhHqzDxq8Xfb3V5bf2NHUkaXGPrUpQnRFVHVKbawdQXtm4xJt9njMDHvg."
}
要继续搜索,您需要在下一次请求中使用错误信息中提供的签名和适当的参数(before-signature 用于降序,after-signature 用于升序)。以下是处理方法:
const fetchFilteredTransactions = async (sortOrder = 'desc') => {
  const walletAddress = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K";
  const transactionType = "NFT_SALE";
  let continuationSignature = null;
  let allFilteredTransactions = [];
  let maxRetries = 10; // Prevent infinite loops
  let retryCount = 0;
  
  // Determine which parameter to use based on sort order
  const continuationParam = sortOrder === 'asc' ? 'after-signature' : 'before-signature';
  
  while (retryCount < maxRetries) {
    // Build URL with optional continuation parameter
    let url = `https://api-mainnet.helius-rpc.com/v0/addresses/${walletAddress}/transactions?api-key=YOUR_API_KEY&type=${transactionType}&sort-order=${sortOrder}`;
    
    if (continuationSignature) {
      url += `&${continuationParam}=${continuationSignature}`;
    }
    
    try {
      const response = await fetch(url);
      const data = await response.json();
      
      // Check if we received an error about search period
      if (data.error && data.error.includes("Failed to find events within the search period")) {
        // Extract the signature from the error message
        const signatureMatch = data.error.match(/parameter set to ([A-Za-z0-9]+)/);
        
        if (signatureMatch && signatureMatch[1]) {
          console.log(`No results in this period. Continuing search from: ${signatureMatch[1]}`);
          continuationSignature = signatureMatch[1];
          retryCount++;
          continue; // Continue searching with new signature
        } else {
          console.log("No more transactions to search");
          break;
        }
      }
      
      // Check if we received transactions
      if (Array.isArray(data) && data.length > 0) {
        console.log(`Found ${data.length} ${transactionType} transactions`);
        allFilteredTransactions = [...allFilteredTransactions, ...data];
        
        // Set continuation signature for next page
        continuationSignature = data[data.length - 1].signature;
        retryCount = 0; // Reset retry count since we found results
      } else {
        console.log("No more transactions found");
        break;
      }
      
    } catch (error) {
      console.error("Error fetching transactions:", error);
      break;
    }
  }
  
  console.log(`Total ${transactionType} transactions found: ${allFilteredTransactions.length}`);
  return allFilteredTransactions;
};

// Usage examples:
// Descending order (newest first) - uses 'before-signature' parameter
fetchFilteredTransactions('desc');

// Ascending order (oldest first) - uses 'after-signature' parameter
fetchFilteredTransactions('asc');
关键点
  • 使用类型过滤时,API 一次搜索最多 50 个交易
  • 若未找到匹配项,使用错误消息中的签名继续搜索
  • 搜索降序时使用 before-signature 参数(默认,最新优先)
  • 搜索升序时使用 after-signature 参数(最旧优先) - 这对按时间顺序搜索是必需的
  • 实施最大重试限制以防止无限循环
  • 这种行为是预期的,允许您搜索地址整个历史记录的特定交易类型

有问题吗?

有关增强交易的常见问题,包括使用、身份验证、速率限制和故障排除,请访问我们的综合增强交易常见问题