@anywalletkit/history-evm

中文文档
0.1.11发布于 2026/11/03Apache-2.0TypeScriptESM + CJS构建来源已验证近 30 天下载 1950

SDK支持的每条EVM链条的活动历史(History Source): Etherscan v2, Blockscout PRO和Alchemy Transfer API(API keys) 有 Blockscout 和 Routescan 键无后退,每散列合并为一链Tx 有文件记载的垃圾邮件heuristic.

中文使用文档
文档目录9 节
  1. 安装
  2. 选项
  3. 链覆盖(2026-10-14年经卷曲核实)
  4. 炼金术后端 backend: 'alchemy' (中文(简体) )
  5. 这算什么 ChainTx 包含
  6. 倾斜
  7. 垃圾邮件规则
  8. 添加链条
  9. 测试

@anywalletkit/历史-evm

npm

HistorySource sDK支持的每个EVM链。 每个链条一个源 (单位:千美元)chain = "eip155:<id>"),在有API密钥时被以太斯干 v2支持, Blockscout PRO和Alchemy( 转让 API) 及其无键倒置 (锁出) /api/v2, Routescan 的以太斯干格式镜像),其中公众 实例存在。 探索者行合并为一 ChainTx 每散列:顶级交易、ERC-20转让和内部 本地转移,包含收费,状态,呼叫选择器和有文件证明的垃圾邮件旗.

安装

npm install @anywalletkit/history-evm @anywalletkit/core
# or: pnpm add @anywalletkit/history-evm @anywalletkit/core  ·  yarn add @anywalletkit/history-evm @anywalletkit/core

时间: @anywalletkit/历史-evm发表于 发布工作流程 与出处.

import { createEvmHistory } from '@anywalletkit/history-evm'

const history = createEvmHistory({ chainId: 8453, etherscanApiKey: process.env.ETHERSCAN_API_KEY })
const page = await history.listActivity('0x8AbE813577E47415A3CD0Bbc68c7ABCa2c4c55bA', { limit: 50 })
for (const tx of page.items) console.log(tx.hash, tx.status, tx.transfers.length, tx.spam ? 'spam' : '')
const older = await history.listActivity(address, { cursor: page.cursor })
const one = await history.getTransaction(page.items[0].hash, address)
history.explorerTxUrl(one.hash) // https://basescan.org/tx/0x…

选项

选项默认说明
chainId—— 说1,8453,42161,10,137,56,43114,100,130,143,999,146,80094,59144,534352,324,42220,9745,4326,4663,480,1329,57073,9886,196
etherscanApiKey无没有它,伊瑟斯坎从不叫: 从2026年开始 api.etherscan.io/v2 答题 Missing/Invalid API Key 对无键请求.
etherscanUrlhttps://api.etherscan.io/v2/api指向添加密钥服务器侧的代理 .
blockscoutProApiKey无多链键proapi_…;免费分级100K信用/日,5 rps,每个屏蔽链的一键. Etherscan 格式为 chain_id=;在以太斯干后尝试,所以自由以太斯干键+自由的PRO键一起覆盖 Base,Arbitrum,Polygon,Optimism,Gnosis,Robinhood,Arc,Scroll,zkSync,Ink,Plume没有付费计划. 在 docs.blockscout.com/devs/pro-api 注册.
blockscoutProUrl 编号 : blockscoutProRateLimithttps://api.blockscout.com/v2/api / 第5条覆盖端点(proxy)/每键限制器.
alchemyApiKey无炼金键(免费分级:30M CU/month,无卡). 启用 alchemy 后端 : alchemy_getAssetTransfers + 1 JSON-RPC批次 eth_getTransactionByHash编号 :eth_getTransactionReceipt 每页。 唯一的自由来源在 基础 财务报告和审定财务报表 业连;也是Monad, Berachain, Linea, HyperEVM 和 Robinhood 的第二个来源,它们原本只依靠以太生. 试图追随以太生和Blockscout Pro. 每个网络必须启用Alchemy仪表板中的应用程序 (见下文).
alchemyNetworkALCHEMY_NETWORKS[chainId] 当传输 API 为链条记录时堵塞覆盖( N)base-mainnet) (中文(简体) ). 通过它还迫使表单列表的链条(Soconic, Plasma, MegaETH, Sei, Plume, X Layer)的后端被打开.
alchemyUrlhttps://{network}.g.alchemy.com/v2/{key}代理服务器主机模板; {network} 编号 : {key} 替换.
alchemyComputeUnitsPerSecond三百块炼金术每秒计算单位,每把钥匙在链上共享. 每一次呼叫都收取其公布的费用(转帐120,收单20,tx 17,第16项,其他26项),并且由JSON-RPC批出其成员的总和,因此在自由等级500CU/s以下的一次关键停留上同时连锁。 速率限制的答案以回扣方式重审最多三次.
blockscoutUrl内置表格任何障碍 /api/v2 root; 添加或覆盖链条的条目.
etherscanCompatUrl内置表 (鲁特斯坎)无密钥 Etherscan 格式端点 .
fetchglobalThis.fetch输入测试/自定义传输.
rateLimit3 个有密钥的 rpsEtherscan 请求每秒(免费第3级,Lite 5,标准10). 每个密钥有一个活字桶,由这个过程中的每个来源共享(25个链子不乘以配额). 屏蔽:每个主机5 rps,路由扫描:2 rps.
prefer'etherscan''blockscout' 尝试Blockscout先保存以太斯干配额; 'alchemy' 先尝试Alchemy(Base,它是唯一自由的,或者用Alchemy CU代替以太斯干调用).
timeoutMs15 000人按请求(AbortSignal.timeout 当运行时间有它.

后端顺序: Etherscan v2(v2链列表中的键+链) → Blockscout PRO (钥匙)- 炼金术(钥匙+有文件证明的转让API,或 alchemyNetwork页:1 路由扫描 – 封锁. prefer 将Blockscout或Alchemy先移动. 一个失败的后端被重审一次,限制费率(HTTP 429/5xx, Max rate limit reached),然后尝试下一个后端. 计划/关键拒绝(Free API access is not supported for this chain, (中文(简体) ), Missing/Invalid API Key, (中文(简体) ), Community Free API Limit reached,无支持的链条,Blockscout PRO Unauthorized 编号 : Featured chain,炼金术 <NETWORK> is not enabled for this app / HTTP 401 / 403 / (韩语) Unsupported method)跳到倒计时. 当一无所有 源头扔 HistoryUnavailableError 与 chain, (中文(简体) ), reason 每行1行 attempts链入 NO_EXPLORER_CHAIN_IDS 返回带有空页的页 note 换句话说.

Etherscan v2 链条列表 (/v2/chainlist)每个进程一次取出 已缓存;当无法取出时,则使用2026-10-14上核实的表格.

链覆盖(2026-10-14年经卷曲核实)

与一个 封锁方案 键(在2026-10-14日用自由键进行直播):服务于1,10,100,130,534352,42220,4326,4663,480,57073,98866,5042和 42161 (Arbitrum) (英语)"Featured"连锁店需要"建设者计划"(49美元: 8453基地、137个多边形、324个zk同步 (单位:千美元){"error":"Featured chain … requires one of the following plans: Builder, Business, Pro"} □ 分类不可用,已完结)。 "网络不支持":56,43114,143,999,146,80094,59144,9745,1329,196,5000,7474,2818,14. 带自由以太生键 + 自由 PRO 键的净效果: 除此之外, 什么都有自由源码 基础 (付费的以太扫描或屏蔽构建器), 业连, (中文(简体) ), X 层 财务报告和审定财务报表 墨菲语 添加免费 炼金术 键(下节)和 Base 和 BSC 也包括在内;只有 X 层(和 Sonic / Plasma / MegaETH / Sei / Plume,其中Alchemy 没有 Transit API) 单独留在以太斯干上.

用于封锁的探测器: GET <root>/api/v2/addresses/0x8AbE813577E47415A3CD0Bbc68c7ABCa2c4c55bA/transactions 财务报告和审定财务报表 /api/v2/transactions,仅在两个回答时保留 200 贾森.

链式编号以太斯干 v2 (英语)无键倒置说明
以利亚1个是( 免费计划 )封锁 eth.blockscout.com路由扫描
基础8453 (英语)对, 仅支付计划无base.blockscout.com 支持Cloudflare JS(403)挑战
一号线42161 (韩语)是( 免费计划 )无arbitrum.blockscout.com 403(云雾)
OP 主要网10个对, 仅支付计划封锁 explorer.optimism.io
多边形137国是( 免费计划 )无polygon.blockscout.com 403(云雾)
BNB 智能链页:1对, 仅支付计划无未发现公众屏蔽
雪崩C-钱第43114号对, 仅支付计划路由扫描
肠道100个对, 仅支付计划阻塞兼容 gnosisscan.iognosis.blockscout.com 重定向到那里
单链130个对封锁 unichain.blockscout.com
修道院143国对无
超高频999号是( 免费计划 )无
音响146 (中文(简体) )对无
贝拉链80094 (英语)对无beratrail.io 回答202,没有JSON
线性a第59144号对无explorer.linea.build 没有 /api/v2
滚动534352 (英语)没有 (不在链条列表中)阻塞兼容 scrollscan.comscroll.blockscout.com 重定向到那里
zk同步时代324国道没有封锁 zksync.blockscout.com
赛罗42220 (英语)是,社区配额封锁 celo.blockscout.com
等离子体9745 (英语)对路由扫描
超级第4326号对封锁 megaeth.blockscout.com
罗宾链第4663条是( 免费计划 )无
世界链480个对封锁 worldchain-mainnet.explorer.alchemy.com
谢1329号对无seitrace.com 拥有自己的API
墨迹57073 (中文(简体) )没有封锁 explorer.inkonchain.com
弹珠98866 (英语)没有封锁 explorer.plume.org
X 层196 (韩语)没有无只有 OKLink( 拥有 API, 密钥); 空页 + note

“ 免费计划 ok ” = 免费密钥返回行( 或 No transactions found(中文(简体) ) 当天;"只付计划"= Free API access is not supported for this chain提供了无限定词的标有“是”的链条,但测试 钱包没有历史,所以无法区分计划级别. 没有钥匙,链子在后退栏里没有 HistoryUnavailableError (单位:千美元)no keyless explorer; pass etherscanApiKey) (中文(简体) ).

炼金术后端backend: 'alchemy'(中文(简体) )

alchemy_getAssetTransfers 每页两次 fromAddress 财务报告和审定财务报表 toAddress 与 category: ['external', 'erc20'] (+ 数) 'internal' 编辑 链条 ALCHEMY_INTERNAL_CHAIN_IDS, (中文(简体) ), order: 'desc', (中文(简体) ), withMetadata: true (块时间戳), excludeZeroValue: false (零值地址隐藏) 转移是垃圾邮件规则旗; Alchemy 默认隐藏它们)和 maxCount = limit。转让由 uniqueId按散列排列, 和传输 API 的空隙由同一端点填补: 页面的散列获得 eth_getTransactionByHash + 键 eth_getTransactionReceipt 内 1个JSON-RPC批次 (每次HTTP呼叫20个请求,1个复试) — from, (中文(简体) ), to, (中文(简体) ), value, (中文(简体) ), input → call.selector, (中文(简体) ), status, (中文(简体) ), fee = gasUsed × effectiveGasPrice. 转让无 metadata.blockTimestamp 得到一个 eth_getBlockByNumber 这批.

合并规则( mirroring the Etherscan) txlist + 键 tokentx + 键 txlistinternal 合并 : erc20 行 = 令牌转让(符号 = asset小数 = rawContract.decimal数量= rawContract.value(三); internal 页: 1 转让; external 行是交易本身的价值,已经是 tx 行数 nativeValue 它们没有增加第二次本土转移。 只有在节点 不再有此类 tx (已删除/ 重置, null 从批量)是 外部行变为赤色的 tx行( r)status: confirmed,不收费),所以 继续制作。 ERC-721 / 11.55 / 特殊-NFT行被跳过 (v1). getTransaction(hash) = 一个散列的同批量 + ERC-20 Transfer 日志 收据+ eth_getBlockByNumber 时间.

贴子是按块的,不是按块的 pageKey。 。 。 . 按基主网计量 2026-10-14:载有 pageKey 忽略 toBlock; 未知或 过期 pageKey (TTL 10分)从第一页默开;a 一个是HTTP 400 Invalid pageKey format。这些都不适合 光标在几小时后恢复,或用更窄的窗口来调整,所以 炼金术列出的页面与以太斯干一样 toBlock = w − 1 从 窗口光标, next 是一个标记——一个Alchemy光标永远不会过期.

预算. 每笔转账120CU,每笔15CU eth_getTransactionByHash, (中文(简体) ), 每名15科朗 eth_getTransactionReceipt: 一个50个项目页 * 2 × 120 + 50 × 30 1 740 CU,因此免费30M CU/月为17,000页(每天为570页);a getTransaction 45–60 CU (中文(简体) ). 免费水平的通量为500CU/s,因此 以上4 rps建议.

找到: 启用Alchemy应用程序中的网络. 新应用程序只有 在仪表盘上勾选的网络( pps ) 。 每一个 弹出答案 HTTP 403 {"error":{"code":-32600,"message":"BNB_MAINNET is not enabled for this app. Visit this page to enable the network: …"}} ——叙级 unavailable,没有重试,下一个后端。 验证 2026-10-14 有免费密钥 : eth-mainnet 财务报告和审定财务报表 base-mainnet 答复(包括 internal 类别 ); 下方的所有其他弹片都会回答"未启用",直到选中.

粘贴表( E)ALCHEMY_NETWORKS;经核查 2026-10-14 eth_chainId 每页 slock —— 已有 slock 回答链式 id 或 "未启用", 不存在 解决不了问题。 "Transfers API"=链条的docs页面 https://www.alchemy.com/rpc/<chain>.md 上面写着"支持..." (单位:千美元)ALCHEMY_TRANSFERS_CHAIN_IDS“内部”= internal 类别 文档 ("仅在Ethereum Mainnet, Polygon Mainnet, Base Mainnet, Arc上提供) 主网和Arc Testnet"; (中文(简体) ); ALCHEMY_INTERNAL_CHAIN_IDS) (中文(简体) ).

链式编号弹片转让 API 文件internal 类别
以利亚1个eth-mainnet对是( 已核实的直播)
基础8453 (英语)base-mainnet对是( 已核实的直播)
一号线42161 (韩语)arb-mainnet对没有
OP 主要网10个opt-mainnet对没有
多边形 PoS137国polygon-mainnet对(/rpc/matic.md(中文(简体) )是(文件)
BNB 智能链页:1bnb-mainnet对没有
雪崩C-钱第43114号avax-mainnet对没有
肠道100个gnosis-mainnet对没有
单链130个unichain-mainnet对没有
修道院143国monad-mainnet对没有
超高频999号hyperliquid-mainnet对没有
音响146 (中文(简体) )sonic-mainnet没有 ("目前不支持")没有
贝拉链80094 (英语)berachain-mainnet对没有
线性a第59144号linea-mainnet对没有
滚动534352 (英语)scroll-mainnet对没有
zk同步时代324国道zksync-mainnet对没有
赛罗42220 (英语)celo-mainnet对没有
等离子体9745 (英语)plasma-mainnet没有没有
超级第4326号megaeth-mainnet没有没有
罗宾链第4663条robinhood-mainnet对没有
世界链480个worldchain-mainnet对没有
谢1329号sei-mainnet没有没有
墨迹57073 (中文(简体) )ink-mainnet对没有
弹珠98866 (英语)plume-mainnet没有 (无炼金术文件页)没有
X 层196 (韩语)xlayer-mainnet没有没有
弧形5042 (简体中文)arc-mainnet对是(文件)

只有Ethereum和Base被行使到结束(测试键只有那些) ; 其他行是 swit + 文件检查。 链条 除非 alchemyNetwork 通过.

这算什么 ChainTx 包含

  • time 从 timeStamp (以太斯堪语)/ ISO timestamp (锁出)/ metadata.blockTimestamp (炼金术,其他) eth_getBlockByNumber) (中文(简体) ).
  • status数字 : failed 何时 isError = 1 或者说 txreceipt_status = 0 (锁出) status = error,收据 status = 0x0页:1 confirmed。 。 。 .
  • from 编号 : to 编号 : nativeValue 从交易行。 搜索器的散列列表仅作为给地址的符号传输( 即将到来的 ERC-20) 没有交易行 : from编号 :to 转帐是.., raw.tx 缺席.
  • fee =: gasUsed × gasPrice (锁出) fee.value; 炼金术和以太史坎代理路径:收到 gasUsed × effectiveGasPrice) (中文(简体) ).
  • call =: { to, selector (4 bytes, lowercase), data } 当输入不是时 0x。 。 。 .
  • transfers: 本地值( 当 > 0), 每行 ERC-20 (standard: 'erc20',从探索者或交换2资产目录中的符号/小数),每一次具有值的内部本土转移 > 0. ERC-721 / ERC-1155行在v1中被跳过.
  • block 像个大人物, raw = { source, tx, tokens, internal, spam?, spamReason? } 与未触动的探索者行( Alchemy : raw.tx = { tx, receipt } JSON-RPC对象, raw.tokens 编号 : raw.internal 转移 API 列.
  • EvmChainTx.spam 镜像 raw.spam。 。 。 .

getTransaction(hash, address) 使用 Etherscan 格式 proxy 模块或炼金术 JSON-RPC(联合国eth_getTransactionByHash + 键 eth_getTransactionReceipt; ERC-20 (中文(简体) ) Transfer 日志变为转让;没有内部转让,也没有痕迹)或 封锁 /api/v2/transactions/<hash> + 键 /token-transfers + 键 /internal-transactions. 回归 undefined 为未知的散列.

倾斜

探索者列表(交易、令牌转让、内部转让) 独立,所以源页面由 块窗口: 每页取一 每个列表的探索者页面, 并且只向最高剪切块上方的行发送 在还有更多行的列表中。 发射完毕 在所有三个列表中,所以由散列合并是准确的。 光标 (基调64 JSON: { v, b: backend, w: exclusive upper block, lists }载体 封锁的 next_page_params 每个列表; Etherscan 列表仅用 endblock = w - 1, 化学列表中 toBlock = w - 1。一个后端的光标会在另一个后端逐块恢复 第一个失败. limit (default 50, max 100) 是探索者的页面大小, 这样一页就比起 limit 当符号/内部行添加时 他们自己的大麻。 脱源案例:当一个列表存在多于 limit 行数 在一个区块中,该区块被排放一次,其余部分跳出一次.

since 应用客户端 time (按块进行勘探,而不是时间): 长于 since ,页面没有光标.

垃圾邮件规则

从未申请过地址本身发送的交易 。 至少有一个 tx 符号行被标记 (raw.spamReason当:

  1. zero-value —— tx 中的每个运动为零( 0 值) transferFrom 处理中毒问题,即使有诸如USDT之类的目录标志;
  2. zero-value-unknown-token 该目录不知道移动了0;
  3. bulk-airdrop 20个或更多的一tx和至少一个未知的符号;
  4. symbol-impersonation - 一个未知的符号,其符号包含非ASCII 字符数( e)USDΤ)或者其ASCII形式等于此上的目录符号 链(在另一合同中假作"USDT").

"目录"= @anywalletkit/swap2-assets (单位:千美元)ccChain('eip155:<id>').assets) (中文(简体) ).

添加链条

  1. 将 ID 添加到 SUPPORTED_CHAIN_IDS 及其探索者改为 EXPLORER_TX_BASE 内 src/chains.ts。 。 。 .
  2. curl https://api.etherscan.io/v2/chainlist ——如果列出,则加入 ETHERSCAN_V2_CHAIN_IDS_FALLBACK。 。 。 .
  3. 探测出块状根(/api/v2/transactions 必须是 200 杰森(英语: BLOCKSCOUT_URLS; 路由扫描( R)https://api.routescan.io/v2/network/mainnet/evm/<id>/etherscan/api?module=account&action=txlist&address=…页:1 ETHERSCAN_COMPAT_URLS。 。 。 .
  4. 炼金术 : curl -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' https://<slug>.g.alchemy.com/v2/<key> → ALCHEMY_NETWORKS· ; https://www.alchemy.com/rpc/<chain>.md 列表“转让 API ” — ALCHEMY_TRANSFERS_CHAIN_IDS (和 ALCHEMY_INTERNAL_CHAIN_IDS 当 internal 页:1.
  5. 没有答案 NO_EXPLORER_CHAIN_IDS。 。 。 .
  6. 用日期更新上表, 运行 pnpm --filter @anywalletkit/history-evm test (链表测试强制要求每个ID被覆盖,并有一个Alchemy sult).

测试

pnpm --filter @anywalletkit/history-evm test ——无网络:固定在 tests/fixtures/ 真实以太斯干 v2(chainid=1用钥匙抓起来的 无密钥捕捉已经不可能)和 eth.blockscout.com 答复 公共测试钱包 0x8AbE813577E47415A3CD0Bbc68c7ABCa2c4c55bA外加一个 用于 Avalanche 和合成行的路由扫描样本 用于 三脚相换, 失败 tx,20行空投和假USDT尘埃传输. 炼金装置 (单位:千美元)alchemy-base-*.json,基主网,同一个钱包,用免费密钥捕获 2026-10-14: 联合国 fromAddress 编号 : toAddress 转移页(包括:. internal 行、Aave供货和取出、通过内部付款和 非 ASCII 被伪造的令牌, 每条散列的 tx + 接收批次 (调用数据长于2 KB并有许多日志的收据被修剪、标记) _inputTrimmed 编号 : _logsTrimmed页:1 is not enabled for this app 信封上写着. LIVE_HISTORY=1 (可选) ETHERSCAN_API_KEY 编号 : ALCHEMY_API_KEY进行现场检查.

安全隐患: fetch 只有,有人看守着 AbortSignal.timeout,自有基数64(无) Buffer编号 :btoa),无 URL 内 src/。 。 。 .

版本与发布记录

@anywalletkit/history-evm 共发布 11 个版本,首次发布于 2026/10/25;过去 12 个月发布了 11 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.11latest2026/11/035 天前
0.1.102026/10/309 天前
0.1.92026/10/2811 天前
0.1.82026/10/2712 天前
0.1.72026/10/2612 天前
0.1.62026/10/2613 天前

关于 @anywalletkit/history-evm 的常见问题

@anywalletkit/history-evm 是什么?

SDK支持的每条EVM链条的活动历史(History Source): Etherscan v2, Blockscout PRO和Alchemy Transfer API(API keys) 有 Blockscout 和 Routescan 键无后退,每散列合并为一链Tx 有文件记载的垃圾邮件heuristic.

如何安装 @anywalletkit/history-evm?

在项目目录运行 npm install @anywalletkit/history-evm,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@anywalletkit/core(0.8.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@anywalletkit/history-evm 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@anywalletkit/history-evm 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@anywalletkit/history-evm 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@anywalletkit/history-evm 可以商用吗?

@anywalletkit/history-evm 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@anywalletkit/history-evm 的下载量有多少?

根据 npm 官方下载统计,@anywalletkit/history-evm 在 2026/10/06 – 2026/11/04 这 30 天内被下载 1,950 次,日均约 65 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@anywalletkit/history-evm 还在维护吗?

最新版本 0.1.11 发布于 2026/11/03(5 天前);至今共发布 11 个版本,其中过去 12 个月发布了 11 个;首次发布于 2026/10/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。