Solidity

如何在 Remix IDE 中正確導入 aave/flashloan-box

  • January 8, 2022

我按照分步指南進行操作,由於只有主要程式碼,因此我嘗試了以下導入

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 導入@. 或者,該項目可以切換到 O​​penZeppelin 4.x,但它可能需要大量的工作。

該修復程序必須由項目開發人員應用。同時,要讓您的項目在 Remix 中執行,您必須複製 flashloan-box 或將其契約直接添加到您自己的項目中並在那裡應用修復。就個人而言,我建議在這種情況下只切換到一個框架,特別是如果這只是一個教程項目並且您沒有大的程式碼庫要遷移。Remix 旨在使其非常快速和容易地開始開發,但您可以在本地訪問更強大的依賴管理工具。如果您有一些特殊要求並且需要更多控制,例如在這種情況下,框架通常是更好的選擇。

引用自:https://ethereum.stackexchange.com/questions/118309