如何在 Remix IDE 中正確導入 aave/flashloan-box
我按照分步指南進行操作,由於只有主要程式碼,因此我嘗試了以下導入
pragma solidity 0.6.12; import { FlashLoanReceiverBase } from "https://github.com/aave/flashloan-box/blob/Remix/contracts/aave/FlashLoanReceiverBase.sol"; import { ILendingPool } from "https://github.com/aave/flashloan-box/blob/Remix/contracts/aave/ILendingPool.sol"; import { ILendingPoolAddressesProvider } from "https://github.com/aave/flashloan-box/blob/Remix/contracts/aave/ILendingPoolAddressesProvider.sol"; import { IERC20 } from "https://github.com/alcueca/ERC3156/blob/main/contracts/ERC20.sol"; /** !!! Never keep funds permanently on your FlashLoanReceiverBase contract as they could be exposed to a 'griefing' attack, where the stored funds are used by an attacker. !!! */ contract MyV2FlashLoan is FlashLoanReceiverBase { /** This function is called after your contract has received the flash loaned amount */ function executeOperation( address[] calldata assets, uint256[] calldata amounts, uint256[] calldata premiums, address initiator, bytes calldata params ) external override returns (bool) { // // This contract now has the funds requested. // Your logic goes here. // // At the end of your logic above, this contract owes // the flashloaned amounts + premiums. // Therefore ensure your contract has enough to repay // these amounts. // Approve the LendingPool contract allowance to *pull* the owed amount for (uint i = 0; i < assets.length; i++) { uint amountOwing = amounts[i].add(premiums[i]); IERC20(assets[i]).approve(address(LENDING_POOL), amountOwing); } return true; } }
但是當我嘗試編譯(使用混音)時,出現以下錯誤
not found https://github.com/OpenZeppelin/openzeppelincontracts/blob/master/contracts/token/ERC20/SafeERC20.sol
問題的要點是您正在使用
Remix
的 aave/flashloan-box 儲存庫的分支似乎需要 OpenZeppelin 3.x,但正在導入最新版本。OpenZeppelin v4.0.0中的一項重大更改是目錄的重組
contracts/
。特別SafeERC20.sol
是被移動到utils/
子目錄。flashloan-box 導入了最先進的 OpenZeppelin 版本,但仍希望文件位於舊路徑下。如果您訪問導入的 URL,您會看到此路徑給您一個 HTTP 404 錯誤:https ://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/SafeERC20.sol 。當您只是在本地安裝可以通過
package.json
. 事實上,flashloan-box對 OpenZeppelin 3.x 有適當的依賴,因此您可以將它與 Truffle 一起使用,這似乎是 README 推薦的方式。在Remix
分支中,這不起作用。版本要求應該已經嵌入到導入中,但事實並非如此。這看起來像一個錯誤,我認為您應該在項目中報告它。該修復將涉及FlashLoanReceiverBase.sol
使用指向特定標記版本 OpenZeppelin 的 URL 替換內部導入,或者使用指定版本的語法替換 NPM 導入@
. 或者,該項目可以切換到 OpenZeppelin 4.x,但它可能需要大量的工作。該修復程序必須由項目開發人員應用。同時,要讓您的項目在 Remix 中執行,您必須複製 flashloan-box 或將其契約直接添加到您自己的項目中並在那裡應用修復。就個人而言,我建議在這種情況下只切換到一個框架,特別是如果這只是一個教程項目並且您沒有大的程式碼庫要遷移。Remix 旨在使其非常快速和容易地開始開發,但您可以在本地訪問更強大的依賴管理工具。如果您有一些特殊要求並且需要更多控制,例如在這種情況下,框架通常是更好的選擇。