Ethers.js — отсутствует подписант

Я работаю над ethers пакетом npm и после создания кошелька пытаюсь передать токены на адрес. но выдает ошибку missing-signer.

Кто-нибудь знает, какую ошибку я мог сделать?

Мой код:

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

Есть ли что-то, что я делаю неправильно с адресом учетной записи или паролем (адрес контракта)?

В чем может быть ошибка? Есть идеи?

Вы когда-нибудь понимали это?
либо адрес контракта, либо интерфейс неверный! вам также может понадобиться проверить walletjson для этой учетной записи.

Ответы (2)

Проблема в том, что экземпляр кошелька не имеет провайдера, поэтому при передаче его в конструктор контракта он не понимает, что он подписывающий, а не только провайдер.

После расшифровки экземпляра кошелька убедитесь, что вы установили для него провайдера (перед передачей его в конструктор контракта):

wallet.provider = p;

Установка поставщика в глобальном классе Wallet не повлияет на экземпляры.

Приведенное выше решение не сработало для меня в эфирах 5.4.2 Экземпляр кошелька теперь неизменяем.

но установка провайдера при создании кошелька сработала

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

для зашифрованного Json и мнемоники сработало использование функции подключения и возврат нового подключенного кошелька

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