V1 contract:
pragma solidity ^0.8.4;
import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";
contract MyToken is Initializable, ERC721Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
using CountersUpgradeable for CountersUpgradeable.Counter;
CountersUpgradeable.Counter private _tokenIdCounter;
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize() initializer public {
__ERC721_init("MyToken", "MTK");
__Ownable_init();
__UUPSUpgradeable_init();
}
function safeMint(address to) public onlyOwner {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
}
function _authorizeUpgrade(address newImplementation)
internal
onlyOwner
override
{}
} ```
V2 Contract:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";
contract MyTokenV2 is Initializable, ERC721Upgradeable, OwnableUpgradeable, UUPSUpgradeable, ERC721BurnableUpgradeable {
using CountersUpgradeable for CountersUpgradeable.Counter;
CountersUpgradeable.Counter private _tokenIdCounter;
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize() initializer public {
__ERC721_init("MyTokenV2", "MTK2");
__Ownable_init();
__UUPSUpgradeable_init();
__ERC721Burnable_init();
}
function safeMint(address to) public onlyOwner {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
}
function _authorizeUpgrade(address newImplementation)
internal
onlyOwner
override
{}
}```
/Users/naveensharma/OZSmartContractWorkshop/MY-POC/upgradeable-smart-contract/node_modules/@openzeppelin/upgrades-core/src/storage/index.ts:35
throw new StorageUpgradeErrors(report);
^
Error: New storage layout is incompatible
@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211: Inserted __gap
New variables should be placed after all existing inherited variables
at assertStorageUpgradeSafe (/Users/naveensharma/OZSmartContractWorkshop/MY-POC/upgradeable-smart-contract/node_modules/@openzeppelin/upgrades-core/src/storage/index.ts:35:11)
at deployImpl (/Users/naveensharma/OZSmartContractWorkshop/MY-POC/upgradeable-smart-contract/node_modules/@openzeppelin/hardhat-upgrades/src/utils/deploy-impl.ts:113:31)
at Proxy.upgradeProxy (/Users/naveensharma/OZSmartContractWorkshop/MY-POC/upgradeable-smart-contract/node_modules/@openzeppelin/hardhat-upgrades/src/upgrade-proxy.ts:25:32)
at main (/Users/naveensharma/OZSmartContractWorkshop/MY-POC/upgradeable-smart-contract/scripts/upgrade_contract.js:8:5)