
Wagmi Tempopolicy.setAdmin完整指南转让策略管理员切换的 Actions 与源码解析【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmiTempo 网络中的 transfer policy转让策略用于约束代币等资产的转移行为而policy.setAdmin负责将某个策略的管理权限移交给新的管理员地址。本文以 wagmi 仓库中 site/tempo/actions/policy.setAdmin.md 为骨架结合 packages/core/src/tempo/actions/policy.ts 的源码实现与 packages/core/src/tempo/actions/policy.test.ts 的测试用例完整讲解同步/异步两种调用方式、返回值结构、全部参数语义与底层调用链帮助你准确掌握在 wagmi 应用中安全地完成策略管理员交接。一、功能定位为什么需要切换策略管理员Transfer policy 是 Tempo 链上一种控制资产转移规则的机制一个策略拥有admin管理员角色只有管理员才能执行策略的后续管理操作例如修改黑白名单、变更权限等。当项目方更换运营地址、拆分权限或回收控制权时就需要把策略的管理员移交给新地址。policy.setAdmin的语义非常明确为指定的策略设置新的管理员地址且调用者必须当前持有该策略的管理员角色原文档明确注明 Requires current policy admin role。也就是说这是一次权限敏感的管理操作普通用户调用会被拒绝。在 wagmi 的 Tempo 模块中这一操作对应两条核心 ActionAction行为返回Actions.policy.setAdmin仅提交交易立即返回交易哈希交易哈希HashActions.policy.setAdminSync等待交易被打包进区块后再返回事件数据 交易回执两者共享同一组参数区别只在于是否等待链上确认见下文同步与异步小节。二、准备工作Tempo 配置与钱包无论使用同步还是异步版本调用前都需要一个已连接 Tempo 链的 wagmi 配置。原文档通过 /snippets/react/config-tempo.ts引入了参考配置 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(), }, })要点说明connectors: [tempoWallet()]引入 Tempo 官方钱包连接器来自wagmi/tempo导出multiInjectedProviderDiscovery: false关闭多注入钱包探测避免与 Tempo 钱包的注入逻辑冲突chains: [tempo]声明使用 Tempo 链transports中为tempo.id配置http()传输层用于发起 RPC 请求从 packages/core/src/exports/tempo.ts 的源码可以看到wagmi/tempo这个导出面将Actions与tempoWallet等连接器集中暴露export * as Actions from ../tempo/actions/index.js。三、基础用法setAdminSync同步等待原文档给出的推荐用法是*Sync变体因为它会在内部等待交易被打包拿到回执后再返回代码最省心import { Actions } from wagmi/tempo import { config } from ./config const { receipt } await Actions.policy.setAdminSync(config, { admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb, policyId: 1n, }) console.log(Transaction hash:, receipt.transactionHash) // log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef参数说明config第一步创建的 wagmi 配置对象admin新管理员地址Address类型policyId要更新权限的策略 IDbigint类型示例使用1n的字面量语法。从 packages/core/src/tempo/actions/policy.ts 的源码可以看到setAdminSync的完整实现它首先从参数中解构account、chainId、connector然后调用getConnectorClient取得当前连接的客户端assertChainId: false表示不强制校验链 ID最终委托给 viem 底层的Actions.policy.setAdminSync完成链上调用与回执等待。返回对象中receipt.transactionHash即交易哈希。四、性能优先异步setAdmin 手动等待*Sync变体的代价是必须等交易进入区块后函数才返回在需要快速响应的场景如边提交边刷新 UI可能不是最优解。原文档给出了性能优先的写法先用非同步的setAdmin拿到交易哈希再手动调用waitForTransactionReceipt等待确认并可用extractEvent从回执日志中解析出事件参数import { Actions as viem_Actions } from viem/tempo import { Actions } from wagmi/tempo import { waitForTransactionReceipt } from wagmi/actions const hash await Actions.policy.setAdmin(config, { admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb, policyId: 1n, }) const receipt await waitForTransactionReceipt(config, { hash }) const { args } viem_Actions.policy.setAdmin.extractEvent(receipt.logs)这条链路的价值在于解耦setAdmin只负责把交易发出去确认与事件解析交给调用方自行编排。其中extractEvent(receipt.logs)是 viem 提供的AdminSet管理员变更事件提取工具返回的args结构与下文返回值一致方便前端直接读取新管理员与更新者地址。从源码层面看setAdmin与setAdminSync的参数类型几乎一致见 packages/core/src/tempo/actions/policy.ts 与 packages/core/src/tempo/actions/policy.ts均通过ChainIdParameter ConnectorParameter UnionLooseOmitOptionalTransactionOverrides..., chain组合出完整参数集合——即除交易覆盖参数外还支持chainId与connector的显式指定并允许覆盖省略底层的chain字段。五、Return Type返回值字段语义setAdmin/setAdminSync的返回值结构如下原文档完整给出type ReturnType { /** Address of the new admin */ admin: Address /** ID of the policy */ policyId: bigint /** Transaction receipt */ receipt: TransactionReceipt /** Address that updated the admin */ updater: Address }逐字段解释admin本次设置的新管理员地址policyId被更新策略的 IDreceipt交易回执*Sync变体必然存在异步版本需要配合waitForTransactionReceipt自行获取updater实际执行更新操作的地址即提交交易的调用者。在 packages/core/src/tempo/actions/policy.test.ts 的测试中这一结构被逐一断言验证测试先通过policy.createSync创建一个whitelist类型策略拿到policyId再调用setAdminSync把管理员切换为account2.address随后断言setAdminResult.policyId等于原policyId、admin等于新地址、updater等于当前连接账户account.address。测试最后还通过policy.getData见 site/tempo/actions/policy.getData.md反查策略数据确认data.admin已变为新管理员——这正好佐证了setAdmin的权限交接是真实生效的。六、Parameters完整参数表核心业务参数admin必填Type:Address要设置为新策略管理员的地址。policyId必填Type:bigint要更新的策略 ID。该 ID 通常来自创建策略时的返回值如createSync返回的policyId。连接与交易覆盖参数原文档通过!--include: shared/tempo-write-parameters.md--引入了通用写入参数完整内容见 site/shared/tempo-write-parameters.md与setAdmin相关的可选参数如下参数类型默认值说明accountAccount \| Address当前已连接的 Wagmi 账户用于发送交易的账户不传则回退到已连接账户feeTokenAddress \| bigint—交易手续费代币可为 TIP-20 代币地址或 IDfeePayerAccount \| true—手续费支付方可传 Viem Account或传true表示使用 Fee Payer Service 代付gasbigint—交易的 gas 上限maxFeePerGasbigint—交易的最大总费用per gasmaxPriorityFeePerGasbigint—最大优先费用per gasnoncenumber—交易的 noncenonceKeyexpiring \| bigint—交易的 nonce keyTempo 链的到期 nonce 机制validBeforenumber—交易必须被打包之前的 Unix 时间戳validAfternumber—交易可以被打包之后的 Unix 时间戳throwOnReceiptRevertbooleantrue仅对*Sync动作有效若回执显示交易 revert 是否抛错结合 packages/core/src/tempo/actions/policy.ts 的参数类型定义setAdmin还额外支持chainId目标链 ID与connector指定连接器两个连接层参数便于多链或多钱包场景下精确路由交易。其中validBefore/validAfter与nonceKey: expiring体现了 Tempo 链交易有效期特性你可以把管理员交接交易约束在某个时间窗口内过期即失效适合需要时间约束的权限操作。七、权限前置校验结合isAuthorized与getData由于setAdmin要求调用者具备当前策略的管理员角色建议在调用前先做一次只读检查避免盲发交易使用Actions.policy.getData见 site/tempo/actions/policy.getData.md查询策略当前的admin与typeconst { admin, type } await Actions.policy.getData(config, { policyId: 1n, })使用Actions.policy.isAuthorized见 site/tempo/actions/policy.isAuthorized.md校验某地址是否被策略授权const isAuthorized await Actions.policy.isAuthorized(config, { user: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb, policyId: 1n, })在 packages/core/src/tempo/actions/policy.test.ts 中测试正是在切换管理员后用getData反查确认data.admin account2.address这一先查后改、改后再查的闭环同样适用于生产代码。八、底层调用链与实现原理从 packages/core/src/tempo/actions/policy.ts 可以看出setAdmin在 wagmi 中只是一个薄封装真正的链上逻辑由 viem 的 Tempo 模块承载调用链为Actions.policy.setAdmin(config, params) → getConnectorClient(config, { account, chainId, connector, assertChainId: false }) → viem Actions.policy.setAdmin(client, params)同理setAdminSync的调用链为Actions.policy.setAdminSync(config, params) → getConnectorClient(...) → viem Actions.policy.setAdminSync(client, params) // 内部等待交易打包并返回回执几个值得注意的实现细节assertChainId: false获取客户端时不强制断言链 ID给上层通过chainId参数精确指定目标链留出空间参数透传parameters as never直接将 wagmi 层参数透传给 viem 层因此 wagmi 文档中关于admin、policyId、交易覆盖参数的语义与 viem 完全一致*Sync的同步含义不是阻塞 JS 主线程而是 Promise 内等待交易上链确认返回的是包含回执的完整结果错误处理当前源码中ErrorType标注为BaseErrorType带// TODO注释说明错误类型在持续演进中使用时建议对baseError做通用兜底处理。九、实战建议与注意事项权限校验先行setAdmin要求当前调用者是策略管理员务必在 UI 层结合getData展示当前管理员并仅在当前地址 策略 admin时开放操作入口同步 vs 异步取舍需要回执数据如展示receipt.transactionHash就用setAdminSync追求响应速度、想自己编排确认流程就用setAdminwaitForTransactionReceipt事件驱动更新异步场景下推荐用viem_Actions.policy.setAdmin.extractEvent(receipt.logs)解析AdminSet事件直接拿到结构化的argsadmin、policyId、updater时间窗口约束如果管理员交接需要在限定时间内完成可配合validBefore/validAfter与nonceKey: expiring设置交易有效期throwOnReceiptRevert使用*Sync时默认true交易失败会抛错如希望自行处理回执中的 revert 状态可显式设为false。十、相关文档导航核心实现packages/core/src/tempo/actions/policy.ts测试用例含 setAdmin 完整流程packages/core/src/tempo/actions/policy.test.ts通用写入参数site/shared/tempo-write-parameters.mdTempo 配置示例site/snippets/react/config-tempo.ts配套查询动作policy.getData 与 policy.isAuthorizedReact 侧 Hook 封装policy.useSetAdmin提供useSetAdmin/useSetAdminSync两个 mutation hook配合mutate调用并在data中读取返回值【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考