Web3js

無法使用 web3js 和 walletconnect 在 android chrome 上執行智能合約 (BUSD) 方法

  • February 22, 2022

我有一個在桌面 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 });

引用自:https://ethereum.stackexchange.com/questions/119203