Wagmi Tempo Actions 深度指南:使用 token.changeTransferPolicy 管理 TIP-20 代币转账策略
Wagmi Tempo Actions 深度指南使用 token.changeTransferPolicy 管理 TIP-20 代币转账策略【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi本篇指南围绕 Wagmi 仓库中 Tempo 模块的核心 Actiontoken.changeTransferPolicy展开讲解如何为 TIP-20 代币切换转账策略transfer policy覆盖同步/异步两种调用方式、完整参数与返回值、底层源码实现以及配套 React Hooks。读完本文你将能在 WagmiReact 与 Core中独立完成代币创建后动态更换转账策略的完整开发流程并理解其与 Viem Tempo 的委托调用关系。背景TIP-20 代币与转账策略Tempo 是一条为支付场景优化的 Layer 1 区块链其协议内建了代币管理能力。TIP-20 是 Tempo 上的代币标准而**转账策略transfer policy**定义了代币在转账、铸造、销毁等场景下需要满足的合规与业务约束例如是否需要授权、是否冻结转账等。token.changeTransferPolicy正是用于修改某个 TIP-20 代币当前生效的转账策略的 Action。根据本仓库官方文档的说明该操作要求调用者拥有默认管理员角色default admin role这一点与同模块中的grantRoles、revokeRoles、setRoleAdmin等权限类 Action 共同构成 Tempo 代币的权限管理体系。前置准备Tempo Wagmi 环境配置在调用该 Action 之前需要先完成 Tempo 链与钱包的接入配置。仓库提供了现成的 React 配置示例 config-tempo.ts内容如下import { createConfig, http } from wagmi import { tempo } from wagmi/chains import { tempoWallet } from wagmi/tempo export const config createConfig({ connectors: [tempoWallet()], chains: [tempo], multiInjectedProviderDiscovery: false, transports: { [tempo.id]: http(), }, })关键点说明chains: [tempo]注册 Tempo 链connectors: [tempoWallet()]使用 Tempo 官方钱包连接器来源为wagmi/tempomultiInjectedProviderDiscovery: false禁用多注入提供方自动发现避免与 Tempo 钱包冲突transports: { [tempo.id]: http() }为 Tempo 链配置 HTTP 传输。同时需要保证项目中的 Viem 版本满足要求仓库文档注明viem2.55.2并安装accounts包。安装命令以 pnpm 为例pnpm add viem2.55.2 accounts若使用 Core 而非 React只需将导入入口替换为wagmi/core、wagmi/core/chains、wagmi/core/tempo配置写法完全一致。同步用法changeTransferPolicySync文档首先推荐的是*Sync变体。changeTransferPolicySync会等待交易被打包进区块后才返回结果适合在交互式界面或脚本中需要立即拿到确认结果的场景import { Actions } from wagmi/tempo import { config } from ./config const { receipt } await Actions.token.changeTransferPolicySync(config, { policyId: 1n, token: 0x20c0000000000000000000000000000000000000, }) console.log(Transaction hash:, receipt.transactionHash) // log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef示例中的config即上文config-tempo.ts导出的配置对象。调用成功后可以从返回的receipt.transactionHash拿到交易哈希用于链上查询或业务记录。异步用法changeTransferPolicy waitForTransactionReceipt如果追求更优性能例如不阻塞 UI、由应用自行控制确认时机应使用非同步版本token.changeTransferPolicy它只负责签名并广播交易、立即返回hash区块确认由开发者手动等待import { Actions as viem_Actions } from viem/tempo import { Actions } from wagmi/tempo import { waitForTransactionReceipt } from wagmi/actions const hash await Actions.token.changeTransferPolicy(config, { policyId: 1n, token: 0x20c0000000000000000000000000000000000000, }) const receipt await waitForTransactionReceipt(config, { hash }) const { args } viem_Actions.token.changeTransferPolicy.extractEvent(receipt.logs)这段代码展示了两种 Action 的差异对比维度changeTransferPolicySyncchangeTransferPolicy返回内容交易回执receipt及事件数据仅交易哈希hash区块确认内部等待返回即已上链不等待需配合waitForTransactionReceipt适用场景交互简单、需要即时反馈性能敏感、自行控制确认流程异步版本还展示了viem_Actions.token.changeTransferPolicy.extractEvent(receipt.logs)的用法在拿到回执后通过 Viem Tempo 的extractEvent从日志中解构出args即事件参数可用于解析newPolicyId、updater等链上事件字段。返回值详解changeTransferPolicySync的返回类型如下文档原文定义type ReturnType { /** ID of the new transfer policy */ newPolicyId: bigint /** Transaction receipt */ receipt: TransactionReceipt /** Address that updated the policy */ updater: Address }字段含义newPolicyId链上生效的新转账策略 IDbigintreceipt完整交易回执TransactionReceipt其中transactionHash可提取交易哈希updater实际执行策略更新的地址即默认管理员账户。该返回结构在仓库测试 token.test.ts 中有直接印证调用changeTransferPolicySync后断言receipt存在并对newPolicyId: 0n与updater: 0xf39F...2266做了快照比对。参数详解changeTransferPolicy接受两个核心参数外加一批可选的交易级参数。policyId类型bigint要切换到的新转账策略 ID。策略 ID 由链上策略注册表定义传入1n表示切换到编号为 1 的策略。token类型Address | bigint目标 TIP-20 代币的地址或 ID。既支持形如0x20c0000000000000000000000000000000000000的合约地址也支持用代币 IDbigint标识。测试代码中通常先用token.createSync创建一个新代币拿到其地址再传给本参数。通用交易参数可选除上述参数外该 Action 还继承了一组 TIP-20 写入类 Action 共用的交易参数仓库文档见 tempo-write-parameters.md完整清单如下参数类型默认值说明accountAccount \| Address已连接的 Wagmi 账户发起交易的账户feeTokenAddress \| bigint—交易手续费代币可为 TIP-20 地址或 IDfeePayerAccount \| true—手续费支付方可传 Viem Account或传true表示使用 Fee Payer Service 代付gasbigint—交易 Gas 上限maxFeePerGasbigint—每单位 Gas 的最高费用maxPriorityFeePerGasbigint—每单位 Gas 的最高优先费小费noncenumber—交易 noncenonceKeyexpiring \| bigint—交易 nonce 键用于并发交易场景validBeforenumber—交易必须被打包进区块之前的 Unix 时间戳validAfternumber—交易可以被打包进区块之后的 Unix 时间戳throwOnReceiptRevertbooleantrue回执显示交易回滚时是否抛错仅对*Sync变体生效此外从源码类型签名见下文还可以推断出chainId与connector两个可选参数chainId用于指定目标链多链配置下按链路由connector用于显式指定使用的连接器两者缺省时分别回退到配置默认链与当前活动连接器。源码级实现原理在 Wagmi 仓库中该 Action 位于 packages/core/src/tempo/actions/token.ts两个变体的实现结构高度一致。以非同步版为例export async function changeTransferPolicyconfig extends Config( config: config, parameters: changeTransferPolicy.Parametersconfig, ): PromiseActions.token.changeTransferPolicy.ReturnValue { const { account, chainId, connector } parameters const client await getConnectorClient(config, { account, assertChainId: false, chainId, connector, }) return Actions.token.changeTransferPolicy(client, parameters as never) }实现要点获取连接器客户端通过getConnectorClient(config, { account, chainId, connector })基于当前 Wagmi 配置解析出可用的 viem 客户端。注意assertChainId: false即不强制断言链 ID允许在未连接对应链时仍可构造客户端委托给 Viem Tempo拿到 client 后直接调用Actions.token.changeTransferPolicy(client, parameters)把执行细节完全交给 Viem 的 Tempo 模块Wagmi 层只负责配置解析与客户端装配类型组合Parameters类型由ChainIdParameterconfig、ConnectorParameter与OptionalTransactionOverrides...交叉组合而成并通过UnionLooseOmit去掉chain字段——这解释了上文参数清单中chainId/connector与各项交易覆盖参数的来源。changeTransferPolicySynctoken.ts的骨架与之完全相同区别仅在于委托给Actions.token.changeTransferPolicySync由 Viem 侧负责等待区块包含后返回回执与事件数据。这种Wagmi 薄封装 Viem 底层实现的分层设计使得该 Action 在 React、Core、Solid、Vue 各框架接入层中复用同一套类型与逻辑。测试验证仓库测试 packages/core/src/tempo/actions/token.test.ts 为两个变体各提供了一条默认用例覆盖了完整流程连接config.connectors[0]测试用 mock 连接器调用token.createSync(config, { currency: USD, name: Policy Token, symbol: POLICY })创建一个新代币对changeTransferPolicy断言返回值为 string 类型的交易哈希对changeTransferPolicySync断言receipt存在且快照结果恰好为{ newPolicyId: 0n, updater: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 }。这与文档中 Return Type 的定义完全吻合也验证了该 Action 在同步模式下会返回newPolicyId与updater两个事件字段。React Hooks 用法除了命令式 Action仓库还提供了对应的 React Hooks。在 packages/react/src/tempo/hooks/token.ts 中useChangeTransferPolicy与useChangeTransferPolicySync均基于useMutation封装内部直接调用同名 Core Actionimport { Hooks } from wagmi/tempo function App() { const { mutate, isPending } Hooks.token.useChangeTransferPolicy() return ( button onClick{() mutate({ token: 0x..., policyId: 1n })} disabled{isPending} Change Policy /button ) }特性说明声明式状态mutate触发策略切换isPending表示交易进行中可安全地用于禁用按钮Mutation 语义返回UseMutationResult可继续使用 TanStack Query 的isError、error、onSuccess等能力管理失败与成功分支Sync 变体useChangeTransferPolicySync使用方式相同仅在回调时拿到的是已确认的回执与事件数据。Viem 对应关系token.changeTransferPolicy的最终实现在 Viem 的 Tempo 模块中Wagmi 仅是转发层。Viem 侧提供同名 Action 与extractEvent工具本文异步用法一节已演示适合需要在纯 viem 环境下直接操作、或对底层行为做更深定制如自定义错误处理、事件解析的开发者。两者的参数与返回结构保持一致。小结token.changeTransferPolicy是 Tempo TIP-20 代币治理中高频使用的管理类 Action本文已覆盖其完整使用链路权限前提需要默认管理员角色两种调用形态changeTransferPolicy快、异步确认与changeTransferPolicySync慢、返回即确认核心参数policyId新策略 ID与token代币地址或 ID并支持feeToken、feePayer、nonceKey、validBefore/validAfter等 Tempo 交易特性参数返回值newPolicyId、receipt、updater实现与验证Wagmi 层通过getConnectorClient装配客户端后委托 Viem Tempo 执行测试用例印证了返回结构与完整调用流程React 集成可通过Hooks.token.useChangeTransferPolicy( Sync)以声明式方式集成到组件。若需要深入协议层了解各种策略 ID 的含义与注册方式可继续阅读仓库中 Tempo Actions 索引 与其他代币治理 Action如grantRoles、revokeRoles、setRoleAdmin、modifyWhitelist/modifyBlacklist的文档组合构建完整的代币合规治理方案。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考