@anywalletkit/wallet-btc (英语)
比特币账户 @scure/btc-signer
(由Cure53审计;纯) Uint8Array,没有 Buffer诺德·希姆斯:
安装
npm install @anywalletkit/wallet-btc
# or: pnpm add @anywalletkit/wallet-btc · yarn add @anywalletkit/wallet-btc
时间: @anywalletkit/wallet-btc (英语)发表于 发布工作流程 与出处.
addressType | 路径 | 地址 | 标准 |
|---|---|---|---|
p2wpkh (默认) | m/84'/0'/0'/0/i | bc1q… | BIP-84 土生土长 |
p2tr | m/86'/0'/0'/0/i | bc1p… | BIP-86 钥匙路径自来水 |
测试网络使用硬币类型 1' (单位:千美元)tb1… 编号 : bcrt1…) (中文(简体) ). 两条道路都由
官方BIP-84 / BIP-86测试矢量.
import WalletManagerBtc from '@anywalletkit/wallet-btc'
const wallet = new WalletManagerBtc(seedPhrase, {
network: 'bitcoin',
addressType: 'p2wpkh', // or 'p2tr'
client: [
{ type: 'blockbook-http', clientConfig: { url: 'https://btc1.trezor.io' } },
{ type: 'esplora-http', clientConfig: { url: 'https://mempool.space/api' } }, // fails over in order
],
maxFeeRate: 200, // sat/vB ceiling (default 500)
})
const account = await wallet.getAccount(0)
const preview = await account.describeTransaction({ to: 'bc1q…', value: 50_000n })
// { kind: 'btc-transfer', inputs, outputs: [{ role: 'recipient' | 'change' }], fee, feeRate, vsize, rbf, lockTime, warnings }
await account.transfer({ recipient: 'bc1q…', amount: 50_000n }) // sats
await account.sendTransaction({ to: 'bc1q…', value: 50_000n, feeRate: 12n }) // explicit sat/vB
const hex = await account.signTransaction({ to: 'bc1q…', value: 50_000n }) // sign only
const max = await account.getMaxSpendable() // sweep amount after fee
wallet.dispose()
花多少钱
硬币的选择是我们自己的(selectCoins, (中文(简体) ), coinselect.ts: 有效值
积累,最大第一;无法自给的投入被省去;
粉尘下的变化(294 sat p2wpkh / 330 sat p2tr)被折叠入收费;最多
maxInputs (200) 投入。 收费是 feeRate × vsize 与标准 segwit 连接
权重,以72字节的签名估计,所以报价永远不能低于收费
实际支付.
交易信号替换换收费( E)rbf设置 nLockTime 页:1
当前提示( o)antiFeeSniping,默认运输何时可以报告高度.
安全检查
没有明确答案的广播(推倒、超时、5xx或408、a)
无法读取的身体)抛出 BroadcastUnknownError (单位:千美元)maybeSent, (中文(简体) ), hash = txid 计算
发送前):交易可能位于集邮地上,所以不要另立开支.
节点的拒绝( 有原因的 4xx, 有错误的正文) 保留一个被标记的错误
(单位:千美元)isAnsweredRefusal),对几个客户来说,只有在每个人都拒绝的情况下,才会拒绝.
"已入"中"/"区块链"回"txid". 习惯 BtcClient 应
标记拒绝 answered: true。产出与收件人匹配,并按脚本进行更改.
签字前 财务报告和审定财务报表 在广播之前——也用于呼叫者提供的生六分位数——
每笔交易都解为 BtcTxDescription 必须通过:
- 收费标准
maxFeeRate(单位:千美元)UnsafeTransactionError('fee-rate-too-high')(三); - 完全一个输出等于请求的接收者+数量,每个其它输出
是我们自己的变化(
'unexpected-output', (中文(简体) ),'recipient-mismatch', (中文(简体) ),'change-not-ours'(三); transactionMaxFee编号 :transferMaxFee绝对封顶.
不屏蔽的警告 : high-fee-rate, (中文(简体) ), fee-over-10pct-of-amount, (中文(简体) ),
dust-output, (中文(简体) ), no-change。 。 。 .
信件签名
sign() 编号 : verify() p2wpkh 账户的BIP-137(标题) 39 + recovery, (中文(简体) ),
base64 — Electrum / 比特币核心编码. 底盘账户没有BIP-137
窗体; sign() 掷出 UnsupportedAddressTypeError (BIP-322未执行).
运输
blockbook-http (Trezor Blockbook REST,快节点加载)和 esplora-http
(mempool.space, blockstream.info). 星洲网. 超时请求 timeoutMs (15个)和
对答复进行形状检查(NetworkError (否则) 传递您自己的对象
执行 BtcClient 为了其他一切.
活动历史
createBtcHistory 是链子 HistorySource (单位:千美元)@anywalletkit/core超过 Blockbook, 重用 BlockbookClient (单位:千美元)getAddressPage, (中文(简体) ), getTransactionDetails) (中文(简体) ).
import { createBtcHistory } from '@anywalletkit/wallet-btc/history'
const history = createBtcHistory({ blockbookUrls: ['https://btc1.trezor.io', 'https://bitcoin.atomicwallet.io'] })
const page = await history.listActivity('bc1q3x8yszvcvjjxqragsh0l6j8rxnhk7pay9hnj5h', { limit: 25 })
const older = await history.listActivity(address, { cursor: page.cursor })
const one = await history.getTransaction(page.items[0].hash, address)
history.explorerTxUrl(one.hash) // https://mempool.space/tx/…
| 选项 | 默认 | 说明 |
|---|---|---|
blockbookUrl 编号 : blockbookUrls | —— 说 | Blockbook根,按顺序进行(Cloudflare 403, 5xx, network ~ next). 特雷佐案btc1…5.trezor.io坐在Cloudflare挑战后,阻止非浏览器用户代理; bitcoin.atomicwallet.io 财务报告和审定财务报表 blockbook.btc.zelcore.io 于2026-10-14回信. QuickNode的"Blockbook"附加语同API. |
network | bitcoin | testnet 编号 : regtest CAIP-2 ids; mempol.space testnet链接. |
pageSize | 查询 limit页:1 | 每块书页行数(最大为1000). |
fetch, (中文(简体) ), timeoutMs | 全球,15 000 |
端点. GET /api/v2/address/{a}?details=txs&page=&pageSize= - 最新的交易,首先是投入和产出(hex ) (删除). 光标是基数64 JSON { v: 1, p, s }: 下一页和页大小的页码开始于页码( Blockbook 夹住出行页到上页, 所以 page stops at totalPages) (中文(简体) ). since ; 总是保留未经证实的行.
测绘. 输入已使用的地址( E)ownIn和收到的产出(ownOut)为总结. 已用投入-发送: from = 地址, (中文(简体) ), to =第一个不是我们的输出, nativeValue = 留给非自有产出的(变化被忽略,费用被分开);我们的每一项产出 = 自我整合。 没有用完的投入 − 收到: from =第一个输入地址(coinbase 当没有的时候, nativeValue =: ownOut。 。 。 . transfers 那是一条本地腿, fee =: fees, (中文(简体) ), status =: confirmed 一次 confirmations ≥ 1 (次数) pending,没有 block, (中文(简体) ), block =: blockHeight, (中文(简体) ), raw = Blockbook 交易加 ownIn 编号 : ownOut。 。 。 .
装入 test/fixtures/history/ 2026年10月14日从 bitcoin.atomicwallet.io 测试地址(其4个交易:2个接收,2个发送,有变化)和 GET /api/v2/tx/{txid} 一个发送。 没有协议模块承认比特币交易,因此没有识别器交叉检查.