Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

核心抽象:Namespace、Chest、Policy

模块与入口一览

模块主要类型 / 函数说明
pas::namespaceNamespace, setup, block_version, unblock_version, chest_address, policy_address单例、派生地址、版本阻断
pas::chestChest, Auth, create_and_share, send_balance, unlock_balance, clawback_balance, deposit_balance, new_auth创建 Chest、发起请求、存款、鉴权
pas::policyPolicy<T>, PolicyCap<T>, new_for_currency, share, set_required_approval, required_approvals创建策略、配置审批、查询
pas::templatesTemplates, setup, set_template_command, unset_template_commandCommand 注册,供 SDK 解析
pas::requestRequest<K>, approve, data, approvals热土豆、收集审批
pas::send_funds / unlock_funds / clawback_fundsSendFunds<T>, resolve_balance / resolve请求数据与 resolve 入口
pas::keyssend_funds_action(), unlock_funds_action(), clawback_funds_action(), is_valid_action动作名字符串("send_funds" 等)

Namespace

Namespace 是 PAS 中的全局单例共享对象,负责:

  • 为每个地址(或对象)派生唯一的 Chest 地址;
  • 为每种代币类型派生唯一的 Policy<Balance<C>> 地址;
  • 存储 Templates(各审批类型对应的 PTB Command);
  • 管理 Versioning(block_version / unblock_version),用于紧急阻断或升级兼容。

发布 PAS 包时,init 会创建并 share_object 一个 Namespace。之后通过 namespace::setup(namespace, &upgrade_cap) 绑定 UpgradeCap,即可用该 Cap 调用 block_version / unblock_version

派生规则依赖 derived_object:Chest 由 keys::chest_key(owner) 派生,Policy 由 keys::policy_key<Balance<C>>() 派生,因此同一地址在同一 Namespace 下只有一个 Chest同一代币类型只有一个 Policy,便于钱包与索引器按地址/类型推算 ID。

Namespace 接口速查

函数签名说明
setupentry fun setup(namespace: &mut Namespace, cap: &UpgradeCap)绑定 UpgradeCap,之后才能 block/unblock 版本、claim 派生对象
block_versionpublic fun block_version(namespace: &mut Namespace, cap: &UpgradeCap, version: u64)阻断指定包版本
unblock_versionpublic fun unblock_version(namespace: &mut Namespace, cap: &UpgradeCap, version: u64)解除版本阻断
chest_existspublic fun chest_exists(namespace: &Namespace, owner: address): bool某地址是否已有 Chest
chest_addresspublic fun chest_address(namespace: &Namespace, owner: address): address派生 Chest 地址(用于查询或 deposit)
policy_existspublic fun policy_exists<T>(namespace: &Namespace): bool是否存在 Policy<T>
policy_addresspublic fun policy_address<T>(namespace: &Namespace): address派生 Policy<T> 的地址

Chest

Chest 是存放某一种或多种 PAS 代币余额的容器,与「所有者」一一对应:

  • 所有者:可以是 address(用户钱包)或对象(用于账户抽象/协议托管)。
  • 每个所有者在一个 Namespace 下只有一个 Chest(由 derived_object::claim(namespace, chest_key(owner)) 保证)。
  • Chest 创建后通常 share_object,便于任何人向该 Chest 存款或查询余额;只有所有者(或授权证明 Auth)才能发起转出、解锁或被动被 clawback。

余额只能:

  • 从 Chest A 转到 Chest B(通过 SendFunds 请求);
  • 从 Chest 解锁到链上普通余额(通过 UnlockFunds 请求,若 Policy 支持);
  • 被发行方 Clawback(通过 ClawbackFunds 请求,若 Policy 在注册时允许)。

Chest 内部使用 balance::Balance<C> 等存储,与 Sui 标准余额兼容,RPC/钱包可按「Chest 的派生地址」查询余额。

Chest 接口速查

函数签名说明
createpublic fun create(namespace: &mut Namespace, owner: address): Chest为 owner 创建 Chest(需随后 share)
create_and_sharepublic fun create_and_share(namespace: &mut Namespace, owner: address)创建并共享,一步完成
sharepublic fun share(chest: Chest)将 Chest 设为共享对象
send_balancepublic fun send_balance<C>(from: &mut Chest, auth: &Auth, to: &Chest, amount: u64, _ctx: &mut TxContext): Request<SendFunds<Balance<C>>>从 from 转 amount 到 to Chest,返回待解析的 Request
unsafe_send_balancepublic fun unsafe_send_balance<C>(from: &mut Chest, auth: &Auth, recipient_address: address, amount: u64, _ctx: &mut TxContext): Request<SendFunds<Balance<C>>>地址转账(可转给尚未建 Chest 的地址),易用错,慎用
unlock_balancepublic fun unlock_balance<C>(chest: &mut Chest, auth: &Auth, amount: u64, _ctx: &mut TxContext): Request<UnlockFunds<Balance<C>>>发起解锁请求
clawback_balancepublic fun clawback_balance<C>(from: &mut Chest, amount: u64, _ctx: &mut TxContext): Request<ClawbackFunds<Balance<C>>>发行方发起收回请求(无 Auth)
deposit_balancepublic fun deposit_balance<C>(chest: &Chest, balance: Balance<C>)无许可向 Chest 存入余额
ownerpublic fun owner(chest: &Chest): address返回 Chest 所有者地址
new_authpublic fun new_auth(ctx: &TxContext): Auth用交易发送方生成 Auth
new_auth_as_objectpublic fun new_auth_as_object(uid: &mut UID): Auth用对象 UID 生成 Auth(对象拥有 Chest 时)
sync_versioningpublic fun sync_versioning(chest: &mut Chest, namespace: &Namespace)与 Namespace 同步版本信息

Policy 与 PolicyCap

Policy<T> 与某种可转移类型 T(实践中多为 Balance<C>)绑定,表示「该类型在 PAS 下的转移规则」:

  • required_approvalsVecMap<String, VecSet<TypeName>>,键为动作名(如 "send_funds""unlock_funds""clawback_funds"),值为需要收集的审批类型(TypeName)集合;只有收集齐这些审批后,对应 Request 才能被 resolve。
  • clawback_allowed:注册时确定,是否允许对该类型的 Chest 发起 clawback。
  • versioning:与 Namespace 同步,用于阻断旧版本。

PolicyCap<T> 与 Policy 一一对应,持有者可:

  • 调用 policy::set_required_approval / remove_action_approval 配置各动作所需的审批类型;
  • Templates 配合,为每种审批类型设置 PTB Command,供 SDK 解析转账时使用。

创建方式(以代币类型 Balance<C> 为例):policy::new_for_currency(namespace, &mut treasury_cap, clawback_allowed),得到 (Policy<Balance<C>>, PolicyCap<Balance<C>>);然后 policy::share(policy),PolicyCap 由发行方保管。

Policy 接口速查

函数签名说明
new_for_currencypublic fun new_for_currency<C>(namespace: &mut Namespace, _cap: &mut TreasuryCap<C>, clawback_allowed: bool): (Policy<Balance<C>>, PolicyCap<Balance<C>>)为货币 C 创建 Policy 与 PolicyCap
sharepublic fun share<T>(policy: Policy<T>)共享 Policy,供 resolve 等使用
set_required_approvalpublic fun set_required_approval<T, A: drop>(policy: &mut Policy<T>, cap: &PolicyCap<T>, action: String)设置某动作(如 "send_funds")需要审批类型 A
remove_action_approvalpublic fun remove_action_approval<T>(policy: &mut Policy<T>, _: &PolicyCap<T>, action: String)移除某动作的审批要求(导致该动作无法 resolve)
required_approvalspublic fun required_approvals<T>(policy: &Policy<T>, action_type: String): VecSet<TypeName>查询某动作所需的审批类型集合
sync_versioningpublic fun sync_versioning<T>(policy: &mut Policy<T>, namespace: &Namespace)与 Namespace 同步版本

合法 action 字符串由 pas::keys 定义:send_funds_action()unlock_funds_action()clawback_funds_action()(即 "send_funds""unlock_funds""clawback_funds")。

小结

  • Namespace:单例,负责派生 Chest/Policy/Templates 及版本控制。
  • Chest:每地址(或对象)一个,存 PAS 余额;仅能通过 SendFunds / UnlockFunds / Clawback 变动。
  • Policy + PolicyCap:按代币类型规定各动作所需审批类型,Cap 持有者配置审批与 Templates。