You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用compose-capability组合coin.TRANSFER能力?执行遇错求助

问题描述

我编写的合约包含一个函数,满足特定条件时会通过coin.transfer转移资金,该函数受名为TRANSFER_WRAPPER的能力保护。但当前用户调用此函数时,必须同时为TRANSFER_WRAPPER和coin.TRANSFER两个能力签名。

我希望在TRANSFER_WRAPPER中使用compose-capability,让用户只需为wrapper签名即可。我写了如下示例代码:

(module test "sender-keyset"
  (defcap TRANSFER_WRAPPER (receiver:string amount:decimal)
    (compose-capability (coin.TRANSFER "sender" receiver amount))
  )

  (defun transfer-wrapper (receiver:string amount:decimal)
    (with-capability (TRANSFER_WRAPPER receiver amount)
      (coin.transfer "sender" receiver amount)
    )
  )
)

但运行这段代码时,触发了coin-v4合约的意外错误:

./root/coin-v4.pact:50:4: Enforce non-upgradeability
 at ./root/coin-v4.pact:50:4: (enforce false "Enforce non-upgradeability")
 at ./root/coin-v4.pact:49:2: (GOVERNANCE)
 at ./test.pact:3:4: (compose-capability (coin.TRANSFER "sender" "receiver" 20.0))
 at ./test.pact:7:21: (TRANSFER_WRAPPER "sender" "receiver" 20.0)
 at ./test.pact:7:4: (with-capability (test.TRANSFER_WRAPPER "sender" "receiver" 20.0) [(coin.transfer "sender" "receiver" 20.0)])

复现步骤

  • 将上述Pact代码保存为test.pact文件
  • 将coin-v4、fungible-xchain-v1、fungible-v2合约放入同级的root目录
  • 创建test.repl文件并粘贴以下内容:
(env-data { "sender-keyset": { "keys": [ "sender-key" ], "pred": "keys-all" } })
(env-sigs [{ "key": "sender-key", "caps": [] }])
(begin-tx)
; The test depends on the 'coin-v4' contract, which in turn depends on these.
(load "./root/fungible-v2.pact")
(load "./root/fungible-xchain-v1.pact")
(load "./root/coin-v4.pact")
(define-keyset "sender-keyset" (read-keyset "sender-keyset"))
(load "./test.pact")
(commit-tx)

(env-sigs [{ "key": "sender-key", "caps": [(test.TRANSFER_WRAPPER "sender" "receiver" 100.0)] }])
(test.transfer-wrapper "sender" "receiver" 20.0)
  • 执行命令pact test.repl即可复现错误

内容的提问来源于stack exchange,提问作者trh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:03:18