Summary
Import the specific member from the module
Vulnerability Details
It is a better practice and more secure to import the specific member from a contract.
Tools Used
Manual Review
Recommendations
Replace every 'import "@.../XXXX.sol";' with 'import {XXXX} from "@.../XXXX.sol";' defining the specific member from the module.
The new imports should look like this:
IEUROs.sol:
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
ILiquidationPoolManager.sol:
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
INFTMetadataGenerator.sol:
import {ISmartVault} from "contracts/interfaces/ISmartVault.sol";
IPriceCalculator.sol:
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
ISmartVault.sol:
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
ISmartVaultManagerV3.sol:
import {ISmartVaultManager} from "contracts/interfaces/ISmartVaultManager.sol";
import {ISmartVaultManagerV2} from "contracts/interfaces/ISmartVaultManagerV2.sol";
IWETH.sol:
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
DefGenerator.sol:
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {NFTUtils} from "contracts/utils/nfts/NFTUtils.sol";
NFTMetadataGenerator.sol:
import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {ISmartVault} from "contracts/interfaces/ISmartVault.sol";
import {INFTMetadataGenerator} from "contracts/interfaces/INFTMetadataGenerator.sol";
import {SVGGenerator} from "contracts/utils/nfts/SVGGenerator.sol";
import {NFTUtils} from "contracts/utils/nfts/NFTUtils.sol";
NFTUtils.sol:
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {ISmartVault.sol} from "contracts/interfaces/ISmartVault.sol";
import {INFTMetadataGenerator} from "contracts/interfaces/INFTMetadataGenerator.sol";
import {SVGGenerator} from "contracts/utils/nfts/SVGGenerator.sol";
SVGGenerator.sol:
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {ISmartVault} from "contracts/interfaces/ISmartVault.sol";
import {DefGenerator} from "contracts/utils/nfts/DefGenerator.sol";
import {NFTUtils} from "contracts/utils/nfts/NFTUtils.sol";
ChainlinkMock.sol:
import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
ERC20Mock.sol:
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
EUROsMock.sol:
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
import {IEURO} from "contracts/interfaces/IEUROs.sol";
MockSmartVaultManager.sol:
import {ISmartVaultManager} from "contracts/interfaces/ISmartVaultManager.sol";
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
PriceCalculator.sol:
import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol" as Chainlink;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IPriceCalculator} from "contracts/interfaces/IPriceCalculator.sol";
SmartVaultDeployerV3.sol:
import {SmartVaultV3} from "contracts/SmartVaultV3.sol";
import {PriceCalculator} from "contracts/utils/PriceCalculator.sol";
import {ISmartVaultDeployer} from "contracts/interfaces/ISmartVaultDeployer.sol";
SmartVaultIndex.sol:
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ISmartVaultIndex} from "contracts/interfaces/ISmartVaultIndex.sol";
SmartVaultManager.sol:
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {INFTMetadataGenerator} from "contracts/interfaces/INFTMetadataGenerator.sol";
import {IEUROs} from "contracts/interfaces/IEUROs.sol";
import {ISmartVault} from "contracts/interfaces/ISmartVault.sol";
import {ISmartVaultDeployer} from "contracts/interfaces/ISmartVaultDeployer.sol";
import {ISmartVaultIndex} from "contracts/interfaces/ISmartVaultIndex.sol";
import {ISmartVaultManager} from "contracts/interfaces/ISmartVaultManager.sol";
SwapRouterMock.sol:
import {ISwapRouter} from "contracts/interfaces/ISwapRouter.sol";
TokenManagerMock.sol:
import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol" as Chainlink;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
WETHMock.sol:
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IWETH} from "contracts/interfaces/IWETH.sol";
LiquidationPool.sol:
import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol" as Chainlink;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IEUROs} from "contracts/interfaces/IEUROs.sol";
import {ILiquidationPool} from "contracts/interfaces/ILiquidationPool.sol";
import {ILiquidationPoolManager} from "contracts/interfaces/ILiquidationPoolManager.sol";
import {ISmartVaultManager} from "contracts/interfaces/ISmartVaultManager.sol";
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
LiquidationPoolManager.sol:
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {LiquidationPool} from "contracts/LiquidationPool.sol";
import {ILiquidationPoolManager} from "contracts/interfaces/ILiquidationPoolManager.sol";
import {ISmartVaultManager} from "contracts/interfaces/ISmartVaultManager.sol";
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
SmartVaultManagerV5.sol:
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {INFTMetadataGenerator} from "contracts/interfaces/INFTMetadataGenerator.sol";
import {IEUROs} from "contracts/interfaces/IEUROs.sol";
import {ISmartVault} from "contracts/interfaces/ISmartVault.sol";
import {ISmartVaultDeployer} from "contracts/interfaces/ISmartVaultDeployer.sol";
import {ISmartVaultIndex} from "contracts/interfaces/ISmartVaultIndex.sol";
import {ISmartVaultManager} from "contracts/interfaces/ISmartVaultManager.sol";
import {ISmartVaultManagerV2} from "contracts/interfaces/ISmartVaultManagerV2.sol";
SmartVaultV3.sol:
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IEUROs} from "contracts/interfaces/IEUROs.sol";
import {IPriceCalculator} from "contracts/interfaces/IPriceCalculator.sol";
import {ISmartVault} from "contracts/interfaces/ISmartVault.sol";
import {ISmartVaultManagerV3} from "contracts/interfaces/ISmartVaultManagerV3.sol";
import {ISwapRouter} from "contracts/interfaces/ISwapRouter.sol";
import {ITokenManager} from "contracts/interfaces/ITokenManager.sol";
import {IWETH} from "contracts/interfaces/IWETH.sol";