Go-Ethereum
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); });
我的賬戶地址或密碼(合約地址)有什麼問題嗎?
錯誤可能是什麼?有任何想法嗎?
問題是錢包實例沒有提供者,所以在將它傳遞給 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)