BSC测试网MetaMask授权ERC20代币时出现-32000服务器错误求助
我通过以下ethers代码触发MetaMask弹窗授权ERC20代币,2-3个月前可正常运行,现在调用报错:
const provider = new ethers.providers.JsonRpcProvider(url); // url === bsc testnet rpc const erco20Contract = new ethers.Contract( erco20ContractAddress, erc20Abi, provider.getSigner(metamaskAddress) ); await erco20Contract.approve(dappContractAddress, amount);
错误信息:
processing response error (body="{"jsonrpc":"2.0","id":51,"error":{"code":-32000,"message":"unknown account"}}
", error={"code":-32000}, requestBody="{"method":"eth_sendTransaction","params":[{"gas":"0xac9f","from":"<my_metamask_address>","to":"<dapp_address>","data":"0x095ea7b300000000000000000000000078c18d3d5f86c9e3e14c13b8065018acd0d76c11000000000000000000000000000000000000000000000000016345785d8a0000"}],"id":51,"jsonrpc":"2.0"}", requestMethod="POST", url="https://data-seed-prebsc-1-s1.binance.org:8545/", code=SERVER_ERROR, version=web/5.7.0)
问题原因
错误核心是unknown account:你直接使用BSC测试网节点的JsonRpcProvider,并调用getSigner(metamaskAddress),但BSC节点没有你的MetaMask私钥,无法签名交易。旧版ethers可能存在兼容逻辑绕过了这一步,但新版本严格遵循规范后就触发了错误。
修正代码
必须通过MetaMask注入的provider来处理交易签名,正确代码如下:
// 检查MetaMask是否安装 if (!window.ethereum) { throw new Error("请安装MetaMask钱包"); } // 触发MetaMask连接账户弹窗 await window.ethereum.request({ method: 'eth_requestAccounts' }); // 用MetaMask的provider创建ethers实例 const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); // 获取当前激活的账户签名者 // 初始化ERC20合约 const erco20Contract = new ethers.Contract( erco20ContractAddress, erc20Abi, signer ); // 发起授权请求,自动触发MetaMask签名弹窗 await erco20Contract.approve(dappContractAddress, amount);
额外检查点
- 确认MetaMask当前网络切换至BSC测试网,与合约部署网络一致;
- 检查ethers版本(你的版本是v5.7.0,属于稳定版,无需降级);
- 核对合约地址、ABI、授权金额参数是否正确。
内容的提问来源于stack exchange,提问作者sdfsdf

