@anywalletkit/历史-evm
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 对无键请求. |
etherscanUrl | https://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 编号 : blockscoutProRateLimit | https://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仪表板中的应用程序 (见下文). |
alchemyNetwork | ALCHEMY_NETWORKS[chainId] 当传输 API 为链条记录时 | 堵塞覆盖( N)base-mainnet) (中文(简体) ). 通过它还迫使表单列表的链条(Soconic, Plasma, MegaETH, Sei, Plume, X Layer)的后端被打开. |
alchemyUrl | https://{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 格式端点 . |
fetch | globalThis.fetch | 输入测试/自定义传输. |
rateLimit | 3 个有密钥的 rps | Etherscan 请求每秒(免费第3级,Lite 5,标准10). 每个密钥有一个活字桶,由这个过程中的每个来源共享(25个链子不乘以配额). 屏蔽:每个主机5 rps,路由扫描:2 rps. |
prefer | 'etherscan' | 'blockscout' 尝试Blockscout先保存以太斯干配额; 'alchemy' 先尝试Alchemy(Base,它是唯一自由的,或者用Alchemy CU代替以太斯干调用). |
timeoutMs | 15 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.io | gnosis.blockscout.com 重定向到那里 |
| 单链 | 130个 | 对 | 封锁 unichain.blockscout.com | |
| 修道院 | 143国 | 对 | 无 | |
| 超高频 | 999号 | 是( 免费计划 ) | 无 | |
| 音响 | 146 (中文(简体) ) | 对 | 无 | |
| 贝拉链 | 80094 (英语) | 对 | 无 | beratrail.io 回答202,没有JSON |
| 线性a | 第59144号 | 对 | 无 | explorer.linea.build 没有 /api/v2 |
| 滚动 | 534352 (英语) | 没有 (不在链条列表中) | 阻塞兼容 scrollscan.com | scroll.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 | 对 | 没有 |
| 多边形 PoS | 137国 | polygon-mainnet | 对(/rpc/matic.md(中文(简体) ) | 是(文件) |
| BNB 智能链 | 页:1 | bnb-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(以太斯堪语)/ ISOtimestamp(锁出)/metadata.blockTimestamp(炼金术,其他)eth_getBlockByNumber) (中文(简体) ).status数字 :failed何时isError = 1或者说txreceipt_status = 0(锁出)status = error,收据status = 0x0页:1confirmed。 。 。 .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当:
zero-value—— tx 中的每个运动为零( 0 值)transferFrom处理中毒问题,即使有诸如USDT之类的目录标志;zero-value-unknown-token该目录不知道移动了0;bulk-airdrop20个或更多的一tx和至少一个未知的符号;symbol-impersonation- 一个未知的符号,其符号包含非ASCII 字符数( e)USDΤ)或者其ASCII形式等于此上的目录符号 链(在另一合同中假作"USDT").
"目录"= @anywalletkit/swap2-assets (单位:千美元)ccChain('eip155:<id>').assets) (中文(简体) ).
添加链条
- 将 ID 添加到
SUPPORTED_CHAIN_IDS及其探索者改为EXPLORER_TX_BASE内src/chains.ts。 。 。 . curl https://api.etherscan.io/v2/chainlist——如果列出,则加入ETHERSCAN_V2_CHAIN_IDS_FALLBACK。 。 。 .- 探测出块状根(
/api/v2/transactions必须是200杰森(英语:BLOCKSCOUT_URLS; 路由扫描( R)https://api.routescan.io/v2/network/mainnet/evm/<id>/etherscan/api?module=account&action=txlist&address=…页:1ETHERSCAN_COMPAT_URLS。 。 。 . - 炼金术 :
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. - 没有答案
NO_EXPLORER_CHAIN_IDS。 。 。 . - 用日期更新上表, 运行
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/。 。 。 .