Uniswap
如何檢查令牌是否被批准?
我正在嘗試使用 impersonateFunds 文件中的簡單 Uniswap V3 交換程式碼。
//Here I should approve DAI function swapExactInputSingle(uint amountIn) external returns (uint amountOut) { //console.log(msg.sender); Checking all possible errors in numbers //console.log(amountIn); //console.log(address(this)); TransferHelper.safeTransferFrom( DAI, msg.sender, address(this), amountIn ); TransferHelper.safeApprove( DAI, address(swapRouter), amountIn );
看起來一切都應該工作,但我收到錯誤:
Error: VM Exception while processing transaction: reverted with reason string 'STF'
社區說這是批准的問題(在我的例子中是 DAI)。我嘗試了幾種這樣的方法:
await dai.approve(swapExamples.address, amountIn)
在哪裡
dai = await ethers.getContractAt("IERC20", DAI)
但我仍然得到一個錯誤。有沒有辦法知道 DAI 是否被批准?
DAI 的智能合約會發出一個 Approval 事件,如果交易被批准則返回 true。
function approve(address usr, uint wad) external returns (bool) { allowance[msg.sender][usr] = wad; emit Approval(msg.sender, usr, wad); return true; }
因此,您可以通過以下方式了解交易是否已恢復:
選項1:
檢查是真是假。
if (await dai.approve(swapExamples.address, amountIn)){ //insert your logic here }
選項 2:
儲存交易收據,讀取它的事件並定義您的控制流。
const tx = await dai.approve(swapExamples.address, amountIn); const receipt = await tx.wait(); console.log(receipt.events);
選項 3:
監聽鏈上事件 -乙太坊 DApps:如何監聽事件
我解決了這個問題。我不需要從 Uniswap V3 範例進行第一次轉賬,因為我已經準備好使用 DAI。
// TransferHelper.safeTransferFrom( // DAI, // msg.sender, // address(this), // amountIn // );