Go-Ethereum

Ethers.js - 缺少簽名者

  • April 10, 2022

我正在處理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);
});

我的賬戶地址或密碼(合約地址)有什麼問題嗎?

錯誤可能是什麼?有任何想法嗎?

問題是錢包實例沒有提供者,所以在將它傳遞給 Contract 建構子時,它沒有意識到它是一個簽名者,而不僅僅是一個提供者。

解密錢包實例後,確保在其上設置提供程序(在將其傳遞給 Contract 建構子之前):

wallet.provider = p;

在全域 Wallet 類上設置提供程序不會影響實例。

上面的解決方案在 ethers 5.4.2 中對我不起作用錢包實例現在是不可變的

但是在創建錢包時設置提供者有效

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

對於 encryptedJson 和助記符,使用 connect 函式並返回一個新的連接錢包有效

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

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