How to Create and Submit a Governance Proposal on Gonka
Step-by-step for submitting Proposal with inferenced.
Aligned with Gonka Transactions & Governance.
Replace every placeholder with your own values before running commands.
Placeholders
| Placeholder | Meaning |
|---|---|
<COLD_KEY_NAME> |
Your key name in the keyring (not your gonka1... address) |
<PATH_TO_PROPOSAL_JSON> |
Path to the proposal JSON file, e.g. ./proposal.json |
<NODE_URL> |
Node base URL without /chain-rpc/, e.g. http://node1.gonka.ai:8000 |
<CHAIN_ID> |
e.g. gonka-mainnet for mainnet |
If a command fails with connection or parse, check that every RPC command uses <NODE_URL>/chain-rpc/ with exactly one /chain-rpc/.
Two URLs (do not mix them)
| Task | Variable |
|---|---|
inferenced query / tx |
<NODE_URL>/chain-rpc/ (must include /chain-rpc/) |
create-client (HTTP .../v1/participants on the seed) |
<NODE_URL> (no /chain-rpc/) |
Using <NODE_URL>/chain-rpc/ for --node-address in create-client is incorrect and will fail or hit the wrong service.
Prerequisites
1. Install CLI
Download a build for your OS from Gonka releases, unpack, then:
chmod +x inferenced
./inferenced --help
For detailed CLI installation instructions, see the local machine CLI setup guide. After installing the CLI, you can return to this page and continue.
2. Read min_deposit and voting_period from the chain
Do not rely on a fixed ngonka amount from old docs. Query live values:
./inferenced query gov params \
--node "<NODE_URL>/chain-rpc/" \
--chain-id "<CHAIN_ID>" \
-o json | jq '{min_deposit: .params.min_deposit, voting_period: .params.voting_period}'
Your proposal JSON deposit must satisfy min_deposit (same denom, amount >= minimum).
3. Proposal JSON
Prepare a gov v1 JSON (messages, metadata, deposit, title, summary).
There are two main parts to prepare:
Proposal description fields
Keep the on-chain text short and clear.
Make sure the proposal includes:
- A short summary of what the proposal is about.
- A link to the full proposal description with all details.
- The wallet address where funds should be sent, if the proposal requests funding.
- The requested amount and denom, if the proposal requests funding.
Proposal JSON structure
For the JSON structure, the best approach is to inspect previous proposals and use them as references.
You can inspect previous proposal JSONs to see how different proposal types are structured. In many cases, it is easier to start from a similar previous proposal and adapt it.
For messages such as MsgUpdateParams, the chain expects the full params object and correct authority (gov module address).
Fetch the gov module address:
./inferenced query auth module-accounts \
--node "<NODE_URL>/chain-rpc/" \
--chain-id "<CHAIN_ID>" \
-o json | jq -r '.accounts[] | select(.value.name=="gov") | .value.address'
Use that address as authority where the message type requires it.
If the jq line prints nothing, run the same query without jq once and locate the gov module entry manually. The output shape can differ slightly by SDK version.
4. Optional: new key + register participant (create-client)
This creates a key and calls the seed HTTP API (participant registration).
Use <NODE_URL> only:
./inferenced create-client "<COLD_KEY_NAME>" \
--node-address "<NODE_URL>"
Store the mnemonic safely. If you already have a funded key for governance, skip this and avoid double registration.
Use the same --keyring-backend everywhere (e.g. file) for keys show, tx gov submit-proposal, and tx gov vote.
Publish the proposal on-chain
1. Check balance
./inferenced query bank balances \
"$(./inferenced keys show "<COLD_KEY_NAME>" -a --keyring-backend file)" \
--node "<NODE_URL>/chain-rpc/" \
--chain-id "<CHAIN_ID>"
Ensure you have enough ngonka (or the fee denom your node expects) for min_deposit and fees.
2. Submit
Recommended pattern from the official Gonka doc:
./inferenced tx gov submit-proposal "<PATH_TO_PROPOSAL_JSON>" \
--from "<COLD_KEY_NAME>" \
--keyring-backend file \
--chain-id "<CHAIN_ID>" \
--node "<NODE_URL>/chain-rpc/" \
--unordered --timeout-duration=60s \
--gas 2000000 --gas-adjustment 5.0 \
--yes
After submission, note the proposal number from the output or find it via query commands. Share the proposal number so the community announcement can go out.
Voting and tally
Voting steps are documented on the dedicated page:
Submit a Parameter Change Proposal
TL;DR: draft a proposal with MsgUpdateParams, include all params for that module, ensure deposit meets min_deposit, submit, then track/deposit/vote.
1. Get the governance module address (authority)
inferenced query auth module-accounts --node <NODE_URL>/chain-rpc/ | grep -B2 'name: gov'
2. Export current params for the target module
inferenced query inference params -o json --node <NODE_URL>/chain-rpc/ > current_params.json
3. Check the minimum deposit
inferenced query gov params -o json --node <NODE_URL>/chain-rpc/ | jq '.params.min_deposit'
4. Draft the proposal file
inferenced tx gov draft-proposal
# fills draft_proposal.json and draft_metadata.json
Edit draft_proposal.json and include the full params object.
5. Submit the proposal
inferenced tx gov submit-proposal ./draft_proposal.json \
--from <COLD_KEY_NAME> \
--keyring-backend file \
--unordered --timeout-duration=60s \
--gas=2000000 --gas-adjustment=5.0 \
--node <NODE_URL>/chain-rpc/ \
--yes
6. Ensure your proposal is on-chain
inferenced query gov proposals --node <NODE_URL>/chain-rpc/
Review the contents carefully (especially param updates)
# 2a) Get current module params (example: inference module)
inferenced query inference params -o json --node <NODE_URL>/chain-rpc/ > current_params.json
# 2b) Extract proposed params from the proposal
inferenced query gov proposal <VOTE_PROPOSAL_ID> -o json --node <NODE_URL>/chain-rpc/ \
| jq '.proposal.messages[] | select(."type"=="inference/x/inference/MsgUpdateParams") | .value' \
> proposed_params.json
# 2c) Diff
diff -u current_params.json proposed_params.json || true
For MsgUpdateParams, modules typically expect the full params object and authority set to the gov module account.