Ethers.js“错误:未知账户#0(操作=“getAddress”,代码=UNSUPPORTED_OPERATION)”

12
我正在尝试使用Ethers.js从KyberSwap获取ETH的价格,但是我收到了以下错误信息:
Error: unknown account #0 (operation="getAddress", code=UNSUPPORTED_OPERATION, version=providers/5.5.3)

我连接到一个Infura Web Socket来获取数据。这是我的脚本:
const { ethers } = require("hardhat");
const kyberABI = require('./kyberABI.json')

const provider = new ethers.providers.WebSocketProvider(
    "wss://mainnet.infura.io/ws/v3/<project_id>")

const kyberNetworkProxyAddress = "0x818E6FECD516Ecc3849DAf6845e3EC868087B755"
const daiAddress = "0x6b175474e89094c44da98b954eedeac495271d0f"

const kyber = new ethers.Contract(
    kyberNetworkProxyAddress,
    kyberABI.kyberNetworkProxy,
    provider.getSigner(),
);

async function main() {
    // Update eth price from Kyber to reflect current market value
    let curEthPriceUSD
    const updateEthPrice = async () => {
        const results = await kyber.getExpectedRate(
            '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
            daiAddress,
            1
        )
        curEthPriceUSD = results.expectedRate
    }
    await updateEthPrice()
    console.log('Current Ethereum price in USD is: ',
        ethers.utils.formatEther(curEthPriceUSD))
}

main()

怎么修复这个错误?
4个回答

13

Github 上一个相关的问题中找到了解决方法。

不要使用 provider.getSigner() 来初始化 Kyber 合约,而是使用 Wallet 对象并从中获取签名者:

const wallet = new ethers.Wallet(ethPrivkey, provider);
const signer = wallet.provider.getSigner(wallet.address);

const kyber = new ethers.Contract(
    kyberNetworkProxyAddress,
    kyberABI.kyberNetworkProxy,
    signer
);

10

我遇到了完全相同的错误信息,但在我的情况下,是因为Metamask账户未连接。这里的第二行修复了它:

const provider = new ethers.providers.Web3Provider(window.ethereum);
await provider.send('eth_requestAccounts', []); // <- this promps user to connect metamask
const signer = provider.getSigner();

1

可能的问题:这里最可能的问题是您的Metamask钱包未连接到您正在创建的应用程序。

解决方案:要连接您的Metamask钱包,您可以按照以下步骤进行:

const connectWallet = async () => {
const accounts= await window.ethereum.request({method: 'eth_requestAccounts'});
console.log(accounts)
}

然后调用上面的函数。

连接到 MetaMask 对我解决了问题,尽管我是使用 Hardhat 部署合约而非浏览器,但我使用了 NPM 包进行连接。 - nikojpapa

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接