Uniswap

如何檢查令牌是否被批准?

  • August 7, 2022

我正在嘗試使用 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
       // );

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