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

在Clojure移动端通过WalletConnect v1与ethers.js调用智能合约方法

WalletConnect 连接后移动端调用合约无响应的解决方法

问题背景

用Clojure实现基于WalletConnect的合约调用流程:Metamask iOS钱包能正常完成账户连接,但调用合约方法时移动端无任何响应;桌面端通过window.ethereum创建Web3Provider的流程完全正常,可唤起Metamask扩展处理签名。

核心修正点

直接使用WalletConnect connector作为provider,或错误初始化Web3Provider,会导致交易签名请求无法正确传递到移动端钱包。需按以下步骤修正代码:

1. 修正合约调用函数

替换原my-function,确保正确初始化Web3Provider并处理签名流程:

(defn my-function [connector DATAS]
  (let [{:keys [abi address params]} DATAS
        ;; 用WalletConnect connector正确初始化Web3Provider
        provider (ethers/providers.Web3Provider. connector)
        ;; 获取当前连接账户的signer
        signer (.getSigner provider)
        ;; 用signer直接初始化合约实例
        contract (ethers/Contract. address abi signer)]
    (-> (. contract "contract-method-name" params)  ;; 替换为你的实际合约方法名
        (.then (fn [tx]
                 (println "交易已提交,哈希:" (.hash tx))
                 ;; 可选:等待交易上链确认
                 (.wait tx)
                 (.then #(println "合约调用成功!"))))
        (.catch (fn [err]
                  (println "调用失败原因:" err))))))

2. 确认连接回调的参数传递

确保create-connector中连接成功的回调能正确获取合约配置:

(defn create-connector []
  (let [connector (WalletConnect.
                   #js{ "bridge" "https://bridge.walletconnect.org" 
                        "qrcodeModal" QRCodeModal})]
    (-> (.createSession connector)
        (.then
          #(.on connector "connect" (fn [session-info]
                                      ;; 确保DATAS是包含abi、address、params的合约配置
                                      (my-function connector DATAS)))))))

关键说明

  • 必须通过ethers/providers.Web3Provider包装WalletConnect connector,不能直接用connector作为provider:Web3Provider会处理WalletConnect的消息传递逻辑,确保签名请求能发送到移动端钱包。
  • 合约实例初始化时直接传入signer,无需重复调用.connect,避免冗余操作。
  • 增加错误捕获逻辑,方便排查请求传递过程中的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:23:11