Error de Ethereum: el proveedor no admite suscripciones: HDWalletProvider

Estoy haciendo una solicitud de préstamo flash usando web3, truffle y sigo recibiendo el error en un detector de eventos:

El proveedor actual no admite suscripciones: HDWalletProvider.

Me estoy conectando a la red de prueba de ropsten .

Estoy usando el siguiente código para conectarme y obtener eventos emitidos en un contrato inteligente:

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);  

La solicitud es:

 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);
            });

La conexión funciona y los eventos se disparan, pero una de las respuestas de una solicitud de préstamo flash es:

Error: el proveedor actual no admite suscripciones: HDWalletProvider

Mi configuración de trufa es:

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"
       }
    }

  }
}

Respuestas (1)

Las suscripciones solo son compatibles con el proveedor de WebSockets. La URL que está dando es para el proveedor HTTP

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

Cambiar https://a wss://.

Hola @Mikko, gracias por responder. Pido disculpas por no mencionar que estoy en ropsten una red de prueba. En realidad, está configurado en wss en mi código. Sin embargo, todavía tengo el problema; incluso con el wss. Editaré la pregunta para mostrar eso ahora.
Ok te tengo. ¿Funciona su código si omite HDWalletProvider y solo usa el proveedor WSS directamente? Casi parece que Web3.js tiene un error para detectar esto.
Acabo de buscar rápidamente en el repositorio web3.js cómo se detecta esto: github.com/ethereum/web3.js/blob/… - podría ser que se necesite un parche para HDWalletProvider si carece onde función
Probaré esto e informaré tan pronto como pueda. Muchas gracias
Hola, @Mikko, ¿quieres decir que debería reemplazar el nuevo HDWalletProvider(mnemónico, "wss://mainnet.infura.io/v3/"+infuraKey); en mi configuración de trufa con un proveedor de websocket? Si es así, por favor, ¿cómo sería eso?
Sí. No recuerdo cómo debería verse, pero los documentos web3.js deberían tener un ejemplo. Tengo un presentimiento HDWalletProvideres el culpable.
Lo intenté agregando un proveedor de websocket directamente, pero dice que no se reconoce la cuenta del remitente. ¿Hay alguna forma de pasarle la clave privada como yo la paso al HDWalletProvider?
No, no es. Pero, ¿las suscripciones de eventos funcionan sin HDWalletProvider>? Es decir, no hay ningún error.
Si este es el caso, le sugiero que presente un problema directamente en el repositorio de Truffle github.