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

Hardhat以太坊主网分叉AAVE多代币闪电贷报错求助

Hardhat 开发 AAVE 闪电贷多代币借入报错问题

问题概述

在 Hardhat 框架下开发 AAVE 闪电贷功能,运行环境为以太坊主网分叉(eth mainnet-fork):

  • 仅借入单种代币时功能可正常执行
  • 借入代币数量大于1种时始终触发报错

单代币借入(运行成功)场景代码

测试脚本 flash-loans-test.js

const { ethers } = require("hardhat");
const hre = require("hardhat");

describe("AaveFlashLoans", function () {
    it("Excute flashloans", async function () {
        const contractAddress = "0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5";
        const flashLoansFactory = await ethers.getContractFactory("AaveFlashLoans");
        const flashLoans = await flashLoansFactory.deploy(contractAddress);
        await flashLoans.deployed();

        const token = await ethers.getContractAt("IERC20", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); //weth

        const BALANCE_AMOUNT = ethers.utils.parseEther("2");

        await hre.network.provider.request({
            method: "hardhat_impersonateAccount",
            params: ["0xf07704777d6bc182bf2c67fbda48913169b84983"],
        });

        const signer = await ethers.getSigner("0xf07704777d6bc182bf2c67fbda48913169b84983");

        await token
            .connect(signer)
            .transfer(flashLoans.address, BALANCE_AMOUNT);

        await flashLoans.myFlashLoanCall();

        const balance = await token.balanceOf(flashLoans.address)

        console.log(balance);
    });
});

合约代码 AaveFlashLoans.sol

pragma solidity ^0.8.0;

import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {FlashLoanReceiverBase} from "./FlashLoanReceiverBase.sol";
import {ILendingPoolAddressesProvider} from "./ILendingPoolAddressesProvider.sol";
import "hardhat/console.sol";

contract AaveFlashLoans is FlashLoanReceiverBase {
    using SafeMath for uint256;

    constructor(ILendingPoolAddressesProvider _addressProvider)
        FlashLoanReceiverBase(_addressProvider)
    {}

    function executeOperation(
        address[] calldata assets,
        uint256[] calldata amounts,
        uint256[] calldata premiums,
        address,
        bytes calldata
    ) external override returns (bool) {
        for (uint256 i = 0; i < assets.length; i++) {
            uint256 amountOwing = amounts[i].add(premiums[i]);
            IERC20(assets[i]).approve(address(LENDING_POOL), amountOwing);
            console.log(amounts[i]);
            console.log(premiums[i]);
        }

        return true;
    }

    function myFlashLoanCall() public {
        address receiverAddress = address(this);

        address[] memory assets = new address[](1);
        assets[0] = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // weth

        uint256[] memory amounts = new uint256[](1);
        amounts[0] = 1 ether;

        uint256[] memory modes = new uint256[](1);
        modes[0] = 0;

        address onBehalfOf = address(this);
        bytes memory params = "";
        uint16 referralCode = 0;

        LENDING_POOL.flashLoan(
            receiverAddress,
            assets,
            amounts,
            modes,
            onBehalfOf,
            params,
            referralCode
        );
    }
}

单代币场景运行成功,对应运行截图:


多代币借入(运行报错)场景代码

新增第二种借入代币USDT后,代码执行始终报错,修改后的 AaveFlashLoans.sol 代码如下:

pragma solidity ^0.8.0;

import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {FlashLoanReceiverBase} from "./FlashLoanReceiverBase.sol";
import {ILendingPoolAddressesProvider} from "./ILendingPoolAddressesProvider.sol";
import "hardhat/console.sol";

contract AaveFlashLoans is FlashLoanReceiverBase {
    using SafeMath for uint256;

    constructor(ILendingPoolAddressesProvider _addressProvider)
        FlashLoanReceiverBase(_addressProvider)
    {}

    function executeOperation(
        address[] calldata assets,
        uint256[] calldata amounts,
        uint256[] calldata premiums,
        address,
        bytes calldata
    ) external override returns (bool) {
        for (uint256 i = 0; i < assets.length; i++) {
            uint256 amountOwing = amounts[i].add(premiums[i]);
            IERC20(assets[i]).approve(address(LENDING_POOL), amountOwing);
            console.log(amounts[i]);
            console.log(premiums[i]);
        }

        return true;
    }

    function myFlashLoanCall() public {
        address receiverAddress = address(this);

        address[] memory assets = new address[](2);
        assets[0] = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // weth
        assets[1] = address(0xdAC17F958D2ee523a2206206994597C13D831ec7); // usdt

        uint256[] memory amounts = new uint256[](2);
        amounts[0] = 1 ether;
        amounts[1] = 1 ether;

        uint256[] memory modes = new uint256[](2);
        modes[0] = 0;
        modes[1] = 0;

        address onBehalfOf = address(this);
        bytes memory params = "";
        uint16 referralCode = 0;

        LENDING_POOL.flashLoan(
            receiverAddress,
            assets,
            amounts,
            modes,
            onBehalfOf,
            params,
            referralCode
        );
    }
}

多代币场景运行报错,对应报错截图:

恳请各位技术同仁协助排查问题原因,非常感谢。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:51:20