在Clojure中使用WalletConnect v1和ethers.js提供商在移动端调用智能合约方法



在这里,我想允许从使用WalletConnect的以太币提供商那里调用我的智能合约的一个方法。

我按照如下步骤将用户连接到WalletConnect:

(ns my.project
(:require
["@walletconnect/client" :default WalletConnect]
["@walletconnect/qrcode-modal" :as QRCodeModal]
["ethers" :as ethers]))

(defn create-connector []
(let [connector (WalletConnect.
#js{ "bridge" "https://bridge.walletconnect.org" 
"qrcodeModal" QRCodeModal})]
(-> (.createSession connector)
(.then
#(.on connector "connect" #(my-function connector DATAS))))))

一旦用户连接上,我启动my-function方法,该方法调用合约方法:

(defn my-function [connector DATAS]
(let [{:keys [abi address params]} DATAS
provider connector
signer (.getSigner provider)
contract (ethers/Contract. address abi signer)
contract (.connect contract signer)]
(-> (.contract-method contract params)
(.then
#(println "SUCCESS CALL.")))))

与账户的连接正常,我在钱包应用程序(Metamask iOS)上被正确重定向,但是在调用合约方法时,在我的移动钱包应用程序级别上没有发生任何事情。

我尝试了另一种方法来创建我的提供者,以这种方式,但也没有任何结果:

(let [...
provider (ethers/providers.Web3Provider. connector)
...] 
...
)

请注意,当我在桌面尝试使用此提供程序调用方法时,它工作得很好,我的Metamask扩展被很好地调用:

(let [...
provider (ethers/providers.Web3Provider. (object/get js/window "ethereum"))
...] 
...
)

这里有用的是能够从walletconnect客户端检索签名。

我对钱包的任何细节都不了解,但一般情况下,您应该添加.catch来处理承诺拒绝,即。.contract-method呼叫失败

那么,试着把它改成这个。也许这会暴露出实际的错误。

(defn my-function [connector DATAS]
(let [{:keys [abi address params]} DATAS
provider connector
signer (.getSigner provider)
contract (ethers/Contract. address abi signer)
contract (.connect contract signer)]
(-> (.contract-method contract params)
(.then #(println "SUCCESS CALL."))
(.catch #(println "FAILED CALL." %)))))

可以用js/console.log代替println。这可能会产生更多可用的输出。

相关内容

  • 没有找到相关文章

最新更新