首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助!最佳令牌路径,如果为uniswap v2

帮助!最佳令牌路径,如果为uniswap v2
EN

Ethereum用户
提问于 2022-08-31 19:41:58
回答 1查看 658关注 0票数 2

我想知道在Uniswap v2中是否存在计算最佳令牌交易路径的函数或方法。

我认为在uniswap v3中,它们提供的功能为我们提供了最佳的交易途径。

但是在第2版中,我必须使用哪个函数呢?

如果不存在这样的函数,我应该使用什么算法?

我在github.com中发现了几个项目,但它们没有意义,而且非常复杂。

请任何人知道,救救我!任何想法,任何建议都是欢迎的。谢谢!

EN

回答 1

Ethereum用户

发布于 2022-09-01 17:17:33

使用智能定单路由器:https://github.com/Uniswap/smart-order-router

我有一个在Uniswap冲突中使用的工作示例,这是一个非常基本的代码。

使用智能路由器/自动路由器SDK的<#>working是我修改后的工作版本(这是在一个主干网分叉上测试的设置,但是它使用的是实时数据(因为AlphaRouter只用于主网活动,所以动态数据和分叉数据将随着时间的推移而改变,因此在使用之前请重新设置分叉)

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

阿尔法自动路由器正在使用新的uniswap V3v2路由器@0x68b3465833fb72A70ecDF485E0C7bD8665Fc45。

谨慎使用,我不是十全十美的,什么也不保证:检查滑动和所有变量,因为这只是一个例子

这是一个令牌,作为一个令牌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())

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/134749

复制
相关文章

相似问题

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