Aave闪电贷的核心约束不是“无需抵押”,而是借出、业务操作和结算必须在同一笔交易内完成。接收合约任何一步失败,整条调用链回滚;但失败交易仍会消耗已执行的Gas。
flashLoanSimple的实际调用顺序
开发者调用Pool.flashLoanSimple,传入receiverAddress、asset、amount、params和referralCode。Pool把单一资产转给receiver,随后调用IFlashLoanSimpleReceiver.executeOperation。回调参数包含asset、amount、premium、initiator与自定义params。
接收合约在回调中完成套利、抵押品置换或其他逻辑,最后保证自己持有amount + premium,并批准Pool拉取这笔金额。executeOperation返回true后,Pool执行结算;余额或allowance不足都会让交易回滚。
两个接口怎样选择
| 能力 | flashLoanSimple | flashLoan |
|---|---|---|
| 资产数量 | 单一资产 | 多资产数组 |
| 回调接口 | SimpleReceiver | FlashLoanReceiver |
| 未归还转债务 | 不支持 | 可按interestRateModes选择 |
| 参数复杂度 | 较低 | 更高 |
flashLoan的interestRateModes为0时要求归还;选择债务模式时,onBehalfOf仍需满足抵押、借贷能力和信用委托等条件。它不是“还不上就自动贷款”的无条件回退。
premium不能写死
Pool接口暴露当前闪电贷premium相关读取,治理和市场版本可能改变参数。接收合约应使用回调给出的premium计算应还额,前端展示则在发起前读取当前配置并注明网络与Pool地址。
四类常见回滚
第一,receiver没有实现正确接口或回调返回false;第二,业务swap得到的资产不足;第三,approve对象不是实际Pool或授权额小于amount + premium;第四,多资产数组长度、rate mode或onBehalfOf条件错误。排查时先解码revert data,再看回调日志和余额变化,不要仅提高gas limit。
接收合约的安全边界
executeOperation应只接受可信Pool调用,并核对initiator是否符合业务预期。params来自发起方,不能直接作为任意外部调用目标。套利合约还要限制可调用代币、路由、最小产出和最终利润,防止攻击者借用公开入口让合约承担premium或执行恶意approve。
回调中给路由器的临时授权最好在业务结束后收紧,长期留存的无限授权会超出一次闪电贷的原子安全边界。
借贷清算规则可结合Aave清算比例,交易revert见自定义错误解码,流动性池价格读取可参考Uniswap v3价格换算。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。