Based on https://github.com/fmorency/cosmovisor-poa-test, with a twitst.
git clone https://github.com/liftedinit/manifest-ledger.git
cd manifest-ledger
git checkout v0.0.1-alpha.10
make build
./build/manifestd version
v0.0.1-alpha.10
Cleanup ~/.manifest (never do this in a production environment!)
rm -rf ~/.manifest
Initialize and configure the chain (never use --overwrite in a production environment!)
./build/manifestd init test --chain-id test --default-denom upoa --overwrite
./build/manifestd config set client chain-id test
./build/manifestd config set client keyring-backend test
./build/manifestd config set client broadcast-mode sync
Create the validation and self-delegate
# manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct
echo "decorate bright ozone fork gallery riot bus exhaust worth way bone indoor calm squirrel merry zero scheme cotton until shop any excess stage laundry" | ./build/manifestd keys add val --keyring-backend test --recover
# staking
cat <<< $(jq '.app_state.staking.params.bond_denom = "upoa"' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json # PoA Token
cat <<< $(jq '.app_state.staking.params.min_commission_rate = "0.000000000000000000"' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
# mint
cat <<< $(jq '.app_state.mint.params.mint_denom = "umfx"' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json # not used
cat <<< $(jq '.app_state.mint.params.blocks_per_year = "6311520"' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
# Add the group and group policy that will act as the POA admin
cat <<< $(jq '.app_state.group.group_seq = "1"' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
cat <<< $(jq '.app_state.group.groups = [{"id": "1", "admin": "manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj", "metadata": "AQ==", "version": "2", "total_weight": "2", "created_at": "2024-05-16T15:10:54.372190727Z"}]' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
cat <<< $(jq '.app_state.group.group_members = [{"group_id": "1", "member": {"address": "manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct", "weight": "1", "metadata": "val", "added_at": "2024-05-16T15:10:54.372190727Z"}}, {"group_id": "1", "member": {"address": "manifest1efd63aw40lxf3n4mhf7dzhjkr453axurm6rp3z", "weight": "1", "metadata": "user2", "added_at": "2024-05-16T15:10:54.372190727Z"}}]' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
cat <<< $(jq '.app_state.group.group_policy_seq = "1"' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
cat <<< $(jq '.app_state.group.group_policies = [{"address": "manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj", "group_id": "1", "admin": "manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj", "metadata": "AQ==", "version": "2", "decision_policy": { "@type": "/cosmos.group.v1.ThresholdDecisionPolicy", "threshold": "1", "windows": {"voting_period": "30s", "min_execution_period": "0s"}}, "created_at": "2024-05-16T15:10:54.372190727Z"}]' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
# Set the POA Admin to the Group policy address
cat <<< $(jq '.app_state.poa.params.admins = ["manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj"]' $HOME/.manifest/config/genesis.json) > $HOME/.manifest/config/genesis.json
./build/manifestd genesis add-genesis-account val 10000000upoa,1000000000umfx --keyring-backend test
./build/manifestd genesis gentx val 1000000upoa --chain-id test
./build/manifestd genesis collect-gentxs
Prepare Cosmovisor
export DAEMON_NAME=manifestd
export DAEMON_HOME=$HOME/.manifest
export DAEMON_ALLOW_DOWNLOAD_BINARIES=false
export DAEMON_RESTART_AFTER_UPGRADE=true
export POA_ADMIN_ADDRESS=manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj
Initialize and start Cosmovisor
cosmovisor init ./build/manifestd
cosmovisor run start
We now have a single validator node running! Let's now perform an upgrade.
Open a new terminal and change directory to the manifest-ledger repository.
Send some tokens to the group policy so it can execute group proposals.
./build/manifestd tx bank send manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj 100umfx --from val --yes
Re-export the environment variables
export DAEMON_NAME=manifestd
export DAEMON_HOME=$HOME/.manifest
export DAEMON_ALLOW_DOWNLOAD_BINARIES=false
export DAEMON_RESTART_AFTER_UPGRADE=true
export POA_ADMIN_ADDRESS=manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj
Build the new version of the binary
git checkout v0.0.1-alpha.11
make build
./build/manifestd version
v0.0.1-alpha.11
Prepare the upgrade in cosmovisor
cosmovisor add-upgrade v0.0.1-alpha.11 ./build/manifestd
Create the software proposal.json
group proposal
{
"group_policy_address": "manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj",
"messages": [
{
"@type": "/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade",
"authority": "manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj",
"plan": {
"name": "v0.0.1-alpha.11",
"time": "0001-01-01T00:00:00Z",
"height": "[UPGRADE_BLOCK_HEIGHT]",
"info": "{}",
"upgraded_client_state": null
}
}
],
"metadata": "",
"title": "Software upgrade",
"summary": "This is a proposal to upgrade the software to v0.0.1-alpha.11",
"proposers": ["manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct"]
}
Submit the group proposal
./build/manifestd tx group submit-proposal proposal.json --from val --yes
Note: Because we set the voting period to 30s, you will have 30s to vote on the proposal from the time the proposal is submitted. Go go go!
Verify the group proposal is active
./build/manifestd q group proposals-by-group-policy manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj
Vote on the proposal
./build/manifestd tx group vote 1 manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct VOTE_OPTION_YES ""
Wait for the voting period to pass
At this point, the proposal should have passed. You can verify the proposal status with
./build/manifestd q group proposal 1
Execute the proposal
./build/manifestd tx group exec 1 --from val --yes
Check that the proposal was executed and that the software upgrade is scheduled
./build/manifestd q upgrade plan
plan:
height: "[SOME_HEIGHT]"
info: '{}'
name: v0.0.1-alpha.11
time: "0001-01-01T00:00:00Z"
Wait until the chain reaches the software upgrade height and monitor Cosmovisor.