Ошибка Ethereum: провайдер не поддерживает подписки: HDWalletProvider

Я делаю запрос на флэш-кредит с помощью web3 , truffle и продолжаю получать сообщение об ошибке в прослушивателе событий:

Текущий провайдер не поддерживает подписки: HDWalletProvider.

Я подключаюсь к тестовой сети ropsten .

Я использую приведенный ниже код для подключения для получения событий в смарт-контракте:

const web3 = new Web3();
const eventProvider = new Web3.providers.WebsocketProvider(wss);
 
eventProvider.on('error', e => {
    console.error('WS Infura Error', e);
});

eventProvider.on('connect', function () {
        console.log('WSS Connected');
            setupListeners();
    });

eventProvider.on('end', e => {
    console.log('WS closed');
    console.log('Attempting to reconnect...');

       eventProvider = new Web3.providers.WebsocketProvider(wss);

eventProvider.on('connect', function () {
        console.log('WSS Reconnected');
            setupListeners();
    });
    web3.setProvider(eventProvider);
});
 web3.setProvider(eventProvider);  

Запрос:

 contract1.methods.flashloan( args_of_my_use_case ).send({
              from: addr, //designated Metamask wallet address
              gas: gasCost,
              value: 0,
              nonce: accountNonce,
            },
            function (error, data) {
               if(error){
                 invariant.currentlyTrading = false;
                 obj.nowTrading = false;
               }
               console.log('arb data => ', data, '   arb error => ' ,error, appendText);
            });

Соединение работает, и события запускаются, но один из ответов на запрос мгновенного кредита:

Ошибка: Текущий провайдер не поддерживает подписки: HDWalletProvider

Моя конфигурация трюфеля:

const dotenv = require('dotenv');
const fs = require('fs');
 
const envConfig = dotenv.config({silent: true});



 const HDWalletProvider = require('@truffle/hdwallet-provider');
 const infuraKey = process.env.INFURA_API_KEY;

const ethPubAddr = process.env.ETH_PUBLIC_ADDRESS;
 const mnemonic = process.env.METAMASK_PVT_KEY; 
 

 console.log("mnemonic -->" , mnemonic);

module.exports = {
   
  networks: {
    // Useful for testing. The `development` name is special - truffle uses it by default
    // if it's defined here and no other network is specified at the command line.
    // You should run a client (like ganache-cli, geth or parity) in a separate terminal
    // tab if you use this network and you must also set the `host`, `port` and `network_id`
    // options below to some value.
    //
    mainnet: {
      provider: function() {
        return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/"+infuraKey);
      },
      network_id: 1,
      from: ethPubAddr

    },
    ropsten: {
      provider: function() {
         return new HDWalletProvider(mnemonic, "wss://ropsten.infura.io/ws/v3/"+infuraKey);
      },
      network_id: 3,
      from: ethPubAddr,   
      gas: 6800000, // Current Ropsten gas limit. See https://ropsten.etherscan.io/block/3141628
      gasPrice: 20000000000 // 1.1 GWei - based on the lower end of current txs getting into blocks currently on Ropsten.
   //   gasLimit: 8000000

    },
  
    development: {
      host: "127.0.0.1",     // Localhost (default: none)
      port: 8545,            // Standard Ethereum port (default: none)
      network_id: "*",       // Any network (default: none)
    },

  },

  // Set default mocha options here, use special reporters etc.
  mocha: {
    // timeout: 100000
  },

  // Configure your compilers
  compilers: {
    solc: {
       version: '0.6.10',    // Fetch exact version from solc-bin (default: truffle's version)
      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
     settings: {          // See the solidity docs for advice about optimization and evmVersion
       /* optimizer: {
          enabled: true,
          runs: 2
        }*/
      //  evmVersion: "byzantium"
       }
    }

  }
}

Ответы (1)

Подписки поддерживаются только провайдером WebSockets. URL-адрес, который вы указываете, предназначен для HTTP-провайдера.

        return new HDWalletProvider(mnemonic, "https://mainnet.infura.io/v3/"+infuraKey);`

Изменить https://на wss://.

Привет @Mikko, спасибо за ответ. Прошу прощения за то, что не упомянул, что я нахожусь в тестовой сети. На самом деле в моем коде установлено значение wss. У меня все еще есть проблема; даже с wss. Я отредактирую вопрос, чтобы показать это сейчас.
Хорошо, понял. Работает ли ваш код, если вы не используете HDWalletProvider и просто напрямую используете провайдера WSS? Похоже, что в Web3.js есть ошибка для обнаружения этого.
Я только что быстро просмотрел репозиторий web3.js, как это обнаруживается: github.com/ethereum/web3.js/blob/… — возможно, потребуется патч для HDWalletProvider, если ему не хватает onфункции
Я попробую это и сообщу, как только смогу. Большое спасибо
Привет @Mikko, ты имеешь в виду, что я должен заменить return new HDWalletProvider(мнемоника, "wss://mainnet.infura.io/v3/"+infuraKey); в моей конфигурации трюфеля с провайдером веб-сокетов? Если да, то как это будет выглядеть?
Да. Я не помню, как это должно выглядеть, но в документах web3.js должен быть пример. У меня нутром чувство, HDWalletProviderчто это виновник.
Я попытался напрямую добавить поставщика веб-сокетов, но он говорит, что учетная запись отправителя не распознана. Есть ли способ передать ему закрытый ключ, как я передаю его HDWalletProvider?
Нет это не так. А подписки на события работают без HDWalletProvider>т.е. ошибки нет.
Если это так, то я предлагаю вам зарегистрировать проблему непосредственно в репозитории Truffle на github.