You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ERC20 approve函数未提升额度,Deposit交易授权失败求助

解决ERC20转账授权错误:transfer amount exceeds allowance

问题根源

你在deposit函数里调用IERC20(underlyingToken).approve(address(this), amount)完全无效——approve函数的调用者是合约本身(address(this)),这相当于让合约给自己授权,而transferFrom需要的是用户(msg.sender)主动授权合约从他的账户转走代币,所以当前的授权操作根本没满足transferFrom的权限要求。

修正方案

  1. 移除合约内的无效授权代码
    合约不需要自己调用approve,正确的流程是用户在调用deposit前,先主动完成授权。修改后的deposit函数如下:

    function deposit(uint256 amount) external {
        console.log("msg sender balance = ", IERC20(underlyingToken).balanceOf(msg.sender));
        console.log("msg sender = ", msg.sender);
        console.log("allowance = ", IERC20(underlyingToken).allowance(msg.sender, address(this)));
    
        // 直接执行转账,前提是用户已完成授权
        IERC20(underlyingToken).transferFrom(msg.sender, address(this), amount);
        IPool(aavePool).supply(underlyingToken, amount, address(this), 0);
    
        totalUnderlyingDeposited += amount;
    }
    
  2. 在测试代码中补充前置授权步骤
    在Foundry测试里,调用deposit前必须让测试账户先给Vault合约授权,示例代码:

    function testDeposit() public {
        uint256 depositAmount = 100 ether;
        // 先让测试账户(比如alice)给Vault授权
        vm.prank(alice);
        underlyingToken.approve(address(vault), depositAmount);
    
        // 再调用deposit函数
        vm.prank(alice);
        vault.deposit(depositAmount);
    
        // 后续断言逻辑
    }
    

内容的提问来源于stack exchange,提问作者Laurynas Lopata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:41:13