Web3js

如何在呼叫 UniSwapRouter V2 之前批准 swapExactTokensForETH?

  • August 28, 2021

我正在嘗試創建一個簡單的 DAI/ETH 交換器,它允許我使用 Uniswap Router V2 將一些 DAI 交換為 ETH。我正在使用 React 和 uniswapSDK 創建它。到目前為止,我已經成功連接到我的 Metamask 錢包,獲取 Uniswap 合約的 ABI,以便我可以呼叫該方法。

但是,我發現很難理解如何在呼叫此方法之前批准它?我知道通過鏈發送交易需要先簽名,然後再呼叫。我不確定“如何”批准它?這是我到目前為止用於交換的程式碼

export const makeSwap = async (
 contract: any,
 account: any,
 library: any,
 amount: any
) => {
 const DAI: Token = await Fetcher.fetchTokenData(chainId, DAItokenAddress);
 const pair: Pair = await Fetcher.fetchPairData(DAI, WETH[chainId]);
 const route: Route = new Route([pair], DAI);
 const trade = new Trade(
   route,
   new TokenAmount(DAI, library.utils.toWei(amount)),
   TradeType.EXACT_INPUT
 );

 const slippageTolerance = new Percent("50", "10000"); //0.5%
 const amountOutMin = ethers.BigNumber.from(
   trade.minimumAmountOut(slippageTolerance).raw.toString()
 ).toHexString();
 const path = [DAI.address, WETH[chainId].address];
 const to = account;
 const deadline = Math.floor(Date.now() / 1000) + 60 * 1;
 const value = ethers.BigNumber.from(
   trade.inputAmount.raw.toString()
 ).toHexString();
 await contract.methods.approve(value, account);
 const tx = await contract.methods
   .swapExactTokensForETH(value, amountOutMin, path, to, deadline)
   .call();


  //Fails above this line


 console.log(`Transaction hash: ${tx.hash}`);
 const receipt = await tx.wait();
 console.log(`Transaction was mined in block ${receipt.blockNumber}`);
};

感謝您的幫助!

首先.call()是當你需要從合約中讀取數據時使用。由於您需要發送交易,因此請使用.send()for .swapExactTokensForETH

為此,您需要批准 Uniswap 路由器從我們的帳戶發送 DAI。

await daiContract.methods.approve(UniswapRouterAddress, tokenAmount).send();

您需要呼叫 DAI 契約,並不確定語法,因為我對 web3.js 完全不熟悉,但我認為您可以弄清楚(如果這有助於更好地理解它的可靠性IERC20(DAIContractAddress).approve(UniRouterAddress, amount)

引用自:https://ethereum.stackexchange.com/questions/107914