Installing contracts using forge install

Hey y'all,

I'm trying to install openzeppelin-contracts-upgradeable & * openzeppelin-contracts using forge.

Installation:

forge install OpenZeppelin/openzeppelin-contracts-upgradeable
forge install OpenZeppelin/openzeppelin-contracts

foundry.toml:

remappings = [
    '@openzeppelin/=lib/@openzeppelin-contracts/',
    '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/',
]


Is there someone who can help me import the following contracts/utils please?

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

import "@openzeppelin/contracts/utils/math/SafeMath.sol";

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

import "@openzeppelin/contracts/access/AccessControl.sol";

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

import "@openzeppelin/contracts/security/Pausable.sol";

<------------------------------------------------------------------------------->
import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";

import "@openzeppelin/contracts/proxy/Clones.sol";

CC: @ernestognw

Change your remappings in foundry.toml to the following instead:

remappings = [
  '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/',
  '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/'
]

EDIT: The following works better for Etherscan source code verification. Note that this would mean both @openzeppelin/contracts/ and @openzeppelin/contracts-upgradeable/ are coming from the openzeppelin-contracts-upgradeable submodule and its subdirectories (which includes its own transitive copy of openzeppelin-contracts of the same release version number). Particularly, any openzeppelin-contracts that you also have installed separately is NOT used.

foundry.toml:

remappings = [
  '@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/',
  '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/'
]

or remappings.txt:

@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/
@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/
1 Like

Seems like it works well; Except for those imports! I'll debug and update

import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

UPDATE:
These two contracts have different import paths from previous openZeppelin versions (4.7.1)

import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

I'm guessing SafeMath.sol no longer available?

Yes, some of the paths have changed and SafeMath.sol was removed in 5.0.0. See https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.0.0

1 Like

exactly! @Ibrahim96 you can use Math library and see the functions, some were renamed and improved!

@ericglau exactly! your remapping works fine, but I add here the command to run it and make it work:
forge install OpenZeppelin/openzeppelin-contracts@v5.0.1 --no-commit

just a little extra info in case anyone sees it! that worked for me too!

1 Like