Ethers.js: falta el firmante

Estoy trabajando en el ethers paquete npm y después de instanciar la billetera, estoy tratando de transferir algunos tokens a la dirección. pero arroja un error missing-signer.

¿Alguien sabe, qué error pude haber cometido?

Mi código :

var ethers = require('ethers');
var providers = require('ethers').providers;
var utils = require('ethers').utils;
var p = new providers.JsonRpcProvider('http://xxx.xx.xxx.xx:8545', false, 5);
ethers.Wallet.provider=p;

const contractAddress = '0x contract address here';
var contractInterface = 'contract interface here';

var data = 'wallet json from keystore';

var walletJson = JSON.stringify(data);
var wPassword='keystore account password';
ethers.Wallet.fromEncryptedWallet(walletJson, wPassword).then(function(wallet) {
    console.log("Address: " + wallet.address);    

    var address = 'adress to transfer to';
    // //var payout =  ethers.utils.parseEther('10.0');
    var payout =  1000000000;
    var contract = new ethers.Contract(contractAddress, contractInterface, wallet);

    try {
        var promise = contract.functions.transfer(address, payout);
        console.log(promise);

        promise
        .then(function(result) { 
          console.log(result); 
        })
        .catch(function(err) { 
          console.log("Promise Rejected "+ err); 
        });
    } catch (e) { 
      console.log(e); process.exit(); 
    }
}).
catch(function(err){
    console.log(err);
});

¿Hay algo que esté haciendo mal con la dirección de la cuenta o la contraseña (dirección del contrato)?

¿Cuál podría ser el error? ¿Algunas ideas?

¿Alguna vez te diste cuenta de esto?
¡Es la dirección del contrato o la interfaz incorrecta! es posible que también deba verificar el walletjson para esa cuenta.

Respuestas (2)

El problema es que la instancia de la billetera no tiene proveedor, por lo que al pasarla al constructor del contrato, no se da cuenta de que es un firmante y no solo un proveedor.

Después de descifrar la instancia de la billetera, asegúrese de configurar el proveedor en ella (antes de pasarla al constructor del contrato):

wallet.provider = p;

Establecer un proveedor en la clase Wallet global no afectará a las instancias.

La solución anterior no funcionó para mí en ethers 5.4.2 La instancia de la billetera ahora es inmutable

pero configurar el proveedor, al crear la billetera funcionó

const _wallet2 = await new ethers.Wallet(privateKey ,provider);

para Json encriptado y mnemónico, usar la función de conexión y devolver la nueva billetera conectada funcionó

let _wallet = await ethers.Wallet.fromMnemonic(mnemonic)
_wallet = _wallet.connect(provider)