ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

wagmi Tempo `token.renounceRoles` 实战指南:TIP-20 代币角色放弃的同步/异步调用与源码解析

wagmi Tempo `token.renounceRoles` 实战指南:TIP-20 代币角色放弃的同步/异步调用与源码解析 wagmi Tempotoken.renounceRoles实战指南TIP-20 代币角色放弃的同步/异步调用与源码解析【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmitoken.renounceRoles是 wagmi Tempo 模块中用于从调用者自身地址放弃renounce一个或多个 TIP-20 代币角色的核心 Action常用于治理与安全流程——例如代币合约不再需要issuer发行权限时主动交出角色以降低被滥用的风险。本文将以 site/tempo/actions/token.renounceRoles.md 为骨架结合 wagmi 仓库源码与测试完整讲解同步/异步两种调用方式、返回值结构、全部参数含义以及 React Hook 用法帮助你直接落地可运行的代码。TIP-20 角色模型与 renounceRoles 的定位在 Tempo 的 TIP-20 代币标准中代币合约通过**角色Role**来控制关键权限而非仅靠单一所有者。文档定义的角色集合为(defaultAdmin | pause | unpause | issuer | burnBlocked)[]defaultAdmin默认管理员通常拥有管理其他角色配置的权限pause暂停代币操作unpause恢复代币操作issuer发行铸造代币burnBlocked被禁止销毁的相关角色控制。与授予grantRoles或撤销revokeRoles不同renounceRoles有一个明确约束只能放弃调用者自己地址上的角色不能替他人放弃。这一点在文档中被直接表述为 Renounces one or more roles from the callers address。它天然适合自省式安全场景——当合约或账户不再需要某权限时主动交还角色。快速上手使用renounceRolesSync一次性完成文档推荐的最直接用法是*Sync变体。renounceRolesSync会等待交易被打包进区块后才返回因此你拿到结果时角色的放弃已经确认生效import { Actions } from wagmi/tempo import { config } from ./config const { receipt, value } await Actions.token.renounceRolesSync(config, { roles: [issuer], token: 0x20c0000000000000000000000000000000000000, }) console.log(Roles renounced:, value.length) // log: Roles renounced: 1其中config是 wagmi 的配置对象文档中的示例配置对应 site/snippets/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(), }, })要点通过tempoWallet()连接器提供签名账户只配置了tempo一条链transport 使用http()multiInjectedProviderDiscovery: false避免多钱包注入冲突。renounceRolesSync返回值中的value是本次角色变更产生的事件数组value.length即成功放弃的角色数量。同步与异步按性能需求选择变体上面的示例使用的是*Sync变体它会一直等到交易确认入块再返回。如果追求更优性能例如高吞吐的批处理场景应当使用非 Sync 的token.renounceRoles它只返回交易哈希入块确认由你手动等待import { Actions as viem_Actions } from viem/tempo import { Actions } from wagmi/tempo import { waitForTransactionReceipt } from wagmi/actions const hash await Actions.token.renounceRoles(config, { roles: [issuer], token: 0x20c0000000000000000000000000000000000000, }) const receipt await waitForTransactionReceipt(config, { hash }) const events viem_Actions.token.renounceRoles.extractEvents(receipt.logs)两条路径的取舍变体返回内容等待入块适用场景token.renounceRoles仅hash否需手动waitForTransactionReceipt性能优先、需自定义等待与错误处理的场景token.renounceRolesSync{ receipt, value }是内部等待确认简单直接、需要立即拿到事件数据的场景另外Sync变体受throwOnReceiptRevert参数影响当其默认值true时如果收据显示交易回滚会直接抛错设为false则交由你自行判断收据状态。返回值详解renounceRolesSync的返回类型结构如下type ReturnType { /** Transaction receipt */ receipt: TransactionReceipt /** Array of role membership update events */ value: readonly { /** Address that renounced the role */ account: Address /** Whether the role was granted (true) or revoked (false) */ hasRole: boolean /** Role identifier */ role: Hex /** Address that initiated the change */ sender: Address }[] }字段说明receipt完整交易收据可用于 gas 消耗、区块号等链上信息的后续读取value角色成员关系变更事件数组每个元素记录一次变更account放弃角色的地址即调用者hasRoletrue表示授予、false表示撤销——在 renounce 场景中通常为falserole被放弃的角色标识Hexsender发起这次变更的地址。value.length可用于校验预期放弃 N 个角色、实际产生 N 条事件。仓库测试 packages/core/src/tempo/actions/token.test.ts 也验证了这一行为renounceRolesSync后value.length为1且value[0].account等于调用者地址、value[0].hasRole为false。参数详解roles必填类型(defaultAdmin | pause | unpause | issuer | burnBlocked)[]要放弃的角色数组可一次传入多个角色。注意这些角色必须存在于调用者自己的地址上否则交易会被链上合约拒绝或产生空事件。测试用例中先通过grantRolesSync将issuer角色授予自己再调用renounceRoles放弃该角色见 packages/core/src/tempo/actions/token.test.ts这是最典型的先授予、后放弃闭环。token必填类型Address | bigint目标 TIP-20 代币的地址或 ID。文档示例使用了0x20c0000000000000000000000000000000000000这样的地址形式当使用代币 IDbigint时适用于以 ID 而非地址标识的 TIP-20 代币。通用写交易参数均可选以下参数来自共享的写入参数集合对应 site/shared/tempo-write-parameters.mdrenounceRoles与renounceRolesSync均支持参数类型默认值说明accountAccount \| Address已连接的 Wagmi 账户发送交易的账户feeTokenAddress \| bigint—交易手续费代币可为 TIP-20 代币地址或 IDfeePayerAccount \| true—手续费支付方可为 Viem 本地账户或传true表示使用 Fee Payer Servicegasbigint—交易的 gas 上限maxFeePerGasbigint—每单位 gas 的最高费用maxPriorityFeePerGasbigint—每单位 gas 的最高优先费小费noncenumber—交易 noncenonceKeyexpiring \| bigint—交易 nonce keyvalidBeforenumber—交易必须被打包的时间戳上限UnixvalidAfternumber—交易可被打包的时间戳下限UnixthrowOnReceiptRevertbooleantrue收据显示回滚时是否抛错仅对*Sync变体生效其中feeToken/feePayer体现了 Tempo 链第三方代付 gas的能力validBefore/validAfter则为交易设置时间窗约束。这些参数与chainId、connector等 wagmi 通用参数一起最终会透传给 viem 层执行。源码级原理从 config 到链上调用在 packages/core/src/tempo/actions/token.ts 中renounceRoles与renounceRolesSync的实现结构一致export async function renounceRolesconfig extends Config( config: config, parameters: renounceRoles.Parametersconfig, ): PromiseActions.token.renounceRoles.ReturnValue { const { account, chainId, connector } parameters const client await getConnectorClient(config, { account, assertChainId: false, chainId, connector, }) return Actions.token.renounceRoles(client, parameters as never) }可以提炼出的关键点通过getConnectorClient获取客户端根据传入的account、chainId、connector参数解析出当前连接器对应的 viem 客户端。assertChainId: false表示不强制断言链 ID允许跨链参数场景。薄封装委托给 viemwagmi 层仅负责从 wagmi config 解析出 viem client 规范化参数实际的链上交易组装、签名与发送由Actions.token.renounceRoles/renounceRolesSyncviem/tempo 层完成。Sync 变体的差异仅在等待逻辑非 Sync 版本返回hashSync 版本额外等待交易入块并解析出receipt与角色变更事件value。类型透传Parameters类型组合了ChainIdParameter、ConnectorParameter与OptionalTransactionOverrides这也是上节通用写交易参数得以生效的底层原因。React 集成useRenounceRoles/useRenounceRolesSyncHook在 React 应用中更推荐使用wagmi/tempo导出的 Hooks对应文档 site/tempo/hooks/token.useRenounceRoles.md。其底层是 TanStack Query 的useMutation见 packages/react/src/tempo/hooks/token.tsmutationKey分别为[renounceRoles]与[renounceRolesSync]。Sync 变体示例import { Hooks } from wagmi/tempo const renounceRolesSync Hooks.token.useRenounceRolesSync() // 在用户动作按钮点击、表单提交中触发 renounceRolesSync.mutate({ roles: [issuer], token: 0x20c0000000000000000000000000000000000000, }) console.log(Transaction hash:, renounceRolesSync.data?.receipt.transactionHash) // log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef性能优先的异步写法配合useWaitForTransactionReceipt手动等待入块import { Hooks } from wagmi/tempo import { Actions } from viem/tempo import { useWaitForTransactionReceipt } from wagmi const renounceRoles Hooks.token.useRenounceRoles() const { data: receipt } useWaitForTransactionReceipt({ hash: renounceRoles.data }) renounceRoles.mutate({ roles: [issuer], token: 0x20c0000000000000000000000000000000000000, }) if (receipt) { const events Actions.token.renounceRoles.extractEvents(receipt.logs) }Hook 参数说明config可选传入Config可绕过最近的WagmiProvider直接使用指定配置mutation可选透传给 TanStack QueryuseMutation的选项可自定义onSuccess、onError等回调data/mutate/mutateAsync的返回类型分别对应 Action 的 Return Type 与 Parameters。测试验证与最佳实践仓库测试 packages/core/src/tempo/actions/token.test.ts 完整覆盖了两个变体的主路径可以作为你验证集成的参考流程连接账户connectconfig.connectors[0]创建新代币token.createSync先授予角色给自己grantRolesSyncroles: [issuer]调用renounceRoles断言返回hash或renounceRolesSync断言receipt存在、value.length 1、account为调用者、hasRole false。基于文档与源码实践中有几点建议放弃前先确认角色归属可通过hasRole查询确认角色确实在自己地址上避免空操作批量放弃时校验事件数用value.length与传入的roles数量比对确保每个角色都产生了对应事件合理选择 Sync 与否UI 交互按钮点击场景用 Sync 变体体验更直观批量/后台任务用非 Sync 变体配合统一等待更高效善用时间窗与代付参数需要控制交易生效时间或由服务端代付 gas 时使用validBefore/validAfter与feeToken/feePayer保持throwOnReceiptRevert默认开启除非你想自行处理回滚收据否则默认true能第一时间暴露链上失败。token.renounceRoles与 viem 的token.renounceRoles一一对应如需更深层的链上编码细节可继续阅读 viem 的 Tempo 实现而 wagmi 层则专注于 config 解析、连接器客户端获取与类型安全让你在 React/Vue/Solid 等框架中以一致的 API 完成角色治理。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进