Submit a Proposal

If you have a final draft of your proposal ready to submit, you may want to push your proposal live on the testnet first. These are the three primary steps to getting your proposal live on-chain.

  1. (Optional) Hosting supplementary materials for your proposal with IPFS (InterPlanetary File System)
  2. Formatting the JSON file for the governance proposal transaction that will be on-chain
  3. Sending the transaction that submits your governance proposal on-chain

Hosting supplementary materials

In general we try to minimize the amount of data pushed to the blockchain. Hence, detailed documentation about a proposal is usually hosted on a separate censorship resistant data-hosting platform, like IPFS.

Once you have drafted your proposal, ideally as a Markdown file, you can upload it to the IPFS network:

  1. either by running an IPFS node and the IPFS software, or
  2. using a service such as https://pinata.cloud

Ensure that you "pin" the file so that it continues to be available on the network. You should get a URL like this: https://ipfs.io/ipfs/QmbkQNtCZdR1GEbFE8ujub5dcpwUfvSRpSCg8gVWrTHSWD The value QmbkQNtCZdR1GEbFE8ujub5dcpwUfvSRpSCg8gVWrTHSWD is called the CID of your file - it is effectively the file's hash.

If you uploaded a markdown file, you can use the IPFS markdown viewer to render the document for better viewing. Links for the markdown viewer look like https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/<CID>, where <CID> is your CID. For instance the link above would be: https://ipfs.io/ipfs/QmTk...HSWD

Share the URL with others and verify that your file is publicly accessible.

The reason we use IPFS is that it is a decentralized means of storage, making it resistant to censorship or single points of failure. This increases the likelihood that the file will remain available in the future.

Formatting the JSON file for the governance proposal

Many proposals allow for long form text to be included, usually under the key description. These provide the opportunity to include markdown if formatted correctly as well as line breaks with \n. Beware, however, that if you are using the CLI to create a proposal, and setting description using a flag, the text will be escaped which may have undesired effects. If you're using markdown or line breaks it's recommended to put the proposal text into a json file and include that file as part of the CLI proposal, as opposed to individual fields in flags.

Text Proposals

TextProposals are used by delegators to agree to a certain strategy, plan, commitment, future upgrade, or any other statement in the form of text. Aside from having a record of the proposal outcome on the Kynno chain, a text proposal has no direct effect on Kynno itself.

Example

a proposal text to agreed for changing the inflation rate.

{
  "title": "Inflation Rate Change Correction",
  "description": "Description about why you want to change the inflation rate",
  "deposit": [
    {
      "denom": "akynno",
      "amount": "10000000000000000000"
    }
  ]
}

Community Pool Spend Proposals

For community pool spend proposals, there are five components:

  1. Title - the distinguishing name of the proposal, typically the way the that explorers list proposals
  2. Description - the body of the proposal that further describes what is being proposed and details surrounding the proposal
  3. Recipient - the Kynno (bech32-based) address that will receive funding from the Community Pool
  4. Amount - the amount of funding that the recipient will receive in atto-KYN (akynno)
  5. Deposit - the amount that will be contributed to the deposit (in akynno) from the account submitting the proposal

Made-Up Example

In this simple example (below), a network explorer will list the governance proposal as a CommunityPoolSpendProposal. When an observer selects the proposal, they'll see the description. Not all explorers will show the recipient and amount, so ensure that you verify that the description aligns with the what the governance proposal is programmed to enact. If the description says that a certain address will receive a certain number of KYN, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise).

The amount is 1000000000000000000akynno. This is equal to 1 KYN, so recipient address kynno1mx9nqk5agvlsvt2yc8259nwztmxq7zjq50mxkp will receive 1 KYN if this proposal is passed.

The deposit of 10000000000000000000akynno results in 10 KYN being used from the proposal submitter's account. There is a minimum deposit required for a proposal to enter the voting period, and anyone may contribute to this deposit within a 5-day period. If the minimum deposit isn't reached before this time, the deposit amounts will be burned. Deposit amounts will also be burned if quorum isn't met in the vote or if the proposal is vetoed.

{
  "title": "Community Pool Spend",
  "description": "This is the summary of the key information about this proposal. Include the URL to a PDF version of your full proposal.",
  "recipient": "kynno1mx9nqk5agvlsvt2yc8259nwztmxq7zjq50mxkp",
  "amount": [
    {
      "denom": "akynno",
      "amount": "1000000000000000000"
    }
  ],
  "deposit": [
    {
      "denom": "akynno",
      "amount": "10000000000000000000"
    }
  ]
}

Users can query the proposal details with the kynnod command-line interface using this command:

`kynnod --node https://tendermint.kynno.dev query gov proposal 23`.

Params-Change Proposals

::: tip Changes to the gov module are different from the other kinds of parameter changes because gov has subkeys, as discussed here. Only the key part of the JSON file is different for gov parameter-change proposals. :::

For parameter-change proposals, there are seven components:

  1. Title - the distinguishing name of the proposal, typically the way the that explorers list proposals
  2. Description - the body of the proposal that further describes what is being proposed and details surrounding the proposal
  3. Subspace - the Kynno module with the parameter that is being changed
  4. Key - the parameter that will be changed
  5. Value - the value of the parameter that will be changed by the governance mechanism
  6. Denom - akynno (atto-KYN) will be the type of asset used as the deposit
  7. Amount - the amount that will be contributed to the deposit (in akynno) from the account submitting the proposal

Example

In the example below, a delegator listed the governance proposal by its title: "Increase the minimum deposit for governance proposals." When a user selects the proposal, they'll see the proposal’s description.

Not all explorers will show the proposed parameter changes that are coded into the proposal, so the delegator should verify that the description aligns with what the governance proposal is programmed to enact. If the description says that a certain parameter will be increased, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise).

Users can query the proposal details with the kynnod command-line interface using this command:

`kynnod --node https://tendermint.kynno.dev query gov proposal 7`.
{
  "title": "Increase the minimum deposit for governance proposals",
  "description": "If successful, this parameter-change governance proposal will change the minimum deposit for future proposals from 10 KYN tokens to 100 KYN.",
  "changes": [
    {
      "subspace": "gov",
      "key": "depositparams",
      "value": {"mindeposit":[{"denom":"akynno","amount":"100000000000000000000"}],
      "max_deposit_period":"1209600000000000"}
    }
  ],
  "deposit": [
    {
      "denom": "akynno",
      "amount": "20100000000000000000"
    }
  ]
}

Sending the transaction that submits your governance proposal

For information on how to use kynnod binary to submit an on-chain proposal through the governance module, please refer to the quickstart documentation.

CLI

This is the command format for using kynnod (the command-line interface) to submit your proposal on-chain:

kynnod tx gov submit-proposal \
  --title=<title> \
  --description=<description> \
  --type="Text" \
  --deposit="10000000000000000000akynno" \
  --from=<mykey> \
  --chain-id=<chain_id>
  --node <address>

::: tip Use the kynnod tx gov --help flag to get more info about the governance commands :::

  1. kynnod is the command-line interface client that is used to send transactions and query Kynno
  2. tx gov submit-proposal param-change indicates that the transaction is submitting a parameter-change proposal
  3. --from mykey is the account key that pays the transaction fee and deposit amount
  4. --gas 500000 is the maximum amount of gas permitted to be used to process the transaction
    • the more content there is in the description of your proposal, the more gas your transaction will consume
    • if this number isn't high enough and there isn't enough gas to process your transaction, the transaction will fail
    • the transaction will only use the amount of gas needed to process the transaction
  5. --gas-prices is the flat-rate per unit of gas value for a validator to process your transaction
  6. --chain-id kynno_9701-1 is Kynno Mainnet. For current and past chain-id's
  7. --node is using a full node to send the transaction to the Kynno Mainnet

Verifying your transaction

After posting your transaction, your command line interface (kynnod) will provide you with the transaction's hash, which you can either query using kynnod or by searching the transaction hash using Kynnoscan or any block explorer.

Depositing funds after a proposal has been submitted

Sometimes a proposal is submitted without having the minimum token amount deposited yet. In these cases you would want to be able to deposit more tokens to get the proposal into the voting stage. In order to deposit tokens, you'll need to know what your proposal ID is after you've submitted your proposal. You can query all proposals by the following command:

kynnod q gov proposals

If there are a lot of proposals on the chain already, you can also filter by your own address. For the proposal above, that would be:

kynnod q gov proposals --depositor kynno1hxv7mpztvln45eghez6evw2ypcw4vjmsmr8cdx

Once you have the proposal ID, this is the command to deposit extra tokens:

kynnod tx gov deposit <proposal-id> <deposit> --from <name>

<proposal-id> can be 3 for example. The <deposit> is written as 500000akynno, just like the example above.

Submit your proposal to the testnet

You may want to submit your proposal to the testnet chain before the mainnet for a number of reasons:

  1. To see what the proposal description will look like
  2. To signal that your proposal is about to go live on the mainnet
  3. To share what the proposal will look like in advance with stakeholders
  4. To test the functionality of the governance features

Submitting your proposal to the testnet increases the likelihood that you will discover a flaw before deploying your proposal on mainnet. A few things to keep in mind:

  • you'll need testnet tokens for your proposal (ask around for a faucet)
  • the parameters for testnet proposals are different (eg. voting period timing, deposit amount, deposit denomination)