尝试通过Uniswap和以太网将USDC交换到ETH,但一直出错。
async function swapUsdcToEth(amount, walledAddress) {
const usdc = await Fetcher.fetchTokenData(chainId, '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48');
const eth = await Fetcher.fetchTokenData(chainId, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2');
const pair = await Fetcher.fetchPairData(usdc, eth);
const route = new Route([pair], usdc);
const amountIn = new TokenAmount(usdc, amount);
const trade = new Trade(route, amountIn, TradeType.EXACT_INPUT);
const slippageTolerance = new Percent('50', '10000');
const value = ethers.BigNumber.from(trade.inputAmount.raw.toString()).toHexString();
const amountOutMin = ethers.BigNumber.from(trade.minimumAmountOut(slippageTolerance).raw.toString()).toHexString();
const deadline = Math.floor(Date.now() / 1000) + 60 * 20;
const uniswapRouterV2Address = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D';
const provider = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/b9fkdmkdkdv4937b52ea9637cf1d1bd');
const signer = new ethers.Wallet(walledAddress, provider);
const uniswap = new ethers.Contract(
uniswapRouterV2Address,
['function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)'],
signer
);
try {
const tx = await uniswap.swapExactTokensForETH(value, amountOutMin, [walledAddress], walledAddress, deadline);
const receipt = await tx.wait();
console.log('transaction was mined in block', receipt.blockNumber);
} catch (e) {
console.log(e);
}
}
接收错误如下:'错误:无法估计气体;交易可能失败或可能需要手动气体限制“。我做错了什么?
1条答案
按热度按时间nwsw7zdq1#
所以看起来可能有几件事。你批准你的令牌被路由器使用了吗?而且我没有看到任何气体设置在那里
这是一个工作版本,我已经修改,使工作(这是设置测试在一个主网分支,但它使用的实时数据(作为阿尔法路由器是只为主网活,所以实时数据和分支数据将随着时间的推移而变化,并导致交易错误,所以重置分支使用前)
使主网只取出本地提供商,将所有提供商改为主网提供商。
谨慎使用,我不完美,不作任何保证:检查滑动和所有变量
这是作为TOKEN到TOKEN Exact_Input交换构建的,WETH存款为1 ETH。要使用ETH,您可以在批准中删除Weth存款和令牌,并使用BigNumber.from(typedValueParsed)作为事务的值,而不是0
由于我不知道EtherJS的天然气价格和天然气限额的存款和批准是一个单位100 gwei和300k的限制,并应修改为目前的网络天然气价格和估计的天然气限额。
要获取ETH,请使用此标记代替输出标记
编辑〉〉〉〉〉〉〉〉〉〉修改为新版本