在这里,我想允许从使用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
。这可能会产生更多可用的输出。