[英]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.