Web3js
無法使用 web3js 和 walletconnect 在 android chrome 上執行智能合約 (BUSD) 方法
我有一個在桌面 chrome 上執行良好的網站。
網站為您提供了將 BSC 主網中的 BUSD 轉移到 Metamask 的一些賬戶的可能性。
對於移動設備,我在瀏覽器和 Metamask android 應用程序中使用 walletconnect。是可以登錄的。但交易無法執行。
const Web3Modal = window.Web3Modal.default; const WalletConnectProvider = window.WalletConnectProvider.default; const providerOptions = { walletconnect: { package: WalletConnectProvider, options: { infuraId: "8043bb2cf99347b1bfadfb233c5325c0", } } }; const detectProvider = async () => { let provider; if (window.ethereum) { provider = window.ethereum; console.log(provider); await provider.enable(); } else if (window.web3) { provider = window.web3.currentProvider; await provider.request({ method: 'eth_requestAccounts' }); } else { const web3Modal = new Web3Modal({ cacheProvider: false, providerOptions, disableInjectedProvider: false, }); provider = await web3Modal.connect(); } return provider; };
畢竟,當我獲得提供者並創建合約範例時,我呼叫 BUSD 方法來轉移硬幣:
const res = await contract.methods.transfer(toAddress, amount).send({ from: selectedAccount });
這在桌面上完美執行,但在移動設備上甚至沒有例外,程式碼的執行只是在那一行停止。
如何解決?有人偶然發現了類似的問題嗎?
我需要建立自己的 infura 項目 ( https://infura.io/ ) 並獲得 infuraId。
升級版:
我決定在沒有infura的情況下這樣做。要解決移動版本的問題,您必須將您的手機導航到 metamask 嵌入式瀏覽器。只有這樣,您才不需要退出瀏覽器來確認交易(以及您帳戶的所有其他操作)。
這就是我在手機上導航的方式(我將以下 url 放到標籤 href 中,當使用者點擊它時,他將在桌面瀏覽器(在 PC 上)或我在 metamask 瀏覽器(在移動設備上)中的網站頁面):
let url = navigator.userAgentData.mobile ? 'https://metamask.app.link/dapp/YOUR_WEB_SITE_PAGE' : 'YOUR_WEB_SITE_PAGE';
交易邏輯:
const Web3Modal = window.Web3Modal.default; const WalletConnectProvider = window.WalletConnectProvider.default; const providerOptions = { walletconnect: { package: WalletConnectProvider, options: { rpc: { 56: 'https://bsc-dataseed1.binance.org' }, chainId: 56 } } }; const detectEthereumProvider = async () => { let provider; if (window.ethereum) { provider = window.ethereum; await provider.enable(); } else if (window.web3) { provider = window.web3.currentProvider; await provider.request({ method: 'eth_requestAccounts' }); } else { const web3Modal = new Web3Modal({ network: "mainnet", cacheProvider: true, providerOptions }); provider = await web3Modal.connect(); await web3Modal.toggleModal(); } return provider; }; .................. connect: async function () { try { this.provider = await detectEthereumProvider(); this.provider.on("accountsChanged", async (accounts) => { await this.fetchAccountData(); }); this.provider.on("chainChanged", async (chainId) => { await this.fetchAccountData(); }); this.provider.on("networkChanged", async (networkId) => { await this.fetchAccountData(); }); await this.fetchAccountData(); this.connected = true; } catch (e) { this.connected = false; } }, .................. fetchAccountData: async function () { this.web3 = new Web3(this.provider); this.accounts = await this.web3.eth.getAccounts(); this.selectedAccount = this.accounts[0]; }, .................. const contract = new this.web3.eth.Contract( smartContractAbiJson, smartContractAddress ); contract.defaultAccount = selectedAccount; let res = await contract.methods.transfer(toAddress, amount).send({ from: selectedAccount });