@ anywalletkit/ kit (英语)
管弦乐者. 链包和协议模块已注册;工具包
由 CAIP-2 链式代号及协议按名称排列的账户, 全部由一个输入
种子短语(或它的64字节种子)或一个外部 Signer被同样的政策包裹着.
短语在构造器中变为种子字节, 并且从未保存; 没有种子或密钥
永远拥有自己的财产 Wallet,管理器,账户或签名器,所以日志和序列器显示
没有秘密.
安装
npm install @anywalletkit/kit
# or: pnpm add @anywalletkit/kit · yarn add @anywalletkit/kit
时间: @ anywalletkit/ kit (英语)发表于 发布工作流程 与出处.
import { Wallet } from '@anywalletkit/kit'
import WalletManagerEvm from '@anywalletkit/wallet-evm'
import WalletManagerSolana from '@anywalletkit/wallet-solana'
const wallet = new Wallet(seedPhrase, {
policies: {
maxFee: { 'eip155:1': 10n ** 16n }, // 0.01 ETH
allowlist: { 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': [TREASURY] },
confirm: async (intent) => ui.confirm(intent), // last word before broadcast
},
})
wallet.registerWallet('eip155', WalletManagerEvm, { provider: ['https://rpc-a', 'https://rpc-b'] })
wallet.registerWallet('solana', WalletManagerSolana, { provider: SOL_RPC })
wallet.registerProtocol('lido', LidoProtocolEvm, { chain: 'eip155:1' })
const eth = await wallet.getAccount('eip155:1') // policies applied
await eth.transfer({ recipient: '0x…', amount: 10n ** 15n })
const lido = await wallet.getProtocol<LidoProtocolEvm>('lido')
wallet.dispose() // zeroizes the seed and every chain's keys; later calls throw
在签署或广播之前执行的政策,按此顺序:费用上限
(先引用,账户可以引用的地方),允许列表,块列表, confirm。 。 。 .
maxFee (本国基数单位) sendTransaction, (中文(简体) ),
signTransaction 财务报告和审定财务报表 transfer,然后作为
WriteOptions.maxFee 故它能保存所签的; approve (欧洲议会),
sendSerialized (索拉纳语), signRaw (特伦), revokeDelegation 和交换2's
sendSerializedTransaction 钩子也一样,由账户检查
交易它签。 在一个帽子下,一个支付费用但无处可去的书写
选择一个( 3)signBuilt, (中文(简体) ), signCompiled, (中文(简体) ), signTransactionMessage被拒绝;
脱链签名不封顶.
账户的每个写出表面都被覆盖—— sendTransaction, (中文(简体) ), transfer, (中文(简体) ),
signTransaction (自行签名和广播的模块无法跳过)
他们, sign, NEAR's (英语) signNep413 还有TON的 signTonProof 编号 :
signTonConnectData (消息签名: confirm 只有,没有移动,批准表面 approve, (中文(简体) ), signPermit 和EIP-2612/
许可证2 signTypedData (对照 开支者· ; confirm 看见了
kind: 'approval' 与 unlimited),EIP-3009 (中文(简体) ) TransferWithAuthorization 编号 :
ReceiveWithAuthorization, ERC- 2771 ForwardRequest, (中文(简体) ), MetaTransaction 编辑
1英寸长 Order (单位:千美元)kind: 'send'由谁支付)
signTypedData (单位:千美元)kind: 'typedData' 与 destinationUnknown: true页:1
允许列表拒绝它,所以块列表没有 confirm; 块列表
verifyingContract 拒绝),
和连锁店,如Tron's signRaw, NEAR's (英语) signBuilt索拉纳的
sendSerialized。规则是逐一拒绝:任何账户方法
sign* 编号 : send* 编号 : approve* 编号 : revoke* 编号 : transfer* 被保护,除非它
列在 UNGUARDED_WRITES,所以链套件中的新签名方法
不能通过不命名来绕过政策。 阅读从不被截取.
没有什么东西能绕过包装器: signer 隐藏, 一个账户
方法返回( NEAR ) withAccountId回到同样的政策之下,
财务报告和审定财务报表 wallet.getManager(chain) 手出有守卫的账户getAccount, (中文(简体) ),
getAccountByPath, (中文(简体) ), getNamedAccount),而无种子或签注者接通. 这个
包件将签名器隐藏在描述和密钥列表中, 拒绝写入
转入账户_config 以冷冻本形式阅读) maxFee 规则
拒绝 sign* 编号 : send* 帮助政策不能引用。 边界是
钱包会发出什么: Wallet 对象本身是应用程序的——给
模块和 dApp 桥口账户、管理器或协议,从不 Wallet。 。 。 .
协议模块总是得到包装,有政策或没有:
任何没有规则的包装(没有限制,但没有标志,没有内部)
帮助者和没有可写设置 。 链条账户保持他们的签名人私密
字段,所以连应用程序自己的账户都没有(getAccount 钱包上没有
(政策)有 signer 财产; signerKind 说什么是钥匙.
名单检查每个目的地的写出姓名(intent.destinations(没有)
只有它所呼叫的合同: 接受者或支出者在标准符号呼叫中
(ERC-20/721/1155转让, approve, (中文(简体) ), increaseAllowance, (中文(简体) ),
setApprovalForAll,许可2 approve,一个在线EIP-2612 permit页:1
transferAndCall),TRC-20电话(通过 parameters 内部 raw_data_hex, (中文(简体) ),
没有 ft_transfer(_call) 编号 : nft_transfer(_call) 编号 : storage_deposit 编号 :
deleteAccount (同样在基数64borsh),TON喷气通和NFT转移(目的地)
和超额接收人),代号账户的所有人,SPL转账支付
(通过账户阅读) getTokenAccountOwner,仅在列表或 confirm
以及索拉纳学说给付或授权的人。 许可列表必须
把他们全部抓起来 当写作的一部分无法读取时,意图是
destinationUnknown:一个许可列表拒绝,一个没有的块列表也拒绝
confirm 钩. transfer 由 recipient每一条链子都要付.
批准书是 unlimited 类型( uint128 ).max 或以上( 核心)
isUnlimitedAllowance(a) 许可证2批次
列出在 intent.approvals。检查和签名使用
第一次核对前的论据副本,以及 confirm 获得自己的:
一个比喻,一个比喻 confirm 钩子或定时器不能更改在它之后所签名的内容
判断.
撤销是 kind: 'revoke'页:1 approve 编号 : signPermit / EIP-2612 许可 0,
原始取消调用数据( e)approve(0x0, tokenId), (中文(简体) ), setApprovalForAll(…, false), (中文(简体) ),
许可证2 lockdown,或只用这批)和 revokeDelegation()原始内容
approve(spender, 0) 非撤销:在ERC-721上批准 spender 页:1
符号 #0,所以检查为批准 spender。它跳过许可列表和开支者块列表条目
(从被封锁的排水者那里收回津贴必须保持可能)
blocklist仍然适用于所谓的合同、收费上限和 confirm 适用,
财务报告和审定财务报表 confirm 看见了 revokes: [{ token, spender }]。 。 。 .
活动历史
history() 是钱包的活性种子 : 每个链条都有一页
历史源, 最新的第一, 第一注册协议描述的每行
模块 describeActivity (登记令),或
通用倒计时。 除非要求, 标记为垃圾邮件的来源行会被隐藏 .
import { createEvmHistory } from '@anywalletkit/history-evm'
const wallet = new Wallet(seedPhrase, {
activity: {
known: { 'eip155:8453': { '0x3fC9…7FAD': 'Uniswap Universal Router' } }, // subtitle for otherwise-anonymous contract calls
natives: { 'eip155:999999': { symbol: 'XYZ', decimals: 18 } }, // overrides the built-in table / swap2-assets catalog
onError: (e) => log.warn('activity', e), // a source down, a recognizer that threw, a journal write that failed
pendingTtl: 24 * 3600, // seconds a pending intent waits for its row (default)
},
})
wallet.registerWallet('eip155', WalletManagerEvm, { provider })
wallet.registerProtocol('aave', AaveProtocolEvm, { chain: 'eip155:8453' }) // every registered protocol is a recognizer
wallet.registerHistorySource(createEvmHistory({ chainId: 8453, etherscanApiKey }))
wallet.registerHistorySource(createEvmHistory({ chainId: 1, etherscanApiKey }))
const page = await wallet.history({ limit: 20 }) // account 0 on every chain with a source
const older = await wallet.history({ limit: 20, cursor: page.cursor })
// or explicit addresses / chains:
await wallet.history({ addresses: [{ chain: 'eip155:1', address }], includeSpam: true, since: lastRefresh })
const item = await wallet.describeTransaction(tx) // one ChainTx through the same pipeline, for a detail screen
history(query) → { items: FeedItem[], cursor?, errors? }
query.addresses(单位:千美元){chain, address}[])或(或)query.index(每个有源链的账户索引,默认为0);chains限制;limit(违约20);includeSpam· ;since(unix 秒,用于刷新);cursor从上页.items为:ActivityItems (单位:千美元)id = chain:hash, (中文(简体) ),kind, (中文(简体) ),title, (中文(简体) ),subtitle, (中文(简体) ),assetsOut编号 :assetsIn基数单位,有符号和小数,counterparty, (中文(简体) ),related, (中文(简体) ),spam, (中文(简体) ),fee, (中文(简体) ),explorerUrl+) 加上 (中文(简体) )intentId当该行属于日记意图时approval(单位:千美元)token, (中文(简体) ),spender, (中文(简体) ),amount, (中文(简体) ),null= 无限制)approve编号 :revoke。 。 。 .cursor将每个源的光标打包成一个不透明的字符串; 当每个源被耗尽时, 空出 。 订单是时间干燥,然后是链条,然后是散列. 返回短页的源头永远不会被超越:其他链条的更老行会等待它的下一页,所以一行永远不能出现在较后一页上,比起更新的一行. 带有块窗页来解答空页的源后续到maxEmptyHops(默认3)每个呼叫.errors列出该调用失败的stage: 'source' | 'recognizer' | 'journal',与chain编号 :module) (中文(简体) ). 一个失败的源保持其在光标上的位置, 并在下一个调用时被重试; 为该行跳过一个丢入的识别器, 而下一个识别器 / 掉入后仍然运行 。 没有什么是默默地放弃的.
一般倒置
describeGeneric(tx, ctx, opts) 用于输出和纯度。 从主人入道:
| 类型 | 何时 | 标题/字幕 |
|---|---|---|
send | 仅属于他人 | “Sent USDC”,接收者标签 |
receive | 只有其他人 —— 拥有(也通过他人的合同电话进行空投) | "收到ETH",发件人标签 |
self | (钱包的两个账户) | "自转",移动金额 assetsOut |
approve 编号 : revoke | 名为 ERC-20 的拥有者 approve (0x095ea7b3); 金额 0=撤销, ^ 2^255=无限制 | "授权的USDC许可2", approval 已填满 |
contract | 任何其它的呼叫( 移动时挂起) | "合同呼吁", opts.known[chain][to] 标签或 0x1234…abcd |
unknown | 没有移动,没有打电话 | "交易" |
发送失败 保留预定数量( 本地值, 或 ERC-20) transfer 调用数据)。 符号和小数来自转接行,然后是互换-资产目录,然后是本地表格(natives 选项 → 内置: TON、SOL、TRX、BTC、NEAR → EVM链的目录原生者 → 命名空间默认值. spam 可从 raw.spam 编号 : tx.spam (历史-evm规则.
意向性期刊——app-side合同
链上行不能说"通过1Click(swapped USDC → ETH)"(链上显示USDC发送到一个存款地址),不能对一桥的两条腿,除非被探险家索引,否则不在那里. 应用程序记录了什么 谓 套件折叠成:
const journal = createMemoryIntentJournal() // or your own { list, put, remove } over SQLite / AsyncStorage
wallet.setIntentJournal(journal)
写一个 Intent 每个用户动作,在播放后立即:
await journal.put({
id: crypto.randomUUID(), // or the provider's id (1Click deposit address, LI.FI route id)
kind: 'swap', // swap | bridge | stake | unstake | claim | supply | withdraw | borrow | repay | send | wrap | unwrap
createdAt: Math.floor(Date.now() / 1000),
chain: 'eip155:1', address: from, // where it started, who signed
hashes: [{ chain: 'eip155:1', hash: depositHash }], // source leg first; push the destination leg when the provider reports it
expect: { assetsOut: [{ token: USDC, amount, symbol: 'USDC', decimals: 6 }], assetsIn: [{ token: null, amount: quoteOut, symbol: 'ETH', decimals: 18 }] },
protocol: '@anywalletkit/protocol-swap2-near-intents',
subtitle: 'NEAR Intents',
status: 'pending',
})
应用程序所写的
- 换乘/桥 (刷取2)数字 :
kindswap(同样的链条)或bridge, (中文(简体) ),hashes[0]=源交易(存款/路由器呼叫),expect从引文。 当供应商的状态终点返回目的地散列时,put其意图再次附在hashes(中继器填充不是钱包本身的tx输入)related) (中文(简体) ). 对于1Click,即用户发送到存款地址,供应商在稍后填充时,存款tx是hashes[0]填满的散列物附着一次GET /status返回它. - 活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活数字 :
kindsupply编号 :withdraw编号 :stake编号 :unstake编号 :claim, (中文(简体) ),hashes[0]交易,protocol模块名称,subtitle市场标签。 模块自己识别出这些行;意向只在探险家索引行之前才重要. - 发送: 可选( n)
kind: 'send'; 用于待定行和用于联系人标签subtitle。 。 。 . - 核准:不需要(倒置和批准模块承认它们).
什麽 history() 使用日记 :
- 一行的散列要继承
kind, (中文(简体) ),protocol, (中文(简体) ),subtitle和预期资产 当识别器返回一个通用项目时;承认者的判决被保留. 每件相配的物品intentId财务报告和审定财务报表related(另一条腿). - 在第一页没有一行的待决意图中,每条腿都要检查
getTransaction(勘探滞后);发现 —— 排放确认;没有发现 —— 排放在上方,作为status: 'pending', (中文(简体) ),id: intent:<id>,标题来自expect。 。 。 . - 同一页上一个意图的两条腿倒入一个项(源腿),
assetsIn从目的地一行,related指向它; 目的地行被丢弃。 掉在不同页面上的腿intentId;如果将页面保存在记忆中,则在应用程序中崩溃. - 等待时间超过
pendingTtl(默认 24 (h) 无行 )status: 'failed'并坚持下去。 失败的意图一直显示在第一页的顶端,直到应用程序removes他们(解散行动). - 匹配的意图被写回为
confirmed编号 :failed。工具箱从不去除意图;prune确认的比保留窗口老.
时间戳是unix 秒像 ChainTx.time; 金额为基单元重金.