首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uniswap USDC=> ETH交换

Uniswap USDC=> ETH交换
EN

Stack Overflow用户
提问于 2021-11-29 10:21:43
回答 1查看 120关注 0票数 0

试图将USDC交换给ETH vith Uniswap和Ether,但一直都有错误。

代码语言:javascript
复制
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);
  }
}

接收错误:“错误:无法估计气体;交易可能失败或可能需要手动气体限制”。我做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2022-11-03 18:34:11

所以看起来可能有几件事。您是否已批准您的令牌由路由器使用?我也没有看到任何气体设置在那里

下面是我修改过的一个工作版本,以使其工作正常(这是在一个主干网分叉上测试的设置,但是它使用的是实时数据(因为AlphaRouter只用于主存数据,所以活动数据和分叉数据将随着时间的推移而变化,从而导致交易错误,因此在使用之前请重新设置分叉)

使主网只取出本地提供商,并将所有提供程序更改为主网络提供商。

谨慎使用,我不是完美的,什么都不保证:检查滑动和所有变量

这是一个令牌,作为一个令牌Exact_Input交换与魏斯存款1 ETH。若要使用ETH,可以在批准时删除Weth存款和令牌,并将BigNumber.from(typedValueParsed)用作事务的值,而不是0。

由于我不知道EtherJS井的煤气价格和煤气限值为100 gwei &300 K,应按目前的管网煤气价格和估计的煤气限额进行修改。

代码语言:javascript
复制
import { AlphaRouter } from '@uniswap/smart-order-router'
import { Token, CurrencyAmount } from '@uniswap/sdk-core'
import { JSBI, Percent } from "@uniswap/sdk";
import { ethers, BigNumber } from "ethers";


const V3_SWAP_ROUTER_ADDRESS = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45";

const TokenInput = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";

const TokenOutput = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";


const web3Provider = new ethers.providers.JsonRpcProvider("https://eth-mainnet.alchemyapi.io/v2/");
const web3 = new ethers.providers.JsonRpcProvider("http://127.0.0.1:8545/");

const privateKey = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
const wallet = new ethers.Wallet(privateKey,web3);
const address = wallet.address;

import * as fs from 'fs';

let UniV3RouterAbi = fs.readFileSync('NewUniRouter.json');
const V3routerAbi = JSON.parse(UniV3RouterAbi);

let ERC20Abi = fs.readFileSync('ERC20.json');
const ERC20 = JSON.parse(ERC20Abi);

let WETHAbij = fs.readFileSync('WETHAbi.json');
const WETHAbi = JSON.parse(WETHAbij);

async function log(inpt){
    console.log(inpt);
    console.log("");
}

async function TokBal(tokens){
    var ERC20contract =  new ethers.Contract(tokens, ERC20, web3);
    var myERC20bal = await ERC20contract.balanceOf(wallet.address);
    return myERC20bal;
}

async function Deposit(amt){
    var WethC =  new ethers.Contract(TokenInput, WETHAbi, web3);
    var datac = await WethC.populateTransaction["deposit"]();
    var ncn = await wallet.getTransactionCount();

    const transaction = {
      data: datac.data,
      nonce: ncn,
      to: TokenInput,
      value: BigNumber.from(amt),
      from: wallet.address,
      gasPrice: '0x174876e800',
      gasLimit: '0x493e0',
    };

    const signedTx = await wallet.signTransaction(transaction);
    const txHash =  await web3.sendTransaction(signedTx);
    log(txHash.hash);
}

async function Approve(Toked, amt){
    var WethC =  new ethers.Contract(Toked, ERC20, web3);
    var datac = await WethC.populateTransaction["approve"](V3_SWAP_ROUTER_ADDRESS, amt);
    var ncn = await wallet.getTransactionCount();

    const transaction = {
      data: datac.data,
      nonce: ncn,
      to: Toked,
      value: BigNumber.from("0"),
      from: wallet.address,
      gasPrice: '0x174876e800',
      gasLimit: '0x493e0',
    };

    const signedTx = await wallet.signTransaction(transaction);
    const txHash =  await web3.sendTransaction(signedTx);
    log(txHash.hash);
    var appFor = await WethC.callStatic.allowance(wallet.address, V3_SWAP_ROUTER_ADDRESS);
    log("Approved : "+appFor.toString());
}


const router = new AlphaRouter({ chainId: 1, provider: web3Provider });
const WETH = new Token(
  router.chainId,
  '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
  18,
  'WETH',
  'Wrapped Ether'
);

const USDC = new Token(
  router.chainId,
  '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
  6,
  'USDC',
  'USD//C'
);

const typedValueParsed = '1000000000000000000';
const wethAmount = CurrencyAmount.fromRawAmount(WETH, JSBI.BigInt(typedValueParsed));

const IO = "Exact_Input"
const TradeType = IO == "Exact_Input" ? 0 : 1;


const route = await router.route(
  wethAmount,
  USDC,
  TradeType,
  {
    recipient: wallet.address,
    slippageTolerance: new Percent(5, 100),
    deadline: Math.floor(Date.now()/1000 +1800)
  }
);

var Ebal = await web3.getBalance(wallet.address);
log("Wallet Balance : "+Ebal.toString());

var tbal = await TokBal(TokenOutput);
log("Token Out Balance : "+tbal.toString());

await Deposit("1000000000000000000");
await Approve(TokenInput,"1000000000000000000");
var tbalW = await TokBal(TokenInput);
log("Token In Balance : "+tbalW.toString());

log(`Quote Exact In: ${route.quote.toFixed(wethAmount.currency === WETH ? USDC.decimals : WETH.decimals)}`);
log(`Gas Adjusted Quote In: ${route.quoteGasAdjusted.toFixed(wethAmount.currency === WETH ? USDC.decimals : WETH.decimals)}`);


var nc = await wallet.getTransactionCount();


const transaction = {
  data: route.methodParameters.calldata,
  nonce: nc,
  to: V3_SWAP_ROUTER_ADDRESS,
  value: BigNumber.from(0),
  from: wallet.address,
  gasPrice: BigNumber.from(route.gasPriceWei),
  gasLimit: BigNumber.from(route.estimatedGasUsed).add(BigNumber.from("50000")),
};


const signedTx = await wallet.signTransaction(transaction);


const PretxHash = ethers.utils.keccak256(signedTx);


const txHash =  await web3.sendTransaction(signedTx)
log(txHash.hash);

var Ebal = await web3.getBalance(wallet.address);
log("Wallet Balance : "+Ebal.toString());

var tbal = await TokBal(TokenOutput);
log("Token Out Balance : "+tbal.toString());

var tbalW = await TokBal(TokenInput);
log("Token In Balance : "+tbalW.toString());

要获得ETH,请使用它来代替输出令牌

代码语言:javascript
复制
outPutAddress === WETH9[chainId].address ? nativeOnChain(chainId) : outPutToken,
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70153009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档