调用合约方法时传递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仅接受两个参数:
- 要验证的Capability引用
- 一个单独的执行表达式
而你的代码中,在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
相关产品推荐
相关产品推荐

