簡體   English   中英

批准 function 不增加 ERC20 的津貼

[英]Aprove function does not increase allowance of ERC20

我正在嘗試將簡單的令牌傳輸到 Vault,但我在批准交易時遇到了麻煩,當我使用代工廠運行測試時,我收到此錯誤:

[失敗。 原因:ERC20:轉賬金額超出限額] testDeposit() (gas: 86770)

我的代碼用於存款 function 在這里:

function deposit(uint256 amount) external {
    console.log("RANDOM inside deposit = ");
    console.log(IERC20(underlyingToken).balanceOf(msg.sender));

    console.log("msg sender =");
    console.log(msg.sender);

    console.log("approve = ");
    console.log(IERC20(underlyingToken).approve(address(this), amount));

    // IERC20(underlyingToken).approve(msg.sender, amount);

    console.log("RANDOM inside deposit after approve = ");
    console.log(IERC20(underlyingToken).allowance(msg.sender, address(this)));


    IERC20(underlyingToken).transferFrom(msg.sender, address(this), amount);
    // // totalDeposited += amount;
    IPool(aavePool).supply(underlyingToken, amount, address(this), 0);

    totalUnderlyingDeposited += amount;
}

提前感謝您的幫助

你不能讓保險庫給自己一個發件人的津貼。 這將破壞批准機制的全部意義。

您的代碼IERC20(underlyingToken).approve(address(this), amount)實際所做的是授予保險庫使用transferFrom轉移任何自己的令牌的權限。 顯然這有點傻,因為保險庫可以使用transfer來做到這一點。

您注釋掉的代碼// IERC20(underlyingToken).approve(msg.sender, amount); ,您可能已經猜到了,讓發件人轉移保險庫的令牌。

讓保管庫執行transferFrom(msg.sender, ..., ...)的唯一方法是發送者通過調用approve他/她自己直接與 ERC20 交互。

這意味着用戶需要進行兩次交易才能將第一筆存款存入保險庫:1)批准保險庫獲得足以支付存款的津貼 2)進行存款。

如果批准的是“無限”金額(最大 uint256),則后續存款每次只需要一次交易; 但是,從安全的角度來看,這被認為是不明智的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM