From a5bbc929be5f9d30b8ee89b369db6596ac2cfc61 Mon Sep 17 00:00:00 2001 From: Petr Hanzl Date: Fri, 13 Jun 2025 08:49:55 +0200 Subject: [PATCH] Add ignition scripts --- contracts/ERC1967Proxy.sol | 4 ++ contracts/governance/StatusConstants.sol | 43 ---------------------- ignition/modules/Governance.ts | 38 +++++++++++++++++++ ignition/modules/ProposalTemplates.ts | 9 +++++ ignition/modules/ProposalTemplatesProxy.ts | 18 +++++++++ ignition/modules/VotesBookKeeper.ts | 10 +++++ ignition/params.json | 10 +++++ 7 files changed, 89 insertions(+), 43 deletions(-) create mode 100644 contracts/ERC1967Proxy.sol delete mode 100644 contracts/governance/StatusConstants.sol create mode 100644 ignition/modules/Governance.ts create mode 100644 ignition/modules/ProposalTemplates.ts create mode 100644 ignition/modules/ProposalTemplatesProxy.ts create mode 100644 ignition/modules/VotesBookKeeper.ts create mode 100644 ignition/params.json diff --git a/contracts/ERC1967Proxy.sol b/contracts/ERC1967Proxy.sol new file mode 100644 index 0000000..9ebd0fe --- /dev/null +++ b/contracts/ERC1967Proxy.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; \ No newline at end of file diff --git a/contracts/governance/StatusConstants.sol b/contracts/governance/StatusConstants.sol deleted file mode 100644 index a753f8f..0000000 --- a/contracts/governance/StatusConstants.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.27; - -/// @notice StatusConstants.sol defines status of governance proposals. -contract StatusConstants { - enum Status { - INITIAL, - RESOLVED, - FAILED - } - - // bit map - uint256 constant public STATUS_INITIAL = 0; - uint256 constant public STATUS_RESOLVED = 1; - uint256 constant public STATUS_FAILED = 1 << 1; - uint256 constant public STATUS_CANCELED = 1 << 2; - uint256 constant public STATUS_EXECUTION_EXPIRED = 1 << 3; - uint256 constant public TASK_VOTING = 1; - - function statusInitial() internal pure returns (uint256) { - return STATUS_INITIAL; - } - - function statusExecutionExpired() internal pure returns (uint256) { - return STATUS_EXECUTION_EXPIRED; - } - - function statusFailed() internal pure returns (uint256) { - return STATUS_FAILED; - } - - function statusCanceled() internal pure returns (uint256) { - return STATUS_CANCELED; - } - - function statusResolved() internal pure returns (uint256) { - return STATUS_RESOLVED; - } - - function isInitialStatus(uint256 status) internal pure returns (bool) { - return status == STATUS_INITIAL; - } -} \ No newline at end of file diff --git a/ignition/modules/Governance.ts b/ignition/modules/Governance.ts new file mode 100644 index 0000000..f719742 --- /dev/null +++ b/ignition/modules/Governance.ts @@ -0,0 +1,38 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import ProposalTemplatesProxyModule from "./ProposalTemplatesProxy"; +import VotesBookKeeperModule from "./VotesBookKeeper"; + +// npx hardhat ignition deploy ./ignition/modules/Governance.ts --network mainnet --deployment-id governance --parameters ignition/params.json + + +export default buildModule("GovernanceModule", (m) => { + const { proposalTemplatesProxy } = m.useModule(ProposalTemplatesProxyModule); + const { votesBookKeeper } = m.useModule(VotesBookKeeperModule); + const owner = m.getParameter('owner'); + + const governance = m.contract("Governance", [], { + proxy: { + methodName: "initialize", + args: [owner], + kind: "uups", // or "transparent" if using Transparent Proxy + }, + }); + + // initialize votesBookKeeper + const maxProposalsPerVoter = m.getParameter('maxProposalsPerVoter'); + m.call(votesBookKeeper, 'initialize', [owner, governance, maxProposalsPerVoter]) + + // initialize governance + const governableContract = m.getParameter('sfcContract'); + m.call(governance, 'initialize', [governableContract, proposalTemplatesProxy, votesBookKeeper]) + + // const networkProposalFactory = m.contract("NetworkParameterProposalFactory", + // [governance],); + + const plainTextProposalFactory = m.contract("PlainTextProposalFactory", [governance]); + const slashingRefundProposalFactory = m.contract("SlashingRefundProposalFactory", [governance, governableContract]); + + + return { proposalTemplatesProxy, votesBookKeeper, governance, plainTextProposalFactory, slashingRefundProposalFactory }; +}); + diff --git a/ignition/modules/ProposalTemplates.ts b/ignition/modules/ProposalTemplates.ts new file mode 100644 index 0000000..c2878d5 --- /dev/null +++ b/ignition/modules/ProposalTemplates.ts @@ -0,0 +1,9 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +// npx hardhat ignition deploy ./ignition/modules/ProposalTemplates.ts --network testnet --deployment-id proposal-templates + +export default buildModule("ProposalTemplatesModule", (m) => { + const proposalTemplates = m.contract("ProposalTemplates"); + return { proposalTemplates }; +}); + diff --git a/ignition/modules/ProposalTemplatesProxy.ts b/ignition/modules/ProposalTemplatesProxy.ts new file mode 100644 index 0000000..afc120f --- /dev/null +++ b/ignition/modules/ProposalTemplatesProxy.ts @@ -0,0 +1,18 @@ +import {buildModule} from "@nomicfoundation/hardhat-ignition/modules"; +import proposalTemplatesModule from "./ProposalTemplates"; + +// npx hardhat ignition deploy ./ignition/modules/ProposalTemplatesProxy.ts --network testnet --deployment-id proposal-templates-proxy --parameters ignition/params.json + +export default buildModule("ProposalTemplatesProxyModule", (m) => { + const { proposalTemplates } = m.useModule(proposalTemplatesModule); + + const owner = m.getParameter('owner'); + + const proposalTemplatesProxy = m.contract('ERC1967Proxy', [ + proposalTemplates, + m.encodeFunctionCall(proposalTemplates, 'initialize', [owner]), + ]); + + return { proposalTemplatesProxy }; +}); + diff --git a/ignition/modules/VotesBookKeeper.ts b/ignition/modules/VotesBookKeeper.ts new file mode 100644 index 0000000..ba2ec53 --- /dev/null +++ b/ignition/modules/VotesBookKeeper.ts @@ -0,0 +1,10 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +// npx hardhat ignition verify votesbook-keeper + + +export default buildModule("VotesBookKeeperModule", (m) => { + const votesBookKeeper = m.contract("VotesBookKeeper"); + return { votesBookKeeper }; +}); + diff --git a/ignition/params.json b/ignition/params.json new file mode 100644 index 0000000..b7138f7 --- /dev/null +++ b/ignition/params.json @@ -0,0 +1,10 @@ +{ + "GovernanceModule": { + "owner": "0x", + "maxProposalsPerVoter": 4, + "sfcContract": "0xfc00face00000000000000000000000000000000" + }, + "ProposalTemplatesProxyModule": { + "owner": "0x" + } +} \ No newline at end of file