Uniswap SDK跨链使用问题及Arbitrum调用报错咨询
问题1:Arbitrum、Polygon、Avalanche等链能否使用Uniswap SDK?
可以直接用Uniswap SDK和这些部署了Uniswap合约的EVM兼容链交互,没必要直接用ethers从零实现。Uniswap SDK原生支持多链,只要目标链上部署了Uniswap V2/V3合约,就能通过SDK快速完成交易对查询、价格计算、交易路径生成等操作,比直接调用ethers高效很多。
问题2:非EVM网络(如Binance Smart Chain)能否与Uniswap合约交互?
首先纠正:BSC属于EVM兼容链,是可以和部署在其上的Uniswap合约交互的。但纯非EVM链(比如Solana、Sui这类)无法直接和Uniswap合约交互,因为Uniswap合约基于EVM开发,依赖以太坊虚拟机的执行逻辑,非EVM链不支持以太坊字节码的运行。
Arbitrum One适配官方示例的报错解决
你遇到的unsupported getDefaultProvider network错误,原因是Uniswap SDK的Fetcher.fetchPairData默认会调用ethers v5的getDefaultProvider连接目标链,但ethers v5的默认provider列表里不包含Arbitrum,导致无法自动连接节点。
解决方法有两种:
方法1:手动传入自定义Provider
自己初始化一个Arbitrum的RPC Provider,传给fetchPairData即可:
import { ethers } from 'ethers'; import { Token, Fetcher, Route, WETH } from '@uniswap/sdk'; export async function getPriceInUsd() { const chainId = 42161; // 初始化Arbitrum RPC Provider,可使用公开节点或自有节点 const provider = new ethers.providers.JsonRpcProvider('https://arb1.arbitrum.io/rpc'); const stableAddress = '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1'; const DAI = new Token(chainId, stableAddress, 18); // 传入自定义provider作为第三个参数 const pair = await Fetcher.fetchPairData(DAI, WETH[chainId], provider); const route = new Route([pair], WETH[chainId]); return route.midPrice.toSignificant(6); };
方法2:升级ethers到v6版本
ethers v6的getDefaultProvider已经原生支持Arbitrum等更多链,升级后无需额外配置provider即可正常连接,代码可以保持原有结构。
另外注意代码里的注释// ChainId.MAINNET是错误的,42161是Arbitrum One的链ID,建议改成// ChainId.ARBITRUM_ONE(如果SDK提供了该枚举值)。
内容的提问来源于stack exchange,提问作者RomanKovalev

