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
相关产品推荐
相关产品推荐

