- Rename
template.env
to.env
and paste the mnemonic phrase from your Rootstock account. - Ensure your Node.js version is
>= v20.15.0
.
yarn
The stRIF contract allows users to stake RIF tokens to gain voting power in the RIF DAO.
This contract has been brought to the project is the RIF Token contract RIFLabs RIF-Token
A few simple tests have been created to make sure that the token works.
Refer to test/RIFToken.test.ts
What is tested:
- That the contract has the initial balance defined in the RIFToken.sol
- That the function
.validAddress(address)
works - That the
transferAll()
function works by using.setAuthorizedManagerContract
- That we can transfer token between accounts
- That it emits a Transfer event
We will be using RIF-Token from the repository RIFLabs RIF-Token
The repository does not contain a package.json, causing hardhat to error when running yarn compile
We decided (in the meantime) to fork the repository and add it there Forked Repository
In the future we must add a package.json to the main repository, and remove the forked repository.
Run this command to test smart contracts, excluding OpenZeppelin and RIF:
slither . --filter-paths openzeppelin,rif-token-contracts,exploit
Before deploying the smart contracts, set all the parameters in the params/testnet.json
, params/mainnet.json
or params/dev.json
files, depending on the network and environment you’re going to deploy to.
-
Deploy Governor, Timelock, StRIF and their proxies to the Rootstock Testnet:
-
to the dev
npx hardhat ignition deploy ignition/modules/GovernorModule.ts --parameters params/dev.json --network rootstockTestnet
-
to the testnet
npx hardhat ignition deploy ignition/modules/GovernorModule.ts --parameters params/testnet.json --network rootstockTestnet
where the --parameters parameter specifies the location of the parameters file with the RIF token address.
-
to the mainnet
npx hardhat ignition deploy ignition/modules/GovernorModule.ts --parameters params/mainnet.json --network rootstockMainnet
See the NFT images/metadata creation details here
-
Create an IPFS directory on Pinata and place the JSON files with NFT metadata there. It's important that the file names start from 1 and are sequential without any gaps.
-
Edit the
EarlyAdoptersProxy
property in theparams/testnet.json
/params/mainnet.json
file to provide the following parameters:- Default Admin address
- Upgrader address
- IPFS ID of the directory containing the prepared JSON metadata files for the NFTs
- The amount of files in the directory
Then run the command:
- for the dev
npx hardhat ignition deploy ignition/modules/EarlyAdoptersModule.ts --parameters params/dev.json --network rootstockTestnet
-
for the testnet
npx hardhat ignition deploy ignition/modules/EarlyAdoptersModule.ts --parameters params/testnet.json --network rootstockTestnet
-
for the mainnet
npx hardhat ignition deploy ignition/modules/EarlyAdoptersModule.ts --parameters params/mainnet.json --network rootstockMainnet
-
To upload additional JSON files with metadata for new NFT tokens, you need to:
- Create a new directory on IPFS (Pinata), adding both the old and new files.
- Copy the CID of the created directory.
- Run the Hardhat task to update the IPFS folder CID in the smart contract
npx hardhat update-ipfs-folder --nft <EA NFT Address> --cid <New folder CID> --files <amount of files in folder> --network rootstockTestnet
for example:
npx hardhat update-ipfs-folder \ --nft 0xa3Dcdac1883f29aA9FafbdeDDCA0c745B2F05b53 \ --cid QmU1Bu9v1k9ecQ89cDE4uHrRkMKHE8NQ3mxhqFqNJfsKPd \ --files 50 \ --network rootstockTestnet
-
Locate the file named:
deployedGovernorProxy.json
insideignition
folder. -
Change the value of
governorProxyAddress
field with the actual Governor Proxy address -
Run the command bellow
npx hardhat ignition deploy ignition/modules/GovernorUpgradeModule.ts --parameters params/testnet.json --network rootstockTestnet
To cancel a proposal using the provided Hardhat task, follow the steps below:
-
Download the repo
-
Install the project: see Installation
-
Compile the smart contracts
npx hardhat compile
-
Prepare the
cancel-proposal.json
File (Optional):If you prefer to use a JSON file for the parameters, create a file named
cancel-proposal.json
in the root directory of your project. The file should contain the following fields:{ "governorAddress": "<Governor Contract Address>", "proposalId": "<Proposal ID>" }
- Replace
<Governor Contract Address>
with the actual address of the deployed Governor contract. - Replace
<Proposal ID>
with the ID of the proposal you want to cancel.
- Replace
-
Run the Hardhat Task to Cancel the Proposal:
npx hardhat cancel-proposal --governor <Governor Contract Address> --id <Proposal ID> --network rootstockTestnet
- Replace
<Governor Contract Address>
with the address of the deployed Governor contract. - Replace
<Proposal ID>
with the ID of the proposal you wish to cancel.
Alternatively, if you have provided the parameters in the cancelProposal.json file, simply run:
npx hardhat cancel-proposal --network rootstockTestnet
- Replace
-
Check for Success:
After running the command, the script will verify your permissions and the state of the proposal. If you are authorized and the proposal is in a cancelable state, the proposal will be canceled, and you will see a confirmation message in the terminal.
Example output:
You have successfully cancelled proposal №12345... Now the proposal is in the "Canceled" state.
-
Troubleshooting:
- Ensure that the Governor Contract Address and Proposal ID are correct and match the proposal you intend to cancel
- Verify that you are the designated Guardian for the Governor contract, as only the Guardian can cancel proposals
- If the proposal is not in a cancelable state (e.g., it has already been executed or defeated), the script will not proceed with the cancellation
In order to verify contracts after deployment run Hardhat Ignition task:
npx hardhat ignition verify <Deployment ID>
Example output:
Verifying contract "contracts/EarlyAdopters.sol:EarlyAdopters" for network rootstockMainnet...
Successfully verified contract "contracts/EarlyAdopters.sol:EarlyAdopters" for network rootstockMainnet:
- https://rootstock.blockscout.com//address/0x...#code
Contract Name | Mainnet Address |
---|---|
GovernorRootstockCollective impl | 0x2109FF4a9D5548a21F877cA937Ac5847Fde49694 |
GovernorRootstockCollective proxy | 0x91a8E4A070B4BA4bf2e2a51Cb42BdeDf8FFB9b5a |
StRIFToken proxy | 0x4861198e9A6814EBfb152552D1b1a37426C54D23 |
StRIFToken impl | 0xFff256c3451D5cF59653Cfe71950AE9ba2F5f0Ef |
DaoTimelockUpgradableRootstockCollective impl | 0x2AEdf0B35651934cF3BEC855cbCE207bBA0C4aB5 |
DaoTimelockUpgradableRootstockCollective proxy | 0x5eDA6fA73350291F7D7cFC7ad93F48189f1333ef |
TreasuryRootstockCollective | 0x47C969d7ae7A377BeaD553c2899D9B83A90e0772 |
Early Adopters NFT | 0x0Ee4e11f2F2B551cA31Ea7873c7bA675cb51A59d |
OGPartnersRootstockCollective impl | 0x5eC0A91618553be6612d81c604b065038f08eEDF |
OGPartnersRootstockCollective proxy | 0x285046a90fb322E6BaCa4F38Bb884e3C0904F7EB |
OGContributorsRootstockCollective impl | 0xdeED96d7dEC874855Cc9a43c5E608e8eF70f4dA6 |
OGContributorsRootstockCollective proxy | 0xDC03B8fb7E47E4651f5008bD718a804726424A75 |
OGFoundersRootstockCollective impl | 0xF8316455785979657Db49d1C4768376db55789C7 |
OGFoundersRootstockCollective proxy | 0x7E6d9969CAC008bAe5f7b144df3c955515404538 |
VotingVanguardsRootstockCollective impl | 0xAEA1187e2BBDb6167DdDBa10c52C8bd9CcdAA9a9 |
VotingVanguardsRootstockCollective proxy | 0x7de6f62ED0481Be42f0cdcc1deE52400e2aaF26B |
Contract Name | Mainnet Address |
---|---|
GovernorRootstockCollective impl | 0x086CE91eBAF4002544121295491A1DC80F3ef7a5 |
GovernorRootstockCollective proxy | 0x71ac6fF904A17F50f2C07B693376cCc1c92627F0 |
StRIFToken impl | 0xcC13a0320f18eB7C370a339b94084012337f3a60 |
StRIFToken proxy | 0x5Db91E24BD32059584bbdB831a901F1199f3D459 |
DaoTimelockUpgradableRootstockCollective impl | 0x9bD89cC339aE4bC1e8F41C648f42854EbFcFCd98 |
DaoTimelockUpgradableRootstockCollective proxy | 0x432f5EF20118CbB1111a06bB4491C6D759643B83 |
TreasuryRootstockCollective | 0xf016fA6B237bb56E3AeE7022C6947A6a103E3c47 |
EarlyAdoptersRootstockCollective impl | 0x979deF73ec80B8AE24Ae46765b81D9aF7b1C9327 |
EarlyAdoptersRootstockCollective proxy | 0x339F209B3eb8381c4fBE997232e95a21A731524c |
OGPartnersRootstockCollective impl | 0xc4DAcee263B0D1f2a09006dbc0170a4fDa861B68 |
OGPartnersRootstockCollective proxy | 0x8158aBDAEdD7770F372031aC0AaB8FB4BC9ABe75 |
OGContributorsRootstockCollective impl | 0xda31e81063ae1CFb6Ea5b8Ea259F1943B4e267E0 |
OGContributorsRootstockCollective proxy | 0x5b20eDd661a2B87A9C9AE55d3e3b09281Dc71C48 |
OGFoundersRootstockCollective impl | 0x357Cb4f62A74F39ca26046A9A208A393172dF1bb |
OGFoundersRootstockCollective proxy | 0x0025e59f281bc06e7A54afe780673bd6A8D3a7E9 |
Contract Name | Dev Address |
---|---|
GovernorRootstockCollective impl | 0x0DB02C99619bB0E6d2cBeF5545Cc968DAb724E10 |
GovernorRootstockCollective proxy | 0xdE4822aBf85dCeec6a3A68B1F692b26ec37694BA |
StRIFToken impl | 0x7C19923bac1b41e9bBD1c33815A61854beeD9b54 |
StRIFToken proxy | 0x956864F3Bb7B86cbCbC3a320277b0d0f5f24F998 |
DaoTimelockUpgradableRootstockCollective impl | 0x014Ee7696B193E8BC9EFA5a68cfDb74C76415043 |
DaoTimelockUpgradableRootstockCollective proxy | 0x7D78e76b9Cc66D977aaf699679A44A721a98022E |
TreasuryRootstockCollective | 0xD2F300D6AecC7db7FDb98d15568ffeFb13BAd7c8 |
EarlyAdoptersRootstockCollective impl | 0xa060A65967cb9b9511E3A4ec091Aa81c6dCe6662 |
EarlyAdoptersRootstockCollective proxy | 0xe4E91A8EeCdF48Ef13f8E98Dfd2f0b7147e89816 |