使用ethers创建合约时遇ABI映射错误,求解决方案
解决ethers创建Uniswap V3合约实例的报错问题
错误原因分析
报错出现在@ethersproject/abi处理ABI的环节,核心问题有两个:
- ABI格式错误:你导入的
IUniswapV3PoolABI是完整的编译后JSON文件(包含abi、bytecode等字段),但ethers.Contract构造函数需要的是单独的ABI数组,而非整个JSON对象。 - 依赖版本不兼容:你使用的
ethers@5.1.4版本过旧,与@uniswap/v3-sdk@3.8.2存在兼容性问题,同时依赖中缺少@uniswap/v3-core包(你导入了该包的artifacts,但未在package.json中声明)。
解决方案
1. 修正ABI传入方式
修改合约实例创建代码,传入JSON文件中的abi字段而非整个对象:
import { ethers } from 'ethers'; import IUniswapV3PoolABI from '@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Pool.sol/IUniswapV3Pool.json'; import dotenv from 'dotenv'; dotenv.config(); const poolAddress = '0x7109C674e52b14FCFb8A04ffe254f454f9C61C18'; const INFURA_URL_MAINNET = process.env.INFURA_URL_MAINNET; const provider = new ethers.providers.JsonRpcProvider(INFURA_URL_MAINNET); // 关键:传入ABI数组而非整个JSON对象 const poolContract = new ethers.Contract( poolAddress, IUniswapV3PoolABI.abi, provider );
2. 调整依赖版本并补充缺失包
更新package.json中的依赖,确保版本兼容:
"dependencies": { "@uniswap/sdk-core": "^3.0.1", "@uniswap/v3-core": "^1.0.1", "@uniswap/v3-sdk": "^3.8.2", "dotenv": "^16.0.0", "ethers": "^5.7.2" }, "devDependencies": { "@ethersproject/experimental": "^5.7.0", "@typechain/ethers-v5": "^7.0.0", "@types/node": "^18.11.9", "typechain": "^5.0.0", "typescript": "^4.8.4" }
执行安装命令更新依赖:
npm install
3. 检查TypeScript配置
确保tsconfig.json中开启JSON模块解析:
{ "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true, // 其他配置项... } }
验证
完成上述修改后重新运行代码,即可正常创建Uniswap V3 Pool合约实例,ABI处理相关报错会消失。
内容的提问来源于stack exchange,提问作者Ritzy Dev
相关产品推荐
相关产品推荐

