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

Aave闪电贷合约异常:仅支持100额度,超额执行即回滚求助

问题分析与修复方案

核心问题

你的合约在executeOperation中错误地使用闪电贷发起者(initiator)的余额判断还款能力,而非合约自身余额——闪电贷资金是直接发放到合约地址的,和发起者账户余额无关。当请求金额超过发起者资产余额时,代码会尝试调用POOL.borrow,但如果发起者在Aave上没有足够抵押品,该操作直接失败触发交易回滚;而金额为100时,发起者账户刚好有足够资产,能通过transfer完成流程,不会触发borrow的失败逻辑。

同时,代码逻辑偏离闪电贷核心设计:闪电贷是临时拆借资金,必须在同一交易内通过合约业务操作产生收益偿还,不能依赖发起者外部资金或额外借贷。

修复步骤

1. 修正余额判断逻辑

将executeOperation中所有getBalance(initiator, asset)替换为getBalance(address(this), asset),因为合约才是闪电贷资金的接收方。

2. 简化偿还逻辑

移除不必要的用户资金检查、borrow操作,专注确保合约能覆盖amount + premium的还款金额。

修复后的关键代码片段

function executeOperation(
    address asset,
    uint256 amount,
    uint256 premium,
    address initiator,
    bytes calldata params
) external override returns (bool) {
    emit paramCheck(asset, amount, premium, address(POOL), params);

    uint256 amountOwed = amount + premium;

    // 在此写入你的闪电贷业务逻辑(如套利、清算等)
    // 业务逻辑必须确保合约最终持有足够资产覆盖 amountOwed

    // 授权Aave合约提取还款资金
    IERC20(asset).approve(address(POOL), amountOwed);

    // 可选:提前检查合约余额是否足够偿还
    require(getBalance(address(this), asset) >= amountOwed, "Insufficient funds to repay flashloan");

    emit loanReceived(amountOwed);

    return true;
}

额外注意事项

  • 调用requestFlashLoan时,金额需匹配资产小数位数:比如USDC是6位小数,借100 USDC需传入100 * 10 ** 6,而非100,否则实际拆借金额远小于预期。
  • 确保业务逻辑能在同一交易内产生足够资金偿还本息,否则交易仍会回滚。
  • 移除代码中无关的debtUSDC、collUSDC变量,以及错误的用户资金转移、borrow逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:58:19