Web3js
如何在呼叫 UniSwapRouter V2 之前批准 swapExactTokensForETH?
我正在嘗試創建一個簡單的 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)
)