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

调用合约方法时传递Capability参数出现参数过多错误求助

合约调用出现「参数过多」错误的排查与解决

错误信息

{ 
  "type" : "EvalError", 
  "message" : "Failed to apply a function or closure because there were too many arguments.", 
  "info" : "free.bridge-contract-v25.funds-in.{A95qbD8zCnsd0vGHfiQgViQGfY1zwkRoeUKFsj2y4f4}:146", 
  "callStack" : [] 
}

合约代码片段

FUNDS_IN Capability定义

(defcap FUNDS_IN (sender:string token-name:string amount:decimal destination-chain:string destination-address:string transaction-id:integer)
      @event
      (enforce (> amount 0.0) "Amount must be positive")
      (enforce (!= destination-chain "") "Destination chain cannot be empty")
      (enforce (!= destination-address "") "Destination address cannot be empty")
      (enforce (!= token-name "") "Token name cannot be empty"))

funds-in方法实现

(defun funds-in:string 
    ( sender:string
      token-module:module{fungible-v2}
      params:object{bridge-in-params-schema})
    (let* ((amount (at "amount" params))
           (commission (at "commission" params))
           (destination-chain (at "destination-chain" params))
           (destination-address (at "destination-address" params))
           (transaction-id (at "transaction-id" params))
           (token-name (format "{}" [token-module]))
           (net-amount (- amount commission)))
      
      (require-capability (FUNDS_IN sender token-name amount destination-chain destination-address transaction-id)
        (enforce-not-paused)
        ...

调用用YAML配置片段

...
  (free.bridge-contract-v25.funds-in
    "k:c424cda0153e67371fcc65ffcea764bebd572e9e582116ccdeb296621c86e938"
    free.fungible-token-v11
    {
      "amount": 100.0,
      "commission": 5.0,
      "destination-chain": "ethereum",
      "destination-address": "0x742d35Cc6634C0532925a3b8D563d7F13a68c98f",
      "transaction-id": 555
    })
data: {}
keyPairs:
  - public: "public"
    secret: "secret"
    caps:
      - name: "free.fungible-token-v11.TRANSFER"
        args: ["k:c424cda0153e67371fcc65ffcea764bebd572e9e582116ccdeb296621c86e938", "bridge-vault", 100.0]
      - name: "free.bridge-contract-v25.FUNDS_IN"
        args: ["k:c424cda0153e67371fcc65ffcea764bebd572e9e582116ccdeb296621c86e938", "free.fungible-token-v11", 100.0, "ethereum", "0x742d35Cc6634C0532925a3b8D563d7F13a68c98f", 555]
      - name: "coin.GAS"
        args: []
      ...

问题原因

错误的核心是**require-capability函数的语法使用错误**:
Clarity语言中,require-capability仅接受两个参数:

  1. 要验证的Capability引用
  2. 一个单独的执行表达式

而你的代码中,在require-capability后直接写了多个表达式((enforce-not-paused)以及后续未展示的代码),这些表达式被当作额外的参数传递给require-capability,导致参数数量超出函数定义,触发「参数过多」的EvalError。

解决方案

将require-capability后的多个执行表达式用(begin ...)包裹,合并为一个单独的表达式:

(require-capability (FUNDS_IN sender token-name amount destination-chain destination-address transaction-id)
  (begin
    (enforce-not-paused)
    ...  // 其他原有代码
  )
)

这样require-capability仅接收两个参数,符合语法要求,即可解决该错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:44:54