在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
相关产品推荐
相关产品推荐

