diff --git a/.gitmodules b/.gitmodules index 690924b..9296efd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "lib/openzeppelin-contracts"] path = lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "lib/openzeppelin-contracts-upgradeable"] + path = lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable diff --git a/foundry.toml b/foundry.toml index 25b918f..21f761a 100644 --- a/foundry.toml +++ b/foundry.toml @@ -2,5 +2,9 @@ src = "src" out = "out" libs = ["lib"] +ffi = true +ast = true +build_info = true +extra_output = ["storageLayout"] # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/remappings.txt b/remappings.txt index 6fdbafd..5be0b51 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1 +1,2 @@ -@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ +@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/ +@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ \ No newline at end of file diff --git a/script/RaidGeld.s.sol b/script/RaidGeld.s.sol index ea5f87c..526059d 100644 --- a/script/RaidGeld.s.sol +++ b/script/RaidGeld.s.sol @@ -3,15 +3,28 @@ pragma solidity ^0.8.13; import {Script, console} from "forge-std/Script.sol"; import {RaidGeld} from "../src/RaidGeld.sol"; +import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; contract RaidGeldScript is Script { - RaidGeld public raidgeld; - function setUp() public {} function run() public { vm.startBroadcast(); - raidgeld = new RaidGeld(); + + // Deploy the upgradeable contract + address _proxyAddress = Upgrades.deployTransparentProxy( + "RaidGeld.sol", + msg.sender, + abi.encodeCall(RaidGeld.initialize, (msg.sender)) + ); + + // Get the implementation address + address implementationAddress = Upgrades.getImplementationAddress( + _proxyAddress + ); + vm.stopBroadcast(); + + return (implementationAddress, _proxyAddress); } } diff --git a/src/RaidGeld.sol b/src/RaidGeld.sol index 361d645..146b6b5 100644 --- a/src/RaidGeld.sol +++ b/src/RaidGeld.sol @@ -1,12 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import {RaidGeldUtils} from "../src/RaidGeldUtils.sol"; import {Army, Player, Raider} from "../src/RaidGeldStructs.sol"; -contract RaidGeld is ERC20, Ownable { +contract RaidGeld is Initializable, ERC20Upgradeable, OwnableUpgradeable { uint256 public constant MANTISSA = 1e4; uint256 public constant BUY_IN_AMOUNT = 0.00005 ether; @@ -21,7 +22,10 @@ contract RaidGeld is ERC20, Ownable { _; } - constructor() ERC20("Raid Geld", "GELD") Ownable(msg.sender) {} + function initialize() public initializer { + __ERC20_init("Raid Geld", "GELD"); + __Ownable_init(); + } // This effectively registers the user function register() external payable {