# Cronos POS Chain Introduction

What is Cronos POS Chain and its design goals?

The development of blockchain technology and cryptocurrencies represents a cryptography and security breakthrough as significant as that created by the internet in the 1990s. This technology, however, is still at a very nascent stage; in order to generate mass adoption, it will therefore be necessary to find compelling real-life use cases that can appeal to an audience larger than the small group of industry professionals and experts.

### Cronos POS Chain

Accordingly, we propose Cronos POS Chain, the next-generation public blockchain that enables transactions worldwide between people and businesses. It is also the technology that powers Crypto.com Pay, mobile payment solution, and will be used to power our trading & financial services offerings in the near future.

We believe enabling cryptocurrency spending in the real world will be an adoption catalyst. Current traditional payment institutions and existing blockchains have failed to provide a secure, scalable and decentralized solution to support cryptocurrency payment. The key limitations of existing blockchain-powered payment networks are that they are:

* Too complex to setup and use;
* Not friendly to crypto first-timers; and
* Rarely supported beyond their own blockchain;

## Design Goals

On the technical side, Cronos POS Chain has the following design goals:

1. **"Security"**: robust and well-understood primitives and implementation are favoured
2. **"Scalability"**: parts that hinder overall latency, throughput, lightweight client support, etc. should be mitigated
3. **"Multi-party"**: the system should permit multi-party operation; anything that puts trust in a single party should be opt-in
4. **"Long-term operation"**: there needs to be a leeway for backward- and forwards-compatibility etc.
5. **"Developer ecosystem"**: external developers can easily work with Chain, regardless of their used programming language; better support for DeFi use cases, e.g., support cross-chain asset transfers and communications.


# Architecture

## Overview

Building a blockchain is not just about software/hardware development. Instead, it is a combination of technological design, incentive mechanism, game theory and governance, which together nourish a robust system that also allows for continuous innovation. Our initially proposed architecture may hence undergo future revisions in response to changes in incentives, governance or other external requirements.

Cronos POS Chain is open to the public to join, participate and scrutinise related transactions. We do not expect that, for example, mobile clients will be able to perform heavy-lifting tasks and have a reliable always-online network connection. For that reason, there are two different types of nodes that are responsible for various duties:

* **Validator**, responsible for validating transactions and committing new blocks to the blockchain; and
* **Full node**, responsible for fetching the blockchain data and serving it upon the client's request.

## Consensus engine

Cronos POS Chain is based on Tendermint Core's consensus engine, it relies on a set of validators to participate in the proof of stake (POS) consensus protocol, and they are responsible for committing new blocks in the blockchain.

Specifically, validators run a Byzantine Fault Tolerant (BFT) consensus protocol among themselves which resolves the final order of transaction sequences. Cronos POS Chain utilizes [Cosmos SDK](https://cosmos.network/sdk) and the [Tendermint](https://tendermint.com/) Core consensus engine underneath. Tendermint works well for POS / DPOS networks, allows high transaction throughputs, and provides instant transaction finality on block commitment. It was chosen as the consensus engine for the Chain prototype due to the following additional reasons:

* Backed by [formal research](https://eprint.iacr.org/2018/574.pdf);
* Robustly tested [implementation](http://jepsen.io/analyses/tendermint-0-10-2);
* Track record of adoption: Tendermint has been in continuous development since 2014, and has been adopted by several high-profile [projects](https://forum.cosmos.network/t/list-of-projects-in-cosmos-tendermint-ecosystem/243); and
* Modular architecture: It offers flexibility on which and how applications are developed on top of it.


# Wallets


# chain-maind

`chain-maind` is the all-in-one command-line interface. It supports wallet management, funds transfer and staking operations.

## Build and configurations

### Build Prerequisites

* You can get the latest `chain-maind` binary here from the [release page](https://github.com/crypto-org-chain/chain-main/releases);
* Alternatively, you can install `chain-maind` by [homebrew](https://brew.sh/)

  ```bash
  # tap the repo
  brew tap crypto-org-chain/chain-maind
  # install the CLI tool
  brew install chain-maind
  # get a list of all the commands
  chain-maind
  ```

### Using `chain-maind`

`chain-maind`is bundled with the Cronos POS Chain code. After you have obtained the latest `chain-maind` binary, run

```bash
$ chain-maind [command]
```

There is also a `-h, --help` command available

```bash
$ chain-maind -h
```

### Config and data directory

By default, your config and data are stored in the folder located at the `~/.chain-maind` directory.

Make sure you have backed up your wallet storage after creating the wallet or else your funds may be inaccessible in case of accident forever.

#### Configure chain-maind config and data directory

To specify the chain-maind config and data storage directory; you can add a global flag `--home <directory>`

### Configure Chain ID

Cronos POS Chain has different Chain ID to distinguish between *devnet*, *testnet* and *mainnet* . Accordingly, you should set up your chain-maind and use the correct configuration for the node you are connecting to. For example, you might create the following aliases and add the global `--chain-id` flag, for example, `crypto-org-chain-mainnet-1` is the chain-id for the Cronos POS Chain mainnet:

```bash
alias chain-maind="chain-maind --chain-id crypto-org-chain-mainnet-1"
```

### Options

A list of commonly used flags of chain-maind is listed below:

| Option              | Description                   | Type         | Default Value    |
| ------------------- | ----------------------------- | ------------ | ---------------- |
| `--home`            | Directory for config and data | string       | `~/.chain-maind` |
| `--chain-id`        | Full Chain ID                 | String       | ---              |
| `--output`          | Output format                 | string       | "text"           |
| `--keyring-backend` | Select keyring's backend      | os/file/test | os               |

## Command list

A list of commonly used `chain-maind` commands.

| Command | Description                                                                                                                | List                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `keys`  | [Keys management](#keys-management-chain-maind-keys)                                                                       | <p><a href="#keys-add-wallet-name-create-a-new-key"><code>add \<wallet\_name></code></a><br><br><a href="#keys-add-key-name-recover-restore-existing-key-by-seed-phrase"><code>add \<key\_name> --recover</code></a><br><br><a href="#keys-list-list-your-keys"><code>list</code></a><br><br><a href="#keys-show-key-name-retrieve-key-information"><code>show \<key\_name></code></a><br><br><a href="#keys-delete-key-name-delete-a-key"><code>delete \<key\_name></code></a><br><br><a href="#keys-export-key-name-export-private-keys"><code>export \<key\_name></code></a></p> |
| `tx`    | [Transactions subcommands](#transactions-subcommands-chain-maind-tx)                                                       | <p><a href="#tx-bank-send-transfer-operation"><code>bank send</code></a><br><br><a href="#delegate-you-funds-to-a-validator-tx-staking-delegate-validator-addr-amount"><code>staking delegate</code></a><br><br><a href="#unbond-your-delegated-funds-tx-staking-unbond-validator-addr-amount"><code>staking unbond</code></a><br><br><a href="#tx-staking-create-validator-joining-the-network-as-a-validator"><code>staking create-validator</code></a><br><br><a href="#tx-slashing-unjail-unjail-a-validator"><code>slashing unjail</code></a></p>                              |
| `query` | [Query subcommands](https://docs.cronos-pos.org/for-users/wallets/cli#query-bank-balances-check-your-transferable-balance) | [`query bank balance`](#query-bank-balances-check-your-transferable-balance)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |

You may also add the flag `-h, --help` on `chain-maind [command]` to get more available commands and details.

{% hint style="info" %}
**Example**: More details of subcommand - tx staking

```bash
$ chain-maind tx staking --help
Staking transaction subcommands

Usage:
  chain-maind tx staking [flags]
  chain-maind tx staking [command]

Available Commands:
  create-validator create new validator initialized with a self-delegation to it
  delegate         Delegate liquid tokens to a validator
  edit-validator   edit an existing validator account
  redelegate       Redelegate illiquid tokens from one validator to another
  unbond           Unbond shares from a validator

Flags:
  -h, --help   help for staking

Global Flags:
      --chain-id string     The network chain ID
      --home string         directory for config and data (default "/Users/.chain-maind")
      --log_format string   The logging format (json|plain) (default "plain")
      --log_level string    The logging level (trace|debug|info|warn|error|fatal|panic) (default "info")
      --trace   
```

{% endhint %}

## Keys management - `chain-maind keys`

First of all, you will need an address to store and spend your CRO.

### `keys add <wallet_name>` - Create a new key

You can create a new key with the name `Default` as in the following example: ::: details Example: Create a new address

```bash
$ chain-maind keys add Default 
- name: Default
  type: local
  address: cro1quw5r22pxy8znjtdkgqc65atrm3x5hg6vycm5n
  pubkey: cropub1addwnpepqdct05khsxvtaaj0stuvayrpw0j8t6styr7vu05k3y63d5540ftuz8x6tsq
  mnemonic: ""
  threshold: 0
  pubkeys: []

**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.

spare leopard potato hospital series salt model myself bronze print despair please mutual rival battle lumber crater brain food artwork goose west talent ritual
```

{% hint style="danger" %}
The key comes with a "mnemonic phrase", which is serialized into a human-readable 24-word mnemonic. User can recover their associated addresses with the mnemonic phrase.

It is important that you keep the mnemonic for address secure, as there is **no way** to recover it. You would not be able to recover and access the funds in the wallet if you forget the mnemonic phrase.
{% endhint %}

### `keys add <key_name> --recover` - Restore existing key by seed phrase

You can restore an existing key with the mnemonic.

{% hint style="info" %}
**Example**: Restore an existing key

```bash
$ chain-maind keys add Default_restore --recover 
> Enter your bip39 mnemonic
## Enter your 24-word mnemonic here ##
```

{% endhint %}

### `keys list` - List your keys

Multiple keys can be created when needed. You can list all keys saved under the storage path.

{% hint style="info" %}
**Example**: List all of your keys

```bash
$ chain-maind keys list
    - name: Default
    type: local
    address: ## Address of "Default" ##
    pubkey: ## Pubkey of "Default" ##
    mnemonic: ""
    threshold: 0
    pubkeys: []
  - name: Default_restore
    type: local
    address: ## Address of "Default_restore" ##
    pubkey: ## Pubkey of "Default_restore" ##
    mnemonic: ""
    threshold: 0
    pubkeys: []
```

{% endhint %}

### `keys show <key_name>` - Retrieve key information

You can retrieve key information by its name:

{% hint style="info" %}
**Example**: Retrieve key information - Account Address and its public key

```bash
$ chain-maind keys show Default --bech acc
- name: Default
  type: local
  address: cro1quw5r22pxy8znjtdkgqc65atrm3x5hg6vycm5n
  pubkey: cropub1addwnpepqdct05khsxvtaaj0stuvayrpw0j8t6styr7vu05k3y63d5540ftuz8x6tsq
  mnemonic: ""
  threshold: 0
  pubkeys: []
```

{% endhint %}

{% hint style="info" %}
**Example**: Retrieve key information - Validator Address and its public key

```
$ chain-maind keys show Default --bech val
- name: Default
  type: local
  address: crocncl1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s3prz35z
  pubkey: crocnclpub1addwnpepq0ua07k8p3vrv5dap4pl77n4gjyyqsqrndzu0tdrr60ddhfg6ah0ck5ad5l
  mnemonic: ""
  threshold: 0
  pubkeys: []
```

{% endhint %}

{% hint style="info" %}
**Example**: Retrieve key information - Consensus nodes Address and its public key

```bash
$ chain-maind keys show Default --bech cons
- name: Default
  type: local
  address: crocnclcons1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s34pfmlc
  pubkey: crocnclconspub1addwnpepq0ua07k8p3vrv5dap4pl77n4gjyyqsqrndzu0tdrr60ddhfg6ah0ch6kdrc
  mnemonic: ""
  threshold: 0
  pubkeys: []
```

{% endhint %}

### `keys delete <key_name>` - Delete a key

You can delete a key in your storage path.

{% hint style="danger" %}
Make sure you have backed up the key mnemonic before removing any of your keys, as there will be no way to recover your key without the mnemonic.&#x20;
{% endhint %}

{% hint style="info" %}
**Example**: Remove a key

```
$ chain-maind keys delete Default_restore1
Key reference will be deleted. Continue? [y/N]: y
Key deleted forever (uh oh!)
```

{% endhint %}

### `keys export <key_name>` - Export private keys

You can export and backup your key by using the `export` subcommand:

{% hint style="info" %}
&#x20;**Example**: Export your keys Exporting the key *Default* :

```bash
$ chain-maind keys export Default
Enter passphrase to encrypt the exported key: ## Insert passphrase (must be at least 8 characters)##
-----BEGIN TENDERMINT PRIVATE KEY-----
kdf: bcrypt
salt: ## Salt of the key ##
type: secp256k1

## Tendermint private key ##
-----END TENDERMINT PRIVATE KEY-----
```

{% endhint %}

### The keyring `--keyring-backend` option

Interacting with a node requires a public-private key pair. Keyring is the place holding the keys. The keys can be stored in different locations with specified backend types.

```
$ chain-maind keys [subcommands] --keyring-backend [backend type]
```

### `os` backend

The default `os` backend stores the keys in the operating system's credential sub-system, which are comfortable to most users, yet without compromising on security.

Here is a list of the corresponding password managers in different operating systems:

* macOS (since Mac OS 8.6): [Keychain](https://support.apple.com/en-gb/guide/keychain-access/welcome/mac)
* Windows: [Credentials Management API](https://docs.microsoft.com/en-us/windows/win32/secauthn/credentials-management)
* GNU/Linux:
  * [libsecret](https://gitlab.gnome.org/GNOME/libsecret)
  * [kwallet](https://api.kde.org/frameworks/kwallet/html/index.html)

### `file` backend

The `file` backend stores the encrypted keys inside the app's configuration directory. A password entry is required every time a user accesses it, which may also occur multiple times of repeated password prompts in one single command.

### `test` backend

The `test` backend is a password-less variation of the `file` backend. It stores unencrypted keys inside the app's configuration directory. It should only be used in testing environments and never be used in production.

## Transactions subcommands - `chain-maind tx`

### `tx bank send` - Transfer operation

Transfer operation involves the transfer of tokens between two addresses.

#### **Send Funds** \[`tx bank send <from_key_or_address> <to_address> <amount> <network_id>`]

{% hint style="info" %}
**Example**: Send 10cro from one address to another.

```
$ chain-maind tx bank send Default cro17waz6n5a4c4z388rvc40n4c402njfjgqmv0qcp 10cro --chain-id crypto-org-chain-mainnet-1
  ## Transaction payload##
  {"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address"....}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

### `tx staking` - Staking operations

Staking operations involve the interaction between an address and a validator. It allows you to create a validator and lock/unlock funds for staking purposes.

#### **Delegate your funds to a validator** \[`tx staking delegate <validator-addr> <amount>`]

To bond funds for staking, you can delegate funds to a validator by the `delegate` command

{% hint style="info" %}
**Example**: Delegate funds from `Default` to a validator under the address `crocncl1zd...rz35z`

```bash
$ chain-maind tx staking delegate crocncl1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s3prz35z 100cro --from Default --chain-id crypto-org-chain-mainnet-1
## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgDelegate"....}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

#### **Unbond your delegated funds** \[`tx staking unbond <validator-addr> <amount>`]

On the other hand, we can create a `Unbond` transaction to unbond the delegated funds

{% hint style="info" %}
Example: Unbond funds from a validator under the address `crocncl1zdl...rz35z`

```
$ chain-maind tx staking unbond crocncl1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s3prz35z 100cro --from Default --chain-id crypto-org-chain-mainnet-1
## Transaction payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgUndelegate"...}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

{% hint style="info" %}
Once your funds are unbonded, they will be locked until the `unbonding_time` has passed.
{% endhint %}

## Balance & transaction history

### `query bank balances` - Check your transferable balance

You can check your *transferable* balance with the `balances` command under the bank module.&#x20;

{% hint style="info" %}
**Example**: Check your address balance

```bash
$ chain-maind query bank balances cro1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s3zwpck7

balances:
- amount: "10005471622381693"
  denom: basecro
pagination:
  next_key: null
  total: "0"
```

{% endhint %}

## Advance operations and transactions

### `tx staking create-validator` - Joining the network as a validator

Anyone who wishes to become a validator can submit a `create-validator` transaction by

```bash
$ chain-maind tx staking create-validator [flags]
```

{% hint style="info" %}
**Example**: Joining the network as a validator

```
$ chain-maind tx staking create-validator \
--amount="100cro" \
--pubkey="crocnclconspub1zcjduepqg0yml2l63qjnhr2cuw4tvprr72tle0twf3zymrxllmr0sj9uv3tqmpcrhs" \
--moniker="The_new_node" \
--chain-id="cro-test" \
--commission-rate="0.10" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.01" \
--min-self-delegation="1" \
--from=node1
## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator"...}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

(TODO: details of each flag )

### `tx slashing unjail` - Unjail a validator

Validator could be punished and jailed due to network misbehaviour, for example, if we check the validator set:

```bash
$ chain-maind query staking validators -o json | jq
................................
    "operator_address": "crocncl18prgwae59zdqpwye6t4xftmq3d87vl0h0rj0qq",
    "consensus_pubkey": "crocnclconspub1zcjduepqg0yml2l63qjnhr2cuw4tvprr72tle0twf3zymrxllmr0sj9uv3tqmpcrhs",
    "jailed": true,
    "status": 1,
................................
```

After the jailing period has passed, one can broadcast a `unjail` transaction to unjail the validator and resume its normal operations by

```bash
$ chain-maind tx slashing unjail --from node1 --chain-id crypto-org-chain-mainnet-1
  {"body":{"messages":[{"@type":"/cosmos.slashing.v1beta1.MsgUnjail"...}]}
  confirm transaction before signing and broadcasting [y/N]: y
```


# Ledger Hardware Wallets with chain-maind

You can use your [Ledger hardware wallets](https://www.ledger.com/) to securely manage your CRO assets. Ledger devices are hardware wallets that store your private keys safely in the device and can be used in even unsafe PCs.

## Pre-requisites

* An initialized Ledger Nano device;
* Install the latest firmware on your device;
* [Ledger Live](https://www.ledger.com/ledger-live);
* Download our latest released `chain-maind` [binary](https://github.com/crypto-org-chain/chain-main/releases).

### Technical support and enquiries

In case you have any inquiries about using the Ledger device, kindly send a message to the Cronos [Discord](https://discord.gg/pahqHz26q4) #technical-questions channel for assistance.

## Install the Cronos POS Chain app on your Ledger device

We will use Ledger Nano S for this illustration:

First of all, you will need to install the Cronos POS Chain app on your Ledger device. Kindly make sure your Ledger Live is updated to the latest version.

* **Step 1** - Connect and unlock your Ledger device
* **Step 2** - On your Ledger device, go to "*Install app*", It should show "*Open Ledger live to install apps*"
* **Step 3** - On the Ledger Live, find and install Cronos POS Chain in the app catalog under "*Manager*" as below:&#x20;

<div align="center"><figure><img src="/files/gj82Il3q1jPKRSScn7UY" alt="" width="563"><figcaption></figcaption></figure></div>

* **Step 4** - Your Ledger device will display "*Processing…*". Once the installation is completed, you should see "*Installed*" on your Ledger Live as below:&#x20;

<div align="center"><figure><img src="/files/8aWHkPbEhK6FDIKFAabl" alt="" width="563"><figcaption></figcaption></figure></div>

You can confirm the installation by checking if the Cronos POS Chain App shows up in the main menu of your Ledger device:&#x20;

<div align="center"><figure><img src="/files/vUENdjsuIwuk9Lme0hDr" alt="" width="563"><figcaption></figcaption></figure></div>

**Remark**: Once the Cronos POS Chain App is successfully installed, please close the Ledger Live app before proceeding to the next step.

## Generate Address with Ledger device

1. Connect and unlock your Ledger device
2. Open "Cronos POS Chain" app on the device
3. Run in your terminal

   ```bash
   $ ./chain-maind keys add [name] --ledger --keyring-backend=test
   ```

   * `name` is an arbitrary name for your new key
4. An address will be displayed on your Ledger device, for example:&#x20;

   <figure><img src="/files/hJr3MlLtJ6mJNrEtOUmw" alt="" width="563"><figcaption></figcaption></figure>
5. Confirm the address on your Ledger device and verify the address displayed on the terminal. They should match each other, for example, if we create a wallet named `ledger_test`, you should see the same address displayed on your terminal after confirming and pressing "*Ok*" on your ledger device:

   ```bash
   - name: ledger_test
   type: ledger
   address: cro1v2uvz32f98kvf2k6tec7pqp4t5hhen6vr5a8ms
   pubkey: cropub1addwnpepq09tkjulrexy0r8atsjknpemk7nelswr3vj8p78hdag62phdhwgzgnpxrmg
   mnemonic: ""
   threshold: 0
   pubkeys: []
   ```
6. Your address is generated successfully. You can now use the address for any chain operations.

## Query account balance

You can query its balance by running in terminal

```bash
$ ./chain-maind query bank balances [address]
```

`address` is the address you have generated. If you didn't copy your address, you can query the address listing it in terminal:

```bash
$ ./chain-maind keys list --keyring-backend=test
```

## Sign a transaction

In this tutorial, we will send a `MsgSend` transaction securely signed by your Ledger device to the chain.

1. Connect and unlock your Ledger device
2. Open "Cronos POS Chain" app on the device
3. For example, if you would like to send `1cro` in the mainnet, in your terminal, you can run:

   ```bash
   $ ./chain-maind tx bank send [from-address] [to-address] 1cro --chain-id="crypto-org-chain-mainnet-1" --ledger --keyring-backend=test  --sign-mode=amino-json
   ```

   * `from-address` is the from address [generated](#generate-address-with-ledger-device) by your Ledger device
   * `to-address` is the destination address
   * In this command, we are sending `1tcro` from the from address, you can specify other amounts you want.
4. You will be asked to confirm the details of transaction in your terminal, input `y` to confirm:

   ```bash
   $ ./chain-maind tx bank send tcro1tzhdkuc328cgh2hycyfddtdpqfwwu42ywyfvkj tcro1aaah6juc9n6wvkkkr4zdn073n8gt7waha39xsv 1tcro --chain-id=testnet-croeseid-4 --ledger --keyring-backend=test  --sign-mode=amino-json
   {"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"tcro1tzhdkuc328cgh2hycyfddtdpqfwwu42ywyfvkj","to_address":"tcro1aaah6juc9n6wvkkkr4zdn073n8gt7waha39xsv","amount":[{"denom":"basetcro","amount":"100000000"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]}

   confirm transaction before signing and broadcasting [y/N]: y
   ```
5. Transaction details will be displayed on your Ledger device, you can click the right button to read the different details.
6. Read the transaction details carefully and confirm ONLY when you have reviewed all the details are correct.
7. The transaction is signed and will be broadcasted.
8. Wait for a while, and the broadcast result will be shown in your terminal.


# Crypto.com DeFi Desktop Wallet

We've migrated the previous user guide of Desktop Wallet to the *Crypto.com Help Center*. Please proceed to the [DeFi Wallet section](https://help.crypto.com/en/collections/2221157-crypto-com-defi-wallet#crypto-com-defi-desktop-wallet) for further assist.


# Conducting IBC Transfer with Keplr Wallet

The Inter-Blockchain Communication protocol (IBC) is an inter-module communication protocol that bridges different blockchains to facilitate communication and feature exchanges between networks with different infrastructure designs and consensus algorithms. IBC transfer works among the IBC-enabled chains, and it has been enabled in Cronos POS Chain.

In the following step-by-step guide, you will learn how to make IBC transfers with Keplr, and IBC transfers between Cronos POS Chain and Cosmos are demonstrated as an example in this guide.

### Pre-requisites

* Make sure you have CRO under Cronos POS Chain and ATOM under the Cosmos network in Keplr.
* You will need your Cronos POS Chain and Cosmos addresses in Keplr, please copy-and-paste somewhere and make them handy for later use.

### Transfer ATOM under Cosmos to Cronos POS Chain

1. Open your Keplr Extension and select "Send".                        &#x20;

<figure><img src="/files/RjlbKtEg6M602Emsvewo" alt="" width="355"><figcaption></figcaption></figure>

2. Search ATOM or Cosmos under "Asset", select "IBC Send" then click Cronos POS.                    &#x20;

<figure><img src="/files/wLs0RojqsKJohsn4CNpU" alt="" width="360"><figcaption></figcaption></figure>

3. Enter your Keplr Cronos POS Chain address under “Wallet Address or ICNS”. Keplr will auto-fill your selected account’s address. but you can manually adjust or click the person icon to select from your Address book if needed.  <br>

<figure><img src="/files/vVYgp2gVijr0uo0qxlVv" alt="" width="375"><figcaption></figcaption></figure>

4. Input the desired ATOM desired amount to your Cronos POS Chain address in Keplr (we recommend testing with a small amount for the first try). And Optionally, customize the transaction fee.                                                                               &#x20;

<figure><img src="/files/k1xmSIDWOQdHiL9cOP5I" alt="" width="357"><figcaption></figcaption></figure>

5. Leave the memo field blank (you will need to provide a memo when sending it to an exchange). Then click “Next”.
6. On the transaction confirmation screen, you can view the details of your transaction. Select "Approve" to confirm the transaction.                                       &#x20;

   <figure><img src="/files/9OL28zfinISXfVWL5cXi" alt="" width="361"><figcaption></figcaption></figure>
7. Now wait a bit for the transfer processing (usually takes less than 1 min). Keplr extension will show the progress of the transfer and a success message.<br>

   <figure><img src="/files/emW05OgivaFkvkY43Xvg" alt="" width="375"><figcaption></figcaption></figure>

### Transfer ATOM under Cronos POS Chain to Cosmos Network

1. Open your Keplr Extension and select "Send".                        &#x20;

   <figure><img src="/files/tcjML70egLb1ft9VbQKJ" alt="" width="357"><figcaption></figcaption></figure>
2. Search ATOM on Cronos POS under "Asset", select "IBC Send" and Cosmos Hub.  &#x20;

   <figure><img src="/files/vDs1vm9sxmb34HO59wI5" alt="" width="358"><figcaption></figcaption></figure>
3. Input your Keplr Cosmos address in “Wallet Address or ICNS”. Keplr will auto-fill your selected account’s address, but you can manually adjust or select from your Address book if needed.                       &#x20;

   <figure><img src="/files/eWGkKO4TPNdR43u8xEyy" alt="" width="360"><figcaption></figcaption></figure>
4. Enter the desired ATOM amount you’d like to send to your Cronos POS Chain address in Keplr (we recommend testing with a small amount for the first try) and and optionally customize the transaction fee.                                                                                &#x20;

   <figure><img src="/files/iDVfHte1jYsouyYjt24A" alt="" width="356"><figcaption></figcaption></figure>
5. Memo is also optional here (you will need to provide a memo when sending it to an exchange). Then click “Next”.
6. On the transaction confirmation screen, you can view the details of your transaction. Select "Approve" to confirm the transaction.                                     &#x20;

   <figure><img src="/files/xj5taaiibgf8H7ABdh8Q" alt="" width="359"><figcaption></figcaption></figure>
7. After a minute, navigate back to account page in Keplr, and you should see the amount of ATOM you just transferred back.                                                           &#x20;

   <figure><img src="/files/YluzNpEaQSs4pFc9R3oq" alt="" width="353"><figcaption></figcaption></figure>

&#x20;

### (Optional) Advanced Transfer Mode in Keplr Wallet &#x20;

{% hint style="danger" %}
**Warning** \
Before using Keplr's Developer Mode for IBC Transfers, make sure research its associated risks and manually verify if the IBC channel is active prior to performing the IBC transactions on [Mintscan's Cronos POS Chain relayer page](https://www.mintscan.io/crypto-org/relayers). These active channels are subject to change. Incorrect Channel ID will lead to the failure of this transaction, or your transaction could get stuck in an inactive channel. Cronos team does not take any liability related to the loss of funds due to improper use of the IBC Transfers service.
{% endhint %}

\
The default IBC Send option remains pre-configured. Keplr Wallet's developer transfer mode provides an alternative for situations where direct IBC send isn't available, requiring manual channel verification and addition.  The developer mode can be enabled by accessing Settings and turning on "Developer Mode" under "Advanced." &#x20;

<figure><img src="/files/eDPzEtd85jMmsgERRbSP" alt="" width="356"><figcaption></figcaption></figure>

Navigate back to the wallet account page, scroll down to the bottom and hit "Transfer" for Advanced IBC Transfer.&#x20;

<figure><img src="/files/XsaMbYpQ4fn5k4bo5zIE" alt="" width="353"><figcaption></figcaption></figure>

### Transfer ATOM under Cosmos to Cronos POS Chain

Click on ATOM Cosmos Hub and select "New IBC Transfer Channel" under Destination chain.&#x20;

Choose "Cronos POS" from the Destination Chain dropdown menu, and enter "channel-187" or "187" in the field of Source Channel ID. Again, make sure you've **verified the** [**active channels** on Mintscan](https://www.mintscan.io/cosmos/relayers/channel-187/crypto-org/channel-27), as these channels are subject to change. Then hit “Save”.  &#x20;

<figure><img src="/files/ySZqOsWtpSaNmONtNVxD" alt="" width="357"><figcaption></figcaption></figure>

Then proceed to input the necessary details and finalize the transaction.<br>

### Transfer ATOM under Cronos POS Chain to Cosmos Network

Click ATOM on Cronos POS and select "New IBC Transfer Channel" under Destination chain.&#x20;

Choose "Cosmos Hub" from the Destination Chain dropdown menu, and enter "channel-27" or "27" in the field of Source Channel ID. Hit “Save”.&#x20;

<figure><img src="/files/s0u4DCFvkOoxntrVQ3Sx" alt="" width="328"><figcaption></figcaption></figure>

Then proceed to input the necessary details and finalize the transaction.

For further assistance, refer to the [Keplr FAQ list or reach out to their HelpDesk](https://help.keplr.app/faq) (located at the bottom corner). You can also join [Cronos Discord](https://discord.gg/cronos) for community support and resources.


# Using Ledger Device with Keplr Wallet

Using Keplr with a Ledger Hardware device to conduct operations like staking and claiming rewards.

In the following step-by-step guide, you will learn how to stake your $CROs using the Keplr chrome extension web wallet together with your Ledger device. You may choose to use Ledger Nano S or Nano X. Ledger Nano S is used for demonstration in this tutorial.

## Install the Keplr Browser and Connect your Ledger Device

*The Keplr browser extension may request permission to access your Ledger device. Please make sure to grant this permission in your browser during this process.* \
\&#xNAN;***Note:** the permission is strictly used to allow Keplr browser extension to communicate with the front-end servers, and all sensitive data remains local on your device.*

## Setup Apps on Ledger Nano S

1. Using the Ledger LIVE app to install both Cosmos($ATOM) & Cronos POS Chain($CRO) onto your Ledger Nano S device

<figure><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdcLpgEDVdx-N-Tfji0jDKjbGSQUa8BI4dVeJTuJCq8WcYDne53854_aL01LufTdXHSo3EhuBPmHj8U7A6pqIF5y9kmEkf5lwvq5VxD_fa-h1Clt40n1zv0u9w0ltOE1ouUiHJcXUDxjWRcHYlgja_XpSw?key=ZYYyxJl6MBH_qHpH6Zjglw" alt=""><figcaption></figcaption></figure>

## Setup Ledger Nano S & Keplr Wallet

1. Download and install the Keplr Browser Extension from your browser’s App Store or from the [Keplr's website](https://www.keplr.app/download) or its[ release page](https://github.com/chainapsis/keplr-extension/releases).&#x20;
2. Launch the extension, then select the person icon <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXe4IUXiABSHV0JYjmt8wuLbc_HmPmB2LwRmy78y3La6qufaW4KCeQZcdPdMQ3p1sLriBaSWxmPi7VzZ6Z0ywZFSFQUoIcdHRFo9hK5dI74CQIUAI6pPL_shAQCFbCLeQQNSDBofYctp7FmbBtE6SV93LQ?key=ZYYyxJl6MBH_qHpH6Zjglw" alt="" data-size="line"> in the top right corner. &#x20;

   <figure><img src="/files/KIHfuB6JkyyrFBAm4d4W" alt="" width="349"><figcaption></figcaption></figure>
3. Choose **“Add Wallet”**.  <br>

   <figure><img src="/files/JM5FBLPOgFEYR2eAalPk" alt="" width="354"><figcaption></figcaption></figure>
4. In the following window, select **“Connect Hardware Wallet”.**<br>

   <figure><img src="/files/rRkZMdWVi04z0hlKRSIQ" alt="" width="563"><figcaption></figcaption></figure>
5. "**Connect Ledger**"<br>

   <figure><img src="/files/feDWtTGHoch1l0X9MUCX" alt="" width="563"><figcaption></figcaption></figure>
6. Give your Wallet a friendly username. Also make sure your Ledger Nano S is unlocked and the Cosmos app is open on the Ledger device. The Cosmos app is selected in the Keplr window by default. Click “**Next**”.\
   &#x20;\
   The “**Advanced**'' option allows users to input another HD Derivation Path for multiple accounts from the same mnemonic seed.If you have more than one account associated with the mnemonic and prefer to set up a custom account derivation path, you can set your custom HD wallet derivation path here and increase the numbers in the blank field under \[HD Derivation Path] to create a new address with the same mnemonic seed. Typically, accounts start from 0 then 1 then 2, and so on. \
   \
   Please note that by Keplr’s default setting, the coin type is 118 (Cosmos Hub) with Ledger. If you would like to recover other wallets at a later time, you may need to provide the HD path with 118 or use the Cosmos app.\
   \
   For more information about Keplr’s advanced setting, it is available [here](https://help.keplr.app/faq).\
   \
   In this tutorial, we can skip the advanced option.<br>

   <figure><img src="/files/81nwFj44AAquFO4l95Zr" alt="" width="563"><figcaption></figcaption></figure>
7. At this point your Ledger Nano S should be unlocked and the Cosmos app selected. Therefore click **Next** for both Step 1 & Step 2.<br>

   <figure><img src="/files/VoCpTVxAxYSaeKrd3N3j" alt="" width="563"><figcaption></figcaption></figure>
8. Now select the chains you will manage with the Keplr wallet. Scroll down to select **Cronos POS**. <br>

   <figure><img src="/files/bqatLqXI8jlZOw8cW5vl" alt="" width="563"><figcaption></figcaption></figure>

   <figure><img src="/files/1g6QB7VLSJIon0QtOv03" alt="" width="563"><figcaption></figcaption></figure>
9. If you have selected EVM compatible chains such as Injective and Evmos, quit the Cosmos app on your Ledger Nano S and open the Ethereum app if you have it installed (install the Ethereum app on your Ledger device using the Ledger LIVE app).
10. Click “**Next**” to perform the Step 1 & Step 2 here:<br>

    <figure><img src="/files/Tvqr1xMWDTFnCPxxElUd" alt="" width="563"><figcaption></figcaption></figure>
11. Finally your Ledger Nano S is now installed/setup on your Keplr browser wallet extension.<br>

    <figure><img src="/files/X68OiXcBTmogDUwYdVrH" alt="" width="563"><figcaption></figcaption></figure>
12. Open the Keplr browser extension by clicking on it, the click the person icon <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfO65-wc2YGR58kq8Gec79mvSyQVO0g1dNRsJHAVLFEjiZ1g-Pp3tP7hkTpTTaxKpMtJ7Dj1nUTY2IrpyUUTqk9wdD62LDtO99mqKg8Fr0VbwK8vI7qD3Pt4xqBafy3dGIfAUgTHrcqE3rsNPAVQ-vSxw?key=ZYYyxJl6MBH_qHpH6Zjglw" alt="" data-size="line"> again to see your Ledger Hardware Wallet.<br>

    <figure><img src="/files/omv838tqrjQidZp9nyN7" alt=""><figcaption></figcaption></figure>

## Stake CRO using the Keplr Dashboard

Now we are going to use the Keplr Dashboard to Stake our **$CRO** tokens with a Validator.&#x20;

1. Open your Keplr browser extension, then click on “**Manage Portfolio in Keplr Dashboard**”

   <figure><img src="/files/3pTet9zkRiJEIrKOCRL6" alt="" width="354"><figcaption></figcaption></figure>
2. The Keplr Dashboard opens in a new browser window or tab. The chains listed on the left menu of the Dashboard are chains that have been set as “**Favorites'**'. If you do not see “**Cronos POS**” in the menu then click on “**Chains**”, a list of chains will appear on the main menu in the middle of the screen.<br>

   <figure><img src="/files/UYRA9N4M3fyY8AXn1lQh" alt="" width="563"><figcaption></figcaption></figure>
3. Now select **Cronos POS** from the menu. The details of your $CRO token holdings are now in the main view in the centre of the Dashboard. The “Stake” option is to the right of the screen. Go ahead and click the “**Stake**” button.<br>

   <figure><img src="/files/PVQOdJBqUHFS7KxtKKrd" alt="" width="563"><figcaption></figcaption></figure>
4. A new menu appears with a list of available **Validators**, along with details of: Voting Power, API % returns & Commission. Choose the option that best fits your needs.<br>

   <figure><img src="/files/M9JJGimyTvTgSU8jAYjD" alt="" width="563"><figcaption></figcaption></figure>
5. For this demo we will select the “**Starship**” Validator. Then click the “**Stake**” button at the bottom of the screen.<br>

   <figure><img src="/files/ndci43o62IAsgdThgznp" alt="" width="563"><figcaption></figcaption></figure>
6. In this scenario, we chose one of the top ten Validators. Therefore a dialog box appears encouraging us to help improve network decentralization by selecting another Validation lower down the list. For now, we will stay with our choice by clicking the button labeled “**Continue Staking**”. Then the “**Stake**” button on the next pop-up window.&#x20;
7. Next we need to “**Approve & Sign**“ the transaction by unlocking our Ledger Nano S device and opening the **Cosmos** app.<br>

   <figure><img src="/files/8iuSGbZoKpJeivYfXZD2" alt="" width="375"><figcaption></figcaption></figure>
8. ..…..and that's it! We have successfully Staked our **$CRO** tokens from our Ledger Nano S hardware wallet using the Keplr browser extension wallet & **Kepler Dashboard**.<br>

   <figure><img src="/files/xk2BCaRElxX1bU6WVCw9" alt="" width="563"><figcaption></figcaption></figure>

##

## Claim your Staking Rewards via the Keplr Dashboard

*Please note: claiming always incurs a transaction fee.*

1. It is ideal that you claim the staking rewards regularly. One option is to redelegate these rewards for a compound effect. To claim your **$CRO** staking rewards, open the Keplr Browser Extension and click “**Manage Portfolio in Keplr Dashboard**''. Now plug in and unlock your Ledger Nano S device, then open the **COSMOS** app.\
   Make sure you have enough $CRO to cover the transaction fee. Now click the “**Claim**” button.<br>

   <figure><img src="/files/xareUuRSPN0xEESKXhyd" alt="" width="563"><figcaption></figcaption></figure>
2. A new window pop-up displays the details of the transaction with an “**Approve**” button at the bottom. Click “**Approve**”. The transaction details will be displayed on your Ledger Nano S device. Go ahead and “**Sign**” the transaction.<br>

   <figure><img src="/files/XF9bCSTbsCD9fpI5WyNt" alt="" width="285"><figcaption></figcaption></figure>

You are all set! We hope this guide helps you successfully stake and claim your rewards. Now you should be familiar with all the tools and menus to manage your staking with Validators as well as claiming your rewards.\
\
For further assistance, refer to the [Keplr FAQ list or reach out to their HelpDesk](https://help.keplr.app/faq) (located at the bottom corner). You can also join [Cronos Discord](https://discord.gg/cronos) for community support and resources.


# Mainnet Address Generation

This document contains the information of account address for Cronos POS Chain mainnet.

## Address prefix

Account address for mainnet starts with prefix `cro`. For example: `cro1y8ua5laceufhqtwzyhahq0qk7rm87hhugtsfey`.

## Hierarchical Deterministic Wallet (HD Wallet) Derivation Path

Cronos POS Chain has [registered](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) coin type `394` as defined in [BIP44 standard](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki).

Coin Type: 394\
Derivation Path: `44'/394'/0'/0/{index}` where index starts from 0.

i.e. the first address is derived at path `44'/394'/0'/0/0` and the second one at path `44'/394'/0'/0/1`.

## How to generate an address

{% hint style="warning" %}
**MAKE SURE YOU BACKUP YOUR MNEMONIC WORDS**\
Before using your generated mainnet addresses to receive funds, ensure that you have securely backed up your address's mnemonic words. It’s crucial to verify that these words are correct and can restore your wallet address in the future.

Please note that you are the sole owner of your wallet's mnemonic words. The Cronos POS Chain team cannot restore your wallet or recover your funds if the mnemonic words are lost.
{% endhint %}

{% hint style="warning" %}
**GENERATE ADDRESS ONLY IN A SECURE ENVIRONMENT**\
We recommend generating an address only on a trusted and secure computer. For enhanced security, consider running on an air-gapped (offline) machine.
{% endhint %}

{% hint style="warning" %}
**ALWAYS VERIFY YOUR MNEMONIC WORDS AND ADDRESS**\
Ensure you have backed up your mnemonic words correctly by restoring your wallet with them and verifying that the derived address is the same.

For more details on verifying your mnemonic words and addresses, please check [Mainnet Address Verification](/for-users/wallets/mainnet-address-verification)&#x20;
{% endhint %}

There are four ways to generate the mainnet address by using:

* [Release Binary (CLI)](#a-release-binary-cli);
* [Ledger Wallet](#b-ledger-wallet);
* [Programmatically via Cronos POS Chain JavaScript Library](#c-programmatically);

## A. Release Binary (CLI)

Supported OS: Linux, Mac OS, and Windows

#### Step 1. Get the Cronos POS Chain binary

Download the Cronos POS Chain Binary for Mainnet from the [release page](https://github.com/crypto-org-chain/chain-main/releases) and extract the binary. Here we used Linux as an example:

```bash
 $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.9/chain-main_3.3.9_Linux_x86_64.tar.gz
 $ tar -zxvf chain-main_3.3.9_Linux_x86_64.tar.gz
```

If you are downloading the binary for other operating systems, make sure you are downloading `v3.3.9` or newer versions that are targeting for mainnet.

Before moving to the next step, kindly check your `chain-maind` version by

```bash
$ ./chain-maind version
3.3.9
```

#### Step 2. Create a new key and address

Run the following command to create a new address. For example, you can create a key with the name "Default" by:

```bash
$ ./chain-maind keys add Default
```

You can find the generated address after running the command. **Please make sure that you have safely backed up the mnemonic words that appear on the last line.**

```bash
- name: Default
  type: local
  address: cro1qxm5lwml3v36h4pygwnn5nfzesupg7cx8nyfkt
  pubkey: cropub1addwnpepqg95fk5grlyucrnvdu8v3h4qnhgcm03ust4yysgtvdjqnh2ytmg6syjkav6
  mnemonic: ""
  threshold: 0
  pubkeys: []


**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.

scare blur bless unfair chat gadget leaf reveal job depend daughter unveil fatal cliff bus beach betray over later rent planet alert remove cactus
```

## B. Ledger Wallet

* Supported OS: Linux, Mac OS and Windows
* Pre-requisite: Ledger Hardware Wallet

### Step 1. Install Ledger Application

#### Step 1-1. Plug in your Ledger device to your computer. If you are using Ledger Nano X, please connect to your computer using the USB-C cable.

#### Step 1-2. Click "Ledger Icon" on the left navigation menu. Confirm to "Allow Ledger Manager" on your Ledger device.

<div align="center"><figure><img src="/files/gj82Il3q1jPKRSScn7UY" alt="" width="563"><figcaption></figcaption></figure></div>

#### Step 1-3. Search for "Cronos POS Chain" and install the application to your Ledger.

<div align="center"><figure><img src="/files/8aWHkPbEhK6FDIKFAabl" alt="" width="563"><figcaption></figcaption></figure></div>

#### Step 1-4. Confirm the installation

You can confirm the installation by checking if the Cronos POS Chain App shows up in the main menu of your Ledger device:

<div align="center"><figure><img src="/files/vUENdjsuIwuk9Lme0hDr" alt="" width="375"><figcaption></figcaption></figure></div>

***

## B-i. Ledger Wallet via Release Binary (CLI)

#### Step 1. Get the Cronos POS Chain binary

Download the Cronos POS Chain Binary for Mainnet from [release page](https://github.com/crypto-org-chain/chain-main/releases) and extract the binary. Here we used Linux as an example:

```bash
$ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.9/chain-main_3.3.9_Linux_x86_64.tar.gz
$ tar -zxvf chain-main_3.3.9_Linux_x86_64.tar.gz
```

If you are downloading the binary for other operating systems, make sure you are downloading `v3.3.9`, which is the version targeting for mainnet.

#### Step 2. Open the Cronos POS Chain application on your Ledger device

#### Step 3. Create a new key and address

Run the following command to create a new address. For example, you can create a key with the name "Default" by:

```bash
$ ./chain-maind keys add Ledger --ledger
```

You will be prompted with the address on your Ledger device screen. Read it carefully and write it down. Afterward, confirm the address on your Ledger device.

{% hint style="info" %}
Cannot Connect To Your Ledger Device?&#x20;

If you encounter a connection error when creating a wallet, you can try to unplug and plug your Ledger device into your computer again. Please make sure your Ledger device is unlocked and you have opened the "Cronos POS Chain" application on your Ledger.
{% endhint %}

#### Step 4. Verify the address displayed on the terminal, and make sure it matches the address you saw on Ledger device

```bash
- name: Ledger
  type: ledger
  address: cro1tzhdkuc328cgh2hycyfddtdpqfwwu42yq3qgkr
  pubkey: cropub1addwnpepqw802qz5mvdcchlekqnypgj5vw3hef75yjw6gw6wda823aa0wrdwc7pl4n9
  mnemonic: ""
  threshold: 0
  pubkeys: []
```


# Mainnet Address Verification

After you have generated a mainnet address, you should first verify that you have backed up the correct mnemonic words and can restore to the same address before using it to receive funds.

{% hint style="warning" %}
**VERIFY ONLY IN SECURE ENVIRONMENT**&#x20;

We recommend verifying your mnemonic words and address only on a trusted, safe and offline computer and always verify the mnemonic words before using it.
{% endhint %}

## Release Binary (CLI)

Supported OS: Linux, Mac OS and Windows

#### Step 1. Get the Cronos POS Chain  binary

Download the Cronos POS Chain Binary for Mainnet from [release page](https://github.com/crypto-org-chain/chain-main/releases/tag/v1.0.0) and extract the binary. Here we used Linux as an example:

```bash
$ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v1.0.0/chain-main_1.0.0_Linux_x86_64.tar.gz
$ tar -zxvf chain-main_1.0.0_Linux_x86_64.tar.gz
```

If you are downloading the binary for other operating systems, make sure you are downloading `v1.0.0` or newer versions available for mainnet.

#### Step 2. Recover a new key and derive the address

Run the following to restore from your saved mnemonic words. For example, you can restore a key with the name "Default" by:

```bash
$ ./chain-maind keys add Default --recover
> Enter your bip39 mnemonic
elder pony lottery motion universe comfort table matrix fly close boy rival verify virus defy permit pottery summer tilt seek trip child defense success
```

You can find the generated address from the mnemonics words after running the command. You can verify whether this address matches with the previous one you have generated.

```bash
- name: Default
  type: local
  address: cro1qxm5lwml3v36h4pygwnn5nfzesupg7cx8nyfkt
  pubkey: cropub1addwnpepqg95fk5grlyucrnvdu8v3h4qnhgcm03ust4yysgtvdjqnh2ytmg6syjkav6
  mnemonic: ""
  threshold: 0
  pubkeys: []
```


# Multisig Account

A Multisig account is a Cronos POS Chain account with a key that requires multiple signers in order to sign transactions. This is a useful feature to increase security as it requires the consent of more than 1 party in order to make a transaction.

This guide assumes that you have some CRO to make a transfer as well as a valid RCPC node with the `--node` argument against which you can broadcast transactions.

#### Step 1. Generate a Multisig key

First, make sure you have the public keys that will be used to create the multisig key. If not then make a public key through the command

```bash
$ ./chain-maind keys add test3
```

Once you have all the public keys, create the multisig account.

```bash
$ ./chain-maind keys add --multisig=test1,test2,test3[...] --multisig-threshold=2 multi
```

* With the `--multisig` flag, pass the names of the public keys to create a new multisig account called for example "multi".
* `--multisig-threshold` denotes the minimum number of private keys needed to sign a transaction, for example "2".
* By default the order does not matter in which you pass the existing keys to create a multisig account.

Check that this multisig account `multi` is succesfully created:

```bash
$ ./chain-maind keys show multi

- name: multi
  type: multi
  address: cro1klzn5esvee42swkj6y9sharx43gnsu9epy75jj
  pubkey: '{"@type":"/cosmos.crypto.multisig.LegacyAminoPubKey","threshold":2,"public_keys":[
    {"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A+MWcbaU4KISL5sCmxMIiiVnMDfyAR9j5i/AZ3jeByo0"},
    {"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A5EYG0FaECx2ONp0mSIvn66cHmYwe40VPSCxHEm9zDi0"},
    {"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AzCHURcUtzNhozSkNNkrj5sSyJVjjNoVHHczvcax6eb0"}`]}'
  mnemonic: ""
```

Send some `cro` to this multisig account:

```bash
$ ./chain-maind tx bank send \
      cro19quuu2qxsfh0ryxu9dhufekepq6xdl7u5ncn34 \
      cro1klzn5esvee42swkj6y9sharx43gnsu9epy75jj \
      5cro \
      --chain-id=crypto-org-chain-mainnet-1 \
      --fees=5000basecro
```

#### Step 2. Create a multisig transaction

If we want to send for example 1 cro from the multisig account to another account, we first setup the unsigned transaction and store the output in `unsignedTx.json`

```bash
$ ./chain-maind tx bank send \
    cro1klzn5esvee42swkj6y9sharx43gnsu9epy75jj \
    cro1mcxedxf985g6rj54rxqluuzdssc0r8p0hydetv \
    1cro \
    --fees=5000basecro \
    --chain-id=crypto-org-chain-mainnet-1 \
    --generate-only > unsignedTx.json
```

The `unsignedTx.json` will now contain the unsigned version of the transaction, as can be seen by the empty list in signatures.

```json
{
  "body": {
    "messages": [
      {
        "@type": "/cosmos.bank.v1beta1.MsgSend",
        "from_address": "cro1klzn5esvee42swkj6y9sharx43gnsu9epy75jj",
        "to_address": "cro1mcxedxf985g6rj54rxqluuzdssc0r8p0hydetv",
        "amount": [
          {
            "denom": "basecro",
            "amount": "500000000"
          }
        ]
      }
    ],
    "memo": "",
    "timeout_height": "0",
    "extension_options": [],
    "non_critical_extension_options": []
  },
  "auth_info": {
    "signer_infos": [],
    "fee": {
      "amount": [
        {
          "denom": "basecro",
          "amount": "5000"
        }
      ],
      "gas_limit": "200000",
      "payer": "",
      "granter": ""
    }
  },
  "signatures": []
}
```

#### Step 3. Sign the transaction individually

Now we sign with at least 2 keys, for example `test1` and `test2` individually.

```bash
./chain-maind tx sign unsignedTx.json \
    --multisig=cro1klzn5esvee42swkj6y9sharx43gnsu9epy75jj \
    --from=test1 \
    --output-document=test1sig.json \
    --chain-id=crypto-org-chain-mainnet-1
```

```bash
./chain-maind tx sign unsignedTx.json \
    --multisig=cro1klzn5esvee42swkj6y9sharx43gnsu9epy75jj \
    --from=test2 \
    --output-document=test2sig.json \
    --chain-id=crypto-org-chain-mainnet-1
```

#### Step 4. Create the multisignature

With the signed transactions from step 3, we can sign a multisignature.

```bash
./chain-maind tx multisign \
    unsignedTx.json \
    multitest \
    test1sig.json \
    test2sig.json \
    --chain-id=crypto-org-chain-mainnet-1 > signedTx.json
```

Now we can see the public keys that have signed a valid new signature as indicated in the `signatures` field.

```json
{
  "body": {
    ...
  "auth_info": {
    "signer_infos": [
      {
        "public_key": {
          "@type": "/cosmos.crypto.multisig.LegacyAminoPubKey",
          "threshold": 2,
          "public_keys": [
            {
              "@type": "/cosmos.crypto.secp256k1.PubKey",
              "key": "A+MWcbaU4KISL5sCmxMIiiVnMDfyAR9j5i/AZ3jeByo4"
            },
            {
              "@type": "/cosmos.crypto.secp256k1.PubKey",
              "key": "A5EYG0FaECx2ONp0mSIvn66cHmYwe40VPSCxHEm9zDi5"
            }
          ]
        },
        "mode_info": {
          "multi": {
            "bitarray": {
              "extra_bits_stored": 3,
              "elems": "YA=="
            },
            "mode_infos": [
              {
                "single": {
                  "mode": "SIGN_MODE_LEGACY_AMINO_JSON"
                }
              },
              {
                "single": {
                  "mode": "SIGN_MODE_LEGACY_AMINO_JSON"
                }
              }
            ]
          }
        },
        "sequence": "2"
      }
    ],
    ...
  "signatures": [
    "CkD7Ive8bavDoKbPFJ+ZxlLcGp43JIZnUJ/iRh9mXX9S7QdeqR/JMsfke9MI+gEJJomcHCRu+TO0S+eaisraQh75CkCf4/B8GPukMeQU36E9BIgdHuOBoMqAbQNRzof7MkOWRVcK113OlVL5QWzdAZb4+WHjtssZZDTJSrHn51Umcj"
  ]
}
```

#### Step 5. Broadcast the transaction

The final step is to broadcast this multisigned transaction.

```bash
./chain-maind tx broadcast signedTx.json --chain-id=crypto-org-chain-mainnet-1

code: 0
codespace: ""
data: ""
gas_used: "0"
gas_wanted: "0"
height: "0"
info: ""
logs: []
raw_log: '[]'
timestamp: ""
tx: null
txhash: 114B582155DAC1033293A00FE8B2142EEDE4E560AE756529AFB1066E25033627
```

Nice, that is it, now you should be able to create multisigned transactions. Verify that you received this transaction succesfully with

```bash
./chain-maind query bank balances cro1mcxedxf985g6rj54rxqluuzdssc0r8p0hydetv
```


# Delegation Guide

This guide is designed to provide you with clear instructions for managing your CRO stakes across different platforms, including Crypto.com Onchain Wallet.

## [Crypto.com Onchain Wallet](https://crypto.com/eea/defi-wallet)

Crypto.com Onchain Wallet provides intuitive user interface through Earn simplifies the process for staking, claiming rewards, claim to restake, unstaking, and redelegation. The Onchain Wallet App offers the ability to select from a list of approved validators for both staking and changing your delegation from one validator to another.

### Delegate CRO on Crypto.com Onchain Wallet&#x20;

1. Tap \[Earn] on the bottom navigation of your Onchain Wallet app
2. Tap \[Start Earning] or \[Earn More] to see the list of tokens supported for earning
3. Select CRO and enter the stake amount to see the projected annual earning based on the latest estimated annual reward %
4. Tap on the “To Validator” dropdown to choose another validator from our whitelisted validator list (we recommend not to stake to a validator with an existing voting power of >15%)
5. Review and confirm the staking by tapping \[Confirm Stake]
6. Authorize the staking request with your passcode (and 2FA if enabled)
7. Wait for the on-chain confirmation of your staking request
8. Once confirmed, you will see the refreshed CRO staking assets on your Earn screen

{% hint style="info" %}
Please note that every time when you increase your stake with the same validator, your reward balance will be automatically claimed into your wallet and your CRO reward balance will start to accrue every block after the staking request is confirmed on-chain.
{% endhint %}

### Undelegrate CRO on Crypto.com Onchain Wallet&#x20;

You can unstake your CRO delegation anytime by following the below steps.

1. Tap \[Earn] on the bottom navigation of your Onchain Wallet app
2. Tap on your CRO assets to navigate to Cronos POS Chain Staking details screen
3. Tap \[...] > \[Unstake] for the corresponding Validator’s delegation
4. Enter the unstake amount
5. Review and confirm the unstake request by tapping \[Confirm Unstake]
6. Authorize the unstake request with your passcode (and 2FA if enabled)
7. Wait for the on-chain confirmation of your unstake request
8. Once confirmed, you will see the refreshed CRO staking assets on your Earn screen and your unstaked balance will be moved into the “Unbonding Balance” and undergo the 28-day unbonding period
9. You can view your unbonding countdown via \[...] > \[View Unbonding Details] for when your unstaked amount is available in your CRO wallet for usage
10. After completing the 28-day unbonding period, the CRO balance will be added back into your CRO wallet automatically.

Once you unstake your CRO, all unreceived rewards will be deposited into your wallet automatically.&#x20;

### &#x20;Redelegate CRO on Crypto.com Onchain Wallet&#x20;

You can redelegate your existing delegations - change stake from one validator to another without undergoing the 28-day unbonding period

1. Tap \[Earn] on the bottom navigation of your Cronos POS Chain Staking details screen
2. Tap \[...] > \[Switch Validator] CTA
3. Enter the amount that you want to switch from the existing validator to another validator
4. Tap on the “To Validator” dropdown to choose another validator from our whitelisted validator list (we recommend not to stake to a validator with an existing voting power of >15%)
5. Review and confirm the switch validator (redelegate) request by tapping \[Confirm Switch Validator] Please note that you cannot redelegate any CROs on the receiving validator for 28 days afterward as enforced by the Cronos POS Chain to prevent “redelegation hopping” within a short period of time
6. Authorize the switch validator (redelegate) request with your passcode (and 2FA if enabled)
7. Wait for the on-chain confirmation of your request
8. Once confirmed, you will see the staking delegation change to the new validator

{% hint style="info" %}
Please note that every time when you redelegate your CRO from the existing validator to another validator, your reward balance with the existing validator will be automatically claimed into your wallet.
{% endhint %}

### &#x20;Restrictions on Re-Delegation

When managing your CRO delegation, be aware of the following restrictions:

{% hint style="warning" %}

* Re-Delegation Limit: There is a limit on the number of re-staking/undelegation operations you can perform in a row, which is typically capped at 7 consecutive actions.
* Cooling Period: Undelegating your CRO will initiate a cooling period during which your tokens will not be accessible or redelegable. This is a security measure to prevent rapid switching and to stabilize the network.
* Your unstaked CRO will be available to you after a 28-day unbonding period, as enforced by the Cronos POS Chain. This is to protect against a Validator attacking the Cronos POS Chain and then immediately withdrawing the stake amount.
  {% endhint %}


# Key Principles for Wallet Security

Securing your wallet is crucial to safeguard your digital assets. This guide provides you with the necessary knowledge and tools to protect your funds from potential threats and scams.

## The #1 Key Principle for Wallet Security

**Keep Your Recovery Phrase & Private Keys Safe and Private:** Your Recovery Phrase & Private Keys are the most important pieces of data stored and managed by your crypto wallet. Store these securely and never share them with anyone.&#x20;

### Crypto Wallets

A crypto wallet allows you to store and manage your digital assets securely. At its core, it manages and secures the **Private Key** - an alphanumeric code that gives you ownership of your crypto assets. **The Private Key should be kept private.** The corresponding Public Key derived from the Private Key, is used to receive cryptocurrencies, NFT’s, and other digital assets.

The Cronos POS chain supports a mix of both Hot & Cold wallets. The most common wallets associated with Cronos POS are:

* [Crypto.com Onchain Wallet](https://crypto.com/defi-wallet)
* [Cronos POS Chain Wallet (chain-maind)](https://docs.cronos-pos.org/for-users/wallets/cli)
* [Kepler Wallet](https://www.keplr.app/)
* [Ledger Hardware Wallet](https://www.ledger.com/)
* [BC Vault Hardware Wallet](https://bc-vault.com/)

See a full list of Conos POS supported wallets [here](https://docs.cronos-pos.org/for-users/wallets).

## Types of Wallets

### Hot Wallets vs Cold Wallets

**Hot Wallets:** Internet-connected wallets are typically software-based, available as mobile or desktop applications. Hot Wallets store and manage your Private Key. They are convenient but are susceptible to cyber threats.&#x20;

Cronos POS Hot Wallets include:&#x20;

* [Crypto.com Onchain Wallet](https://crypto.com/defi-wallet)
* [Keplr Wallet](https://www.keplr.app/)

**Security Tips for Hot Wallets**

* Keep your software up-to-date: Regularly update your operating system, wallet software updates, etc
* Use antivirus software: Install reputable antivirus software to protect against malware.
* Use strong passwords: Create complex passwords and use a password manager.
* Enable two-factor authentication (2FA): This adds an extra layer of security by requiring a second form of verification.

**Cold Wallets:** Cold wallets store your private key offline, offering greater security as they are not exposed to the internet and online threats. These can be physical devices like hardware wallets or even paper wallets. However, they can be lost, stolen, or damaged.&#x20;

Cronos POS Hardware Wallets include:

* [Ledger](https://www.ledger.com/)
* [Trezor](https://trezor.io/)
* [BC Vault](https://bc-vault.com/)

**Security Tips for Cold Wallets**

* Buy from trusted sources: Purchase hardware wallets directly from manufacturers or trusted retailers to avoid tampered devices.
* Keep firmware up-to-date: Regularly update your wallet’s firmware for improved security and functionality.
* Protect the recovery phrase: Never share the recovery phrase, as it grants control over your cryptocurrencies. Store it securely offline.
* Set a strong PIN: Use a strong PIN to safeguard your device from unauthorized access. Avoid easily guessable PINs.
* Verify addresses: Double-check the recipient’s address to avoid malware altering the copied addresses.
* Confirm transactions on the device: Always verify transaction details on the hardware wallet’s screen before confirming.
* Secure your wallet physically: Store your hardware wallet in a safe place when not in use, treat it like a family heirloom.
* Consider using a passphrase: Some wallets offer an additional passphrase for enhanced security. Use with caution as forgetting it can lead to permanent loss of access.
* Use trusted computers: Connect your hardware wallet only to computers with good security measures. Avoid convenience-driven connections.
* Understand the risks: Be aware of risks such as physical theft, phishing attacks, inadequate backups, forgotten PINs or recovery phrases, device damage, firmware vulnerabilities, and address verification. Take precautions to mitigate these risks.

## Self-Custody vs. Hosted Wallets

**Hosted Wallets:** These wallets are usually provided and managed by centralized crypto exchanges (CEX). The exchange holds the private key, meaning they technically own & control the assets. For example the [Crypto.com App](https://crypto.com/app).

**Self-Custody Wallets:** In self-custody wallets you hold/own the private key, giving you full control over the digital assets. [Crypto.com Onchain Wallet](https://crypto.com/defi-wallet) is an example of a self-custody solution.

## Critical Data to Secure

**Seed Phrases & Private Keys:** A seed phrase is a series of words generated by your wallet that can be used to generate & recover your Private Key(s). Both of these pieces of data can be accessed from your wallet and **protecting these two pieces of data is your No.1 priority.** Never share these, keep them private and store them securely.

**Security Tools and Techniques**

1. **Password Managers:** Use them to create and store strong, unique passwords.
2. **Two-Factor Authentication (2FA):** Adds an extra layer of security by requiring a second form of verification.
3. **A Physical Security Key (2FA):** Consider using a hardware security key as part of your 2FA solution.
4. **Virtual Private Network (VPN):** Use a VPN to encrypt your internet connection, especially on public WiFi

## Avoiding Common Scams

Understanding and recognising common scams is crucial for protecting your crypto assets. Here are some prevalent scams and tips on how to avoid them:

### **1. Dusting Attack**

Dusting attack involves sending a small amount of cryptocurrency, referred to as dust, to multiple crypto wallet addresses. These transactions are often sent at similar intervals or in quick succession and may involve tiny fractions of a cryptocurrency unit. The attack aims to connect the receiver's addresses with other addresses, potentially revealing their real-world identity and their links to centralised exchanges or other platforms.

**How to Avoid Dusting Attacks**

* Use separate “Burner Wallets” to deposit crypto dust you receive.
* Use a hierarchical-deterministic (HD) wallet. This type of wallet creates a new wallet address for each transaction making it more difficult to track.
* Ignore unknown or unanticipated tokens, if you received some unknown or unanticipated tokens in your wallet, it’s best to ignore and not interact with the tokens or linked addresses.&#x20;
* Only interact with AirDrops from official and legitimate projects. Avoid Airdrops from unfamiliar sources.&#x20;
* Hide small balances and non-listed tokens to help shield yourself. Most wallets have features to “Hide small balances” and “Hide non-listed tokens” utilise them to reduce clutter and potential risk.
* Refrain from sharing any personal details alongside your wallet address.&#x20;

### **2. Phishing Scams**

Phishing is a tactic that targets the user’s identity, aiming to obtain private keys, seed phrases, and/or login credentials. Scammers use fraudulent websites, emails, or texts to deceive individuals into revealing their private data.

Phishing websites mimic the look and feel of a legitimate cryptocurrency exchange or wallet, leading users to believe they are interacting with a trustworthy platform.

Phishing emails or texts trick users into installing malware or downloading malicious software that can compromise their computer or device. These malicious software can lead to the theft of private keys, seed phrases, or other sensitive information.

**How to Avoid Phishing Scams**

* Verify the authenticity of emails and websites. Check the sender's email address and the website's URL for any discrepancy like spelling errors, typos, and misspellings in the domain name.
* Enable **two-factor authentication (2FA)** on your cryptocurrency wallets and exchanges.
* Avoid clicking on links or downloading attachments from unknown senders, especially if they request sensitive information or ask you to update your account details.
* Keep your operating system, wallet software and antivirus updated.
* Use a Password Manager to store your cryptocurrency wallet passwords and pass-phrases securely.
* Use a hardware wallet to store and manage your private key offline where it's less susceptible to phishing attacks.
* Regularly backup your seed phrase and store it in a secure location. Safety Deposit Boxes are great storage options.
* Be cautious of offers that seem too good to be true. Adverts offering high-return investments or promising large sums of cryptocurrency could be scams designed to lure you into revealing your sensitive information.

### **3. Wallet Drainer, Signature Phishing, Ice Phishing and Address Poisoning Scams**

Scammers use various tactics to drain wallets and steal funds. Wallet drainer, signature phishing, and ice phishing scams are just a few common methods.

**Wallet Drainer Scams:** involve tricking users into signing a fraudulent transaction or approving a malicious contract, which grants the scammer access to their wallet and allows them to drain their funds. These attacks often occur through social engineering tactics such as:

* Phishing emails or messages.&#x20;
* Fake websites mimicking legitimate services.&#x20;
* Unsolicited offers or promotions.
* Fake airdrops or giveaways.
* Malicious browser extensions or software.

**Signature Phishing Scams:** Signature phishing scams are a subtype of wallet drainer attacks that focus on obtaining a victim's signature approval for a malicious transaction. Scammers may use fake pop-ups, notifications, or websites to trick users into approving a transaction that grants the attacker access to their wallet.

**Ice Phishing Scams:** Ice phishing scams (also known as token approval scams) are a specific type of attack that relies on a user's willingness to approve a token transaction. The scammer creates a phishing website that mimics a legitimate crypto service and tricks the user into approving a token transaction, granting the attacker access to their wallet.

**How to Avoid These Attacks**

* Be cautious when connecting your wallet to external websites or services.
* Verify the authenticity of websites and services before providing any information or connecting your wallet.
* Use two-factor authentication (2FA) whenever possible to add an extra layer of security.
* Monitor your transactions and wallet activity regularly to detect any suspicious activity.
* Avoid clicking on unknown links or downloading attachments from unknown sources.
* Reject transactions that you do not recognise or understand. Verify transactions are from legitimate dApps.
* Keep your software and firmware up to date to ensure you have the latest security patches.
* Use a reputable antivirus and anti-malware software to protect your device from infections.
* Educate yourself about common scams and phishing tactics to stay vigilant.

### **4. Address Poisoning**

Also known as address spoofing, this deceptive tactic where scammers send small amounts of cryptocurrency, NFTs, or worthless tokens from a wallet that closely mimics the recipient's or a frequently used partner's address. This makes its way to transaction history. If the victim is in the habit of copying and reusing addresses from recent transactions when sending crypto, they can end up sending their funds to the scammer’s wallet.\
It is common for crypto users to only glance at the first and last several characters of the address copied from one’s smartphone notes or transaction history, especially if this is a wallet with which one has previously interacted.

**How to Avoid Address Poisoning Scams**

* Double-check the address when sending crypto. Always take the time to verify the recipient’s entire address, not just the beginning or end.
* Save frequently used addresses. Utilise wallet features to save trusted addresses and assign nicknames and QR codes to them to avoid the need for frequent copying and pasting.
* Use name services like Ethereum Name Service (ENS), which provide shorter, more recognisable addresses that are difficult for scammers to replicate.
* Conduct test transactions when transferring significant amounts of digital assets. Send a small amount first to make sure that the recipient address is correct.
* Be vigilant with copying and pasting. Malware can alter clipboard content to replace your copied address with one owned by a scammer. Always recheck the address after pasting and consider typing out some characters manually.

By following a few basic guidelines, you'll be well-equipped to secure your Cronos wallet and safeguard your digital assets. Remember, your security is your responsibility - stay vigilant and stay safe!


# Token Migration Web Tool

Token migration is the process of migrating your ERC20 CRO to Mainnet CRO.

This tutorial will guide you through the steps to migrate your ERC20 CRO to Mainnet CRO using the token migration web tool. This method is suitable for non-custodial wallet users.

{% hint style="info" %}
**Other Migration Methods**&#x20;

The Migration Web Tool targets advanced crypto users. It requires more complicated steps. For most users, we recommend using other migration methods such as [Crypto.com App](https://crypto.com/en/wallet), [Crypto.com Onchain wallet](https://crypto.com/en/defi/wallet/), or through our featured exchanges.
{% endhint %}

## Preparation

To use the web tool, you must first fulfill the following requirements

* [MetaMask Wallet](https://metamask.io/) (Right now we only support connecting with MetaMask browser wallet);
* ERC20 CRO on your MetaMask Account;
* A small amount of Ethereum on your MetaMask Account (For paying Ethereum transaction fee).

## How to migrate

{% hint style="warning" %}
You Will Need to Burn Your ERC20 CRO To use the migration web tool to migrate your CRO, you will have to first burn the ERC20 CRO and then submit the migration request. There will be a period of time before the CRO appears on your mainnet address. You will not be able to access your funds during this migration period.
{% endhint %}

### Table of Content

1. [Request a new token migration](#request-a-new-token-migration)
   * Suitable for users who want to initiate a new token migration request
2. [Re-submit migration request](#re-submit-migration-request)
   * Suitable for users who have failed to submit previous token migration but have already burnt the ERC20 CRO

## Request A New Token Migration

### 1. Open Web Tool

Go to [Token Migration](https://crypto.org/migration) website and click "Open Web Tool".

<figure><img src="/files/HzyIERWkbzjnjmF7gLxo" alt="" width="563"><figcaption></figcaption></figure>

### 2. Connect to MetaMask Wallet

#### 2.1 Click "Connect Now"

<figure><img src="/files/iO6VAVrcOF9dKyKq2iXI" alt="" width="563"><figcaption></figcaption></figure>

#### 2.2 Choose "MetaMask" on the wallet list

<figure><img src="/files/JLmh81CcBf2z75VKKaUY" alt="" width="563"><figcaption></figcaption></figure>

### 3. Fill in Your Mainnet Address

{% hint style="info" %}
**How to Generate Mainnet Address**&#x20;

To generate a mainnet address, please refer to the [mainnet address generation guide](/for-users/wallets/mainnet-address-generation)
{% endhint %}

Fill in the mainnet address you want to receive the migrated CRO. If the address is valid, you will see a green tick next to the address. After you have completed, click "Continue".

<figure><img src="/files/b34WqdzBE9uQrHTV5AQi" alt="" width="563"><figcaption></figcaption></figure>

### 4. Fill in The Migration Amount

Fill in the amount of CRO you want to migrate to Mainnet and click "Continue".

<figure><img src="/files/GEjV87axXsHPfdjIc5o5" alt="" width="563"><figcaption></figcaption></figure>

### 5. Review Your Migration

Review and confirm the details of your token migration request. Make sure all the information is correct.

Afterwards, read the "CRO Token Migration Terms". If you understand and agree to the terms, you can tick the checkbox and click "Sign Agreement".

<figure><img src="/files/ZjVUHvRCW4m3eEQ5UC1r" alt="" width="563"><figcaption></figcaption></figure>

### 6. Sign The Agreement

A MetaMask popup will appear and ask for your signature. By signing this message with your MetaMask account, you acknowledge that you agree to the "CRO Token Migration Terms".

<figure><img src="/files/vtdUWZaddE9i0jufW5RQ" alt="" width="563"><figcaption></figcaption></figure>

### 7. Sign The Burn Transaction

A MetaMask popup will appear and ask for your confirmation to send your ERC20 CRO to the [burn address](https://etherscan.io/address/0x000000000000000000000000000000000000dEaD) (0x000000000000000000000000000000000000dEaD). Please make sure all the information on this popup is correct before clicking "Confirm". In addition, you may adjust the gas parameters of your choice.

<figure><img src="/files/XABCJLo0o6n9yuWq0yW7" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
**Could Not See MetaMask Popup?**&#x20;

If you cannot see the MetaMask popups, you can check the MetaMask browser icon in your top right-hand corner. You should see a pending action on the icon and you can click the icon to continue the operations on MetaMask.
{% endhint %}

<figure><img src="/files/5QdK3mo9o339FdXUBMwM" alt="" width="510"><figcaption></figcaption></figure>

### 8. Successful Submission

If your migration request is submitted, you will see the following page.

<figure><img src="/files/hqsP9oWaphqyjwHZPBDV" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
Failed To Submit Your Migration Request? You can always re-submit your token migration request if your burn transaction has already been confirmed and succeeded on the chain. For details, please refer to the [Re-submit Migration Request guide](#re-submit-migration-request)
{% endhint %}

### 9. Check Migration Record Status

To check for the latest status of your migration requests, click the "Migration Records" on the navigation bar or go to the [link](https://crypto.org/migration/tx).

You will see a list of migration requests associated with your current account and the status of it. If you are uncertain of the status, you can put your mouse over the status for an explanation.

<figure><img src="/files/TebHPp19FpeLds43RfJy" alt="" width="563"><figcaption></figcaption></figure>

## Re-submit Migration Request

If you encountered an error during the registration, but have already burnt your CRO. You can use the [Migration Re-submission Tool](https://crypto.org/migration/resubmit) to re-submit your migration request.

### Pre-requisite

To use the re-submission tool, make sure:

* Your ERC20 CRO burn request is confirmed and succeeded on the Ethereum network
* The burn ERC20 CRO belongs to your current MetaMask account

### 1. Make Sure Your Migration Request Is Not Submitted

To do so, you can check the record on the [Migration Records Status Page](https://crypto.org/migration/tx). If you do not see your migration request appear on the list, it means your request has not been submitted.

### 2. Open Re-submission Tool

Go to [Token Migration Re-submission Tool](https://crypto.org/migration/resubmit).

Alternatively, you can go to [Token Migration website](https://crypto.org/migration) and click "Open Web Tool", you will see a text saying "Proceed to Re-submit Tool.".

<figure><img src="/files/iO6VAVrcOF9dKyKq2iXI" alt="" width="563"><figcaption></figcaption></figure>

### 3 Click "Connect Now" and choose "MetaMask" on the wallet list

<figure><img src="/files/fMJlY8lHtPpRhexVDuoV" alt="" width="563"><figcaption></figcaption></figure>

### 4. Fill in Your Mainnet Address

{% hint style="info" %}
How to Generate Mainnet Address&#x20;

To generate a mainnet address, please refer to the [mainnet address generation guide](/for-users/wallets/mainnet-address-generation)
{% endhint %}

Fill in the mainnet address you want to receive the migrated CRO. If the address is valid, you will see a green tick next to the address. After you have completed, click "Continue".

<figure><img src="/files/fPGqfShxJB6eD3Jup8k1" alt="" width="563"><figcaption></figcaption></figure>

### 5. Fill in Your ERC20 CRO Burn Transaction Hash

Fill in your previous ERC20 CRO burn transaction hash and click "Review Transaction".

You can look for the burn transaction hash from your MetaMask transaction lists (Under the Activity tab).

<figure><img src="/files/ddlSCFgf3LDCnU0Dhvmj" alt="" width="563"><figcaption></figcaption></figure>

### 6. Review Your Burn Transaction

Review and confirm the details of your token migration request. Make sure all the information is correct.

Afterwards, read the "CRO Token Migration Terms". If you understand and agree to the terms, you can tick the checkbox and click "Sign Agreement".

<figure><img src="/files/yzvIvuM62XzmJ8FiUAct" alt="" width="563"><figcaption></figcaption></figure>

### 7. Sign The Agreement

A MetaMask popup will appear and ask for your signature. By signing this message with your MetaMask account, you acknowledge that you agree to the "CRO Token Migration Terms".

<figure><img src="/files/vtdUWZaddE9i0jufW5RQ" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
**Could Not See MetaMask Popup?**&#x20;

If you cannot see the MetaMask popups, you can check the MetaMask browser icon on the top right-hand corner. You should see a pending action on the icon and you can click the icon to continue the operations on MetaMask. &#x20;
{% endhint %}

<figure><img src="/files/5QdK3mo9o339FdXUBMwM" alt="" width="510"><figcaption></figcaption></figure>

### 8. Successful Submission

If you migration request is submitted, you will see the following page.

<figure><img src="/files/hqsP9oWaphqyjwHZPBDV" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
Failed To Submit Your Migration Request? You can always re-submit your token migration request if your burn transaction has already been confirmed and succeeded on the chain. For details, please refer to the [Re-submit Migration Request guide](#re-submit-migration-request)&#x20;
{% endhint %}

### 9. Check Migration Record Status

To check for the latest status of your migration requests, click the "Migration Records" on the navigation bar or go to the [link](https://crypto.org/migration/tx).

You will see a list of migration requests associated with your current account and the status of it. If you are uncertain of the status, you can put your mouse over the status for an explanation.

<figure><img src="/files/TebHPp19FpeLds43RfJy" alt="" width="563"><figcaption></figcaption></figure>


# Running Nodes

Thanks for your interest in Cronos POS Chain. In this technical documentation, we have covered node setup instructions, our all-in-one command-line interface `chain-maind`, and different SDK modules we utilized in the Cronos POS Chain.

### What's next?

#### Cronos POS Chain Mainnet

* **Join Cronos POS Chain Mainnet**
  * [As a validator](/for-node-hosts/getting-started/mainnet_validator);
  * [Build a Full node](/for-node-hosts/getting-started/mainnet)
* Deploy mainnet node with [1 click](/for-node-hosts/getting-started/aws-1click):

  Try running Full Nodes or Validators connected to our mainnet on

  * [AWS](/for-node-hosts/getting-started/aws-1click); or
  * [Azure](/for-node-hosts/getting-started/azure-1click).

#### Cronos POS Chain Croeseid Testnet

* [Join Croeseid Testnet](/for-node-hosts/getting-started/croeseid-testnet):

  Try running Full Nodes or Validators connected to our Croeseid Testnet.
* Deploy testnet node with [1 click](/for-node-hosts/getting-started/aws-1click):

  Try running Full Nodes or Validators connected to our Croeseid Testnet on

  * [AWS](/for-node-hosts/getting-started/aws-1click); or
  * [Azure](/for-node-hosts/getting-started/azure-1click).
* [Deploy testnet node with nix](/for-node-hosts/getting-started/croeseid-testnet-nix):

  Install and run full nodes or validators connected to our Croeseid Testnet with Nix.

#### Devnet

* **Devnet** - [Build latest development version](/for-node-hosts/getting-started/local-devnet): Try running the latest development network (Devnet)

### Useful links

* [Project Website](http://crypto.org/)
* [Project Repository](https://github.com/crypto-org-chain/chain-main)
* [Developer community channel](https://discord.com/invite/pahqHz26q4)&#x20;
* Community/Third Party Analytic Dashboard&#x20;
  * [Defier](https://defier.net/)
  * [Validator.Info](https://validator.info/cronos-pos)


# Cronos POS Chain Mainnet: Running a Validator

This is detailed documentation for setting up a **Validator** on Cronos POS Chain mainnet. Note that while anyone can set up a validator, only the top 100 validators are considered "active" and eligible to receive rewards. See [FAQs](https://github.com/crypto-org-chain/chain-main/discussions/442) for more info.

## Step 0: Notes on network upgrades

There are two ways to set up a node:

1. For the host who would like to build a **Validator with complete blockchain data** from scratch,

* Note that there were several breaking network upgrades, requiring upgrading at designated block heights. For more details on upgrading, we refer to this [guide](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide) on running a full node.
* Once you have a complete synced node, you can revisit this page and jump to the [step](#step-3-5-joining-the-network-as-a-validator-send-a-create-validator-transaction) of joining the networking as a validator.

2. For hosts who would like to **join the network and start validating quickly**, one can:

* Begin with the binary `v6.0.1` and join the network by `STATE-SYNC`

To simplify this guide, we will be covering the **second case** here in this guide, and guide you to begin with binary `v6.0.1` and join the network by `STATE-SYNC`.

## Pre-requisites

### Supported OS

We officially support macOS, Windows and Linux only. Other platforms may work, but there is no guarantee. We will extend our support to other platforms after we have stabilized our current architecture.

### Prepare your machine

For Cronos POS Chain mainnet, you will need a machine with the following minimum requirements to run different types of nodes:

Archive Node (setting pruning = nothing)

* RAM: 64GB (Rocksdb)
* Disk: 3.4TB
* CPU: 4 cores

Default Full Node (setting pruning = default)

* RAM: 64GB (Rocksdb) or 16GB (goleveldb)
* Disk: 1.2TB (From [Cronos Native Snapshots](/for-node-hosts/getting-started/cronos-pos-snapshots/native-snapshots))
* CPU: 4 cores

Pruned Node (setting pruning = everything)

* RAM: 64GB (Rocksdb) or 16GB (goleveldb)
* Disk: 40GB (From [Cronos Native Snapshots](/for-node-hosts/getting-started/cronos-pos-snapshots/native-snapshots))
* CPU: 4 cores

*Please note that the size of snapshots will keep growing.*

## Step 1. Get the Cronos POS Chain Mainnet binary

{% hint style="info" %}
**Remarks**: The following is the minimal setup to join Cronos POS Chain Mainnet. Furthermore, you may want to run full nodes as sentries (see [Tendermint](https://docs.tendermint.com/v0.34/)), restrict your validator connections to only connect to your full nodes, use secure storage and [key management](https://docs.cronos-pos.org/for-users/wallets/cli#keys-management-chain-maind-keys) service for your validator keys, etc.&#x20;
{% endhint %}

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.9/chain-main_3.3.9_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.9/chain-main_3.3.9_Windows_x86_64.zip) are also available.

There are two options to install `chain-maind`:

* [Directly from Github](#option-1-install-chain-maind-released-binaries-from-github); or
* [Homebrew](#option-2-install-chain-maind-by-homebrew)

### Option 1 - Install `chain-maind` released binaries from GitHub

* To install Cronos POS Chain binaries from Github:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v6.0.1/chain-main_6.0.1_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_6.0.1_Linux_x86_64.tar.gz
  ```
* You can verify the installation by checking the version of the chain-maind, the current version is 6.0.1.

  ```bash
  # check the version of chain-maind
  $ ./chain-maind version
  6.0.1
  ```

## Step 2. Configure `chain-maind`

Before kick-starting your node, we will have to configure the node so that it connects to the Cronos POS Chain mainnet

{% hint style="info" %}
**NOTE**

* Depending on your `chain-maind` home setting, the `chain-maind` configuration will be initialized to that home directory. To simply the following steps, we will use the default chain-maind home directory `~/.chain-maind/` for illustration.
* You can also put the `chain-maind` to your binary path and run it directly by `chain-maind`
  {% endhint %}

### Step 2-1. Initialize `chain-maind`

* First of all, you can initialize chain-maind by:

  ```bash
    $ ./chain-maind init [moniker] --chain-id crypto-org-chain-mainnet-1
  ```

  * This `moniker` will be the displayed ID of your node when connected to the Cronos POS Chain network. When providing the moniker value, make sure you drop the square brackets since they are not needed.

### Step 2-2. Configure chain-maind

* Download and replace the Cronos POS Chain mainnet `genesis.json` by:

  ```bash
  $ curl https://raw.githubusercontent.com/crypto-org-chain/mainnet/main/crypto-org-chain-mainnet-1/genesis.json > ~/.chain-maind/config/genesis.json
  ```
* Verify sha256sum checksum of the downloaded `genesis.json`. You should see `OK!` if the sha256sum checksum matches.

  ```bash
  $ if [[ $(sha256sum ~/.chain-maind/config/genesis.json | awk '{print $1}') = "d299dcfee6ae29ca280006eaa065799552b88b978e423f9ec3d8ab531873d882" ]]; then echo "OK"; else echo "MISMATCHED"; fi;

  OK!
  ```

  &#x20;

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong></p><ul><li><p>For Mac environment, <code>sha256sum</code> was not installed by default. In this case, you may setup <code>sha256sum</code> with this command:</p><pre class="language-bash"><code class="lang-bash">function sha256sum() { shasum -a 256 "$@" ; } &#x26;&#x26; export -f sha256sum
  </code></pre></li></ul></div>

  ###
* In `~/.chain-maind/config/app.toml`, update minimum gas price to avoid [transaction spamming](https://github.com/cosmos/cosmos-sdk/issues/4527)

  ```bash
  $ sed -i.bak -E 's#^(minimum-gas-prices[[:space:]]+=[[:space:]]+)""$#\1"0.025basecro"#' ~/.chain-maind/config/app.toml
  ```

{% hint style="info" %}
**Reminder**: The list of the `seed` is subject to change, you can also find the latest seed to connect [here](https://github.com/crypto-org-chain/mainnet#seed-nodes).
{% endhint %}

### Step 2-3. Enable STATE-SYNC

With [STATE-SYNC](https://docs.tendermint.com/v0.34/tendermint-core/state-sync.html) your node will download data related to the head or near the head of the chain and verify the data. This leads to drastically shorter times for joining a network for validators. For the **validator**, it will be amazingly fast to sync the near head of the chain and join the network.&#x20;

{% hint style="warning" %}
**Cautious** \
Blocks before state-sync `trust height` will **NOT** be queryable. If you want to run a **full node** or a validator with complete blockchain data; It is not suggested to use state-sync. \
Kindly refer to this [guide](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet) on building a node with complete data.&#x20;
{% endhint %}

Follow the below steps to enable state-sync:

* For state-sync configuration, in `~/.chain-maind/config/config.toml`, please modify the configurations under \[statesync] `enable`, `rpc_servers`, `trust_height` and `trust_hash` and add `persistent_peers` by:

  ```bash
  $ sed -i.bak -E 's#^(persistent_peers[[:space:]]+=[[:space:]]+).*$#\1"87c3adb7d8f649c51eebe0d3335d8f9e28c362f2@seed-0.cronos-pos:26656,e1d7ff02b78044795371beb1cd5fb803f9389256@seed-1.cronos-pos.org:26656,2c55809558a4e491e9995962e10c026eb9014655@seed-2.cronos-pos.org:26656"#' ~/.chain-maind/config/config.toml
  $ sed -i.bak -E 's#^(seeds[[:space:]]+=[[:space:]]+).*$#\1""#' ~/.chain-maind/config/config.toml
  $ LATEST_HEIGHT=$(curl -s https://rpc.mainnet.cronos-pos.org:443/block | jq -r .result.block.header.height); \
  BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
  TRUST_HASH=$(curl -s "https://rpc.mainnet.cronos-pos.org:443/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

  $ sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
  s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"https://rpc.mainnet.cronos-pos.org:443,https://rpc.mainnet.cronos-pos.org:443\"| ; \
  s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
  s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \
  s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" ~/.chain-maind/config/config.toml
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong></p><ul><li>For Mac environment, if <code>jq</code> is missing, you may install it by: <code>brew install jq</code></li><li>We suggest using <code>persistent_peers</code> instead of <code>seeds</code> to provide a stable state-sync experience.</li></ul></div>

## Step 3. Run everything

### Step 3-1. Run everything

Once the `chain-maind` has been configured, we are ready to start the node and sync the blockchain data:

* Start `chain-maind`, e.g.:

```bash
  $ ./chain-maind start
```

**OR**

* *(Optional for Linux)* If you would like to have it running in the background, you can start `chain-maind` with `systemd` service, e.g.:

```bash
  $ git clone https://github.com/crypto-org-chain/chain-main.git && cd chain-main
  $ ./networks/create-service.sh
  $ sudo systemctl start chain-maind
  # view log
  $ journalctl -u chain-maind -f
```

{% hint style="info" %}
**Example**: /etc/systemd/system/chain-maind.service created by script

```bash
# /etc/systemd/system/chain-maind.service
[Unit]
Description=Chain-maind
ConditionPathExists=/usr/local/bin/chain-maind
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/chain-maind start --home /home/ubuntu/.chain-maind
Restart=on-failure
RestartSec=10
LimitNOFILE=50000

[Install]
WantedBy=multi-user.target
```

{% endhint %}

It should begin fetching blocks from the other peers. Please wait until it is synced before moving onto the next step.

```bash
# /etc/systemd/system/chain-maind.service
[Unit]
Description=Chain-maind
ConditionPathExists=/usr/local/bin/chain-maind
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/chain-maind start --home /home/ubuntu/.chain-maind
Restart=on-failure
RestartSec=10
LimitNOFILE=50000

[Install]
WantedBy=multi-user.target
```

{% hint style="info" %}
**Remarks**:

* You can query the node syncing status by

  ```bash
  $ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
  ```

  If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.
  {% endhint %}

### Step 3-2. Joining the network as a validator: Send a `create-validator` transaction

Once the node is synced, we are now ready to send a `create-validator` transaction and join the network, for example:

```
$ ./chain-maind tx staking create-validator \
--from=[name_of_your_key] \
--amount=[amount of cro, e.g. 1000cro] \
--pubkey='{"@type":"/cosmos.crypto.ed25519.PubKey","key":[validator_public_key]}' \
--moniker="[The_id_of_your_node]" \
--security-contact="[security contact email/contact method]" \
--chain-id="crypto-org-chain-mainnet-1" \
--commission-rate="[The_commission_rate_of_your_node, e.g. 0.1 (10%)]" \
--commission-max-rate="[The_maximum_commission_rate_of_your_node e.g. 0.2 (20%)]" \
--commission-max-change-rate="[The_maximum_change_of_commission_rate_per_day e.g. 0.01 (1%)]" \
--min-self-delegation="1" \
--gas 8000000 \
--gas-prices 0.1basecro

{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator"...}
confirm transaction before signing and broadcasting [y/N]: y
```

{% hint style="info" %}
You will be required to insert the following:

* `--from`: The `cro...` address or the key name that holds your funds for initial delegation;
* `--amount`: The amount of self-delegation provided to the validator as an initial staking;
* `--pubkey`: The validator public key. Can be found using `./chain-maind tendermint show-validator`.;
* `--moniker`: A moniker (name) for your validator node;
* `--security-contact`: Security contact email/contact method, it is **strongly recommended** to provide an email address for receiving important messages related to validator operation in the future;
* `--chain-id=`: The chain-id of mainnet - *crypto-org-chain-mainnet-1*
* `--commission-rate`: The commission rate charge on the delegator;
* `--commission-max-rate`: The upper bound of the commission rate;
* `--commission-max-change-rate`: The maximum daily increase of the validator commission. Please note this parameter cannot be changed after create-validator is processed;
* `--min-self-delegation`: The lower threshold of validator's self-delegation amount, if the self-delegation drops below this number, all staked funds to the validator will be automatically unbonded and the validator will be inactive. :::
  {% endhint %}

### Step 3-3. Check your validator status

Once the `create-validator` transaction completes, you can check if your validator has been added to the validator set:

```bash
$ ./chain-maind tendermint show-address
## [crocnclcons... address] ##
$ ./chain-maind query tendermint-validator-set | grep -c [crocnclcons...]
## 1 = Yes; 0 = Not yet added ##
```

You can also check your public key by:

```bash
$ ./chain-maind tendermint show-validator
## [crocnclconspub... address] ##
```

To further check if the validator is signing blocks, kindly run this [script](https://github.com/crypto-com/chain-docs/blob/master/docs/getting-started/assets/signature_checking/check-validator-up.sh), for example:

```bash
$ curl -sSL https://raw.githubusercontent.com/crypto-org-chain/chain-docs/master/docs/getting-started/assets/signature_checking/check-validator-up.sh | bash -s -- \
--tendermint-url https://rpc.mainnet.cronos-pos.org:443 \
--pubkey $(cat ~/.chain-maind/config/priv_validator_key.json | jq -r '.pub_key.value')

The validator is in the active validator set under the address  <YOUR_VALIDATOR_ADDRESS>
The validator is signing @ Block#<BLOCK_HEIGHT> 👍
```

Congratulations! You've successfully set up a mainnet node and performed some basic transactions! You may refer to [Wallet Management](https://docs.cronos-pos.org/for-users/wallets/cli#transactions-subcommands-chain-maind-tx) for more advanced operations and transactions.

## Basic Transactions and queries

### `query bank balances` - Check your transferable balance

You can check your *transferable* balance with the `balances` command under the bank module.&#x20;

{% hint style="info" %}
**Example**: Check your address balance

```bash
$ ./chain-maind query bank balances cro1quw5r22pxy8znjtdkgqc65atrm3x5hg6vycm5n

  balances:
  - amount: "10005471622381693"
    denom: basecro
  pagination:
    next_key: null
    total: "0"
```

{% endhint %}

### `tx bank send` - Transfer operation

Transfer operation involves the transfer of tokens between two addresses.

#### **Send Funds** \[`tx bank send <from_key_or_address> <to_address> <amount> <network_id>`]

{% hint style="info" %}
**Example**: Send 10cro from one address to another.

```bash
$ ./chain-maind tx bank send Default cro1j7pej8kplem4wt50p4hfvndhuw5jprxxn5625q 10cro --chain-id="crypto-org-chain-mainnet-1" --gas-prices 0.1basecro
  ## Transaction payload##
  {"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address"....}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

### `tx staking` - Staking operations

{% hint style="info" %}
**NOTE**

* To get the 'validator-addr' with bech32 prefix, you can run this command:

  ```bash
  ./chain-maind keys show Default --bech val
  ```

{% endhint %}

Staking operations involve the interaction between an address and a validator. It allows you to create a validator and lock/unlocking funds for staking purposes.

#### **Delegate your funds to a validator** \[`tx staking delegate <validator-addr> <amount>`]

To bond funds for staking, you can delegate funds to a validator by the `delegate` command. Note that you can look up validators and their operator address by the validator list on the [explorer](https://crypto.org/explorer/validators).

{% hint style="info" %}
**Example**: Delegate funds from `Default` to a validator under the operator address `crocncl16k...edcer`
{% endhint %}

```bash
$ ./chain-maind tx staking delegate crocncl16kqr009ptgken6qsxnzfnyjfsq6q97g3uedcer 100cro --from Default --chain-id "crypto-org-chain-mainnet-1" --gas-prices 0.1basecro
## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgDelegate"....}
confirm transaction before signing and broadcasting [y/N]: y
```

#### **Unbond your delegated funds** \[`tx staking unbond <validator-addr> <amount>`]

On the other hand, we can create an `Unbond` transaction to unbond the delegated funds

{% hint style="info" %}
**Example**: Unbond funds from a validator under the address `crocncl16k...edcer`

```bash
$ ./chain-maind tx staking unbond crocncl16kqr009ptgken6qsxnzfnyjfsq6q97g3uedcer 100cro --from Default --chain-id "crypto-org-chain-mainnet-1" --gas-prices 0.1basecro
## Transaction payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgUndelegate"...}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

{% hint style="info" %}
Once your funds are unbonded, they will be locked until the `unbonding_time` has passed.
{% endhint %}

### Reward-related transactions and queries

After you have delegated or created a validator, the reward will be accumulated, you can check/ withdraw it by:

#### `query distribution validator-outstanding-rewards` - Query un-withdrawn rewards for a validator

We can check the distribution outstanding (un-withdrawn) rewards for a validator and all of their delegations by operator address.

{% hint style="info" %}
Example: Check all outstanding rewards under the operator address `crocncl1...zrf8`

```bash
$ ./chain-maind q distribution validator-outstanding-rewards crocncl1kkqxv3szgh099xezt7y38t5anqzue4s326zrf8 --gas-prices 0.1basecro
  rewards:
  - amount: "1920761912.927067330419141688"
    denom: basecro
```

{% endhint %}

#### `tx distribution validator-outstanding-rewards` - Query un-withdrawn rewards for a validator

We can check the distribution outstanding (un-withdrawn) rewards for a validator and all of their delegations by operator address.

{% hint style="info" %}
**Example**: Withdraw all outstanding under a delegation address:

```bash
$ ./chain-maind tx distribution withdraw-all-rewards --from [key_name] --chain-id crypto-org-chain-mainnet-1 --gas-prices 0.1basecro

{"body":{"messages":[{"@type":"/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"...}]}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

&#x20;

### Slashing related transaction

### `tx slashing unjail` - Unjail a validator

Validator could be punished and jailed due to network misbehaviour, we can check the jailing status of a validator, for example:

```bash
$ ./chain-maind query staking validators -o json | jq
................................
      "operator_address": "crocncl1hct8ye56gk80qjxvrx299yu9v98aqaxe0y5kvg",
      "consensus_pubkey": {
        "@type": "/cosmos.crypto.ed25519.PubKey",
        "key": "P1/aHuScW5myVs+xH10R8yFT2u0wwaCKXfDKSuVTl60="
      },
      "jailed": true,
................................
```

Where `"jailed": true` implies that the validator has been jailed. After the jailing period has passed, one can broadcast a `unjail` transaction to unjail the validator and resume its normal operations by

```bash
$ ./chain-maind tx slashing unjail --from [key_name] --chain-id crypto-org-chain-mainnet-1 --gas-prices 0.1basecro

  {"body":{"messages":[{"@type":"/cosmos.slashing.v1beta1.MsgUnjail"...}]}
  confirm transaction before signing and broadcasting [y/N]: y
```


# Cronos POS Chain Mainnet: Running a Full Node

This is detailed documentation for setting up a **Full Node** on the Cronos POS Chain mainnet. Note that while anyone can set up a full node, only the top 100 validators are considered "active" and eligible to receive rewards. See [FAQs](https://github.com/crypto-org-chain/chain-main/discussions/442) for more info.

## Step 0: Notes on network upgrades

For the host who would like to build a **Run a Full Node with complete blockchain data** from scratch, note that there were several breaking network upgrades, requiring upgrading at designated block heights below:

| Block height              | Binary Version       | Instruction                                                                                      |
| ------------------------- | -------------------- | ------------------------------------------------------------------------------------------------ |
| `1 - 922,363`             | `chain-main_1.2.1`   | Start the node with the older binary version                                                     |
| `922,363 - 3,526,800`     | `chain-main_2.0.1`   | When it reaches the target block height `922,363` (Canis Major), update the binary and restart   |
| `3,526,800 - 10,073,800`  | `chain-main_3.3.9`   | When it reaches the target block height `3,526,800` (Draco II), update the binary and restart\*  |
| `10,073,800 - 22,649,500` | `chain-main_4.2.2`   | When it reaches the target block height `10,073,800` (V4 upgrade), update the binary and restart |
| `22,649,500 - 24,836,000` | `chain-main_v5.0.1`  | When it reaches the target block height `22,649,500` (V5 upgrade), update the binary and restart |
| `>24,836,000`             | `chain-main_6.0.0-2` | When it reaches the target block height `24,836,000` (V6 upgrade), update the binary and restart |
| `>29,782,800`             | `chain-main_v7.2.0`  | When it reaches the target block height `29,782,800` (V7 upgrade), update the binary and restart |
| `>30,720,400`             | `chain-main_8.0.0`   | When it reaches the target block height `30,720,400` (V8 upgrade), update the binary and restart |

* \*Note that as of `v3.3.5` and higher, you need to modify your `.chain-maind/config/app.toml` and set the following params:
  * `index_events = []`
  * `iavl-cache-size = 781250`
  * `iavl-disable-fastnode = false` (set to `true` to skip IAVL migration, but keep as `false` when starting from a migrated snapshot. When you are on `INF starting ABCI with Tendermint` for a while, migration is going on and you should NOT terminate this. It might take a couple of hours, so plan well ahead for this migration, as it may incur downtime.)
* Users can refer to the upgrade guides for the detailed upgrade steps.
  * "[Canis Major](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide)" (`v1.*` to `v2.0.1`);
  * ["DRACO II"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_draco_2) (`v2.*` to `v3.3.9`);
  * ["V4 upgrade"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_v4) (`v3.3.9` to `v4.2.2`);
  * [V5 upgrade](/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_v4-3) (`v4.*` to `v5`);&#x20;
  * [V6 upgrade](/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_v4-2) (`v5.0.1` to `v6.0.0-2` )&#x20;
  * [V7 upgrade](/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_v4-1) (`v6.0.0-2` to `v7.2.0` )&#x20;
  * [V8 upgrade](/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_v4) (`v7.2.0` to `v8.0.0` )&#x20;

## Pre-requisites

### Supported OS

We officially support macOS, Windows and Linux only. Other platforms may work, but there is no guarantee. We will extend our support to other platforms after we have stabilized our current architecture.

### Prepare your machine

For Cronos POS Chain mainnet, you will need a machine with the following minimum requirements to run different types of nodes:

Archive Node (setting pruning = nothing)

* RAM: 64GB (Rocksdb)
* Disk: 5.9TB
* CPU: 4 cores

Default Full Node (setting pruning = default)

* RAM: 64GB (Rocksdb) or 16GB (goleveldb)
* Disk: 1.5TB (From [Cronos Native Snapshots](/for-node-hosts/getting-started/cronos-pos-snapshots/native-snapshots))
* CPU: 4 cores

Pruned Node (setting pruning = everything)

* RAM: 64GB (Rocksdb) or 16GB (goleveldb)
* Disk: 15GB (From [Publicnode](/for-node-hosts/getting-started/cronos-pos-snapshots/public-node-sync))
* CPU: 4 cores

*Please note that the size of snapshots will keep growing.*

## Step 1. Get the Cronos POS Chain Mainnet binary

{% hint style="info" %}
**Remarks**: The following is the minimal setup to join Cronos POS Chain Mainnet. Furthermore, you may want to run full nodes as sentries (see [Tendermint](https://docs.tendermint.com/v0.34/)), restrict your validator connections to only connect to your full nodes, use secure storage and [key management](https://docs.cronos-pos.org/for-users/wallets/cli#keys-management-chain-maind-keys) service for your validator keys etc.
{% endhint %}

To simplify the following step, we will be using **Linux** for illustration. Binaries for [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v1.2.1/chain-main_1.2.1_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v1.2.1/chain-main_1.2.1_Windows_x86_64.zip) are also available. There are two options to install `chain-maind`:

* [Directly from Github](#option-1-install-chain-maind-released-binaries-from-github); or
* [Homebrew](#option-2-install-chain-maind-by-homebrew)

As mentioned before, in order to run a full node with complete blockchain data, we would need to begin with the older binary version `1.2.1`:

### Option 1 - Install `chain-maind` released binaries from GitHub

* To install Cronos POS Chain binaries from Github:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v1.2.1/chain-main_1.2.1_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_1.2.1_Linux_x86_64.tar.gz
  ```
* You can verify the installation by checking the version of the chain-maind, the current version is `1.2.1`.

  ```bash
  # check the version of chain-maind
  $ ./chain-maind version
  1.2.1
  ```

**OR**

### Option 2 - Install `chain-maind` by homebrew

{% hint style="info" %}
**Reminder**:  \
\- If you plan to play around with different networks (mainnet and testnet), we suggest you follow Option 1 to download the binary directly. \
\- The binary downloaded from homebrew is **only for interacting with the mainnet**. You cannot use it to interact with testnet.
{% endhint %}

To install binaries in Homebrew for macOS X or Linux

[Homebrew](https://brew.sh/) is a free and open-source package management system for macOS X. Install the official Chain-maind formula from the terminal.

* First, install the `crypto-org-chain` tap, a repository of our Homebrew `chain-maind` package:

```bash
  # tap the repo
  $ brew tap crypto-org-chain/chain-maind
```

* Now, install the `chain-maind` version `1.2.1` with crypto-org-chain/chain-maind

  ```bash
    # install the chain-maind CLI tool
    $ brew install chain-maind@1.2.1
  ```
* You can verify the installation by checking the version of the `chain-maind`

  ```bash
  # check the version of chain-maind
  $ chain-maind version
  1.2.1
  ```

## Step 2. Configure `chain-maind`

Before kick-starting your node, we will have to configure the node so that it connects to the Cronos POS mainnet

{% hint style="info" %}
**Note**:\
\- Depending on your `chain-maind` home setting, the `chain-maind` configuration will be initialized to that home directory. To simplify the following steps, we will use the default chain-maind home directory `~/.chain-maind/` for illustration.\
\- You can also put the `chain-maind` to your binary path and run it directly by `chain-maind`
{% endhint %}

### Step 2-1. Initialize `chain-maind`

* First of all, you can initialize chain-maind by:

  ```bash
    $ ./chain-maind init [moniker] --chain-id crypto-org-chain-mainnet-1
  ```

  * This `moniker` will be the displayed ID of your node when connected to the Cronos POS Chain network. When providing the moniker value, make sure you drop the square brackets since they are not needed.

### Step 2-2. Configure chain-maind

* Download and replace the Cronos POS Chain mainnet `genesis.json` by:

  ```bash
  $ curl https://raw.githubusercontent.com/crypto-org-chain/mainnet/main/crypto-org-chain-mainnet-1/genesis.json > ~/.chain-maind/config/genesis.json
  ```

* Verify sha256sum checksum of the downloaded `genesis.json`. You should see `OK!` if the sha256sum checksum matches.

  ```bash
  $ if [[ $(sha256sum ~/.chain-maind/config/genesis.json | awk '{print $1}') = "d299dcfee6ae29ca280006eaa065799552b88b978e423f9ec3d8ab531873d882" ]]; then echo "OK"; else echo "MISMATCHED"; fi;

  OK!
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>Note</strong>: <br>For Mac environment, <code>sha256sum</code> was not installed by default. In this case, you may setup <code>sha256sum</code> with this command:</p><pre class="language-bash"><code class="lang-bash">function sha256sum() { shasum -a 256 "$@" ; } &#x26;&#x26; export -f sha256sum
  </code></pre></div>

* In `~/.chain-maind/config/app.toml`, update minimum gas price to avoid [transaction spamming](https://github.com/cosmos/cosmos-sdk/issues/4527)

  ```bash
  $ sed -i.bak -E 's#^(minimum-gas-prices[[:space:]]+=[[:space:]]+)""$#\1"0.025basecro"#' ~/.chain-maind/config/app.toml
  ```

{% hint style="info" %}
**Reminder**: \
The list of the`seed`is subject to change, you can also find the latest seed to connect [here](https://github.com/crypto-org-chain/mainnet#seed-nodes).
{% endhint %}

{% hint style="warning" %}
**Important**: \
When a validator is jailed because of a byzantine fault, their validator public key is added to a list of permanently banned validators and cannot re-join the network as a validator with the same public key, see [staking tombstone](https://docs.cosmos.network/master/modules/slashing/07_tombstone.html)&#x20;
{% endhint %}

## Step 3. Run everything

### Step 3-1. Run everything

Once the `chain-maind` has been configured, we are ready to start the node and sync the blockchain data:

* Start `chain-maind`, e.g.:

```bash
  $ ./chain-maind start
```

**OR**

* *(Optional for Linux)* If you would like to have it running in the background, you can start `chain-maind` with `systemd` service, e.g.:

```bash
  $ git clone https://github.com/crypto-org-chain/chain-main.git && cd chain-main
  $ ./networks/create-service.sh
  $ sudo systemctl start chain-maind
  # view log
  $ journalctl -u chain-maind -f
```

{% hint style="info" %}
&#x20;**Example**: /etc/systemd/system/chain-maind.service created by script

```bash
# /etc/systemd/system/chain-maind.service
[Unit]
Description=Chain-maind
ConditionPathExists=/usr/local/bin/chain-maind
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/chain-maind start --home /home/ubuntu/.chain-maind
Restart=on-failure
RestartSec=10
LimitNOFILE=50000

[Install]
WantedBy=multi-user.target
```

{% endhint %}

It should begin fetching blocks from the other peers. Please wait until it is synced to the upgrade height `922,363` before moving onto the next step.

{% hint style="info" %}
**Remarks:**  \
Option 2 - Install `chain-maind` by homebrew <br>

To install binaries in Homebrew for macOS X or Linux

* You can query the node syncing status by

  ```bash
  $ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
  ```
* If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.
  {% endhint %}

### Step 3-2. Upgrade the `chain-maind` binary to `v2.1.2`

At the upgrade height of `922,363`, users will see the following error message on the `chain-maind`:

```bash
`ERR UPGRADE "v2.0.0" NEEDED at time: 2021-06-01T23:59:00Z:...`
```

#### Step 3-2-1 - Get the `v2.1.2` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v2.1.2/chain-main_2.1.2_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v2.1.2/chain-main_2.1.2_Windows_x86_64.zip) are also available.

* Terminate the `chain-maind`; afterwards, download the `v2.1.2` released binaries from github:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v2.1.2/chain-main_2.1.2_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_2.1.2_Linux_x86_64.tar.gz
  ```

{% hint style="info" %}
**Remarks:**  \
If you have stated `chain-maind` with *systemd* service, kindly stop it by

```bash
$ sudo systemctl stop chain-maind
```

And replace the binary in the location where the `ExecStart` states in Systemd Unit file.
{% endhint %}

* For [homebrew](https://github.com/crypto-org-chain/homebrew-chain-maind#chain-maind-homebrew-tap) users, simply run

  ```bash
  $ brew upgrade chain-maind
  ```

#### Step 3-2-2 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `2.0.1`.

```bash
# check the version of chain-maind
$ ./chain-maind version
2.1.2
```

#### Step 3-2-3 - Restart `chain-maind` with version `v2.1.2`

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
  $ ./chain-maind start
```

You've successfully performed the new binary upgrade! Sit back and wait for the syncing process.

* You can query the node syncing status by

  ```bash
  $ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
  ```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

* You can check the current block height by querying the public full node by:

  ```bash
  curl -s https://rpc.mainnet.cronos-pos.org:443/commit | jq "{height: .result.signed_header.header.height}"
  ```

and you can check your node's progress (in terms of block height) by:

````
```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.latest_block_height'
```
````

## "DRACO II" and "V4" Network upgrades

You've successfully performed the **"Canis Major"** binary upgrade! Allow sometime for the node to catch up, meanwhile, you can get ready for **"DRACO II,"** the second network upgrade ( from `v2.*` to `v3.3.2` at block height `3,526,800` ) by following this [guide](/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_draco_2), and **"V4 Upgrade"** (from `v3.3.*` to `v4.2.2` at block height `10,073,800`) by following this [guide](/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_v4-4) at a later stage. You can find the key details for all the upgrades under ["Notes on network upgrades"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide)

***


# Upgrade Guide


# The "V8" upgrade guide (v7.2.0 to v8.0.0)

For a full overview of the latest upgrades, please refer to ["Notes on network upgrades"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide).

{% hint style="warning" %}
**Warning**:

* The chain-maind `v8.0.0` - "V8" upgrade is proposed to be scheduled at the block height of `30,720,400` ( *Estimated time Tuesday, July 14 2026*, but this depends on the actual time taken when the blocks are being processed);
* Actual timing depends on the progress of block production, the estimated time of this block can be found [here](https://www.mintscan.io/crypto-org/block/30720400).

**DO NOT UPGRADE to the binary** `v8.0.0` **before that suggested upgrade schedule and come across with the error message as described in** **Step 0.**
{% endhint %}

### Step 0 - Don't panic

At the point of proposed upgrade, user will see the error message on the `chain-maind` similar to the below:

`ERR UPGRADE "v8.0.0" NEEDED at time: xxxxxxxxxxxxx: {"binaries":{"darwin/amd64":.......`

**Don't panic** - The Chain will be paused to allow the majority of validators to upgrade. Validators and full node hosts will have to upgrade your Cronos POS Chain nodes to the latest release binary.

#### Backups

Before the upgrade, validators are encouraged to take a complete data snapshot. Snapshotting depends heavily on infrastructure, but generally, we can do this by backing up the `.chain-maind` directory.

It is critically important for validator operators to back-up the `.chain-maind/data/priv_validator_state.json` file after stopping the `chain-maind` process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing if the upgrade fails and the previous chain needs to be restarted.

### Step 1 - Get the `v8.0.0` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac(arm64)](https://github.com/crypto-org-chain/chain-main/releases/download/v8.0.0/chain-main_8.0.0_Darwin_arm64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v8.0.0/chain-main_8.0.0_Windows_x86_64.tar.gz) are also available.

* Terminate the `chain-maind`; afterward, download the `v8.0.0` released binaries from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v8.0.0/chain-main_8.0.0_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_8.0.0_Linux_x86_64.tar.gz
  ```

{% hint style="info" %}
**Remarks**: If you have stated `chain-maind` with *systemd* service, kindly stop it by

```bash
$ sudo systemctl stop chain-maind
```

And replace the binary in the location where the `ExecStart` states in Systemd Unit file.
{% endhint %}

#### Step 1.1 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `v8.0.0`.

<pre class="language-bash"><code class="lang-bash"># check the version of chain-maind
<strong>$ ./chain-maind version
</strong>v8.0.0
</code></pre>

#### Step 1.2 - Insert new configuration

Several new fields under `~/.chain-maind/config/app.toml` have been introduced, kindly add the following fields to the `app.toml`:

* Under `Base Configuration`, please align the `app-db-backend` with the `db-backend` field under `~/.chain-maind/config/config.toml`, for example, if it is `goleveldb` (default), then we can add:

```bash
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
# An empty string indicates that a fallback will be used.
# First fallback is the deprecated compile-time types.DBBackend value.
# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml.
app-db-backend = "goleveldb"
```

* Under `gRPC Configuration`:

```bash
# MaxRecvMsgSize defines the max message size in bytes the server can receive.
# The default value is 10MB.
max-recv-msg-size = "10485760"

# MaxSendMsgSize defines the max message size in bytes the server can send.
# The default value is math.MaxInt32.
max-send-msg-size = "2147483647"
```

{% hint style="info" %}
**Remarks**: If you are upgrading from `v3.3.5` or earlier, kindly also add the following fields to the `app.toml` under `Base Configuration`:

```
index_events = []
iavl-cache-size = 781250
iavl-disable-fastnode = true
```

For validators or production critical services, we recommend setting the `iavl-disable-fastnode` as `true` to skip the optional "IAVL migration" and avoid downtime:

* Setting it as `true` would skip the the optional "IAVL migration";
* Setting it as `false` would run the "IAVL migration" that would take a couple hours with the log `INF starting ABCI with Tendermint` for a while and incur downtime.
  {% endhint %}

### Step 2. - Run everything

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
$ ./chain-maind start
```

Afterwards, sit back and wait for the syncing process. You can query the node syncing status by

```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

At this step, you've successfully performed the new binary upgrade!


# The "V7" upgrade guide (v6.0.\* to v7.2.0)

For a full overview of the latest upgrades, please refer to ["Notes on network upgrades"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide).

{% hint style="warning" %}
**Warning**:

* The chain-maind `v7.2.0` - "V7" upgrade is proposed to be scheduled at the block height of `29,782,800` ( *Estimated time \~7:00* AM GMT, Wednesday, May 20 2026, but this depends on the actual time taken when the blocks are being processed);
* Actual timing depends on the progress of block production, the estimated time of this block can be found [here](https://www.mintscan.io/crypto-org/block/29782800).

**DO NOT UPGRADE to the binary** `v7.2.0` **before that suggested upgrade schedule and come across with the error message as described in** **Step 0.**
{% endhint %}

### Step 0 - Don't panic

At the point of proposed upgrade, user will see the error message on the `chain-maind` similar to the below:

`ERR UPGRADE "v7.2.0" NEEDED at time: xxxxxxxxxxxxx: {"binaries":{"darwin/amd64":.......`

**Don't panic** - The Chain will be paused to allow the majority of validators to upgrade. Validators and full node hosts will have to upgrade your Cronos POS Chain nodes to the latest release binary.

#### Backups

Before the upgrade, validators are encouraged to take a complete data snapshot. Snapshotting depends heavily on infrastructure, but generally, we can do this by backing up the `.chain-maind` directory.

It is critically important for validator operators to back-up the `.chain-maind/data/priv_validator_state.json` file after stopping the `chain-maind` process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing if the upgrade fails and the previous chain needs to be restarted.

### Step 1 - Get the `v7.2.0` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac(arm64)](https://github.com/crypto-org-chain/chain-main/releases/download/v7.2.0/chain-main_7.2.0_Darwin_arm64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v7.2.0/chain-main_7.2.0_Windows_x86_64.tar.gz) are also available.

* Terminate the `chain-maind`; afterward, download the `v7.2.0` released binaries from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v7.2.0/chain-main_7.2.0_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_7.2.0_Linux_x86_64.tar.gz
  ```

{% hint style="info" %}
**Remarks**: If you have stated `chain-maind` with *systemd* service, kindly stop it by

```bash
$ sudo systemctl stop chain-maind
```

And replace the binary in the location where the `ExecStart` states in Systemd Unit file.
{% endhint %}

#### Step 1.1 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `7.1.0`.

<pre class="language-bash"><code class="lang-bash"># check the version of chain-maind
<strong>$ ./chain-maind version
</strong>v7.2.0
</code></pre>

#### Step 1.2 - Insert new configuration

Several new fields under `~/.chain-maind/config/app.toml` have been introduced, kindly add the following fields to the `app.toml`:

* Under `Base Configuration`, please align the `app-db-backend` with the `db-backend` field under `~/.chain-maind/config/config.toml`, for example, if it is `goleveldb` (default), then we can add:

```bash
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
# An empty string indicates that a fallback will be used.
# First fallback is the deprecated compile-time types.DBBackend value.
# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml.
app-db-backend = "goleveldb"
```

* Under `gRPC Configuration`:

```bash
# MaxRecvMsgSize defines the max message size in bytes the server can receive.
# The default value is 10MB.
max-recv-msg-size = "10485760"

# MaxSendMsgSize defines the max message size in bytes the server can send.
# The default value is math.MaxInt32.
max-send-msg-size = "2147483647"
```

{% hint style="info" %}
**Remarks**: If you are upgrading from `v3.3.5` or earlier, kindly also add the following fields to the `app.toml` under `Base Configuration`:

```
index_events = []
iavl-cache-size = 781250
iavl-disable-fastnode = true
```

For validators or production critical services, we recommend setting the `iavl-disable-fastnode` as `true` to skip the optional "IAVL migration" and avoid downtime:

* Setting it as `true` would skip the the optional "IAVL migration";
* Setting it as `false` would run the "IAVL migration" that would take a couple hours with the log `INF starting ABCI with Tendermint` for a while and incur downtime.
  {% endhint %}

### Step 2. - Run everything

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
$ ./chain-maind start
```

Afterwards, sit back and wait for the syncing process. You can query the node syncing status by

```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

At this step, you've successfully performed the new binary upgrade!


# The "V6" upgrade guide (v5.0.1 to v6.0.0-2) :

For a full overview of the latest upgrades, please refer to ["Notes on network upgrades"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide).

{% hint style="warning" %}
**Warning**:

* The chain-maind `v6.0.0-2` - "V6" upgrade is proposed to be scheduled at the block height of `24836000` ( *Estimated time \~6:30* AM GMT, Monday, July 28 2025, but this depends on the actual time taken when the blocks are being processed);
* Actual timing depends on the progress of block production, the estimated time of this block can be found [here](https://www.mintscan.io/crypto-org/block/24836000).

**DO NOT UPGRADE to the binary** `v6.0.0-2` **before that suggested upgrade schedule and come across with the error message as described in** [**Step 0**](#step-0-dont-panic)**.** &#x20;
{% endhint %}

## Step 0 - Don't panic

At the point of proposed upgrade, user will see the error message on the `chain-maind` similar to the below:

`ERR UPGRADE "v6.0.0-2" NEEDED at time: xxxxxxxxxxxxx: {"binaries":{"darwin/amd64":.......`

**Don't panic** - The Chain will be paused to allow the majority of validators to upgrade. Validators and full node hosts will have to upgrade your Cronos POS Chain nodes to the latest release binary.

### Backups

Before the upgrade, validators are encouraged to take a complete data snapshot. Snapshotting depends heavily on infrastructure, but generally, we can do this by backing up the `.chain-maind` directory.

It is critically important for validator operators to back-up the `.chain-maind/data/priv_validator_state.json` file after stopping the `chain-maind` process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing if the upgrade fails and the previous chain needs to be restarted.

## Step 1 - Get the `v6.0.0-2` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac(arm64)](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2/chain-main_4.2.2_Darwin_arm64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2/chain-main_4.2.2_Windows_x86_64.zip) are also available.

* Terminate the `chain-maind`; afterward, download the `v6.0.0-2` released binaries from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v6.0.0-2/chain-main_6.0.0-2-testnet_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_6.0.0-2_Linux_x86_64.tar.gz
  ```

{% hint style="info" %}
**Remarks**: If you have stated `chain-maind` with *systemd* service, kindly stop it by

```bash
$ sudo systemctl stop chain-maind
```

And replace the binary in the location where the `ExecStart` states in Systemd Unit file.
{% endhint %}

### Step 1.1 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `6.0.0-2`.

```bash
# check the version of chain-maind
$ ./chain-maind version
6.0.0-2
```

### Step 1.2 - Insert new configuration

Several new fields under `~/.chain-maind/config/app.toml` have been introduced, kindly add the following fields to the `app.toml`:

* Under `Base Configuration`, please align the`app-db-backend` with the `db-backend` field under `~/.chain-maind/config/config.toml`, for example, if it is `goleveldb` (default), then we can add:

```bash
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
# An empty string indicates that a fallback will be used.
# First fallback is the deprecated compile-time types.DBBackend value.
# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml.
app-db-backend = "goleveldb"
```

* Under `Rosetta Configuration`:

  ```bash
  # EnableDefaultSuggestedFee defines if the server should suggest fee by default.
  # If 'construction/medata' is called without gas limit and gas price,
  # suggested fee based on gas-to-suggest and denom-to-suggest will be given.
  enable-fee-suggestion = false

  # GasToSuggest defines gas limit when calculating the fee
  gas-to-suggest = 200000

  # DenomToSuggest defines the defult denom for fee suggestion.
  # Price must be in minimum-gas-prices.
  denom-to-suggest = "basecro"
  ```
* Under `gRPC Configuration`:

```bash
# MaxRecvMsgSize defines the max message size in bytes the server can receive.
# The default value is 10MB.
max-recv-msg-size = "10485760"

# MaxSendMsgSize defines the max message size in bytes the server can send.
# The default value is math.MaxInt32.
max-send-msg-size = "2147483647"
```

{% hint style="info" %}
**Remarks**:  If you are upgrading from `v3.3.5` or earlier, kindly also add the following fields to the `app.toml` under `Base Configuration`:

```
index_events = []
iavl-cache-size = 781250
iavl-disable-fastnode = true
```

For validators or production critical services, we recommend setting the `iavl-disable-fastnode` as `true` to skip the optional "IAVL migration" and avoid downtime:

* Setting it as `true` would skip the the optional "IAVL migration";
* Setting it as `false` would run the "IAVL migration" that would take a couple hours with the log `INF starting ABCI with Tendermint` for a while and incur downtime.&#x20;
  {% endhint %}

## Step 2. - Run everything

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
$ ./chain-maind start
```

Afterwards, sit back and wait for the syncing process. You can query the node syncing status by

```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

At this step, you've successfully performed the new binary upgrade!


# The "V5" upgrade guide (v4.\* to v5.0.1) :

For a full overview of the latest upgrades, please refer to ["Notes on network upgrades"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide).

{% hint style="warning" %}
**Warning**:

* The chain-maind `v5.0.1` - "V5" upgrade is proposed to be scheduled at the block height of `22649500` ( *Estimated time \~*&#x33; AM GMT, Tuesday, March 18th, but this depends on the actual time taken when the blocks are being processed);
* Actual timing depends on the progress of block production, the estimated time of this block can be found [here](https://www.mintscan.io/crypto-org/block/22649500).

**DO NOT UPGRADE to the binary `v5.0.1` before that suggested upgrade schedule and come across with the error message as described in** [**Step 0**](#step-0-dont-panic)**.** &#x20;
{% endhint %}

## Step 0 - Don't panic

At the point of proposed upgrade, user will see the error message on the `chain-maind` similar to the below:

`ERR UPGRADE "v5.0.1" NEEDED at time: xxxxxxxxxxxxx: {"binaries":{"darwin/amd64":.......`

**Don't panic** - The Chain will be paused to allow the majority of validators to upgrade. Validators and full node hosts will have to upgrade your Cronos POS Chain nodes to the latest release binary.

### Backups

Before the upgrade, validators are encouraged to take a complete data snapshot. Snapshotting depends heavily on infrastructure, but generally, we can do this by backing up the `.chain-maind` directory.

It is critically important for validator operators to back-up the `.chain-maind/data/priv_validator_state.json` file after stopping the `chain-maind` process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing if the upgrade fails and the previous chain needs to be restarted.

## Step 1 - Get the `v5.0.1` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac(arm64)](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2/chain-main_4.2.2_Darwin_arm64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2/chain-main_4.2.2_Windows_x86_64.zip) are also available.

* Terminate the `chain-maind`; afterward, download the `5.0.1` released binaries from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v5.0.1/chain-main_5.0.1-testnet_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_5.0.1_Linux_x86_64.tar.gz
  ```

{% hint style="info" %}
**Remarks**: If you have stated `chain-maind` with *systemd* service, kindly stop it by

```bash
$ sudo systemctl stop chain-maind
```

And replace the binary in the location where the `ExecStart` states in Systemd Unit file.
{% endhint %}

### Step 1.1 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `5.0.1`.

```bash
# check the version of chain-maind
$ ./chain-maind version
5.0.1
```

### Step 1.2 - Insert new configuration

Several new fields under `~/.chain-maind/config/app.toml` have been introduced, kindly add the following fields to the `app.toml`:

* Under `Base Configuration`, please align the`app-db-backend` with the `db-backend` field under `~/.chain-maind/config/config.toml`, for example, if it is `goleveldb` (default), then we can add:

```bash
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
# An empty string indicates that a fallback will be used.
# First fallback is the deprecated compile-time types.DBBackend value.
# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml.
app-db-backend = "goleveldb"
```

* Under `Rosetta Configuration`:

```bash
# EnableDefaultSuggestedFee defines if the server should suggest fee by default.
# If 'construction/medata' is called without gas limit and gas price,
# suggested fee based on gas-to-suggest and denom-to-suggest will be given.
enable-fee-suggestion = false

# GasToSuggest defines gas limit when calculating the fee
gas-to-suggest = 200000

# DenomToSuggest defines the defult denom for fee suggestion.
# Price must be in minimum-gas-prices.
denom-to-suggest = "basecro"
```

* Under `gRPC Configuration`:

```bash
# MaxRecvMsgSize defines the max message size in bytes the server can receive.
# The default value is 10MB.
max-recv-msg-size = "10485760"

# MaxSendMsgSize defines the max message size in bytes the server can send.
# The default value is math.MaxInt32.
max-send-msg-size = "2147483647"
```

{% hint style="info" %}
**Remarks**:  If you are upgrading from `v3.3.5` or earlier, kindly also add the following fields to the `app.toml` under `Base Configuration`:

```
index_events = []
iavl-cache-size = 781250
iavl-disable-fastnode = true
```

For validators or production critical services, we recommend setting the `iavl-disable-fastnode` as `true` to skip the optional "IAVL migration" and avoid downtime:

* Setting it as `true` would skip the the optional "IAVL migration";
* Setting it as `false` would run the "IAVL migration" that would take a couple hours with the log `INF starting ABCI with Tendermint` for a while and incur downtime.&#x20;
  {% endhint %}

## Step 2. - Run everything

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
$ ./chain-maind start
```

Afterwards, sit back and wait for the syncing process. You can query the node syncing status by

```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

At this step, you've successfully performed the new binary upgrade!


# The "V4" upgrade guide (v3.\* to v4.2.2) :

For a full overview of the latest upgrades, please refer to ["Notes on network upgrades"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide)

{% hint style="warning" %}
**Warning**:

* The chain-maind `v4.2.2` - "V4" upgrade is proposed to be scheduled at the block height of `10,073,800` ( *Estimated time \~WED, 22 Feb 2023 02:00:00 GMT*, but this depends on the actual time taken when the blocks are being processed);
* Actual timing depends on the progress of block production, the estimated time of this block can be found [here](https://www.mintscan.io/crypto-org/blocks/10073800).

**DO NOT UPGRADE to the binary `v4.2.2` before that suggested upgrade schedule and come across with the error message as described in** [**Step 0**](#step-0-dont-panic)**.** &#x20;
{% endhint %}

## Step 0 - Don't panic

At the point of proposed upgrade, user will see the error message on the `chain-maind` similar to the below:

`ERR UPGRADE "v4.2.0" NEEDED at time: xxxxxxxxxxxxx: {"binaries":{"darwin/amd64":.......`

**Don't panic** - The Chain will be paused to allow the majority of validators to upgrade. Validators and full node hosts will have to upgrade your Cronos POS Chain nodes to the latest release binary.

### Backups

Before the upgrade, validators are encouraged to take a complete data snapshot. Snapshotting depends heavily on infrastructure, but generally, we can do this by backing up the `.chain-maind` directory.

It is critically important for validator operators to back-up the `.chain-maind/data/priv_validator_state.json` file after stopping the `chain-maind` process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing if the upgrade fails and the previous chain needs to be restarted.

## Step 1 - Get the `v4.2.2` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac(arm64)](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2/chain-main_4.2.2_Darwin_arm64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2/chain-main_4.2.2_Windows_x86_64.zip) are also available.

* Terminate the `chain-maind`; afterward, download the `4.2.2` released binaries from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2/chain-main_4.2.2_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_4.2.2_Linux_x86_64.tar.gz
  ```

{% hint style="info" %}
**Remarks**: If you have stated `chain-maind` with *systemd* service, kindly stop it by

```bash
$ sudo systemctl stop chain-maind
```

And replace the binary in the location where the `ExecStart` states in Systemd Unit file.
{% endhint %}

### Step 1.1 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `4.2.2`.

```bash
# check the version of chain-maind
$ ./chain-maind version
4.2.2
```

### Step 1.2 - Insert new configuration

Several new fields under `~/.chain-maind/config/app.toml` have been introduced, kindly add the following fields to the `app.toml`:

* Under `Base Configuration`, please align the`app-db-backend` with the `db-backend` field under `~/.chain-maind/config/config.toml`, for example, if it is `goleveldb` (default), then we can add:

```bash
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
# An empty string indicates that a fallback will be used.
# First fallback is the deprecated compile-time types.DBBackend value.
# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml.
app-db-backend = "goleveldb"
```

* Under `Rosetta Configuration`:

```bash
# EnableDefaultSuggestedFee defines if the server should suggest fee by default.
# If 'construction/medata' is called without gas limit and gas price,
# suggested fee based on gas-to-suggest and denom-to-suggest will be given.
enable-fee-suggestion = false

# GasToSuggest defines gas limit when calculating the fee
gas-to-suggest = 200000

# DenomToSuggest defines the defult denom for fee suggestion.
# Price must be in minimum-gas-prices.
denom-to-suggest = "basecro"
```

* Under `gRPC Configuration`:

```bash
# MaxRecvMsgSize defines the max message size in bytes the server can receive.
# The default value is 10MB.
max-recv-msg-size = "10485760"

# MaxSendMsgSize defines the max message size in bytes the server can send.
# The default value is math.MaxInt32.
max-send-msg-size = "2147483647"
```

{% hint style="info" %}
**Remarks**:  If you are upgrading from `v3.3.5` or earlier, kindly also add the following fields to the `app.toml` under `Base Configuration`:

```
index_events = []
iavl-cache-size = 781250
iavl-disable-fastnode = true
```

For validators or production critical services, we recommend setting the `iavl-disable-fastnode` as `true` to skip the optional "IAVL migration" and avoid downtime:

* Setting it as `true` would skip the the optional "IAVL migration";
* Setting it as `false` would run the "IAVL migration" that would take a couple hours with the log `INF starting ABCI with Tendermint` for a while and incur downtime.&#x20;
  {% endhint %}

## Step 2. - Run everything

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
$ ./chain-maind start
```

Afterwards, sit back and wait for the syncing process. You can query the node syncing status by

```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

At this step, you've successfully performed the new binary upgrade!


# The "DRACO II" upgrade guide (v2.\* to v3.3.2) :

For a full overview of the latest upgrades, please refer to ["Notes on network upgrades"](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet/upgrade-guide).

{% hint style="warning" %}
**Warning**:

The chain-maind `v3.3.2` - DRACO II upgrade is proposed to be scheduled at the block height of `3,526,800` ( *Estimated time \~Tuesday, 7 December 2021 02:00:00 GMT*, but this depends on the actual time taken when the blocks are being processed).

**DO NOT UPGRADE to the binary `v3.3.2` before that suggested upgrade schedule and came across the error message as described in Step 0.**&#x20;
{% endhint %}

## Step 0 - Don't panic

At the point of the proposed upgrade, the user will see the error message on the `chain-maind` similar to the below:

`ERR UPGRADE "v3.0.0" NEEDED at time: xxxxxxxxxxxxx: {"binaries":{"darwin/amd64":"https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Darwin_x86_64.tar.gz?checksum=sha256:082539ce9e9f2e382a70003a8504c9aa95f16fee55d104d3d94090b01e36ee63","darwin/arm64":"https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Darwin_arm64.tar.gz?checksum=sha256:3ebdeeb65400332e6c892a52cc6241ed6f4a43949114cf19a9648f56a212f471","linux/amd64":"https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Linux_x86_64.tar.gz?checksum=sha256:043793233827cb948714d8d9f0196a4d574195c90d7e8ac85c06220fdec39df2","linux/arm64":"https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Linux_arm64.tar.gz?checksum=sha256:728940e53a9706d286480f55d6f033f8345b82e3788710490aac8cd79b44bdcd","windows/amd64":"https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Windows_x86_64.zip?checksum=sha256:1865dad6ff10b0830f2ef2230bce6f9b4aadbf09bc4b371175552d101201b030"}}`

**Don't panic** - The Chain will be paused to allow the majority of validators to upgrade. Validators and full node hosts will have to upgrade your Cronos POS Chain nodes to the latest release binary.

### Backups

Before the upgrade, validators are encouraged to take a complete data snapshot. Snapshotting depends heavily on infrastructure, but generally, we can do this by backing up the `.chain-maind` directory.

It is critically important for validator operators to back-up the `.chain-maind/data/priv_validator_state.json` file after stopping the `chain-maind` process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing if the upgrade fails and the previous chain needs to be restarted.

## Step 1 - Get the `v3.3.2` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Windows_x86_64.zip) are also available.

* Terminate the `chain-maind`; afterward, download the `3.3.2` released binaries from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.2/chain-main_3.3.2_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_3.3.2_Linux_x86_64.tar.gz
  ```

  <br>

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>Remarks</strong>: If you have stated <code>chain-maind</code> with <em>systemd</em> service, kindly stop it by</p><pre class="language-bash"><code class="lang-bash">$ sudo systemctl stop chain-maind
  </code></pre><p>And replace the binary in the location where the <code>ExecStart</code> states in Systemd Unit file.</p></div>

### Step 1.1 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `3.3.2`.

```bash
# check the version of chain-maind
$ ./chain-maind version
3.3.2
```

## Step 2. - Run everything

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
  $ ./chain-maind start
```

{% hint style="info" %}
**Remarks:**\
Once the `chain-maind` is started we would see the message

```
applying upgrade "v3.0.0" at height: 3526800"
```

and there will be an iteration over the previous blockchain data. This process will take a while (could be up to hours) which is depending on the size of the database and the hardware specs.&#x20;
{% endhint %}

Afterwards, sit back and wait for the syncing process. You can query the node syncing status by

```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

At this step, you've successfully performed the new binary upgrade!


# The "Canis Major" upgrade guide (v1.\* to v2.0.1) at block height 922,363:

For a full overview of the latest upgrades, please refer to "[Notes on network upgrades](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet#step-0-notes-on-network-upgrades)".

{% hint style="warning" %}
**Warning**:

The chain-maind `v2.0.1` - Canis Major upgrade is completed at block height `922,363`
{% endhint %}

For those who want to enjoy the automatic upgrade managed by [cosmovisor](https://docs.cosmos.network/main/build/tooling/cosmovisor), please follow this [cosmovisor guide](https://docs.cosmos.network/v0.46/run-node/cosmovisor.html#detecting-upgrades) for the coming "Canis Major" network upgrade. Otherwise, please continue below manual upgrade steps.

## Step 0 - Don't panic

Once you have started syncing the blockchain from block `1` by using `v1.*` binary, at the point of reaching block height `922,363`, user will see the following error message on the `chain-maind`:

`ERR UPGRADE "v2.0.0" NEEDED at time: 2021-06-01T23:59:00Z: {"binaries":{"darwin/amd64":"https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Darwin_x86_64.tar.gz?checksum=sha256:a4d51bf98350c7ecbb5e6bab192c9cac2f4059754e5507d2a1970a8a5488c74a","darwin/arm64":"https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Darwin_arm64.tar.gz?checksum=sha256:eb6274724eab1957a7b708a5a0887de9f213d053841fb58041f697e13728a454","linux/amd64":"https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Linux_x86_64.tar.gz?checksum=sha256:5e9e9f703cb85c72573086e384e187e752463b2ed0ccd612094a1f29a13f0158","linux/arm64":"https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Linux_arm64.tar.gz?checksum=sha256:345c7eacfc768df355c3b3ecadc9cc39e3c1656c9c0c4d465b938834fa66ff03","windows/amd64":"https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Windows_x86_64.zip?checksum=sha256:07b06382397df49774788ec06a5c9d0bf7e28ddb7b1dd91abdb35174bce49a31"}}`

Validators and full node hosts will have to upgrade your Cronos POS Chain nodes to the `v2.0.1` binary.

## Step 1 - Get the `v2.0.1` binary

To simplify the following step, we will be using **Linux** for illustration. Binary for [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Windows_x86_64.zip) are also available.

* Terminate the `chain-maind`; afterwards, download the `v2.0.1` released binaries from github:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_2.0.1_Linux_x86_64.tar.gz
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>Remarks</strong>: If you have stated <code>chain-maind</code> with <em>systemd</em> service, kindly stop it by</p><pre class="language-bash"><code class="lang-bash">$ sudo systemctl stop chain-maind
  </code></pre><p>And replace the binary in the location where the <code>ExecStart</code> states in Systemd Unit file.</p></div>

* For [homebrew](https://github.com/crypto-org-chain/homebrew-chain-maind#chain-maind-homebrew-tap) users, simply run

  ```bash
  $ brew upgrade chain-maind
  ```

### Step 1.1 - Verify the version

You can verify the installation by checking the version of `chain-maind`, the latest version is `2.0.1`.

```bash
# check the version of chain-maind
$ ./chain-maind version
2.0.1
```

## Step 2. - Run everything

We are ready to start the node join the network again with the new binary:

* Start `chain-maind`, e.g.:

```bash
  $ ./chain-maind start
```

Sit back and wait for the syncing process. You can query the node syncing status by

```bash
$ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
```

If the above command returns `false`, it means that your node **is synced**; otherwise, it returns `true` and implies your node is still catching up.

## Getting ready - "DRACO II" second netwrok upgrade

At last step, you've successfully performed the **"Canis Major"** binary upgrade! Allow sometime for the node to catch up, meanwhile, you can get ready for **"DRACO II"** ,the second network upgrade ( from `v2.*` to `v3.1.1` at block height `2,472,800` ) by following this [guide](/for-node-hosts/getting-started/mainnet/upgrade-guide/upgrade_guide_draco_2).


# Running "Canis Major" network upgrade with cosmovisor

{% hint style="warning" %}
**Warning**:

It is recommended that cosmovisor is better to be used on full nodes rather than validators as currently there's a potential race condition: [cosmos/cosmos-sdk#9384](https://github.com/cosmos/cosmos-sdk/pull/9384)
{% endhint %}

## Step 0 - Install cosmosviosr

One can follow this [link](https://docs.cosmos.network/main/build/tooling/cosmovisor) to install.

Alternatively, run the below commands instead

```
$ git clone https://github.com/cosmos/cosmos-sdk.git
$ cd cosmos-sdk/cosmovisor
$ make cosmovisor
```

## Step 1 - Set up Environment Variables

Set your [Environment Variables](https://docs.cosmos.network/main/build/tooling/cosmovisor) for cosmovisor to run

```
export DAEMON_NAME=chain-maind
export DAEMON_HOME=/home/ubuntu/.chain-maind
export DAEMON_RESTART_AFTER_UPGRADE=true
export DAEMON_ALLOW_DOWNLOAD_BINARIES=true
export DAEMON_LOG_BUFFER_SIZE=512
```

### Step 1.1 - Create cosmovisor folder structure

One can follow this [folder structure](https://docs.cosmos.network/main/build/tooling/cosmovisor)

```
.chain-maind/
├── config
│ 
├── cosmovisor
│   ├── current -> genesis or upgrades/v3.3.0
│   ├── genesis
│   │   └── bin
│   │       └── chain-maind
│   └── upgrades
│       └── v3.3.0
│           └── bin
│               └── chain-maind
└── data
```

For `.chain-maind/cosmovisor/genesis/bin/chain-maind`, it is the binary before the upgrade proceeds. In our case of the "DRACO II" upgrade, it should be chain-maind with version `2.*`. Kindly have this binary ready before running cosmovisor.

## Step 2. - Run everything

* Start `cosmovisor`, e.g.:

```bash
$ ./cosmovisor start
```

Since we enable `DAEMON_ALLOW_DOWNLOAD_BINARIES=true`, cosmovisor will automatically download binary with `3.3.1` in `./cosmovisor/upgrades/v2.0.0/bin/chain-maind` and update `./cosmovisor/current` directory symlink to `upgrades/v3.3.0` instead when proposed upgrade log is found. cosmovisor will create `./cosmovisor/upgrades/v3.3.0/bin/chain-maind` for you.

{% hint style="info" %}
**Important**: If one doesn't want to enable `DAEMON_ALLOW_DOWNLOAD_BINARIES`, one should prepare `./cosmovisor/upgrades/v3.3.0/bin/chain-maind` manually before upgrade time. [Linux](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.0/chain-main_3.3.0_Linux_x86_64.tar.gz), [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.0/chain-main_3.3.0_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.0/chain-main_3.3.0_Windows_x86_64.zip) are also available.
{% endhint %}

{% hint style="info" %}
**Tip**: Example of running cosmovisor with systemd

```toml
# /lib/systemd/system/chain-maind.service
[Unit]
Description=Chain-maind
ConditionPathExists=/chain/bin/cosmovisor
After=network.target

[Service]
Type=simple
User=crypto
Group=crypto
LimitNOFILE=12288

Restart=always
RestartSec=10

Environment="DAEMON_NAME=chain-maind"
Environment="DAEMON_HOME=/chain/.chain-maind"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=true"
Environment="DAEMON_LOG_BUFFER_SIZE=512"

WorkingDirectory=/chain/bin
ExecStart=/chain/bin/cosmovisor start --home /chain/.chain-maind

# make sure log directory exists and owned by syslog
PermissionsStartOnly=true

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=chain-maind

TimeoutStartSec=3min

[Install]
WantedBy=multi-user.target
```

{% endhint %}


# Cronos POS Snapshots

To streamline the node setup process and reduce sync times, Cronos supports multiple snapshot and sync methods, both **officially provided by the Cronos Labs** and supported by **ecosystem partners**. These options allow node operators to start from a recent blockchain state without syncing from the genesis block.

This section provides an overview of the various sync methods available and guidance on using each.

### Cronos POS Snapshot Options

{% content-ref url="/pages/T3FN3lLci9XDE4litFDE" %}
[Native Snapshots](/for-node-hosts/getting-started/cronos-pos-snapshots/native-snapshots)
{% endcontent-ref %}

{% content-ref url="/pages/nj5UoyytPs04gAGPl9ee" %}
[Public Node Sync](/for-node-hosts/getting-started/cronos-pos-snapshots/public-node-sync)
{% endcontent-ref %}


# Native Snapshots

Fast, reliable blockchain snapshots for Cronos networks

### Introduction

Setting up a new Cronos node traditionally requires synchronizing with the entire blockchain database from the genesis block—a process that can take days or even weeks depending on your hardware and network conditions. To address this challenge and accelerate node deployment, the Cronos team maintains pre-synchronized blockchain snapshots that dramatically reduce setup time.

### What Are Snapshots?

Blockchain snapshots are compressed archives containing the complete blockchain state at a specific block height. Instead of downloading and verifying every transaction since genesis, you can restore your node from a recent snapshot and only sync the remaining blocks.

Cronos POS snapshots are available for:

* **Cronos POS Mainnet** with LevelDB backend in default configuration
* **Default nodes**: Standard configuration containing recent state data for typical node operations

### Benefits

Using Cronos snapshots provides several key advantages:

* **Faster deployment**: Reduce initial sync time from days to hours
* **Lower bandwidth usage**: Download a single compressed file instead of syncing block-by-block
* **Quick network participation**: Get your node operational and contributing to the network rapidly
* **Reduced resource consumption**: Less CPU and disk I/O during the initial setup phase

### Getting Started

All Cronos POS snapshots can be accessed at: [**https://snapshot.cronos.org/**](https://snapshot.cronos.org/)

### Installation Guide  <a href="#step-1-quicksync-download" id="step-1-quicksync-download"></a>

Before using snapshots, you'll need to install the Cronos binary. Follow these steps to get started:

1. Create a new directory and navigate to it:

```
mkdir cronos-pos-node
cd cronos-pos-node
```

2. Download the latest Cronos Binary release ([Github repo](https://github.com/crypto-org-chain/chain-main/releases/)):

{% code overflow="wrap" %}

```
curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/tag/v6.0.1
```

{% endcode %}

3. Unpack & Install the binary files. This step will create a hidden folder named `.chain-maind` in your root directory.

```
tar -zxvf crypto-org-chain/chain-main/releases/tag/v6.0.1
```

{% hint style="info" %}
**Note:** Pre-requisite: gnu-tar and lz4\
`brew install gnu-tar lz4`
{% endhint %}

4. Verify the installation:

```
# check the version of chain-maind
cd bin
./chain-maind version
6.0.1
```

Once the Cronos binary is installed and verified, you can proceed with downloading and applying the appropriate snapshot for your node configuration.

### Download Cronos POS Snapshot

{% code overflow="wrap" %}

```
wget https://snapshot.cronos.org/cronos-pos/mainnet-snapshot/leveldb/default/crypto-org-chain-mainnet-1_leveldb-default-20250807.tar.lz4
```

{% endcode %}

### Unpack Cronos POS Snapshot

Copy or Move the snapshot into the hidden `.chain-maind` directory in the root. Then unpack the file:

```
mv crypto-org-chain-mainnet-1_leveldb-default-20250807.tar.lz4 ~/.chain.maind
tar -zxvf crypto-org-chain-mainnet-1_leveldb-default-20250807.tar.lz4
```

The original `data`  folder under `.chain-maind` is overwritten. It takes around a few mins to decompress.

### Initialize `chain-maind`

Initialize your Cronos POS node with a unique identifier (moniker):

```
./chain-maind init [moniker] --chain-id crypto-org-chain-mainnet-1
```

The `moniker` serves as your node's display name when it appears on the Cronos POS Chain network. Choose a unique, descriptive name for easy identification. Make sure to replace `[moniker]` with your desired node name without the square brackets.

### Configure `chain-maind`

1. Download and replace the Cronos POS Chain mainnet `genesis.json` :

{% code overflow="wrap" %}

```
curl https://raw.githubusercontent.com/crypto-org-chain/mainnet/main/crypto-org-chain-mainnet-1/genesis.json > ~/.chain-maind/config/genesis.json
```

{% endcode %}

2. Verify sha256sum checksum of the downloaded `genesis.json`. You should see `OK!` if the sha256sum checksum matches.

```
$ if [[ $(sha256sum ~/.chain-maind/config/genesis.json | awk '{print $1}') = "d299dcfee6ae29ca280006eaa065799552b88b978e423f9ec3d8ab531873d882" ]]; then echo "OK"; else echo "MISMATCHED"; fi;
OK!
```

{% hint style="info" %}
**Note**: For Mac environment, `sha256sum` was not installed by default. In this case, you may setup `sha256sum` with this command:

`function sha256sum() { shasum -a 256 "$@" ; } && export -f sha256sum`
{% endhint %}

3. In `~/.chain-maind/config/app.toml`, update minimum gas price to avoid [transaction spamming](https://github.com/cosmos/cosmos-sdk/issues/4527)

{% code overflow="wrap" %}

```
sed -i.bak -E 's#^(minimum-gas-prices[[:space:]]+=[[:space:]]+)""$#\1"0.025basecro"#' ~/.chain-maind/config/app.toml
```

{% endcode %}

{% hint style="info" %}
**Reminder**: The list of the `seed` is subject to change, you can also find the latest seed to connect [here](https://github.com/crypto-org-chain/mainnet#seed-nodes).
{% endhint %}

### Start the Node

Once the `chain-maind` has been configured, the node is ready to start synchronization with the blockchain:

```
./chain-maind start
```


# Snapshot Downloader

The Snapshot Downloader is a Rust-based automation tool that downloads a blockchain binary, snapshot (single or multi-part), and address book, then automatically extracts the binary and snapshot, initializes the node, merges custom settings into <mark style="color:orange;">`app.toml`</mark> and <mark style="color:orange;">`config.toml`</mark>, and starts the chain. \
It also provides lifecycle hooks to execute commands at different stages (post-download, post-extraction, post-start).

This guide walks you through the installation, setup, and configuration of the Snapshot Downloader for running a Cronos node. Follow the steps in order, adapting to your hardware setup (e.g. number of disks).

### Environment Setup&#x20;

The tool works best on Linux with Btrfs, as the tool leverages Btrfs subvolumes for efficient snapshot handling. On Linux, users can manually create snapshots of subvolumes and roll back to previous states if needed.

On macOS and Windows, the downloader still supports snapshot download, extraction, and node start, but Btrfs-specific snapshot and rollback features are unavailable.&#x20;

**Note:** \
On Windows, it requires a Unix-compatible shell (e.g., Git Bash) to run the tool.

<details>

<summary><strong>Linux Only – Btrfs Setup</strong></summary>

#### Install `btrfs-progs`

```sh
sudo apt install -y btrfs-progs
```

#### Format and Mount Disk(s)

Choose one of the below according to the number of additional disk(s) mounted.

**Format and Mount 2 Disks**

```sh
sudo parted /dev/nvme0n2 -- mklabel gpt
sudo parted /dev/nvme0n2 -- mkpart downloads btrfs 0% 100%
sudo mkfs.btrfs /dev/nvme0n2p1
sudo parted /dev/nvme0n3 -- mklabel gpt
sudo parted /dev/nvme0n3 -- mkpart chain-data btrfs 0% 100%
sudo mkfs.btrfs /dev/nvme0n3p1
mkdir -p ~/test
sudo mount /dev/nvme0n3p1 ~/test
sudo btrfs sub create ~/test/data
sudo btrfs sub create ~/test/data/.snapshots
```

```sh
mkdir -p ~/.snapshot-downloader/downloads
mkdir -p ~/.snapshot-downloader/workspace/home/data
```

```sh
sudo mount /dev/nvme0n2p1 ~/.snapshot-downloader/downloads
sudo mount -osubvol=data /dev/nvme0n3p1 ~/.snapshot-downloader/workspace/home/data
sudo chown -R $USER ~/.snapshot-downloader/downloads
sudo chown -R 1001:1002 ~/.snapshot-downloader/workspace/home/data
```

**Format and Mount 1 Disk**

```sh
sudo parted /dev/nvme0n2 -- mklabel gpt
sudo parted /dev/nvme0n2 -- mkpart downloads btrfs 0% 100%
sudo mkfs.btrfs /dev/nvme0n2p1
```

```sh
mkdir -p ~/.snapshot-downloader
```

```sh
sudo mount /dev/nvme0n2p1 ~/.snapshot-downloader
sudo chown -R $USER ~/.snapshot-downloader
```

#### Resize Disk (Optional)

```sh
sudo growpart /dev/nvme0n3 1
sudo btrfs filesystem resize max ~/.snapshot-downloader/workspace/home/data
```

</details>

### Dependencies Installation

Install Rust using the official installer.

```sh
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ . "$HOME/.cargo/env"
```

Install other dependencies needed for building Rust projects.

```sh
$ sudo apt install -y gcc libssl-dev pkg-config
```

### Build Snapshot Downloader

```sh
$ git clone https://github.com/whs-dot-hk/snapshot-downloader2.git
$ cd snapshot-downloader2
$ cargo build
```

### Configure Snapshot Downloader `config.yaml`

The tool supports single-file or multi-part snapshots, custom lifecycle hooks, and TOML overrides for node configuration.

#### Choose Snapshot

Checkout the latest snapshots at <https://snapshot.cronos.org/?chain=cronos-pos>

#### Update DB Settings

In `snapshot-downloader2/config.yaml`, under the `app_yaml` and `config_yaml` sections, update the database settings according to the target snapshot database type and pruning type, along with any other desired configurations. Follow the same pattern as:

```
[file_yaml]:
    [section]:
        name: "value"
```

Below are examples of each database with pruning type `Default` , overriding  `minimum-gas-prices` and `persistent_peers`.

{% tabs %}
{% tab title="GolevelDB" %}

```
app_yaml:
  minimum-gas-prices: "0.025basecro"
  pruning: "nothing"
  app-db-backend: "goleveldb"

config_yaml:
  db_backend: "goleveldb"
  p2p:
    persistent_peers: "986a5ab3f6c397de5984c6b5e5bb87997dcbc4cf@3.0.132.213:26656"
```

{% endtab %}

{% tab title="RocksDB" %}

```
app_yaml:
  minimum-gas-prices: "0.025basecro"
  pruning: "nothing"
  app-db-backend: "rocksdb"

config_yaml:
  db_backend: "rocksdb"
  p2p:
    persistent_peers: "986a5ab3f6c397de5984c6b5e5bb87997dcbc4cf@3.0.132.213:26656"
```

{% endtab %}

{% tab title="VersionDB" %}

```
app_yaml:
  minimum-gas-prices: "0.025basecro"
  pruning: "nothing"
  app-db-backend: "rocksdb"
  versiondb:
    enable: true

config_yaml:
  db_backend: "rocksdb"
  p2p:
    persistent_peers: "986a5ab3f6c397de5984c6b5e5bb87997dcbc4cf@3.0.132.213:26656"
```

{% endtab %}

{% tab title="VersionDB Memiavl" %}

```
app_yaml:
  minimum-gas-prices: "0.025basecro"
  pruning: "nothing"
  app-db-backend: "rocksdb"
  versiondb:
    enable: true
  memiavl:
    enable: true
    async-commit-buffer: 3

config_yaml:
  db_backend: "rocksdb"
  p2p:
    persistent_peers: "986a5ab3f6c397de5984c6b5e5bb87997dcbc4cf@3.0.132.213:26656"
```

{% endtab %}
{% endtabs %}

#### Full Config Example

Below is the example of `snapshot-downloader2/config.yaml` for Cronos POS. Update URLs, chain IDs, and settings as needed for the latest snapshots and binaries.

* **Cronos POS Mainnet Example**&#x20;

  This example uses a single file snapshot for the Cronos EVM chain.

  ```
  # Snapshot Downloader Configuration

  # URL for the snapshot to download (for single file snapshots)
  snapshot_url: "https://snapshots.publicnode.com/cronos-pos-pruned-24836847-24836857.tar.lz4"

  # URLs for multi-part snapshots (alternative to snapshot_url)
  # If snapshot_urls is provided, it will be used instead of snapshot_url
  # snapshot_urls:
  #   - "https://example.com/cosmos-snapshot.part001.tar.gz"
  #   - "https://example.com/cosmos-snapshot.part002.tar.gz"
  #   - "https://example.com/cosmos-snapshot.part003.tar.gz"

  # Final filename for multi-part snapshots (REQUIRED when using snapshot_urls)
  # This specifies what the final concatenated file should be called
  # snapshot_filename: "cosmos-snapshot.tar.gz"

  # URL for the binary to download
  binary_url: "https://github.com/crypto-org-chain/chain-main/releases/download/v6.0.0-2/chain-main_6.0.0-2_Linux_arm64.tar.gz"

  # Relative path to the binary within the workspace directory
  # This is used to locate the binary after extraction
  binary_relative_path: "bin/chain-maind"

  # Chain ID for the Cosmos network
  chain_id: "crypto-org-chain-mainnet-1"

  # Moniker (node name) to use when initializing
  moniker: "my-cosmos-node"

  # Custom home directory for the chain (optional)
  # If not specified, defaults to ~/.snapshot-downloader/workspace/home
  # chain_home_dir: "/mnt/data/cosmos-home"

  # URL for the addrbook.json file (optional)
  # If specified, this file will be downloaded and placed in the config directory
  # addrbook_url: "https://example.com/addrbook.json"

  # Command to execute after snapshot extraction (optional)
  # This will only run if a snapshot is successfully extracted
  post_snapshot_command: "echo 'Snapshot extraction completed'"

  # Command to execute after cosmos node starts and specific pattern is detected (optional)
  # This will run after the node starts and the post_start_pattern is found in the output
  # post_start_command: "echo 'Node started and pattern detected'"

  # Pattern to search for in cosmos node output (optional)
  # When this pattern is found in the node output, the post_start_command will be executed
  # Can be any message you want to wait for after node startup
  # post_start_pattern: "committed state"

  # Whether to stop the cosmos node and exit the program after executing post_start_command (optional)
  # If true, the cosmos node will be terminated and the program will exit after post_start_command completes
  # stop_after_post_start: false

  # Configuration overrides for app.toml
  # These values will be merged with the existing app.toml file
  app_yaml:
    minimum-gas-prices: "0.025basecro"
    pruning: "nothing"

  # Configuration overrides for config.toml
  # These values will be merged with the existing config.toml file
  config_yaml:
    p2p:
      persistent_peers: "986a5ab3f6c397de5984c6b5e5bb87997dcbc4cf@3.0.132.213:26656"
  ```

### Running the Tool

Once configured, run the tool with:

```sh
$ cargo run
```

Monitor the output for progress. The tool will handle downloads, extractions, initialization, and startup. Use lifecycle hooks ( `post_snapshot_download_command` `post_snapshot_extract_command` and `post_start_command` ) for custom automation.

{% hint style="info" %}
To re-run the tool without re-downloading or re-extracting the snapshot, run:

```sh
$ cargo run --skip-download-snapshot --skip-extract-snapshot
```

{% endhint %}

For troubleshooting, check logs in the workspace directory or adjust retry settings in the config. Always verify snapshot and binary URLs from official sources for the latest versions.


# Public Node Sync

Newest snapshots for the Cronos Proof Of Steak (POS) Blockchain

## Introduction

[Public Node Snapshots](https://www.publicnode.com/snapshots#cronos) provided by blockchain infrastructure company [Allnodes](https://www.allnodes.com/) offer a streamlined solution for Cronos node operators looking to quickly sync with the Cronos POS network. These snapshots are available as one-time bulk downloads and significantly reduce initial setup time and bandwidth requirements for new nodes.

The snapshots provide are `pruned` data for both Cronos EVM and **Cronos POS** mainnet blockchains, optimized for file size and download speed. This guide walks you through the step-by-step process of performing a quick synchronization using Public Node Snapshots.

> **Note:** If you need complete blockchain history to operate a full archive node, Native Snapshots are the recommended alternatives.

### Step 1: Download Public Node Snapshot

Users can visit [Public Node Snapshots page](https://www.publicnode.com/snapshots#cronos) and Select "Cronos POS Chain" from the available options to download the preferred`.lz4` compressed snapshot file.

The snapshot file will be named similar to: `cronos-pos-pruned-[height-range].tar.lz4`&#x20;

### Step 2: Install Required Tools

To start with Public Node Sync, install the `LZ4` [compression tool](https://www.npmjs.com/package/lz4?activeTab=readme) by running `brew install lz4` in a new terminal.

### Step 3: Chain-maind Setup

#### Download and Install Chain-maind

1. Download the latest `chain-maind` binary from the [Cronos POS Chain GitHub repository](https://github.com/crypto-org-chain/chain-main/releases) based on your operating system.
2. Extract the downloaded file by `tar -zxvf chain-main_6.0.1_Darwin_arm64.tar.gz`\
   &#x20;\
   After you unzip the `chain-maind` to the location you desire. In terminal, change directory to the `bin` folder, where `chain-maind` is located.<br>
3. Verify Installation:

```bash
# check the version of chain-maind
cd bin
./chain-maind version
6.0.1
```

#### Initialize and Configure

1. I**nitialize** `chain-maind` (refer to the [initialization steps from the main documentation](https://docs.cronos-pos.org/for-node-hosts/getting-started/cronos-pos-snapshots/pages/A1gT72PFskm7CDzxAs8e#step-2.-configure-chain-maind))
2. Configure the node by editing the configuration file:

```bash
nano ~/.chain-maind/config/config.toml
```

Update the seed nodes with the latest available seeds (as the list of the seed is subject to change, check the official documentation for [current seed list](https://github.com/crypto-org-chain/mainnet#seed-nodes)). &#x20;

3. Start Chain-maind briefly to create the necessary directory structure:

```bash
./chain-maind start
```

Once you see the node syncing for a couple of blocks, terminate the process (Ctrl+C). OR, perform [Step 3.1 Run Everything](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator#step-3-1.-run-everything), terminate the terminal once `chainmaind` is able to sync for couple of blocks.

### Step 4: Extract Snapshot Data

After successfully initializing Chain-maind, you'll find the `.chain-maind` folder in your user directory.

1. Move the snapshot `lz4` file to the Chain-maind directory:

```bash
mv cronos-pos-pruned-18968897-18968907.tar.lz4 ~/.chain-maind/
```

2. Navigate to the Chain-maind directory:

```bash
cd ~/.chain-maind
```

3. Extract the snapshot data:

```bash
lz4 -d cronos-pos-pruned-18968897-18968907.tar.lz4 | tar -xv
```

{% hint style="info" %}
**Important:** All extracted files should be placed under `~/.chain-maind/data/`.
{% endhint %}

### Step 5: Start Your Synced Node

With the snapshot data extracted, `chain-maind` should now be updated to the latest height from the snapshot file.

Start your node:

```bash
./chain-maind start
```

### Conclusion

You are now running a synced Cronos POS mainnet node using the Public Node Snapshot. Your node will continue to sync from the snapshot height to the current network height, which should be much faster than syncing from genesis.


# QuickSync SnapShots

Newest snapshots for the Cronos Proof Of Steak (POS) Blockchain

## Introduction

Syncing Cronos POS Chain from genesis can be a time-consuming process. To make this more efficient for users, the Cronos team has partnered with [Chainlayer](https://chainlayer.io/) to provide the "[QuickSync](https://quicksync.io/cronos-pos)" service, which offers pre-synchronized blockchain snapshots with different pruning configurations.

QuickSync snapshots are available with three different pruning settings to match your specific use case:

* **Pruned** - Optimized for validators and sentry nodes with minimal storage requirements
* **Default** - Balanced option suitable for most use cases including API nodes
* **Archive** - Complete blockchain history for full API functionality

All snapshots use `LevelDB` and can be downloaded from: <https://quicksync.io/cronos-pos>

### Snapshot Types

#### Crypto-org-chain-mainnet-1-pruned

The **pruned** snapshot is the fastest way to get a node running and is ideal for validator or sentry nodes. This option has transaction indexing disabled to reduce disk space and download size, which means API queries cannot work backward in time. If you need API functionality, you can enable transaction indexing after startup, but you won't be able to query historical data from before your node started.

#### Crypto-org-chain-mainnet-1-default

The **default** snapshot provides a good balance for most use cases, including validators, sentry nodes, and API nodes. It has transaction indexing enabled, allowing you to query historical blocks. However, it doesn't include the complete history from chain genesis or previous chain upgrades.

#### Crypto-org-chain-mainnet-1-archive

The **archive** snapshot contains complete blockchain data from chain start with full indexing, making it perfect for API nodes requiring access to entire chain history. Note that archive nodes grow quickly in size and may be slower to operate compared to other options.

{% hint style="info" %}
Before starting the QuickSync process, install the LZ4 [compression tool](https://www.npmjs.com/package/lz4?activeTab=readme):\
`brew install lz4`
{% endhint %}

### Step 1: Chain-maind Setup

#### Download and Install Chain-maind

1. Download the latest **`chain-maind`** binary from the [Cronos POS Chain GitHub repository](https://github.com/crypto-org-chain/chain-main/releases) based on your operating system.
2. Extract the downloaded file:

```bash
tar -zxvf chain-main_4.2.9_Darwin_arm64.tar.gz
```

3. Verify installatio&#x6E;**:**

```bash
# check the version of chain-maind
cd bin
./chain-maind version
6.0.1
```

#### Initialize and Configure

1. Initialize Chain-maind (refer to the [initialization steps from the main documentation](https://docs.cronos-pos.org/for-node-hosts/getting-started/cronos-pos-snapshots/pages/A1gT72PFskm7CDzxAs8e#step-2-1.-initialize-chain-maind))
2. Configure the node in \`config.toml\`

```bash
nano ~/.chain-maind/config/config.toml
```

Update the seed nodes with the latest available seeds (check the official documentation for [current seed list](https://github.com/crypto-org-chain/mainnet#seed-nodes)).

3. Start Chain-maind briefly to create the necessary directory structure:

```bash
./chain-maind start
```

Once you see the node syncing for a couple of blocks, terminate the process (Ctrl+C).

### Step 2: Download QuickSync Snapshot

1. Visit the QuickSync page: <https://quicksync.io/cronos-pos>
2. Select your preferred snapshot type based on your use case requirements
3. Download the snapshot file (example filename: `crypto-org-chain-mainnet-1-pruned.20220323.2110.tar.lz4`)

### Step 3: QuickSync Setup

Optional: Download Address Book

For faster peer connections, you can download an address book:

1. Download the address book from the QuickSync page
2. Place the `addrbook.json` file in your `~/.chain-maind/config/` folder
3. Restart your node to apply the new address book

#### Extract the Snapshot

1. Move the downloaded snapshot to your Chain-maind directory:

```bash
mv crypto-org-chain-mainnet-1-pruned.20220323.2110.tar.lz4 ~/.chain-maind/
```

2. Navigate to the Chain-maind directory:

```bash
cd ~/.chain-maind
```

3. Extract the snapshot:

```bash
lz4 -d crypto-org-chain-mainnet-1-pruned.20220323.2110.tar.lz4 | tar -xv
```

Expected output during extraction:

```
x data/
x data/state.db/
x data/state.db/161915.ldb
x data/state.db/035015.ldb
...
x data/evidence.db/MANIFEST-000143
x data/evidence.db/000142.log
x data/priv_validator_state.json
```

{% hint style="info" %}
**Note:** The extraction process will overwrite your existing data folder. For the pruned version (approximately 47GB), extraction takes a few minutes.
{% endhint %}

### Step 4: Start Syncing with QuickSync

1. Navigate back to your Chain-maind binary directory
2. Start the node:

```bash
./chain-maind start
```

Your node will start syncing from the snapshot height. Expected output:

```
12:28PM INF starting ABCI with Tendermint
12:28PM INF Starting multiAppConn service impl=multiAppConn module=proxy
12:28PM INF Starting localClient service connection=query impl=localClient module=abci-client
...
12:28PM INF ABCI Handshake App Info height=5055406 module=consensus
12:28PM INF ABCI Replay Blocks appHeight=5055406 module=consensus stateHeight=5055406 storeHeight=5055406
```

### Conclusion

Your Cronos POS Chain node is now running with QuickSync! The node will continue syncing from the snapshot height to the current network height, significantly reducing the time required compared to syncing from genesis.


# Cronos POS Chain Mainnet Validator Security Checklist

## Part 1 - Conduct Survey on General Controls of Hosting Data Centre

Description: Perform a survey on the hosting data centre, and compare your result with the best practice suggested below

For example, your hosting data centre should have the following features

| Controls Category | Description of Best Practice    |
| ----------------- | ------------------------------- |
| Data Center       | Redundant Power                 |
| Data Center       | Redundant Cooling               |
| Data Center       | Redundant Networking            |
| Data Center       | Physical Cage/Gated Access      |
| Data Center       | Remote Alerting Security Camera |

## Part 2 - Current Status of Node Setup

Description: Perform a survey on your current status of node setup, and compare your result with the best practice suggested below

| Controls Category                       | Description of Best Practice                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| General System Security                 | Operating system appropriately patched. Kernel is updated to latest stable version. The node should be operated in x86\_64 environment                                                                                                                                                                                                                                                                                                                                                                                                  |
| General System Security                 | Auto-updates for operation system is configured. Toolkit for automatic upgrades exists (e.g. auter, yum-cron, dnf-automatic, unattended-upgrades)                                                                                                                                                                                                                                                                                                                                                                                       |
| General System Security                 | Security framework enabled and enforcing. SELinux / AppArmor / Tomoyo / Grsecurity Enabled.                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| General System Security                 | No insecure and unnecessary services Installed. (e.g. telnet, rsh, inetd, etc ...)                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| General System Security                 | GRUB boot loader password is configured. Grub2 configured with password                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| General System Security                 | Only root permissions on core system files                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| Mainnet related File Directory Security | Secure the directory `~/.chain-maind` to be accessible by owner only                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Mainnet Binary Configuration            | Recommed the following settings in config.toml for both performance and security - For sentry nodes: `max_num_inbound_peers = 500, max_num_outbound_peers = 50, flush_throttle_timeout = "300ms"` - For validator node: `max_num_inbound_peers = 100, max_num_outbound_peers = 10, flush_throttle_timeout = "100ms"`                                                                                                                                                                                                                    |
| Account Security & Remote Access        | Following Pasword policies are enforeced: No Blank Passwords; Weak Passwords Not Allowed                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| Account Security & Remote Access        | Following SSH configurations are enabled: PermitRootLogin: `no`; PasswordAuthentication `no`; ChallengeResponseAuthentication `no`; UsePAM `yes`; AllowUsers `Neccesary user only`; AllowGroups `Neccesary group only`.                                                                                                                                                                                                                                                                                                                 |
| Networking                              | Network throughput test using speedtest. Recommend to have at least 5 Mbps upload, 5 Mbps download)                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| Networking                              | Host-based (e.g. iptables) or cloud-based (e.g. AWS Security Group) firewall is enabled to protect all the involved nodes. Remote management ports (e.g. SSH - TCP 22) should only be exposed to selected IP instead of the internet. No overly permissive rules (e.g. wide range of allowed ports 1-65535) should be set. For internal communication channels between nodes, they should be set with specific source and destination addresses. For internet reachable nodes, set TCP 26656 to be the only incoming port, if possible. |
| Networking                              | Intrusion Detection / Prevention System (e.g. Fail2Ban, Snort, OSSEC) is installed and enforcing                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Networking                              | Setup sentry node architecture to protect validator node, and set firewall rules to restrict direct internet access to it.                                                                                                                                                                                                                                                                                                                                                                                                              |
| Networking                              | The Remote Procedure Call (RPC) provides sensitive operations and information that is not supposed to be exposed to the Internet. By default, RPC is on and allow connection from 127.0.0.1 only. Please be extremely careful if you need to allow RPC from other IP addresses.                                                                                                                                                                                                                                                         |
| Redundancy                              | Hot standby node is setup with the same configuration as main node                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| Redundancy                              | System monitoring and alerting is setup to alert owners on anormalies                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| Key Managment                           | Setup Tendermint KMS with HSM or equivalent online service, which should replace the static key file.                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| DDOS                                    | Setup validator in accordance with sentry architecture. Kindly refer to the setup [instruction](https://docs.tendermint.com/v0.34/tendermint-core/validators.html#sentry-node-configuration) and [detailed description](https://forum.cosmos.network/t/sentry-node-architecture-overview/454).                                                                                                                                                                                                                                          |


# Croeseid Testnet: Running Nodes

The latest Cronos POS Chain Testnet has been named as **Croeseid**.

This is detailed documentation for setting up a Validator or a full node on Croeseid testnet `testnet-croeseid-4`.

## Pre-requisites

### Supported OS

We officially support macOS, Windows and Linux only. Other platforms may work but there is no guarantee. We will extend our support to other platforms after we have stabilized our current architecture.

### Prepare your machine

To run Cronos POS Chain nodes in the testnet, you will need a machine with the following minimum requirements to run different types of nodes:

Archive Node (setting pruning = nothing)

* RAM: 16GB (goleveldb)
* Disk: 900GB
* CPU: 4 cores

Default Full Node (setting pruning = default)

* RAM 16GB (goleveldb)
* Disk: 150GB (Depends on how long the node is running for)
* CPU: 4 cores

## Step 0: Notes on network upgrades

For those that would like to build a **Run a Full Node with complete blockchain data** from scratch, note that there were several breaking network upgrades, requiring upgrading at designated block heights below:

| Block height    | Binary Version              | Instruction                                                                       |
| --------------- | --------------------------- | --------------------------------------------------------------------------------- |
| `1 - 8,302,700` | `chain-main_3.1.0-croeseid` | Start with this version.                                                          |
| `>`8,302,700    | `chain-main_4.2.2-croeseid` | When it reaches the target block height `8,302,700` update the binary and restart |

IMPORTANT: If you are not able to perform this upgrades, you can also request a testnet archive snapshot from us

## Step 1. Get the Cronos POS Chain testnet binary

{% hint style="info" %}
**Remarks**: The following is the minimal setup for a **validator node**.
{% endhint %}

{% hint style="info" %}
**Reminder**: The binary for *testnet* and the binary for *mainnet* are two **different** binaries. Please make sure you are using the correct binary.
{% endhint %}

To simplify the following step, we will be using **Linux** (Intel x86) for illustration. Binary for **Mac** ([Intel x86](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Darwin_x86_64.tar.gz) / [M1](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Darwin_arm64.tar.gz)) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Windows_x86_64.zip) are also available.

* To install Cronos POS Chain released **testnet binaries** from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_3.1.0-croeseid_Linux_x86_64.tar.gz
  ```
* You can verify the installation by checking the version of the chain-maind, the current version is `3.1.0-croeseid.`

{% hint style="info" %}
**Reminder**: For macOS users: the binary is not signed, you have to follow the steps [here](https://support.apple.com/en-hk/guide/mac-help/mh40616/mac) to make the binary runnable.

```
$./chain-maind version
3.1.0-croeseid
```

{% endhint %}

## Step 2. Configure `chain-maind`

Before kick-starting your node, we will have to configure your node so that it connects to the Croeseid testnet:

### Step 2-0 (Optional) Clean up the old blockchain data

* If you have joined `testnet-croeseid-3` before, you would have to clean up the old blockchain data and start over again, it can be done by running:

  ```bash
  $ ./chain-maind unsafe-reset-all
  ```

  and remove the old Genesis file by

  ```
  $ rm ~/.chain-maind/config/genesis.json
  ```
* You can not override the previous validator through `chain-maind init`. If you want to have a new validator, you need to manually remove the `priv_validator_key.json`:

  ```bash
  rm ~/.chain-maind/config/priv_validator_key.json
  ```

  Then, in Step 2-1, `chain-maind init` should help you to generate a new validator key file.

### Step 2-1 Initialize `chain-maind`

* First of all, you can initialize chain-maind by:

  ```bash
    $ ./chain-maind init [moniker] --chain-id testnet-croeseid-4
  ```

  This `moniker` will be the displayed ID of your node when connected to Cronos POS Chain network. When providing the moniker value, make sure you drop the square brackets since they are not needed. The example below shows how to initialize a node named `pegasus-node` :

  ```bash
    $ ./chain-maind init pegasus-node --chain-id testnet-croeseid-4
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong></p><ul><li>Depending on your chain-maind home setting, the chain-maind configuration will be initialized to that home directory. To simply the following steps, we will use the default chain-maind home directory <code>~/.chain-maind/</code> for illustration.</li><li>You can also put the <code>chain-maind</code> to your binary path and run it by <code>chain-maind</code></li></ul></div>

### Step 2-2 Configure chain-maind

* Download and replace the Croeseid Testnet `genesis.json` by:

  ```bash
  $ curl https://raw.githubusercontent.com/crypto-com/testnets/main/testnet-croeseid-4/genesis.json > ~/.chain-maind/config/genesis.json
  ```
* Verify sha256sum checksum of the downloaded `genesis.json`. You should see `OK!` if the sha256sum checksum matches.

  ```bash
  $ if [[ $(sha256sum ~/.chain-maind/config/genesis.json | awk '{print $1}') = "cf20fb923be3bc565e49a57e81a47ca969e8a973be7b3ed44e2734e369118b6c" ]]; then echo "OK"; else echo "MISMATCHED"; fi;

  OK!
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong></p><ul><li><p>For Mac environment, <code>sha256sum</code> was not installed by default. In this case, you may setup <code>sha256sum</code> with this command:</p><pre class="language-bash"><code class="lang-bash">function sha256sum() { shasum -a 256 "$@" ; } &#x26;&#x26; export -f sha256sum
  </code></pre></li></ul></div>
* In `~/.chain-maind/config/app.toml`, update minimum gas price to avoid [transaction spamming](https://github.com/cosmos/cosmos-sdk/issues/4527)

  ```bash
  $ sed -i.bak -E 's#^(minimum-gas-prices[[:space:]]+=[[:space:]]+)""$#\1"0.025basetcro"#' ~/.chain-maind/config/app.toml
  ```
* For network configuration, in `~/.chain-maind/config/config.toml`, please modify the configurations of `persistent_peers`, `create_empty_blocks_interval` and `timeout_commit` by:

  ```bash
  $ sed -i.bak -E 's#^(persistent_peers[[:space:]]+=[[:space:]]+).*$#\1"71d2a4727bf574d5d368c343e37edff00cd556b1@seed-0.testnet-croeseid-4.cronos-pos.org:26656,8af7c92277f3edce58aa828cf1026cfa74fd6569@seed-1.testnet-croeseid-4.cronos-pos.org:26656"#' ~/.chain-maind/config/config.toml
  $ sed -i.bak -E 's#^(create_empty_blocks_interval[[:space:]]+=[[:space:]]+).*$#\1"5s"#' ~/.chain-maind/config/config.toml
  $ sed -i.bak -E 's#^(timeout_commit[[:space:]]+=[[:space:]]+).*$#\1"2s"#' ~/.chain-main
  ```

**Note**: We suggest using `persistent_peers` instead of `seeds` for a stable state-sync experience.

### Step 2-3 Enable STATE-SYNC

[STATE-SYNC](https://docs.tendermint.com/v0.34/tendermint-core/state-sync.html) is supported in our testnet! 🎉

With state sync your node will download data related to the head or near the head of the chain and verify the data. This leads to drastically shorter times for joining a network for validators.

However, you should keep in mind that the block before state-sync `trust height` will not be queryable. So if you want to run a full node, better not use state-sync feature to ensure your node has every data on the blockchain network.

For **validator**, it will be amazingly fast to sync the near head of the chain and join the network.

Follow the below optional steps to enable state-sync.

* For state-sync configuration, in `~/.chain-maind/config/config.toml`, please modify the configurations of \[statesync] `enable`, `rpc_servers`, `trust_height` and `trust_hash` by:

  ```bash

  $ LATEST_HEIGHT=$(curl -s https://testnet-croeseid-4.crypto.org:26657/block | jq -r .result.block.header.height); \
  BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
  TRUST_HASH=$(curl -s "https://testnet-croeseid-4.crypto.org:26657/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

  $ sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
  s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"https://testnet-croeseid-4.crypto.org:26657,https://testnet-croeseid-4.crypto.org:26657\"| ; \
  s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
  s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \
  s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" ~/.chain-maind/config/config.toml
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong></p><ul><li>For Mac environment, if <code>jq</code> is missing, you may install it by: <code>brew install jq</code></li></ul></div>

## Step 3. Run everything

{% hint style="warning" %}
**CAUTION**&#x20;

This page only shows the minimal setup for a validator node.

Furthermore, you may want to run full nodes as sentries (see [Tendermint](https://docs.tendermint.com/master/tendermint-core/running-in-production.html)), restrict your validator connections to only connect to your full nodes, test secure storage of validator keys etc.
{% endhint %}

### Step 3-1. Create a new key and address

Run the following to create a new key. For example, you can create a key with the name `Default` by:

```bash
  $ ./chain-maind keys add Default
```

You should obtain an address with `tcro` prefix, e.g. `tcro1quw5r22pxy8znjtdkgqc65atrm3x5hg6vycm5n`. This will be the address for performing transactions.

### Step 3-2. Obtain test token

Unless you have obtained the CRO testnet token before, use the [tcro faucet](https://crypto.org/faucet) to obtain test CRO tokens. In case you have reached the daily limit on faucet airdrop, you can simply send a message on [Discord](https://discord.gg/pahqHz26q4) #request-tcro channel, stating who you are and your `tcro.....` address.

### Step 3-3. Obtain the validator public key

You can obtain your validator public key by:

```bash
  $ ./chain-maind tendermint show-validator
```

be The public key should in a json format, for example:

```bash
{
  "@type": "/cosmos.crypto.ed25519.PubKey",
  "key": "[The_validator_key]"
}
```

### Step 3-4. Run everything

Once the `chain-maind` has been configured, we are ready to start the node and sync the blockchain data:

* Start chain-maind, e.g.:

```bash
  $ ./chain-maind start
```

{% hint style="info" %}
**Remarks**: If you see errors saying `too many files opened...`, then you need to set a higher number for maximum open file descriptors in your OS.

If you are on OSX or Linux, then the following could be useful:

```bash
# Check current max fd
$ ulimit -n
# Set a new max fd
$ ulimit -Sn [NEW_MAX_FILE_DESCRIPTOR]
# Example
$ ulimit -Sn 4096 
```

{% endhint %}

* *(Optional for Linux)* Start chain-maind with systemd service, e.g.:

```bash
  $ git clone https://github.com/crypto-org-chain/chain-main.git && cd chain-main
  $ ./networks/create-service.sh
  $ sudo systemctl start chain-maind
  # view log
  $ journalctl -u chain-maind -f
```

{% hint style="info" %}
**Example**: /etc/systemd/system/chain-maind.service created by script

```
# /etc/systemd/system/chain-maind.service
[Unit]
Description=Chain-maind
ConditionPathExists=/usr/local/bin/chain-maind
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/chain-maind start --home /home/ubuntu/.chain-maind
Restart=on-failure
RestartSec=10
LimitNOFILE=50000

[Install]
WantedBy=multi-user.target
```

{% endhint %}

It should begin fetching blocks from the other peers. Please wait until it is fully synced before moving onto the next step.

* You can query the node syncing status by

  ```bash
  $ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
  ```

  If the above command returns `false`, It means that your node **is fully synced**; otherwise, it returns `true` and implies your node is still catching up.
* One can check the current block height by querying the public full node by:

  ```bash
  curl -s https://testnet-croeseid-4.crypto.org:26657/commit | jq "{height: .result.signed_header.header.height}"
  ```

  and you can check your node's progress (in terms of block height) by

  ```bash
  $ ./chain-maind status 2>&1 | jq '.SyncInfo.latest_block_height'
  ```

### Step 3-5. Send a `create-validator` transaction

Once the node is fully synced, we are now ready to send a `create-validator` transaction and join the network, for example:

```
$ ./chain-maind tx staking create-validator \
--from=[name_of_your_key] \
--amount=500000tcro \
--pubkey='{"@type":"/cosmos.crypto.ed25519.PubKey","key":"PUBLIC_KEY"}'  \
--security-contact="[security contact email/contact method]" \
--chain-id="testnet-croeseid-4" \
--commission-rate="0.10" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.01" \
--min-self-delegation="1" \
--gas 80000000 \
--gas-prices 0.1basetcro

{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator"...}
confirm transaction before signing and broadcasting [y/N]: y
```

You will be required to insert the following:

* `--from`: The `trco...` address that holds your funds;
* `--pubkey`: The validator public key( See Step [3-3](#step-3-3-obtain-the-validator-public-key) above );
* `--moniker`: A moniker (name) for your validator node;
* `--security-contact`: Security contact email/contact method.

### Step 3-6. Check your validator status

Once the `create-validator` transaction completes, you can check if your validator has been added to the validator set:

```bash
$ ./chain-maind tendermint show-address
## [tcrocnclcons... address] ##
$ ./chain-maind query tendermint-validator-set | grep -c [tcrocnclcons...]
## 1 = Yes; 0 = Not yet added ##
```

To further check if the validator is signing blocks, kindly run this [script](https://github.com/crypto-com/chain-docs/blob/master/docs/getting-started/assets/signature_checking/check-validator-up.sh), for example:

```bash
$ curl -sSL https://raw.githubusercontent.com/crypto-com/chain-docs/master/docs/getting-started/assets/signature_checking/check-validator-up.sh | bash -s -- \
--tendermint-url https://testnet-croeseid-4.crypto.org:26657 \
--pubkey $(cat ~/.chain-maind/config/priv_validator_key.json | jq -r '.pub_key.value')

The validator is in the active validator set under the address  <YOUR_VALIDATOR_ADDRESS>
The validator is signing @ Block#<BLOCK_HEIGHT> 👍
```

```bash
$ curl -sSL https://raw.githubusercontent.com/crypto-com/chain-docs/master/docs/getting-started/assets/signature_checking/check-validator-up.sh | bash -s -- \
--tendermint-url https://testnet-croeseid-4.crypto.org:26657 \
--bechpubkey [tcrocnclconspub1....]

The validator is in the active validator set under the address  <YOUR_VALIDATOR_ADDRESS>
The validator is signing @ Block#<BLOCK_HEIGHT> 👍
```

Alternatively, you can run it on this [browser based IDE](https://repl.it/@allthatjazzleo/cryptocomcheckNodeJoinStatus#main.go), by specifying your validator public key in the `"YOUR_PUBKEY"` field, where this key can be obtained by running

```bash
$ cat ~/.chain-maind/config/priv_validator_key.json | jq -r '.pub_key.value'
```

## Step 4. Perform Transactions

### Step 4-1. `query bank balances` - Check your transferable balance

You can check your *transferable* balance with the `balances` command under the bank module.&#x20;

{% hint style="info" %}
**Example**: Check your address balance

```bash
$ ./chain-maind query bank balances tcro1quw5r22pxy8znjtdkgqc65atrm3x5hg6vycm5n

balances:
- amount: "10005471622381693"
  denom: basetcro
pagination:
  next_key: null
  total: "0"

```

{% endhint %}

### Step 4-2. `tx bank send` - Transfer operation

Transfer operation involves the transfer of tokens between two addresses.

#### **Send Funds** \[`tx bank send <from_key_or_address> <to_address> <amount> <network_id>`]

{% hint style="info" %}
**Example**: Send 10tcro from one address to another.

```bash
$ ./chain-maind tx bank send Default tcro1j7pej8kplem4wt50p4hfvndhuw5jprxxn5625q 10tcro --chain-id "testnet-croeseid-4" --gas-prices 0.1basetcro
  ## Transaction payload##
  {"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address"....}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

### Step 4-3. `tx staking` - Staking operations

{% hint style="info" %}
**NOTE**

* To get the 'validator-addr' with bech32 prefix, you can run this command:

  ```bash
  ./chain-maind keys show Default --bech val
  ```

{% endhint %}

Staking operations involve the interaction between an address and a validator. It allows you to create a validator and lock/unlocking funds for staking purposes.

#### **Delegate your funds to a validator** \[`tx staking delegate <validator-addr> <amount>`]

To bond funds for staking, you can delegate funds to a validator by the `delegate` command

{% hint style="info" %}
**Example**: Delegate funds from `Default` to a validator under the address `tcrocncl16k...edcer`
{% endhint %}

```bash
$ ./chain-maind tx staking delegate tcrocncl16kqr009ptgken6qsxnzfnyjfsq6q97g3uedcer 100tcro --from Default --chain-id "testnet-croeseid-4" --gas-prices 0.1basetcro
## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgDelegate"....}
confirm transaction before signing and broadcasting [y/N]: y
```

#### **Unbond your delegated funds** \[`tx staking unbond <validator-addr> <amount>`]

On the other hand, we can create a `Unbond` transaction to unbond the delegated funds

**Example**: Unbond funds from a validator under the address `tcrocncl16k...edcer`

```bash
$ ./chain-maind tx staking unbond tcrocncl16kqr009ptgken6qsxnzfnyjfsq6q97g3uedcer 100tcro --from Default --chain-id "testnet-croeseid-4" --gas-prices 0.1basetcro
## Transaction payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgUndelegate"...}
confirm transaction before signing and broadcasting [y/N]: y
```

{% hint style="info" %}
Once your funds are unbonded, they will be locked until the `unbonding_time` has passed.
{% endhint %}

### Reward related transactions and queries

After you have delegated or created a validator, the reward will be accumulated, you can check/ withdraw it by:

#### `query distribution validator-outstanding-rewards` - Query un-withdrawn rewards for a validator

We can check the distribution outstanding (un-withdrawn) rewards for a validator and all of their delegations by operator address.

{% hint style="info" %}
**Example**: Check all outstanding rewards under the operator address `tcrocncl1...zrf8`

```bash
$ ./chain-maind q distribution validator-outstanding-rewards tcrocncl1kkqxv3szgh099xezt7y38t5anqzue4s326zrf8
  rewards:
  - amount: "1920761912.927067330419141688"
    denom: basetcro
```

{% endhint %}

#### `tx distribution validator-outstanding-rewards` - Query un-withdrawn rewards for a validator

We can check distribution outstanding (un-withdrawn) rewards for a validator and all of their delegations by their operator address.

{% hint style="info" %}
**Example**: Withdraw all outstanding under a delegation address:

```bash
$ ./chain-maind tx distribution withdraw-all-rewards --from [key_name] --chain-id "testnet-croeseid-4" --gas-prices 0.1basetcro

{"body":{"messages":[{"@type":"/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"...}]}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

### Slashing related transaction

### `tx slashing unjail` - Unjail a validator

Validator could be punished and jailed due to network misbehaviour, we can check the jailing status of a validator, for example:

```bash
$ ./chain-maind query staking validators -o json | jq
................................
      "operator_address": "tcrocncl1hct8ye56gk80qjxvrx299yu9v98aqaxe0y5kvg",
      "consensus_pubkey": {
        "@type": "/cosmos.crypto.ed25519.PubKey",
        "key": "P1/aHuScW5myVs+xH10R8yFT2u0wwaCKXfDKSuVTl60="
      },
      "jailed": true,
................................
```

Where `"jailed": true` implies that the validator has been jailed. After the jailing period has passed, one can broadcast a `unjail` transaction to unjail the validator and resume its normal operations by

```bash
$ ./chain-maind tx slashing unjail --from [key_name] --chain-id "testnet-croeseid-4" --gas-prices 0.1basetcro

  {"body":{"messages":[{"@type":"/cosmos.slashing.v1beta1.MsgUnjail"...}]}
  confirm transaction before signing and broadcasting [y/N]: y
```

Congratulations! You've successfully set up a Testnet node and performed some basic transactions! You may refer to [Wallet Management](https://docs.cronos-pos.org/for-users/wallets/cli#transactions-subcommands-chain-maind-tx) for more advanced operations and transactions.

## Croeseid testnet faucet and explorer

* You can lookup data within the `testnet-croeseid-4` network by the [explorer](https://crypto.org/explorer/croeseid4/);
* To interact with the blockchain, simply use the [test-token faucet](https://crypto.org/faucet) to obtain test CRO tokens for performing transactions on the **Croeseid** testnet.
  * Note that you will need to create an [address](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet#step-3-1.-create-a-new-key-and-address) before using the faucet.


# Mainnet/Testnet: Running Nodes using AWS 1-click Deployment

This tutorial will use our AWS 1-click Deployment image to start and create the latest Cronos POS Chain 1-Click Node for both Mainnet and Testnet

{% hint style="warning" %}
**CAUTION** We do not recommend directly running validator on Mainnet by 1-Click deployment. Please use it with caution! Because the 1-click deployment is not running with [TMKMS](https://github.com/iqlusioninc/tmkms) and your tendermint validator key is in plain text `/chain/.chain-maind/config/priv_validator_key.json`. You may consider running validator with [tmkms on AWS nitro-enclave](https://docs.cronos-pos.org/for-node-hosts/advanced-tmkms-integration).
{% endhint %}

## Step 1. AWS Account Creation

You will first need to create an [AWS](https://aws.amazon.com/) account. This will require providing your credit card information to `AWS` and you may be subject to getting charged when you create a virtual machine. More details on account creation, check this [link](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).

Please read `AWS` free trial [page](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank\&all-free-tier.sort-order=asc) to see if you are eligible for the free-tier.

## Step 2. Common Setup

### Step 2-0. Go to EC2 page and change the region

Sign in to your AWS account and go to EC2 Dashboard and change to your favourite region. Click "Launch Instance"

<figure><img src="/files/HvKw1NpMXcLJdSGZy8cW" alt="" width="563"><figcaption></figcaption></figure>

### Step 2-1. Search for Cronos POS Chain 1-Click Node on AWS Marketplace

Search for "Cronos POS Chain 1-Click Node" in **Choose an Amazon Machine Image (AMI)** section. Select "Cronos POS Chain 1-Click Node" from the search results.&#x20;

<figure><img src="/files/83NlQrAcbDget80Bwb40" alt="" width="563"><figcaption></figcaption></figure>

### Step 2-2. Choose an instance type

By default, it will choose the recommended instance type (**m5a.large**) for you. But you can choose another instance type based on [Mainnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator#pre-requisites)/[Testnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet) requirements.&#x20;

<figure><img src="/files/fWBTNhP2TsRpT5yiy0gU" alt="" width="563"><figcaption></figcaption></figure>

### Step 2-3. Configure instance details

<img src="/files/hoTX0SC9GVltxnPLCchK" alt="" width="563">

| Configuration           | Value                                                       |
| ----------------------- | ----------------------------------------------------------- |
| *Network*               | Select an existing one or default vpc if you don't have any |
| *Subnet*                | Choose a subnet or default subnet if you don't have any     |
| *Auto-assign Public IP* | Enable                                                      |
| *Other fields*          | Follow default setting                                      |

### Step 2-4. Add Storage

* Follow the default setting with `125` Throughput (MB/s)

### Step 2-5. Add Tags

* Create Tag if needed

### Step 2-6. Configure Security Group

By default, the image creates a new security group for you allowing ssh, p2p, rpc, and rest ports. You can remove the default opened rules or add more rules for example: grpc(9090), node\_exporter(9100), prometheus (26660), etc.

| Default Port                                                                                         | Description |
| ---------------------------------------------------------------------------------------------------- | ----------- |
| *22*                                                                                                 | ssh         |
| *26656*                                                                                              | p2p         |
| *26657*                                                                                              | rpc         |
| *1317*                                                                                               | rest        |
| You should consider updating your security group rules to allow access from known IP addresses only. |             |

### Step 2-7. Review Instance Launch

Click "Launch" once you finish the review

<figure><img src="/files/TLIqC8sWOBBwZEyuE3FB" alt="" width="563"><figcaption></figcaption></figure>

You can either create a new key pair or import a key pair. Follow this [instruction](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#prepare-key-pair).

### Step 2-8. Connect to your instance

Once the deployment is completed, you can connect to your instance via SSH.

```bash
$ ssh ubuntu@PUBLIC_IP -i YOUR_KEY.pem
```

AfterwardAfterwards, go to the `chain` directory, and you will find all the essential binaries for setting up your node:

```bash
$ cd /chain/
$ ll
total 32
drwxr-xr-x  7 crypto crypto 4096 Mar 20 14:51 ./
drwxr-xr-x 20 root   root   4096 Mar 25 09:46 ../
drwxr-xr-x  4 crypto crypto 4096 Mar 20 14:47 .chain-maind/
drwxr-xr-x  2 crypto crypto 4096 Mar 20 14:44 bin/
drwxr-xr-x  2   3434   3434 4096 Mar  5 09:41 node_exporter-1.1.2.linux-amd64/
-rwxr-xr-x  1 crypto crypto  535 Mar 20 14:43 reconfig.sh*
drwxr-xr-x  2 root   root   4096 Mar 20 14:43 release_binary/
drwxr-xr-x  2 crypto crypto 4096 Mar 20 14:47 sockets/
```

## Step 3. Running a full node

### Step 3-1. Use the reconfiguration script

Now we use the reconfiguration script `reconfig.sh` to choose the existing networks to join.

```bash
$ sudo -u crypto /chain/reconfig.sh
Please select either mainnet(M) or testnet(T) to join (M/T): M
You can select the following networks to join
	0. crypto-org-chain-mainnet-1
Please choose the network to join by index (0/1/...): 0
The selected network is crypto-org-chain-mainnet-1
The genesis does not exit or the sha256sum does not match the target one. Download the target genesis from github.
💾 Downloading crypto-org-chain-mainnet-1 genesis
```

(**Optional**) You may also enable [STATE-SYNC](https://docs.tendermint.com/v0.34/tendermint-core/state-sync.html). Your node will download data related to the head or near the head of the chain and verify the data. This leads to drastically shorter times for joining a network for validator. For **validator**, It will be amazingly fast to sync the near head of the chain and join the network.

{% hint style="warning" %}
**CAUTION** Blocks before state-sync `trust height` will **NOT** be queryable. If you want to run a **full node** or a validator with complete blockchain data; It is not suggested to use state-sync.
{% endhint %}

```bash
...
Do you want to enable state-sync? (Y/N): Y
State-sync require the latest version of binary to state-sync from the latest block.
The binary does not exist or the version does not match the target version. Download the target version binary from github release.
💾 Downloading crypto-org-chain-mainnet-1 binary
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   644  100   644    0     0   6192      0 --:--:-- --:--:-- --:--:--  6192
100 13.7M  100 13.7M    0     0  43.6M      0 --:--:-- --:--:-- --:--:-- 43.6M
```

Clean up the old blockchain data (if any)

```bash
...
Reset chain-maind and remove data if any
❗️ Enter (Y/N) to confirm to delete any old data: Y
Stopping chain-maind service
3:18PM INF Removed all blockchain history dir=/chain/.chain-maind/data
3:18PM INF Generated private validator file keyFile=/chain/.chain-maind/config/priv_validator_key.json stateFile=/chain/.chain-maind/data/priv_validator_state.json
❗️ /chain/.chain-maind/config/priv_validator_key.json already exists! Do you want to override old key? (Y/N): Y
A new priv_validator_key.json with pubkey: open /chain/.chain-maind/config/priv_validator_key.json: no such file or directory

💡 Please make sure you have a backup of /chain/.chain-maind/config/priv_validator_key.json in case of unexpected accidents!
```

The consensus public key information could be found in `/chain/.chain-maind/config/priv_validator_key.json`

Backup your old `/chain/.chain-maind/config/priv_validator_key.json` if you ever created.

```bash
❗️ /chain/.chain-maind/config/priv_validator_key.json already exists! Do you want to override old key? (Y/N): Y
A new priv_validator_key.json with pubkey: open /chain/.chain-maind/config/priv_validator_key.json: no such file or directory

💡 Please make sure you have a backup of /chain/.chain-maind/config/priv_validator_key.json in case of unexpected accidents!
```

The script will also ask you to fill in the `moniker` value which is a human-readable display name for tendermint p2p. *p2p gossip* will allow you to connect with more nodes (data sources).

```bash
Replace moniker in /chain/.chain-maind/config/config.toml
Moniker is display name for tendermint p2p

moniker: YOUR_MONIKER_NAME
Do you want to add the public IP of this node for p2p gossip? (Y/N): Y
✅ Added public IP to external_address in chain-maind config.toml for p2p gossip
```

*node\_id* and *node\_key* are the unique identity of your node. Save them for later use.

```bash
...
Generate and replace node_key in /chain/.chain-maind/config/node_key.json

You may want to save node_id and node_key for later use

node_id: 62cf74XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

node_key: LyQiGlL4HsdHsPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

`chain-maind` is now running in the background as a systemd service.

You can check its log by the command `journalctl`, for example:

```bash
$ journalctl -u chain-maind.service -f
-- Logs begin at Wed 2020-12-30 13:51:25 UTC. --
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF finalizing commit of block hash=3CB6E9CFAEB6681797E02547A096C9654A4558701660DCA78182CA1B43AA05F3 height=8460 module=consensus num_txs=3 root=39878A5AC834C6D89ADBC55097A6495FCE8C9E6FF8DE8DAAC5DD7373407A5C6D
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF minted coins from module account amount=7925328957basecro from=mint module=x/bank
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF executed block height=8460 module=state num_invalid_txs=0 num_valid_txs=3
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF updates to validators module=state updates=A7E76081779FF5EE79A765DE4D716B4903D6902B:4266505417
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF commit synced commit=436F6D6D697449447B5B36352032313020313636203639203130203633203137322032372031363120313438203133322031313320313031203135203131302031353720323134203134372034302034203234362032343220323237203231362032362031363220333120313431203231342032303020313239203234345D3A323130437D
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF committed state app_hash=41D2A6450A3FAC1BA1948471650F6E9DD6932804F6F2E3D81AA21F8DD6C881F4 height=8460 module=state num_txs=3
...
```

The consensus public key can be found by and please take note of it for the next [steps](https://docs.cronos-pos.org/for-node-hosts/getting-started/aws-1click#step-4.-join-as-a-validator):

```
$ sudo /chain/bin/chain-maind tendermint show-validator --home /chain/.chain-maind/
## [crocnclcons... address] ##
## [tcrocnclcons... address] ##
```

The latest block height can be found by:

Mainnet

```bash
$ curl -s https://rpc.mainnet.crypto.org:443/block | jq -r .result.block.header.height
8525
```

Testnet

```bash
$ curl -s https://testnet-croeseid-4.crypto.org:26657/block | jq -r .result.block.header.height
8525
```

Once the tendermint syncs to the latest block, the setup is done! You may move on to the next step if you want to join the network as a validator.

## Step 4. Join as a validator

We suggest that you should do this process locally with `chain-maind` to avoid exposing your keys on a cloud server. If you haven't installed `chain-maind` yet, please follow [Step 1. Get the Cronos POS Chain binary for testnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet) or [Step 1. Get the Cronos POS Chain Mainnet binary for mainnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet).&#x20;

{% hint style="info" %}
**NOTE**

* Check whether your chain-maind is mainnet or testnet binary

Mainnet

```bash
$ chain-maind version
3.3.9
```

* Mainnet binary for [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.9/chain-main_3.3.9_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v3.3.9/chain-main_3.3.9_Windows_x86_64.zip) are also available.

Or

Testnet

```bash
$ chain-maind version
3.1.0-croeseid
```

* Testnet binary for **Mac** ([Intel x86](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Darwin_x86_64.tar.gz) / [M1](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Darwin_arm64.tar.gz))and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Windows_x86_64.zip) are also available.
  {% endhint %}

<details>

<summary><strong>Mainnet</strong></summary>

### Create a new key and address

Please follow [Step 3-1. Create a new key and address](https://docs.cronos-pos.org/for-users/wallets/cli#keys-management-chain-maind-keys)

### Creating a validator node

You should obtain a consensus public key from [Step 3-1. Use the reconfiguration script](https://docs.cronos-pos.org/~/changes/2e2355w5GSNes3nTqLmc/for-node-hosts/getting-started/aws-1click?r=4ufDBgXrbDIE7JCAgzaq#step-3-1.-use-the-reconfiguration-script)

Please follow Step 3-5. [Joining the network as a validator to create a validator](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet).

### Check if the validator has been set

Back your server, and follow [Step 3-6. Check your validator status](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator#step-3-3.-check-your-validator-status)

🎊 Congratulations! You've successfully joined the network as a validator! 🎊

</details>

<details>

<summary><strong>Testnet</strong></summary>

### Create a new key and address

Please follow [Step 3-1. Create a new key and address](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet#step-3-1.-create-a-new-key-and-address)

### Creating a validator node

You should obtain a consensus public key from [Step 3-1. Use the reconfiguration script](https://docs.cronos-pos.org/for-node-hosts/getting-started/azure-1click#step-3-1.-use-the-reconfiguration-script)

Please follow [Step 3-2 Joining the network as a validator to create a validator](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator#step-3-2.-joining-the-network-as-a-validator-send-a-create-validator-transaction).

### Check if the validator has been set

Back your server, and follow [Step 3-6. Check your validator status](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator#step-3-3.-check-your-validator-status)

🎊 Congratulations! You've successfully joined the network as a validator! 🎊

</details>


# Mainnet/Testnet: Running Nodes using Azure 1-click Deployment

This tutorial will use our Azure 1-click Deployment image to start and create the latest Croeseid Testnet validator or full node.

{% hint style="warning" %}
**CAUTION** We do not recommend directly running validator on Mainnet by 1-Click deployment. Please use it with caution! Because the 1-click deployment is not running with [TMKMS](https://github.com/iqlusioninc/tmkms) and your tendermint validator key is in plain text `/chain/.chain-maind/config/priv_validator_key.json`. You may consider running validator with [tmkms on AWS nitro-enclave](https://docs.cronos-pos.org/for-node-hosts/advanced-tmkms-integration).
{% endhint %}

## Step 1. Azure Account Creation

You will first need to create a [Microsoft Azure](https://azure.microsoft.com/) account with a `Pay-As-You-Go` subscription. This will require providing your credit card information to `Microsoft Azure` and you may be subject to getting charged when you create a virtual machine.

Please read `Microsoft Azure` free trial introduction to see if you are eligible for the free-tier.

## Step 2. Common Setup

### Step 2-1. Search for Cronos POS Chain on Marketplace

Sign in to your Microsoft Azure account and go to [Marketplace](https://portal.azure.com/#blade/Microsoft_Azure_Marketplace/MarketplaceOffersBlade/selectedMenuItemId/home). Search for "Cronos POS Chain 1-Click Node".

<img src="/files/LSDxhQ8KJ4v3YNxSckgy" alt="" width="563">

### Step 2-2. Create a Virtual Machine

Choose the image and click "Create" to start creating the Cronos POS Chain 1-Click Node.

#### 1. Basic

<img src="/files/MXA6LMJIgx4ARcxfBEa8" alt="" width="563">

| Configuration           | Value                                                                                                             |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------- |
| *Size*                  | Select a recommended one or *DC2s\_v3*                                                                            |
| *SSH public key source* | Choose *"existing public key"*                                                                                    |
| *SSH public key*        | Copy and paste your [SSH public key](https://docs.microsoft.com/azure/virtual-machines/linux/mac-create-ssh-keys) |
| *Resource group*        | We suggest creating a new and dedicated one so that you can easily manage resources attached to the instance      |

#### 2. Disk

* Follow default setting

#### 3. Networking

<img src="/files/rScGM0WNglkih8ofLud3" alt="" width="563">

* *Virtual network*, *Subnet*, *Public IP* and *NIC*: "Create new" if you don't have any in that region

#### 4. Management

* Follow default setting
* *Boot diagnostics*: default is "On". Set to "Off" if it is not required.

#### 5. Advanced

* Follow default setting

#### 6. Tags

* Create Tag if needed

#### 7. Review + Create

* Click "create" to create your instance

### Step 2-3. Connect to your instance

Once the deployment is completed, you can connect to your instance via SSH.

```bash
$ ssh ubuntu@PUBLIC_IP
```

Afterward, go to the `chain` directory, and you will find all the essential binaries for setting up your node:

```bash
$ cd /chain/
$ ll
total 32
drwxr-xr-x  7 crypto crypto 4096 Mar 20 14:51 ./
drwxr-xr-x 20 root   root   4096 Mar 25 09:46 ../
drwxr-xr-x  4 crypto crypto 4096 Mar 20 14:47 .chain-maind/
drwxr-xr-x  2 crypto crypto 4096 Mar 20 14:44 bin/
drwxr-xr-x  2   3434   3434 4096 Mar  5 09:41 node_exporter-1.1.2.linux-amd64/
-rwxr-xr-x  1 crypto crypto  535 Mar 20 14:43 reconfig.sh*
drwxr-xr-x  2 root   root   4096 Mar 20 14:43 release_binary/
drwxr-xr-x  2 crypto crypto 4096 Mar 20 14:47 sockets/
```

## Step 3. Running a full node

### Step 3-1. Use the reconfiguration script

Now we use the reconfiguration script `reconfig.sh` to choose the existing networks to join.

```bash
$ sudo -u crypto /chain/reconfig.sh
Please select either mainnet(M) or testnet(T) to join (M/T): M
You can select the following networks to join
	0. crypto-org-chain-mainnet-1
Please choose the network to join by index (0/1/...): 0
The selected network is crypto-org-chain-mainnet-1
The genesis does not exit or the sha256sum does not match the target one. Download the target genesis from github.
💾 Downloading crypto-org-chain-mainnet-1 genesis
```

You may also enable (**Optional**)[STATE-SYNC](https://docs.tendermint.com/master/tendermint-core/state-sync.html). Your node will download data related to the head or near the head of the chain and verify the data. This leads to drastically shorter times for joining a network for validator. For **validator**, It will be amazingly fast to sync the near head of the chain and join the network.

::: warning CAUTION Blocks before state-sync `trust height` will **NOT** be queryable. If you want to run a **full node** or a validator with complete blockchain data; It is not suggested to use state-sync. :::

```bash
...
Do you want to enable state-sync? (Y/N): Y
State-sync require the latest version of binary to state-sync from the latest block.
The binary does not exist or the version does not match the target version. Download the target version binary from github release.
💾 Downloading crypto-org-chain-mainnet-1 binary
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   644  100   644    0     0   6192      0 --:--:-- --:--:-- --:--:--  6192
100 13.7M  100 13.7M    0     0  43.6M      0 --:--:-- --:--:-- --:--:-- 43.6M
```

Clean up the old blockchain data (if any)

```bash
...
Reset chain-maind and remove data if any
❗️ Enter (Y/N) to confirm to delete any old data: Y
Stopping chain-maind service
3:18PM INF Removed all blockchain history dir=/chain/.chain-maind/data
3:18PM INF Generated private validator file keyFile=/chain/.chain-maind/config/priv_validator_key.json stateFile=/chain/.chain-maind/data/priv_validator_state.json
❗️ /chain/.chain-maind/config/priv_validator_key.json already exists! Do you want to override old key? (Y/N): Y
A new priv_validator_key.json with pubkey: open /chain/.chain-maind/config/priv_validator_key.json: no such file or directory

💡 Please make sure you have a backup of /chain/.chain-maind/config/priv_validator_key.json in case of unexpected accidents!
```

The consensus public key information could be found in `/chain/.chain-maind/config/priv_validator_key.json`

Backup your old `/chain/.chain-maind/config/priv_validator_key.json` if you created once.

```bash
❗️ /chain/.chain-maind/config/priv_validator_key.json already exists! Do you want to override old key? (Y/N): Y
A new priv_validator_key.json with pubkey: open /chain/.chain-maind/config/priv_validator_key.json: no such file or directory

💡 Please make sure you have a backup of /chain/.chain-maind/config/priv_validator_key.json in case of unexpected accidents!
```

The script will also ask you to fill in the `moniker` value which is a human-readable display name for tendermint p2p. *p2p gossip* will allow you to connect with more nodes (data sources).

```bash
Replace moniker in /chain/.chain-maind/config/config.toml
Moniker is display name for tendermint p2p

moniker: YOUR_MONIKER_NAME
Do you want to add the public IP of this node for p2p gossip? (Y/N): Y
✅ Added public IP to external_address in chain-maind config.toml for p2p gossip
```

*node\_id* and *node\_key* are the unique identity of your node. Save them for later use.

```bash
...
Generate and replace node_key in /chain/.chain-maind/config/node_key.json

You may want to save node_id and node_key for later use

node_id: 62cf74XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

node_key: LyQiGlL4HsdHsPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

`chain-maind` is now running at the background as a systemd service.

You can check its log by the command `journalctl`, for example:

```bash
$ journalctl -u chain-maind.service -f
-- Logs begin at Wed 2020-12-30 13:51:25 UTC. --
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF finalizing commit of block hash=3CB6E9CFAEB6681797E02547A096C9654A4558701660DCA78182CA1B43AA05F3 height=8460 module=consensus num_txs=3 root=39878A5AC834C6D89ADBC55097A6495FCE8C9E6FF8DE8DAAC5DD7373407A5C6D
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF minted coins from module account amount=7925328957basecro from=mint module=x/bank
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF executed block height=8460 module=state num_invalid_txs=0 num_valid_txs=3
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF updates to validators module=state updates=A7E76081779FF5EE79A765DE4D716B4903D6902B:4266505417
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF commit synced commit=436F6D6D697449447B5B36352032313020313636203639203130203633203137322032372031363120313438203133322031313320313031203135203131302031353720323134203134372034302034203234362032343220323237203231362032362031363220333120313431203231342032303020313239203234345D3A323130437D
Mar 25 15:34:02 ip-172-31-69-43 chain-maind[2657]: 3:34PM INF committed state app_hash=41D2A6450A3FAC1BA1948471650F6E9DD6932804F6F2E3D81AA21F8DD6C881F4 height=8460 module=state num_txs=3
...
```

The consensus public key can be found by and please take a note of it for next [steps](https://github.com/crypto-org-chain/chain-docs/blob/Gitbook/docs/getting-started/aws-1click.html#step-4-join-as-a-validator):

```
$ sudo /chain/bin/chain-maind tendermint show-validator --home /chain/.chain-maind/
## [crocnclcons... address] ##
## [tcrocnclcons... address] ##
```

The latest block height can be found by:

Mainnet

```bash
$ curl -s https://rpc.mainnet.crypto.org:443/block | jq -r .result.block.header.height
8525
```

Testnet (`testnet-croeseid-4`)

```bash
$ curl -s https://testnet-croeseid-4.crypto.org:26657/block | jq -r .result.block.header.height
8525
```

Once the tendermint syncs to the latest block, the setup is done! You may move on to the next step if you want to join the network as a validator.

## Step 4. Join as a validator

We suggest that you should do this process locally with `chain-maind` to avoid exposing your keys on a cloud server. If you haven't installed `chain-maind` yet, please follow [Step 1. Get the Cronos POS Chain binary for testnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet) or [Step 1. Get the Cronos POS Chain Mainnet binary for mainnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet).&#x20;

{% hint style="info" %}
**NOTE**

* Check whether your chain-maind is mainnet or testnet binary

Mainnet

```bash
$ chain-maind version
3.3.9
```

* Mainnet binary for [Mac](https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Darwin_x86_64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v2.0.1/chain-main_2.0.1_Windows_x86_64.zip) are also available.

Or Testnet

```bash
$ chain-maind version
3.1.0-croeseid
```

* Testnet binary for **Mac** ([Intel x86](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Darwin_x86_64.tar.gz) / [M1](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Darwin_arm64.tar.gz))and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v3.1.0-croeseid/chain-main_3.1.0-croeseid_Windows_x86_64.zip) are also available.
  {% endhint %}

<details>

<summary>Mainnet</summary>

### Create a new key and address

Please follow [Step 3-1. Create a new key and address](https://docs.cronos-pos.org/for-users/wallets/cli#keys-management-chain-maind-keys)

### Creating a validator node

You should obtain consensus public key from [Step 3-1. Use the reconfiguration script](https://docs.cronos-pos.org/for-node-hosts/getting-started/azure-1click#step-3-1.-use-the-reconfiguration-script)

Please follow [Step 4. Joining the network as a validator](https://docs.cronos-pos.org/~/changes/2e2355w5GSNes3nTqLmc/for-node-hosts/getting-started/azure-1click#step-4.-join-as-a-validator) to create validator.

### Check if the validator has been set

Back your server, and follow [Step 3-6. Check your validator status](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator#step-3-3.-check-your-validator-status)

🎊 Congratulations! You've successfully joined the network as a validator! 🎊

</details>

<details>

<summary>Testnet</summary>

### Create a new key and address

Please follow [Step 3-1. Create a new key and address](https://docs.cronos-pos.org/for-users/wallets/cli#keys-management-chain-maind-keys)

### Creating a validator node

You should obtain consensus public key from [Step 3-1. Use the reconfiguration script](https://docs.cronos-pos.org/for-node-hosts/getting-started/azure-1click#step-3-1.-use-the-reconfiguration-script)

Please follow [Step 4. Joining the network as a validator](https://docs.cronos-pos.org/~/changes/2e2355w5GSNes3nTqLmc/for-node-hosts/getting-started/azure-1click#step-4.-join-as-a-validator) to create validator.

### Check if the validator has been set

Back your server, and follow [Step 3-6. Check your validator status](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid5-testnet#step-3-6.-check-your-validator-status)

🎊 Congratulations! You've successfully joined the network as a validator! 🎊

</details>


# Croeseid Testnet: Running Nodes With Nix

## Pre-requisites

Nix supports both Linux and Mac, for Windows users, you can follow the [manual instructions](/for-node-hosts/getting-started/croeseid-testnet).

## Install nix

Follow official instructions to install nix: <https://nixos.org/download.html>

> for Mac user, you might need to consult the [nix manual for macos installation](https://nixos.org/manual/nix/stable/#sect-macos-installation), simply put, if you have a recent Mac, you can install nix with `sh <(curl -L https://nixos.org/nix/install) --darwin-use-unencrypted-nix-store-volume`

Install cachix and enable crypto-com binary cache:

```shell
$ nix-env -iA cachix -f https://cachix.org/api/v1/install
$ cachix use crypto-com
```

## Install chain utils for testnet

```shell
$ nix-env -iA chain-utils-testnet -f https://github.com/crypto-org-chain/chain-main/archive/v3.1.0-croeseid.tar.gz
```

After installation, you'll have these commands in your `PATH`:

* `chain-maind`, the chain binary for testnet
* `init-node`, the script to initialize the chain data directory with state sync enabled
* `print-systemd-config`, print a systemd config file to stdout

## Initialization

```shell
$ export CHAINHOME=/path/to/data # optional, default to $HOME/.chain-maind
$ MONIKER=testnode init-node
```

Change the value of `MONIKER` to your node's name.

state sync is initialized and enabled by `init-node` automatically, if you don't want that to happen, you can disable it by edit `$CHAINHOME/config/config.toml` manually, set `enable` field to `false` under section `[statesync]` like this:

```
[statesync]
enable = false
```

## Run

You can now run the chain node manually:

```shell
$ chain-maind start --home $CHAINHOME
```

Or setup systemd service on linux:

```
$ print-systemd-config | sudo tee /etc/systemd/system/chain-maind.service
$ sudo systemctl start chain-maind
```

Please refer to [Croeseid Testnet](/for-node-hosts/getting-started/croeseid-testnet#step-3-run-everything) for instructions to issue transactions and create validator.

## Isolated installation

One of the strengths of nix package manager is you can have multiple isolated installations, it would be important when you want to manage both testnet and mainnet chains or different versions of them on a single machine.

```shell
$ nix build -f https://github.com/crypto-org-chain/chain-main/archive/v3.1.0-croeseid.tar.gz chain-utils-testnet -o testnet
$ export CHAINHOME=$PWD/testnet_data
$ MONIKER=testnode ./testnet/bin/init-node
$ ./testnet/bin/chain-maind start --home $CHAINHOME
```


# Devnet: Running Latest Development Node

{% hint style="warning" %}
**Caution**&#x20;

This page is for building and running the latest development version of the chain for testing purposes only. The development branch is under active development and is highly unstable and subject to breaking changes. You should expect a moderate amount of troubleshooting work to be required.\
\
For anyone interested in joining the Cronos POS Chain testnet, please refer to our [testnet documentation](/for-node-hosts/getting-started/croeseid-testnet).&#x20;
{% endhint %}

By following this tutorial, you can compile and run the latest development version of Cronos POS Chain from scratch. It is intended for testing purposes only.

## Overview

We will be using [pystarport](https://github.com/crypto-org-chain/chain-main/tree/master/pystarport), a dedicated script similar to [cosmos starport](https://github.com/tendermint/starport) without the scaffolding feature to build a local development network with multiple validators.

## Install with Nix

### Install nix

Follow official instructions: <https://nixos.org/download.html>

### Use binary cache

If you are using Linux, enable the cachix binary cache:

```
$ nix-env -iA cachix -f https://cachix.org/api/v1/install
$ cachix use crypto-com
```

### Install pystarport

```
$ nix profile install github:crypto-com/pystarport
```

The `pystarport` will be available at path `~/.nix-profile/bin/pystarport`

#### Install chain-maind

```
$ nix profile install github:crypto-com/chain-main
```

The `chain-maind` will be available at path `~/.nix-profile/bin/chain-maind`

## Install manually

### Pre-requisites

* Python > 3.7.3
* [pystarport](https://github.com/crypto-com/pystarport)
* [chain-maind](https://github.com/crypto-org-chain/chain-main)

## Install pystarport

```
$ git clone https://github.com/crypto-com/pystarport.git
$ cd pystarport
$ pip install -e .
```

The `pystarport` will be available `/usr/local/bin/pystarport`

## Install chain-maind

```
$ git clone https://github.com/crypto-org-chain/chain-main.git
$ cd chain-main
$ make install
```

The `chain-maind` will be available at `$GOPATH/bin`

## Customize your devnet

Jump to the next section to start it without customization.

You can customize your devnet based on `examples/devnet.yaml`:

```yaml
chainmaind:  # The chain-id
  validators:
    - coins: 10cro # Tokens allocated for the first validator
      staked: 10cro # Tokens that were staked by the validator in the genesis
      moniker: awesome0 # Optional, default to node{i}
      hostname: localhost # Optional, default to localhost
      base_port: 26650 # Optional, default to BASE_PROT(26650) + i * 10
    - coins: 10cro
      staked: 10cro
      moniker: awesome1
      base_port: 26660
  accounts:
    - name: community
      coins: 100cro
    - name: ecosystem
      coins: 200cro
    - name: reserve
      coins: 200cro
      vesting: "1d" # Optional, vesting period of the account
    - name: launch
      coins: 100cro
  genesis: # Network parameters in the genesis can be specified in here
    app_state:
      staking:
        params:
          unbonding_time: "10s"
```

This configuration will give us 2 validators devnet with the chain-id `chainmaind`; 4 accounts under the name of `community`, `ecosystem` `reserve` and `launch` with some allocated funds at the genesis.

You can also specify some network parameters in the genesis file of your devnet under `genesis:` for different testing purposes. As in the above example, we have specified the `unbonding_time` to be `10` seconds.

## Start the devnet

Once we finish with the configuration, we are ready to start the chain: in the repository root directory, run

```sh
$ pystarport serve --config examples/devnet.yaml
```

Afterward, keys will be generated according to the configuration specified, and the accounts' information will be generated in `data/chainmaind/accounts.json`, for example:

```json
[
  {"name": "validator", "type": "local", "address": "cro1u6w6hurleq6nxxdhn4p3avunkak6rm8t5dvk2q", "pubkey": "cropub1addwnpepqgn4qt0h0zvu6t9t05jwh7vedxwe4s8p5rv3jmq36v6l0c44falusftpgqm", "mnemonic": "off giggle census three heavy below balance vehicle useless reflect safe gym vivid fault fee connect miracle release material volume note coast laundry federal"},
  {"name": "validator", "type": "local", "address": "cro1yjvw6pwj7vvhg2j4rrxawcjevdqeqn5p4ujfds", "pubkey": "cropub1addwnpepqvc9kw0ntnny6u57g72pmecuvzy2k07y3xf9r0w4vjxhseg6ujwjuqq780g", "mnemonic": "fork security naive turtle bring pill imitate suffer clerk final century shock account pulp suffer gas runway punch extra spatial else solar mango explain"},
  {"name": "community", "type": "local", "address": "cro1f8hjnj8wv9rf2vy57gx80fs5f00nyczxuuelwj", "pubkey": "cropub1addwnpepqfr8zzx85yjw83uh33uhjajm8v3rr5lww6er6ysu7g6e3xendwsy7zadp4e", "mnemonic": "kangaroo session warrior echo make amount pear series random gas pizza cheap artefact senior lumber unknown beef rigid lemon dignity boss lesson cash innocent"},
  {"name": "ecosystem", "type": "local", "address": "cro1vfwelxg7yvgu0dhl3mcd9d8qf8g3q4zvknyhzk", "pubkey": "cropub1addwnpepqvz3hnk30qxx8z5n00zsq28ax0fhv057unqgnetunaxsdrj3y735qff30tn", "mnemonic": "result unable ball shove city high cook ignore rally student jaguar sound tiny duck nest yellow neglect people noodle crazy lazy evolve wheel machine"},
  {"name": "reserve", "type": "local", "address": "cro1krckx5esmlz3ga7gq9vkha92nqcw8u6w382s0u", "pubkey": "cropub1addwnpepqt4exeghsgsl2wrxp4atk63xj5ylnm95z3dkxevp8jrldvgy824duchdwky", "mnemonic": "bird best thank chalk agree buzz apple lens strike help eyebrow valley winner section protect panther april bright keen reunion burst episode obtain hockey"},
  {"name": "launch", "type": "local", "address": "cro1tgjt434qqr9y3ugmumwez5rule0ak86f2vdceg", "pubkey": "cropub1addwnpepqwn06cqy4895k5yhp0v5nx897c3s2psu4kzx4qq2r5eck2ljw557jx9e4pr", "mnemonic": "picture walnut banner glide once refuse cradle engage bike follow mistake clutch powder pencil ring walnut pigeon kind decade dutch tank immune coconut notable"}
]
```

Kindly save these mnemonics for key recovery later.

Blocks are now being generated! You can view the blockchain data by the RPC port of the `awesome0` (first node): <http://localhost:26657/>. Furthermore, you can also use the swagger doc of `awesome0` at <http://localhost:26654/swagger/>.

It is worth mentioning that the `serve` command would truncate all the blocks previously generated and regenerate a new Genesis block, which means you'll also lose all of your transaction records. If you wish to restart the chain with the existing blocks, please run `pystarport` with `start` command:

```sh
$ pystarport start
```

## Interact with the chain

After the chain has been started, we may open up another terminal and start interacting with the chain by `chain-maind`.

### Keys management

#### Restore the key

As in the last section, pre-created Hierarchical Deterministic (HD) mnemonic with genesis funds inside are prepared for you in the Devnet. To gain access to the funds, kindly restore the key by using the mnemonic before moving on to the next step.

**Note**: The keys are stored in your operating system by default, we will use `--keyring-backend test` for simplicity. You may refer to a more detailed explanation [here](/for-users/wallets/cli#the-keyring-keyring-backend-option).

* Firstly, restore the key name as `launch`:

  ```
  $ chain-maind keys add launch --recover --keyring-backend test

   > Enter your bip39 mnemonic
   beef pistol fury work kick thumb delay side cement suggest tenant blind inform copy cross pull clinic arrow curtain laugh item oven clinic add

   - name: launch
   type: local
   address: cro1jyd8ul8ze2eyppet3ajl3t9sjfglf76l0ukgns
   pubkey: cropub1addwnpepqtapys5eyeg28nak7xurka7phugp8m5fyzcc92d2sz86hgf7s85lqw6jgqv
   mnemonic: ""
   threshold: 0
   pubkeys: []
  ```
* Now you can check the balance of it by running

  ```bash
  $ chain-maind query bank balances cro1jyd8ul8ze2eyppet3ajl3t9sjfglf76l0ukgns
  balances:
  - amount: “20000000000”
  denom: basecro
  pagination:
  next_key: null
  total: “0"
  ```

  We can see that there is `20000000000` basecro (=`200`cro) in this address as expected.

#### Transfer CRO to another address

Once we have a restore the key and the address , we are now ready to transfer token between different addresses; we can create another address with the key name `Bob`:

```bash
$ chain-maind keys add Bob --keyring-backend test
   - name: Bob
   type: local
   address: cro13vy5dks0ns99h3rkuqtka3wasp0aqax6feeqfa
   pubkey: cropub1addwnpepqwy37un50y4wd6npgx0eegjj50xdjk9a00uuw996zcer534n5edz5ka28ml
   mnemonic: ""
   threshold: 0
   pubkeys: []
```

* Now you can transfer tokens to Bob, for example, you can send `1` CRO to Bob's address by

  ```
  $ chain-maind tx bank send launch cro13vy5dks0ns99h3rkuqtka3wasp0aqax6feeqfa 1cro --keyring-backend test --chain-id chainmaind
  ```
* Lastly, check `balance` of Bob's address:

  ```
  $ chain-maind query bank  balances cro1qrnqv9hgmyr4nrdr905wf2h4w6gvwypwhklhar
     balances:
     - amount: “100000000”
     denom: basecro
     pagination:
     next_key: null
     total: “0"
  ```

Congratulations! You've successfully transferred tokens to Bob.

### Staking Operation

Cronos POS Chain is based on tendermint with the Proof of Stake (POS) consensus algorithm. In this sub-section, we will be covering how to perform basic staking related transactions.

#### Check the current validator set

Firstly, we can check the details of the current validator set by the query command of chain-maind, for example:

```
$ chain-maind query staking validators -o json | jq
```

will result in

```json
  [
    {
      "operator_address": "crocncl1h9037fa3rn2hpudj5p088574pcfh47sy8tu52q",
      "consensus_pubkey": "crocnclconspub1zcjduepq0etg4wk302r0h08fuvpep4vlu4mhv9xk8s0qp5vgae7u5cw296yqqmkc9m",
      "status": 3,
      "tokens": "1000000000",
      "delegator_shares": "1000000000.000000000000000000",
      "description": {
        "moniker": "awesome1"
      },
      "unbonding_time": "1970-01-01T00:00:00Z",
      "commission": {
        "commission_rates": {
          "rate": "0.100000000000000000",
          "max_rate": "0.200000000000000000",
          "max_change_rate": "0.010000000000000000"
        },
        "update_time": "2020-10-27T06:37:18.419202Z"
      },
      "min_self_delegation": "1"
    },
    {
      "operator_address": "crocncl173q6r8kc3gl8lccma23qe62q5c7v9h5q9mtx2j",
      "consensus_pubkey": "crocnclconspub1zcjduepq9zfvkh8m282xdv8h4fraqfudc9uc57g85nrga54ryc2fg577lweqyy97pu",
      "status": 3,
      "tokens": "1000000000",
      "delegator_shares": "1000000000.000000000000000000",
      "description": {
        "moniker": "awesome0"
      },
      "unbonding_time": "1970-01-01T00:00:00Z",
      "commission": {
        "commission_rates": {
          "rate": "0.100000000000000000",
          "max_rate": "0.200000000000000000",
          "max_change_rate": "0.010000000000000000"
        },
        "update_time": "2020-10-27T06:37:18.419202Z"
      },
      "min_self_delegation": "1"
    }
  ]
```

Then we can see that there are two active validators `awesome0` and `awesome1` at the moment.

For each validator, we can see that it comes with an address and a public key:

* `"operator_address"` - The operator address, which is used for identifying the operators of validators;
* `"consensus_pubkey"` - The consensus public key, which is used for identifying the validator nodes participating in consensus.

#### Delegating to a validator

One can delegate their tokens to validator(s) and earn rewards by participating in the consensus process. For example, if you would like to delegate `5` cro to the validator node `"awesome0"`, It can be done by sending a transaction with the `Staking` module:

```
$ chain-maind tx staking delegate  crocncl173q6r8kc3gl8lccma23qe62q5c7v9h5q9mtx2j  5cro --from launch --keyring-backend test --chain-id chainmaind

{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgDelegate"...}}}

confirm transaction before signing and broadcasting [y/N]: y

```

In order to do the above transaction, please note that you would need the "operator address" of the validator. This is the `"operator_address"` with the prefix `crocncl` we found in the last section.

#### Check and collect the delegation reward

As mentioned earlier, rewards will be accumulated once we delegate to a validator. We can check this reward by querying the `Distribution` module, for example:

```
$ chain-maind query distribution rewards cro1slecdwyyn35xex8ukhyddcaqml3ms59gx409rq crocncl173q6r8kc3gl8lccma23qe62q5c7v9h5q9mtx2j

rewards:
- amount: "550249.594800000000000000"
  denom: basecro
```

Afterwards, we can send the following transaction to withdraw the rewards:

```
$ chain-maind tx distribution withdraw-rewards crocncl173q6r8kc3gl8lccma23qe62q5c7v9h5q9mtx2j --from launch --keyring-backend test --chain-id chainmaind

{"body":{"messages":[{"@type":"/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"...}}}

confirm transaction before signing and broadcasting [y/N]: y
```

***

If you are interested in contributing to or joining our testnet, you can continue reading the following sections about [Joining the Croeseid Testnet](/for-node-hosts/getting-started/croeseid-testnet).


# Advanced TMKMS Integration

* The default consensus engine available within the SDK is Tendermint Core. See [Tendermint notes on running in production](https://docs.tendermint.com/v0.34/tendermint-core/running-in-production.html) and [notes on setting up a validator](https://docs.tendermint.com/v0.34/tendermint-core/validators.html#setting-up-a-validator)
* Validator block signing should be via [tmkms](https://github.com/iqlusioninc/tmkms)

## Setting up AWS Nitro Enclaves + Tendermint KMS for signing blocks

{% hint style="warning" %}
**CAUTION** \
\
The setup isn't yet ready for production use:

* It is not yet audited
* The [tmkms prototype fork](https://github.com/crypto-com/tmkms-light) isn't meant to be maintained in the long term&#x20;
  {% endhint %}

### Background

[TMKMS](https://github.com/iqlusioninc/tmkms), initially targeting Cosmos Validators, provides **High-availability**, **Double-signing prevention** and **Hardware security module**.

Currently, TMKMS provides both **hardware signing** and **softsign**. However, it is hard or impossible to plug your own [Hardware Security Modules(HSM)](https://github.com/iqlusioninc/tmkms#hardware-security-modules-recommended) into the major cloud providers when one wants to run it on the cloud for **hardware signing**. On the other hand, it is also insecure to use **softsign** as your generated signing key is actually in plain text on the machine.

What we want to achieve is just running TMKMS securely and provision validator conveniently on the cloud. To meet this end, we now can leverage [AWS Nitro Enclaves](https://aws.amazon.com/blogs/aws/aws-nitro-enclaves-isolated-ec2-environments-to-process-confidential-data/) to execute TMKMS and TMKMS then decrypts (during initialization) the signing via [AWS KMS](https://aws.amazon.com/kms/). Read more details [here](https://github.com/tomtau/tmkms/blob/feature/nitro-enclave/README.nitro.md)

Note that this is still a work in progress and this document only describes a basic setup, so it is not yet ready for production use. We recommend looking at other materials for additional setups, such as the [Security best practices for AWS KMS whitepaper](https://d0.awsstatic.com/whitepapers/aws-kms-best-practices.pdf).

<img src="/files/gY5JDHySRlsngL8zMvE8" alt="" width="563">

### Step 1. Set up supported EC2 instance types

Virtualized Nitro-based instances with at least four vCPUs. t3, t3a, t4g, a1, c6g, c6gd, m6g, m6gd, r6g, and r6gd instances are not supported.

We recommend `m5a.xlarge` and `Amazon Linux 2 AMI` for easier installation for AWS Nitro Enclaves CLI.

* Remember to check `Enable` for Enclave in `Advanced Details` when configuring instance details.&#x20;

  <figure><img src="/files/Hg35jbygIMnwoVfBbYBg" alt="" width="563"><figcaption></figcaption></figure>

### Step 2. Installing the Nitro Enclaves CLI

One needs to install Docker + Nitro Enclaves CLI.

Follow this [doc](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-cli-install.html) to proceed.

### Step 3. Prepare TMKMS Enclave images on EC2

You can either follow this [compiling-tmkms-for-aws-ne](https://github.com/tomtau/tmkms/blob/feature/nitro-enclave/README.nitro.md#compiling-tmkms-for-aws-ne) to build **TMKMS Enclave images** from scratch or simply use our published [image](https://hub.docker.com/r/cryptocom/nitro-enclave-tmkms/tags).

```bash
$ mkdir ~/.tmkms
$ nitro-cli build-enclave --docker-uri cryptocom/nitro-enclave-tmkms:latest --output-file ~/.tmkms/tmkms.eif
```

After building the enclave image, you should obtain 3 [enclave's measurements(PCRs)](https://docs.aws.amazon.com/enclaves/latest/user/set-up-attestation.html#where): PCR0 (SHA384 hash of the image), PCR1 (SHA384 hash of the OS kernel and the bootstrap process), and PCR2 (SHA384 hash of the application). Take note of the **PCR0** value. One can also use PCR3 and PCR8, for more details, please find this [link](https://docs.aws.amazon.com/enclaves/latest/user/enclaves-user.pdf)

And also create and take a note of **PCR4** manually which is unique across ec2.

```bash
$ printf "PCR4: %s\n" $(INSTANCE_ID="$(curl http://169.254.169.254/latest/meta-data/instance-id -s)"; python -c"import hashlib, sys; h=hashlib.sha384(); h.update(b'\0'*48); h.update(\"$INSTANCE_ID\".encode('utf-8')); print(h.hexdigest())")
```

### Step 4. Preparing IAM instance role and AWS KMS policy

#### Step 4.1. Create an IAM role for EC2

[Create an IAM role](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#create-iam-role) for the created EC2 previously without permissions policies attached. We will allow this role to decrypt with CMK inside nitro enclave in [KMS key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) instead.

Attach this role to the previously created EC2. Check this [guide](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role).

#### Step 4.2. Create your CMK

* Create your [symmetric CMK](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)
* Define key administrative permissions and key usage permissions that user can admin, encrypt and decrypt the signing key in your local or a trusted machine via [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-mac.html).

<img src="/files/YPezqSdofOqQfbnG0klb" alt="" width="563">

* Edit key policy to allow only TMKMS inside nitro enclave to decrypt instead of entire EC2 and encrypt on EC2 You should have a generated policy shown in the console.

  For the decryption action, you should add the following snippet in "Statement" as:

```json
{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        ...
        {
            "Sid": "Enable decrypt from nitro enclave only",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<EC2_IAM_ROLE>"
            },
            "Action": "kms:Decrypt",
            "Resource": "*",
            "Condition": {
                "StringEqualsIgnoreCase": {
                    "kms:RecipientAttestation:PCR4": "<PCR4>",
                    "kms:RecipientAttestation:PCR0": "<PCR0>"
                }
            }
       	},
        {
            "Sid": "Enable encrypt from instance only",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<EC2_IAM_ROLE>"
            },
            "Action": "kms:Encrypt",
            "Resource": "*"
        }
    ]
}
```

**Change `EC2_IAM_ROLE` ,`PCR0` and `PCR4` to what we just created in previous steps.**

If you plan to run the tmkms enclave in the debug mode, set the recipient attestation value to: `000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000` (instead of the PCR0 value).

### Step 5. Prepare encrypted validator signing key on your local machine

#### Step 5.1. Install tmkms-nitro-helper on EC2

Install tmkms-nitro-helper from source code.

```bash
$ git clone https://github.com/crypto-com/tmkms-light.git && cd tmkms-light
$ sudo yum install -y openssl-devel
$ cargo build --release -p tmkms-nitro-helper
$ cp ./target/release/tmkms-nitro-helper /usr/local/bin/
```

#### Step 5.2. Generate a new encrypted validator signing key

`bech32-prefix` is `crocnclconspub` for mainnet and `tcrocnclconspub` for testnet

```bash
$ tmkms-nitro-helper init -a <KMS_REGION> -k <KMS_KEY_ID> -p bech32 -b <bech32-prefix>
```

It should generate a `bech32 public key` to stdout and an encrypted private key in relative path `secrets/secret.key`. We need bech32 public key for node join and secret.key to decrypt inside enclave.

### Step 6. Configure tmkms.toml for enclave TMKMS on EC2

Move above generated `secrets/secret.key` to `~/.tmkms` directory

Create `tmkms.toml` under `~/.tmkms` directory as:

```toml
address = 'unix:///tmp/sockets/validator.socket'
chain_id = '<chain id>'
sealed_consensus_key_path = 'secrets/secret.key'
state_file_path = 'state/priv_validator_state.json'
enclave_config_cid = 15 #overridden by flag
enclave_config_port = 5050
enclave_state_port = 5555
enclave_tendermint_conn = 5000
aws_region = '<AWS region to use for KMS>'
```

{% hint style="info" %}
Example: tmkms.toml for testnet

```toml
address = 'unix:///home/ec2-user/sockets/validator.socket'
chain_id = 'testnet-croeseid-4'
sealed_consensus_key_path = '/home/ec2-user/.tmkms/secrets/secret.key'
state_file_path = '/home/ec2-user/.tmkms/state/priv_validator_state.json'
enclave_config_cid = 15 #overridden by flag
enclave_config_port = 5050
enclave_state_port = 5555
enclave_tendermint_conn = 5000
aws_region = 'ap-southeast-1'
```

{% endhint %}

### Step 7. Create TMKMS enclave service

To launch the TMKMS enclave, one needs to execute several commands to make it work.

```bash
$ nitro-cli run-enclave --cpu-count 2 --memory 512 --eif-path /home/ec2-user/.tmkms/tmkms.eif
# run in background with specific kms region
$ vsock-proxy 8000 kms.<KMS_REGION>.amazonaws.com 443 & 
$ tmkms-nitro-helper start -c /home/ec2-user/.tmkms/tmkms.toml --cid $(nitro-cli describe-enclaves | jq -r .[0].EnclaveCID)
```

In order to have a resilient validator, one should run the TMKMS enclave as a service.

#### Step 7.1. Create a script to run TMKMS enclave

```bash
#!/bin/bash

set -e

TRAP_FUNC ()
{
  nitro-cli terminate-enclave --enclave-id $(nitro-cli describe-enclaves | jq -r .[0].EnclaveID) || echo "no existing enclave"
  sudo kill -TERM $(pidof vsock-proxy)
  exit 1
}

nitro-cli run-enclave --cpu-count 2 --memory 512 --eif-path /home/ec2-user/.tmkms/tmkms.eif || TRAP_FUNC

vsock-proxy 8000 kms.<KMS_REGION>.amazonaws.com 443 &
echo "[vsock-proxy] Running in background ..."

trap TRAP_FUNC TERM INT SIGKILL

sleep 1
/home/ec2-user/bin/tmkms-nitro-helper start -c /home/ec2-user/.tmkms/tmkms.toml --cid $(nitro-cli describe-enclaves | jq -r .[0].EnclaveCID)

```

One should adjust the `<KMS_REGION>` in the script if set differently in `tmkms.toml` eg. `us-east-1`

Create the script `run_tmkms_nitro_helper.sh` with executable permissions under `~/.tmkms` directory

```bash
$ chmod +x run_tmkms_nitro_helper.sh
```

#### Step 7.2. Create systemd service for TMKMS enclave

```toml
[Unit]
Description=Tendermint KMS
ConditionPathExists=/home/ec2-user/.tmkms/tmkms.eif
After=network.target

[Service]
Type=simple
User=ec2-user
Group=ec2-user
LimitNOFILE=50000

Restart=on-failure
RestartSec=10

WorkingDirectory=/home/ec2-user/.tmkms

# make sure log directory exists
PermissionsStartOnly=true

ExecStartPre=/bin/mkdir -p /home/ec2-user/sockets /home/ec2-user/state
ExecStartPre=/bin/chown ec2-user:ec2-user /home/ec2-user/sockets /home/ec2-user/state
ExecStart=/home/ec2-user/.tmkms/run_tmkms_nitro_helper.sh

[Install]
WantedBy=multi-user.target
```

One should adjust the path in the systemd file if set different paths for the binary and script.

Create `/lib/systemd/system/tmkms.service` and run the service

```bash
sudo systemctl daemon-reload
sudo systemctl enable tmkms.service
sudo systemctl start tmkms.service
```

### Step 8. Running chain-maind

One should follow the same steps in [Croeseid Testnet: Running Nodes](/for-node-hosts/getting-started/croeseid-testnet)

Except for one last thing one needs to further configure `~/.chain-maind/config/config.toml` to enable enclave tmkm to sign.

In `~/.chain-maind/config/config.toml`, `priv_validator_key_file` and `priv_validator_state_file` should be commented and uncomment `priv_validator_laddr` to value `unix://...` which should match the `address` in `tmkms.toml`. e.g. `unix:///home/ec2-user/sockets/validator.socket`


# Notes on Performance

The current discourse in cryptocurrencies focuses on “maximum TPS” as the key defining performance metric, and one often finds various outlandish claims about it. For more details on why these numbers don’t matter, we recommend [this article from the Nervos Network](https://medium.com/nervosnetwork/forget-about-the-tps-competition-df40a45fdad8).&#x20;

{% hint style="info" %}
**NOTE** There are more issues with regard to “maximum TPS metrics” that are not mentioned in the article
{% endhint %}

We’ll have to eat humble pie and say that some of the existing Cronos POS Chain materials fall into similar fallacies (despite being written with the word “aim” and intended to be seen in the potential Layer-2 context).

In the future, once the system reaches a certain maturity, we’d like to establish metrics (e.g. the 95th percentile of end-to-end transaction latency) that are more meaningful for user experience. We would try to benchmark against these metrics, ideally in diverse settings (rather than “the best case where nothing ever crashes”) and using estimated real workloads.


# Notes on Production Deployment

* See [Tendermint notes on running in production](https://docs.tendermint.com/v0.34/tendermint-core/running-in-production.html#running-in-production) and [notes on setting up a validator](https://docs.tendermint.com/v0.34/tendermint-core/validators.html#setting-up-a-validator)
* Validators shouldn’t be exposed directly to the internet
* RPC shouldn’t be exposed directly to the internet (as it currently doesn’t support rate-limiting, authentication…)
* Validator block signing should be via [tmkms](https://github.com/iqlusioninc/tmkms)

## Setting up Tendermint KMS for signing blocks (only for validators)

Currently (tmkms v0.7), the system is still a bit Cosmos-centric, so the setup is slightly quirky.

### Configuration

As per the [example](https://github.com/iqlusioninc/tmkms/blob/develop/tmkms.toml.example), create `~/.tmkms/tmkms.toml` (or any path) with something like:

```
[[chain]]
id = "<CHAIN_ID>"
key_format = { type = "hex" }

[[validator]]
addr = "unix:///<TMKMS_SOCKET_PATH>"
chain_id = "<CHAIN_ID>"

[[providers.<USED SIGNING PROVIDER>]]
chain_ids = ["<CHAIN_ID>"]
```

In `~/.tendermint/config/config.toml` (or wherever located), set the socket address to the same one as in `tmkms.toml`:

```
priv_validator_laddr = "unix:///<TMKMS_SOCKET_PATH>"
```

### Obtaining the consensus/validator public key

#### Step 0. Generate/Initialize the key pair or seed

Step 0 depends on the signing provider -- e.g. for Ledger devices, one may need to enable *developer mode* in Ledger Live settings and install the Tendermint validator app.

#### Step 1. Obtain the public key in the correct encoding

Depending on the signing provider, there may be a command to print out the public key. One other option is to run `tmkms start -c .tmkms/tmkms.toml -v` where `-v` is for verbose logging; the log may then include a message `... added consensus key <KEY_HEX_PAYLOAD>`.

The public key hex payload is Amino-encoded -- for the use in Tendermint configurations, there are two steps that need to be done:

1. strip off the Amino prefix; in the case of Ed25519 public keys, it's 5 bytes: 0x16, 0x24, 0xDE, 0x64, 0x20.
2. convert the stripped-off `KEY_HEX_PAYLOAD` to base64.

#### Step 2. Place/Use the public key where needed

For example, generate the `genesis.json` with it if the corresponding node is one of the initial validators.

#### Step 3. Start up everything

As before, but along with `tendermint node`, `tmkms start -c .tmkms/tmkms.toml` should also be launched.


# Chain Details


# Genesis

The `genesis.json` file defines the initial state of the Cronos POS Chain. On top of the standard [tendermint genesis](https://docs.tendermint.com/v0.33/tendermint-core/using-tendermint.html#genesis) format, we customize our own genesis file that includes different [modules](#module_overview) and facilitates the special features of the Cronos POS Chain. Sample genesis file can be found [here](https://github.com/crypto-com/testnets/blob/main/testnet-croeseid-2/genesis.json).

## Fields in genesis

Specifically, the genesis file includes the following fields:

* `"genesis_time"`: The time of the beginning of the blockchain.
* `"genutil"`: A variety of genesis utility functionality for usage including genesis transactions creation (gentx) and genesis file validation command as well as Tendermint related initialization.
* `"ibc"`: Inter-Blockchain Communication across different chains.
* `"chain_id"`: A unique identifier for the blockchain. See [this](/cronos-pos-chain-protocol/chain-details/chain-id) for further details.
* `"initial_height"`: The initial height of the blockchain.
* `"consensus_params`: Consensus parameters defined in the genesis file.
  * `"block"`:
    * `"max_bytes"`: Maximum size of a block (in bytes).
    * `"max_gas"`: The gas limit per block, default value is "-1", i.e., no rules about gas are enforced.
    * `"time_iota_ms"`: The minimum time increment between consecutive blocks, in milliseconds.
  * `"evidence"`: Evidence storage handling and block proposal detection with the evidence reactor.
    * `"max_age_num_blocks"`: *This field is to be deprecated.*
    * `"max_age_duration"`: The maximum age of evidence. Any evidence older than this will be rejected.
    * `"max_num"`: The maximum age of evidence (in number of blocks).
  * `"validator"`:
    * `"pub_key_types"`: The supported validator public key types.
* `"app_hash"`: The initial application state defined in the genesis block.
* `"auth"`
  * `"params"`: Parameters of the auth module defined in the genesis file.
    * `"max_memo_characters"`: Maximum number of characters in a memo of a transaction.
    * `"tx_sig_limit"`: The maximum number of signers for a transaction.
    * `"tx_size_cost_per_byte"`: The amount of gas consumed per byte of a transaction.
    * `"sig_verify_cost_ed25519"`: Gas cost on `edd2519` signature verification.
    * `"sig_verify_cost_secp256k1"`: Gas cost on `secp256k1` signature verification.
  * `"accounts"`: Genesis accounts, which defines the initial allocation of the tokens.
    * `"@type"`: Account type.
    * `"address"`: Address of the genesis accounts.
    * `"pub_key"`: Public key of the genesis accounts.
    * `"account_number"`: The account number of the account in state.
    * `"sequence"`: Used to count the number of transactions sent by this account. It is incremented each time a transaction is included in a block, and used to prevent replay attacks.
    * `"base_vesting_account"`:
      * `"original_vesting"`: Special type of accounting that the token needs to be vested for a period of time before they can be transferred. Tokens can be delegated during the vesting period.
        * `"denom"`: Denomination of the token.
        * `"amount"`: Total amount in the vesting account.
        * `"delegated_free"`: Amount of delegated tokens that can be transferred after they've been vested.
        * `"delegated_vesting"`: Amount of delegated tokens that are still under vesting.
        * `"endtime"`: Vesting end time.
* `"bank"` The bank module handles tokens.
  * `"params"`: Parameters of the bank module defined in the genesis file.
    * `"send_enabled"`: The transfer capability in the genesis.
    * `"default_send_enabled"`: The default value for "send\_enabled" value controls send transfer capability.
* `"distribution"`:The module that handles the logic of distribution block provisions and fees to validators and delegators.
  * `"delegator_starting_infos"`:
  * `"delegator_withdraw_infos"`: List of delegators withdraw address.
  * `"fee_pool"`:
    * `"community_pool"`: Allocated funds in the community pool, if any.
  * `"outstanding_rewards"`: Uncollected rewards, if any.
  * `"params"`: Parameters of the distribution module defined in the genesis file.
    * `"base_proposer_reward"`: Base bonus on transaction fees collected in a valid block.
    * `"bonus_proposer_reward"`: Maximum bonus on transaction fees collected in a valid block.
    * `"community_tax"`: The rate of community tax.
    * `"withdraw_addr_enabled"`: Whether delegators can set a different address to withdraw their rewards.
  * `"previous_proposer"`: Proposer of the previous block, if any.
  * `"validator_accumulated_commissions"`: Uncollected commission of validators, if any.
  * `"validator_current_rewards"`: Information related to the current rewards of validators, if any.
  * `"validator_historical_rewards"`: Information related to the historical rewards of validators, if any.
  * `"validator_slash_events"`: Information related to the historical slashing events of validators, if any.
* `"gov"`: The governance module.
  * `"deposit_params"`: Parameters for the deposit required for governance proposal.
    * `"max_deposit_period"`: The maximum deposit period for governance proposal.
    * `"min_deposit"`: The minimum deposit required for governance proposal.
  * `"deposits"`: List of deposits for each proposal ID, if any.
  * `"proposals"`: List of proposals for proposals, if any.
  * `"starting_proposal_id"`: The initial proposals id, starting from `"1"`
  * `"tally_params"`: Parameters for tally.
    * `"quorum"`: Minimum percentage of bonded staking tokens that needs to vote for the result to be valid.
    * `"threshold"`: Minimum percentage of votes that need to be `YES` for the result to be valid.
    * `"veto_threshold"`: Maximum percentage `NO_WITH_VETO` votes for the result to be valid.
  * `"votes"`: List of votes for each proposal ID, if any.
  * `"voting_params"`: Parameters for voting.
    * `"voting_period"`: The voting period for governance proposal.
* `"mint"`: The minting module for token minting.
  * `"minter"`:
    * `"annual_provisions"`: Annual expected provisions (set to zero in genesis).
    * `"inflation"`: The target yearly inflation rate, compounded weekly.
  * `"params":` Parameters of the mint module defined in the genesis file.
    * `"blocks_per_year"`: The expected number of blocks being produced per year.
    * `"goal_bonded"`: Target bonded token in percentage.
    * `"inflation_max"`: Maximum inflation rate.
    * `"inflation_min"`: Minimum inflation rate.
    * `"inflation_rate_change"`: Maximum annual change in inflation rate.
    * `"mint_denom"`: Token type being minted.
* `"slashing"`: The slashing module for the punishment of validator's misbehavior.
  * `"missed_blocks"`: Information related to validators missed blocks, if any.
  * `"params"`: Parameters of the slashing module defined in the genesis file.
    * `"downtime_jail_duration"`: The jailing duration for validators with low availability.
    * `"min_signed_per_window"`: Threshold of total missed blocks, in percentage.
    * `"signed_blocks_window"`: Window to calculate validators's liveness.
    * `"slash_fraction_double_sign"`: Maximum percentage of stake reduction for byzantine validators.
    * `"slash_fraction_downtime"`: Maximum percentage of stake reduction for validators with low availability.
  * `"signing_infos"`: Information related to each validator for the slashing module, if any.
* `"staking"`: The staking module that handles Proof-of-Stake related logics.
  * `"delegations"`: Information related to the delegation state of validators, if any.
  * `"exported"`: Wether this genesis file was generated by exporting of a previous state.
  * `"last_total_power"`: Total voting power in the genesis, if any.
  * `"last_validator_powers"`: The voting power of each validator in last known state, if any.
  * `"params"`: Parameters of the staking module defined in the genesis file.
    * `"bond_denom"`: Coin denomination for staking.
    * `"historical_entries"`: The number of historical entries to persist.
    * `"max_entries"`: The max entries for either unbonding delegation or redelegation.
    * `"max_validators"`: The maximum number of validator.
    * `"unbonding_time"`: The time duration of unbonding.
  * `"redelegations"`: List of redelegations for validators, if any.
  * `"unbonding_delegations"`: List of unbonding delegations for validators, if any.
  * `"validators"`: List of existing validators, if any.


# Protocol Documentation

## Table of Contents

* [cosmos/crypto/multisig/v1beta1/multisig.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CompactBitArray](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MultiSignature](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/crypto/multisig/keys.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [LegacyAminoPubKey](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/crypto/secp256k1/keys.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PrivKey](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PubKey](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/crypto/ed25519/keys.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PrivKey](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PubKey](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/upgrade/v1beta1/upgrade.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CancelSoftwareUpgradeProposal](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Plan](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SoftwareUpgradeProposal](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/upgrade/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAppliedPlanRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAppliedPlanResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryCurrentPlanRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryCurrentPlanResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/mint/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAnnualProvisionsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAnnualProvisionsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryInflationRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryInflationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/mint/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/mint/v1beta1/mint.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Minter](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Params](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/evidence/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSubmitEvidence](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSubmitEvidenceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/evidence/v1beta1/evidence.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Equivocation](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/evidence/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAllEvidenceRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAllEvidenceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryEvidenceRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryEvidenceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/evidence/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/auth/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAccountRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAccountResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/auth/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/auth/v1beta1/auth.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [BaseAccount](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ModuleAccount](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Params](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/bank/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgMultiSend](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgMultiSendResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSend](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSendResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/bank/v1beta1/bank.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DenomUnit](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Input](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Metadata](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Output](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Params](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SendEnabled](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Supply](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/bank/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAllBalancesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryAllBalancesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryBalanceRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryBalanceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QuerySupplyOfRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QuerySupplyOfResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryTotalSupplyRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryTotalSupplyResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/bank/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Balance](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/capability/v1beta1/capability.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Capability](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CapabilityOwners](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Owner](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/capability/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisOwners](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/distribution/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgFundCommunityPool](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgFundCommunityPoolResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSetWithdrawAddress](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSetWithdrawAddressResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgWithdrawDelegatorReward](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgWithdrawDelegatorRewardResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgWithdrawValidatorCommission](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgWithdrawValidatorCommissionResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/distribution/v1beta1/distribution.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CommunityPoolSpendProposal](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CommunityPoolSpendProposalWithDeposit](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DelegationDelegatorReward](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DelegatorStartingInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [FeePool](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Params](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorAccumulatedCommission](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorCurrentRewards](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorHistoricalRewards](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorOutstandingRewards](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorSlashEvent](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorSlashEvents](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/distribution/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryCommunityPoolRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryCommunityPoolResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegationRewardsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegationRewardsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegationTotalRewardsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegationTotalRewardsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorValidatorsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorValidatorsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorWithdrawAddressRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorWithdrawAddressResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorCommissionRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorCommissionResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorOutstandingRewardsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorOutstandingRewardsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorSlashesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorSlashesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/distribution/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DelegatorStartingInfoRecord](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DelegatorWithdrawInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorAccumulatedCommissionRecord](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorCurrentRewardsRecord](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorHistoricalRewardsRecord](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorOutstandingRewardsRecord](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorSlashEventRecord](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/crisis/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgVerifyInvariant](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgVerifyInvariantResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/crisis/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/tx/signing/v1beta1/signing.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignatureDescriptor](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignatureDescriptor.Data](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignatureDescriptor.Data.Multi](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignatureDescriptor.Data.Single](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignatureDescriptors](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignMode](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/tx/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [AuthInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Fee](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ModeInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ModeInfo.Multi](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ModeInfo.Single](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignDoc](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignerInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Tx](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TxBody](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TxRaw](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/vesting/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgCreateVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgCreateVestingAccountResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/vesting/v1beta1/vesting.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [BaseVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ContinuousVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DelayedVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Period](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PeriodicVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/staking/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgBeginRedelegate](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgBeginRedelegateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgCreateValidator](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgCreateValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgDelegate](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgDelegateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgEditValidator](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgEditValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUndelegate](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUndelegateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/staking/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegationRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorUnbondingDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorUnbondingDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorValidatorRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorValidatorsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDelegatorValidatorsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryHistoricalInfoRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryHistoricalInfoResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPoolRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPoolResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryRedelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryRedelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryUnbondingDelegationRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryUnbondingDelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorUnbondingDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorUnbondingDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryValidatorsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/staking/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [LastValidatorPower](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/staking/v1beta1/staking.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Commission](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CommissionRates](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DVPair](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DVPairs](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DVVTriplet](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DVVTriplets](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Delegation](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Description](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [HistoricalInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Params](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Pool](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Redelegation](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [RedelegationEntry](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [RedelegationEntryResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [RedelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [UnbondingDelegation](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [UnbondingDelegationEntry](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValAddresses](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Validator](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [BondStatus](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/genutil/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/params/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/params/v1beta1/params.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ParamChange](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ParameterChangeProposal](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/slashing/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUnjail](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUnjailResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/slashing/v1beta1/slashing.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Params](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorSigningInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/slashing/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QuerySigningInfoRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QuerySigningInfoResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QuerySigningInfosRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QuerySigningInfosResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/slashing/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MissedBlock](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SigningInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ValidatorMissedBlocks](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/abci/v1beta1/abci.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ABCIMessageLog](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Attribute](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GasInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Result](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SearchTxsResult](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SimulationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [StringEvent](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TxMsgData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TxResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/kv/v1beta1/kv.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Pair](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Pairs](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/snapshots/v1beta1/snapshot.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Metadata](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Snapshot](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/simulate/v1beta1/simulate.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SimulateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SimulateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SimulateService](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/v1beta1/coin.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Coin](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DecProto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [IntProto](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/query/v1beta1/pagination.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/store/v1beta1/commit\_info.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CommitID](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [CommitInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [StoreInfo](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/store/v1beta1/snapshot.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SnapshotIAVLItem](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SnapshotItem](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SnapshotStoreItem](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/base/reflection/v1beta1/reflection.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ListAllInterfacesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ListAllInterfacesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ListImplementationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ListImplementationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ReflectionService](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/gov/v1beta1/tx.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgDeposit](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgDepositResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSubmitProposal](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSubmitProposalResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgVote](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgVoteResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/gov/v1beta1/gov.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Deposit](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DepositParams](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Proposal](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TallyParams](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TallyResult](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TextProposal](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Vote](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [VotingParams](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ProposalStatus](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [VoteOption](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/gov/v1beta1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDepositRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDepositResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDepositsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDepositsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryProposalRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryProposalResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryProposalsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryProposalsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryTallyResultRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryTallyResultResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryVoteRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryVoteResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryVotesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryVotesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [cosmos/gov/v1beta1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/types/v1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/connection/v1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryClientConnectionsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryClientConnectionsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionClientStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionClientStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionConsensusStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionConsensusStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/connection/v1/connection.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ClientPaths](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ConnectionEnd](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ConnectionPaths](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [IdentifiedConnection](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenAck](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenAckResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenConfirm](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenConfirmResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenInit](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenInitResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenTry](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgConnectionOpenTryResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Version](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [State](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/connection/v1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/commitment/v1/commitment.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Key](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [KeyPath](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MerklePath](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MerklePrefix](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MerkleProof](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MerkleRoot](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [KeyEncoding](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/channel/v1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelClientStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelClientStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelConsensusStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelConsensusStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryChannelsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionChannelsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConnectionChannelsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryNextSequenceReceiveRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryNextSequenceReceiveResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPacketAcknowledgementRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPacketAcknowledgementResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPacketCommitmentRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPacketCommitmentResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPacketCommitmentsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryPacketCommitmentsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryUnreceivedPacketsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryUnreceivedPacketsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryUnrelayedAcksRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryUnrelayedAcksResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/channel/v1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PacketSequence](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/channel/v1/channel.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Acknowledgement](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Channel](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [IdentifiedChannel](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgAcknowledgement](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgAcknowledgementResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelCloseConfirm](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelCloseConfirmResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelCloseInit](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelCloseInitResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenAck](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenAckResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenConfirm](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenConfirmResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenInit](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenInitResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenTry](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgChannelOpenTryResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgRecvPacket](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgRecvPacketResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgTimeout](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgTimeoutOnClose](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgTimeoutOnCloseResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgTimeoutResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Packet](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PacketAckCommitment](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Order](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [State](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/client/v1/client.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ClientConsensusStates](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ClientUpdateProposal](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ConsensusStateWithHeight](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Height](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [IdentifiedClientState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgCreateClient](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgCreateClientResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSubmitMisbehaviour](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgSubmitMisbehaviourResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUpdateClient](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUpdateClientResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUpgradeClient](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgUpgradeClientResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/client/v1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryClientStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryClientStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryClientStatesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryClientStatesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConsensusStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConsensusStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConsensusStatesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryConsensusStatesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/core/client/v1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/lightclients/solomachine/v1/solomachine.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ChannelStateData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ClientState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ClientStateData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ConnectionStateData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ConsensusState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ConsensusStateData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Header](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [HeaderData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Misbehaviour](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [NextSequenceRecvData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PacketAcknowledgementData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PacketCommitmentData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [PacketReceiptAbsenceData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignBytes](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [SignatureAndData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [TimestampedSignatureData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DataType](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/lightclients/tendermint/v1/tendermint.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ClientState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ConsensusState](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Fraction](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Header](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Misbehaviour](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/lightclients/localhost/v1/localhost.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [ClientState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/applications/transfer/v1/transfer.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [DenomTrace](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [FungibleTokenPacketData](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgTransfer](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [MsgTransferResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Params](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Msg](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/applications/transfer/v1/query.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDenomTraceRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDenomTraceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDenomTracesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryDenomTracesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [Query](broken://pages/gOJeSIL8phGPlQ62pLku)
* [ibc/applications/transfer/v1/genesis.proto](broken://pages/gOJeSIL8phGPlQ62pLku)
  * [GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)
* [Scalar Value Types](broken://pages/gOJeSIL8phGPlQ62pLku)

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/crypto/multisig/v1beta1/multisig.proto

### CompactBitArray

CompactBitArray is an implementation of a space efficient bit array. This is used to ensure that the encoded data takes up a minimal amount of space after proto encoding. This is not thread safe, and is not intended for concurrent usage.

| Field               | Type                                          | Label | Description |
| ------------------- | --------------------------------------------- | ----- | ----------- |
| extra\_bits\_stored | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| elems               | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |

### MultiSignature

MultiSignature wraps the signatures from a multisig.LegacyAminoPubKey. See cosmos.tx.v1betata1.ModeInfo.Multi for how to specify which signers signed and with which modes.

| Field      | Type                                         | Label    | Description |
| ---------- | -------------------------------------------- | -------- | ----------- |
| signatures | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/crypto/multisig/keys.proto

### LegacyAminoPubKey

LegacyAminoPubKey specifies a public key type which nests multiple public keys and a threshold, it uses legacy amino address rules.

| Field        | Type                                                       | Label    | Description |
| ------------ | ---------------------------------------------------------- | -------- | ----------- |
| threshold    | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)              |          |             |
| public\_keys | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/crypto/secp256k1/keys.proto

### PrivKey

PrivKey defines a secp256k1 private key.

| Field | Type                                         | Label | Description |
| ----- | -------------------------------------------- | ----- | ----------- |
| key   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### PubKey

PubKey defines a secp256k1 public key Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte if the y-coordinate is the lexicographically largest of the two associated with the x-coordinate. Otherwise the first byte is a 0x03. This prefix is followed with the x-coordinate.

| Field | Type                                         | Label | Description |
| ----- | -------------------------------------------- | ----- | ----------- |
| key   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/crypto/ed25519/keys.proto

### PrivKey

PrivKey defines a ed25519 private key.

| Field | Type                                         | Label | Description |
| ----- | -------------------------------------------- | ----- | ----------- |
| key   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### PubKey

PubKey defines a ed25519 public key Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte if the y-coordinate is the lexicographically largest of the two associated with the x-coordinate. Otherwise the first byte is a 0x03. This prefix is followed with the x-coordinate.

| Field | Type                                         | Label | Description |
| ----- | -------------------------------------------- | ----- | ----------- |
| key   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/upgrade/v1beta1/upgrade.proto

### CancelSoftwareUpgradeProposal

CancelSoftwareUpgradeProposal is a gov Content type for cancelling a software upgrade.

| Field       | Type                                          | Label | Description |
| ----------- | --------------------------------------------- | ----- | ----------- |
| title       | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| description | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Plan

Plan specifies information about a planned upgrade and when it should occur.

| Field                   | Type                                                             | Label | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------------------- | ---------------------------------------------------------------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name                    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | Sets the name for the upgrade. This name will be used by the upgraded version of the software to apply any special "on-upgrade" commands during the first BeginBlock method after the upgrade is applied. It is also used to detect whether a software version can handle a given upgrade. If no upgrade handler with this name has been set in the software, it will be assumed that the software is out-of-date when the upgrade Time or Height is reached and the software will exit. |
| time                    | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       | The time after which the upgrade must be performed. Leave set to its zero value to use a pre-defined Height instead.                                                                                                                                                                                                                                                                                                                                                                     |
| height                  | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | The height at which the upgrade must be performed. Only used if Time is not set.                                                                                                                                                                                                                                                                                                                                                                                                         |
| info                    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | Any application specific upgrade info to be included on-chain such as a git commit that validators could automatically upgrade to                                                                                                                                                                                                                                                                                                                                                        |
| upgraded\_client\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)       |       | IBC-enabled chains can opt-in to including the upgraded client state in its upgrade plan This will make the chain commit to the correct upgraded (self) client state before the upgrade occurs, so that connecting chains can verify that the new upgraded client is valid by verifying a proof on the previous version of the chain. This will allow IBC connections to persist smoothly across planned chain upgrades                                                                  |

### SoftwareUpgradeProposal

SoftwareUpgradeProposal is a gov Content type for initiating a software upgrade.

| Field       | Type                                          | Label | Description |
| ----------- | --------------------------------------------- | ----- | ----------- |
| title       | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| description | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| plan        | [Plan](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/upgrade/v1beta1/query.proto

### QueryAppliedPlanRequest

QueryCurrentPlanRequest is the request type for the Query/AppliedPlan RPC method.

| Field | Type                                          | Label | Description                                        |
| ----- | --------------------------------------------- | ----- | -------------------------------------------------- |
| name  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | name is the name of the applied plan to query for. |

### QueryAppliedPlanResponse

QueryAppliedPlanResponse is the response type for the Query/AppliedPlan RPC method.

| Field  | Type                                         | Label | Description                                               |
| ------ | -------------------------------------------- | ----- | --------------------------------------------------------- |
| height | [int64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height is the block height at which the plan was applied. |

### QueryCurrentPlanRequest

QueryCurrentPlanRequest is the request type for the Query/CurrentPlan RPC method.

### QueryCurrentPlanResponse

QueryCurrentPlanResponse is the response type for the Query/CurrentPlan RPC method.

| Field | Type                                        | Label | Description                       |
| ----- | ------------------------------------------- | ----- | --------------------------------- |
| plan  | [Plan](broken://pages/gOJeSIL8phGPlQ62pLku) |       | plan is the current upgrade plan. |

### Query

Query defines the gRPC upgrade querier service.

| Method Name | Request Type                                                   | Response Type                                                   | Description                                                        |
| ----------- | -------------------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------ |
| CurrentPlan | [QueryCurrentPlanRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryCurrentPlanResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | CurrentPlan queries the current upgrade plan.                      |
| AppliedPlan | [QueryAppliedPlanRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryAppliedPlanResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | AppliedPlan queries a previously applied upgrade plan by its name. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/mint/v1beta1/query.proto

### QueryAnnualProvisionsRequest

QueryAnnualProvisionsRequest is the request type for the Query/AnnualProvisions RPC method.

### QueryAnnualProvisionsResponse

QueryAnnualProvisionsResponse is the response type for the Query/AnnualProvisions RPC method.

| Field              | Type                                         | Label | Description                                                        |
| ------------------ | -------------------------------------------- | ----- | ------------------------------------------------------------------ |
| annual\_provisions | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       | annual\_provisions is the current minting annual provisions value. |

### QueryInflationRequest

QueryInflationRequest is the request type for the Query/Inflation RPC method.

### QueryInflationResponse

QueryInflationResponse is the response type for the Query/Inflation RPC method.

| Field     | Type                                         | Label | Description                                       |
| --------- | -------------------------------------------- | ----- | ------------------------------------------------- |
| inflation | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       | inflation is the current minting inflation value. |

### QueryParamsRequest

QueryParamsRequest is the request type for the Query/Params RPC method.

### QueryParamsResponse

QueryParamsResponse is the response type for the Query/Params RPC method.

| Field  | Type                                          | Label | Description                                  |
| ------ | --------------------------------------------- | ----- | -------------------------------------------- |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       | params defines the parameters of the module. |

### Query

Query provides defines the gRPC querier service.

| Method Name      | Request Type                                                        | Response Type                                                        | Description                                               |
| ---------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------- | --------------------------------------------------------- |
| Params           | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)           | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)           | Params returns the total set of minting parameters.       |
| Inflation        | [QueryInflationRequest](broken://pages/gOJeSIL8phGPlQ62pLku)        | [QueryInflationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)        | Inflation returns the current minting inflation value.    |
| AnnualProvisions | [QueryAnnualProvisionsRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryAnnualProvisionsResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | AnnualProvisions current minting annual provisions value. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/mint/v1beta1/genesis.proto

### GenesisState

GenesisState defines the mint module's genesis state.

| Field  | Type                                          | Label | Description                                                  |
| ------ | --------------------------------------------- | ----- | ------------------------------------------------------------ |
| minter | [Minter](broken://pages/gOJeSIL8phGPlQ62pLku) |       | minter is a space for holding current inflation information. |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       | params defines all the paramaters of the module.             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/mint/v1beta1/mint.proto

### Minter

Minter represents the minting state.

| Field              | Type                                          | Label | Description                        |
| ------------------ | --------------------------------------------- | ----- | ---------------------------------- |
| inflation          | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | current annual inflation rate      |
| annual\_provisions | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | current annual expected provisions |

### Params

Params holds parameters for the mint module.

| Field                   | Type                                          | Label | Description                             |
| ----------------------- | --------------------------------------------- | ----- | --------------------------------------- |
| mint\_denom             | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | type of coin to mint                    |
| inflation\_rate\_change | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | maximum annual change in inflation rate |
| inflation\_max          | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | maximum inflation rate                  |
| inflation\_min          | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | minimum inflation rate                  |
| goal\_bonded            | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | goal of percent bonded atoms            |
| blocks\_per\_year       | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | expected blocks per year                |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/evidence/v1beta1/tx.proto

### MsgSubmitEvidence

MsgSubmitEvidence represents a message that supports submitting arbitrary Evidence of misbehavior such as equivocation or counterfactual signing.

| Field     | Type                                                       | Label | Description |
| --------- | ---------------------------------------------------------- | ----- | ----------- |
| submitter | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |             |
| evidence  | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgSubmitEvidenceResponse

MsgSubmitEvidenceResponse defines the Msg/SubmitEvidence response type.

| Field | Type                                         | Label | Description                            |
| ----- | -------------------------------------------- | ----- | -------------------------------------- |
| hash  | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       | hash defines the hash of the evidence. |

### Msg

Msg defines the evidence Msg service.

| Method Name    | Request Type                                             | Response Type                                                    | Description                                                                                                 |
| -------------- | -------------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| SubmitEvidence | [MsgSubmitEvidence](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgSubmitEvidenceResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | SubmitEvidence submits an arbitrary Evidence of misbehavior such as equivocation or counterfactual signing. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/evidence/v1beta1/evidence.proto

### Equivocation

Equivocation implements the Evidence interface and defines evidence of double signing misbehavior.

| Field              | Type                                                             | Label | Description |
| ------------------ | ---------------------------------------------------------------- | ----- | ----------- |
| height             | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| time               | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| power              | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| consensus\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/evidence/v1beta1/query.proto

### QueryAllEvidenceRequest

QueryEvidenceRequest is the request type for the Query/AllEvidence RPC method.

| Field      | Type                                                                         | Label | Description                                                |
| ---------- | ---------------------------------------------------------------------------- | ----- | ---------------------------------------------------------- |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request. |

### QueryAllEvidenceResponse

QueryAllEvidenceResponse is the response type for the Query/AllEvidence RPC method.

| Field      | Type                                                                          | Label    | Description                                        |
| ---------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| evidence   | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated | evidence returns all evidences.                    |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryEvidenceRequest

QueryEvidenceRequest is the request type for the Query/Evidence RPC method.

| Field          | Type                                         | Label | Description                                                |
| -------------- | -------------------------------------------- | ----- | ---------------------------------------------------------- |
| evidence\_hash | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       | evidence\_hash defines the hash of the requested evidence. |

### QueryEvidenceResponse

QueryEvidenceResponse is the response type for the Query/Evidence RPC method.

| Field    | Type                                                       | Label | Description                              |
| -------- | ---------------------------------------------------------- | ----- | ---------------------------------------- |
| evidence | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | evidence returns the requested evidence. |

### Query

Query defines the gRPC querier service.

| Method Name | Request Type                                                   | Response Type                                                   | Description                                       |
| ----------- | -------------------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------- |
| Evidence    | [QueryEvidenceRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryEvidenceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | Evidence queries evidence based on evidence hash. |
| AllEvidence | [QueryAllEvidenceRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryAllEvidenceResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | AllEvidence queries all evidence.                 |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/evidence/v1beta1/genesis.proto

### GenesisState

GenesisState defines the evidence module's genesis state.

| Field    | Type                                                       | Label    | Description                                   |
| -------- | ---------------------------------------------------------- | -------- | --------------------------------------------- |
| evidence | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | evidence defines all the evidence at genesis. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/auth/v1beta1/query.proto

### QueryAccountRequest

QueryAccountRequest is the request type for the Query/Account RPC method.

| Field   | Type                                          | Label | Description                               |
| ------- | --------------------------------------------- | ----- | ----------------------------------------- |
| address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | address defines the address to query for. |

### QueryAccountResponse

QueryAccountResponse is the response type for the Query/Account RPC method.

| Field   | Type                                                       | Label | Description                                               |
| ------- | ---------------------------------------------------------- | ----- | --------------------------------------------------------- |
| account | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | account defines the account of the corresponding address. |

### QueryParamsRequest

QueryParamsRequest is the request type for the Query/Params RPC method.

### QueryParamsResponse

QueryParamsResponse is the response type for the Query/Params RPC method.

| Field  | Type                                          | Label | Description                                  |
| ------ | --------------------------------------------- | ----- | -------------------------------------------- |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       | params defines the parameters of the module. |

### Query

Query defines the gRPC querier service.

| Method Name | Request Type                                               | Response Type                                               | Description                                       |
| ----------- | ---------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------- |
| Account     | [QueryAccountRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryAccountResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | Account returns account details based on address. |
| Params      | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)  | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)  | Params queries all parameters.                    |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/auth/v1beta1/genesis.proto

### GenesisState

GenesisState defines the auth module's genesis state.

| Field    | Type                                                       | Label    | Description                                      |
| -------- | ---------------------------------------------------------- | -------- | ------------------------------------------------ |
| params   | [Params](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | params defines all the paramaters of the module. |
| accounts | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | accounts are the accounts present at genesis.    |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/auth/v1beta1/auth.proto

### BaseAccount

BaseAccount defines a base account type. It contains all the necessary fields for basic account functionality. Any custom account type should extend this type for additional functionality (e.g. vesting).

| Field           | Type                                                       | Label | Description |
| --------------- | ---------------------------------------------------------- | ----- | ----------- |
| address         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |             |
| pub\_key        | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| account\_number | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |             |
| sequence        | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |             |

### ModuleAccount

ModuleAccount defines an account for modules that holds coins on a pool.

| Field         | Type                                               | Label    | Description |
| ------------- | -------------------------------------------------- | -------- | ----------- |
| base\_account | [BaseAccount](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |
| name          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      |          |             |
| permissions   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      | repeated |             |

### Params

Params defines the parameters for the auth module.

| Field                        | Type                                          | Label | Description |
| ---------------------------- | --------------------------------------------- | ----- | ----------- |
| max\_memo\_characters        | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| tx\_sig\_limit               | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| tx\_size\_cost\_per\_byte    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| sig\_verify\_cost\_ed25519   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| sig\_verify\_cost\_secp256k1 | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/bank/v1beta1/tx.proto

### MsgMultiSend

MsgMultiSend represents an arbitrary multi-in, multi-out send message.

| Field   | Type                                          | Label    | Description |
| ------- | --------------------------------------------- | -------- | ----------- |
| inputs  | [Input](broken://pages/gOJeSIL8phGPlQ62pLku)  | repeated |             |
| outputs | [Output](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### MsgMultiSendResponse

MsgMultiSendResponse defines the Msg/MultiSend response type.

### MsgSend

MsgSend represents a message to send coins from one account to another.

| Field         | Type                                                            | Label    | Description |
| ------------- | --------------------------------------------------------------- | -------- | ----------- |
| from\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| to\_address   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| amount        | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### MsgSendResponse

MsgSendResponse defines the Msg/Send response type.

### Msg

Msg defines the bank Msg service.

| Method Name | Request Type                                        | Response Type                                               | Description                                                                        |
| ----------- | --------------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Send        | [MsgSend](broken://pages/gOJeSIL8phGPlQ62pLku)      | [MsgSendResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | Send defines a method for sending coins from one account to another account.       |
| MultiSend   | [MsgMultiSend](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgMultiSendResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | MultiSend defines a method for sending coins from some accounts to other accounts. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/bank/v1beta1/bank.proto

### DenomUnit

DenomUnit represents a struct that describes a given denomination unit of the basic token.

| Field    | Type                                          | Label    | Description                                                                                                                                                                                                                                                                           |
| -------- | --------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| denom    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |          | denom represents the string name of the given denom unit (e.g uatom).                                                                                                                                                                                                                 |
| exponent | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku) |          | exponent represents power of 10 exponent that one must raise the base\_denom to in order to equal the given DenomUnit's denom 1 denom = 1^exponent base\_denom (e.g. with a base\_denom of uatom, one can create a DenomUnit of 'atom' with exponent = 6, thus: 1 atom = 10^6 uatom). |
| aliases  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | aliases is a list of string aliases for the given denom                                                                                                                                                                                                                               |

### Input

Input models transaction input.

| Field   | Type                                                            | Label    | Description |
| ------- | --------------------------------------------------------------- | -------- | ----------- |
| address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| coins   | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### Metadata

Metadata represents a struct that describes a basic token.

| Field        | Type                                             | Label    | Description                                                                 |
| ------------ | ------------------------------------------------ | -------- | --------------------------------------------------------------------------- |
| description  | [string](broken://pages/gOJeSIL8phGPlQ62pLku)    |          |                                                                             |
| denom\_units | [DenomUnit](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | denom\_units represents the list of DenomUnit's for a given coin            |
| base         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)    |          | base represents the base denom (should be the DenomUnit with exponent = 0). |
| display      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)    |          | display indicates the suggested denom that should be displayed in clients.  |

### Output

Output models transaction outputs.

| Field   | Type                                                            | Label    | Description |
| ------- | --------------------------------------------------------------- | -------- | ----------- |
| address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| coins   | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### Params

Params defines the parameters for the bank module.

| Field                  | Type                                               | Label    | Description |
| ---------------------- | -------------------------------------------------- | -------- | ----------- |
| send\_enabled          | [SendEnabled](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| default\_send\_enabled | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)        |          |             |

### SendEnabled

SendEnabled maps coin denom to a send\_enabled status (whether a denom is sendable).

| Field   | Type                                          | Label | Description |
| ------- | --------------------------------------------- | ----- | ----------- |
| denom   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| enabled | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |

### Supply

Supply represents a struct that passively keeps track of the total supply amounts in the network.

| Field | Type                                                            | Label    | Description |
| ----- | --------------------------------------------------------------- | -------- | ----------- |
| total | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/bank/v1beta1/query.proto

### QueryAllBalancesRequest

QueryBalanceRequest is the request type for the Query/AllBalances RPC method.

| Field      | Type                                                                         | Label | Description                                                |
| ---------- | ---------------------------------------------------------------------------- | ----- | ---------------------------------------------------------- |
| address    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | address is the address to query balances for.              |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request. |

### QueryAllBalancesResponse

QueryAllBalancesResponse is the response type for the Query/AllBalances RPC method.

| Field      | Type                                                                          | Label    | Description                                        |
| ---------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| balances   | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku)               | repeated | balances is the balances of all the coins.         |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryBalanceRequest

QueryBalanceRequest is the request type for the Query/Balance RPC method.

| Field   | Type                                          | Label | Description                                    |
| ------- | --------------------------------------------- | ----- | ---------------------------------------------- |
| address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | address is the address to query balances for.  |
| denom   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | denom is the coin denom to query balances for. |

### QueryBalanceResponse

QueryBalanceResponse is the response type for the Query/Balance RPC method.

| Field   | Type                                                            | Label | Description                         |
| ------- | --------------------------------------------------------------- | ----- | ----------------------------------- |
| balance | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       | balance is the balance of the coin. |

### QueryParamsRequest

QueryParamsRequest defines the request type for querying x/bank parameters.

### QueryParamsResponse

QueryParamsResponse defines the response type for querying x/bank parameters.

| Field  | Type                                          | Label | Description |
| ------ | --------------------------------------------- | ----- | ----------- |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### QuerySupplyOfRequest

QuerySupplyOfRequest is the request type for the Query/SupplyOf RPC method.

| Field | Type                                          | Label | Description                                    |
| ----- | --------------------------------------------- | ----- | ---------------------------------------------- |
| denom | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | denom is the coin denom to query balances for. |

### QuerySupplyOfResponse

QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC method.

| Field  | Type                                                            | Label | Description                       |
| ------ | --------------------------------------------------------------- | ----- | --------------------------------- |
| amount | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       | amount is the supply of the coin. |

### QueryTotalSupplyRequest

QueryTotalSupplyRequest is the request type for the Query/TotalSupply RPC method.

### QueryTotalSupplyResponse

QueryTotalSupplyResponse is the response type for the Query/TotalSupply RPC method

| Field  | Type                                                            | Label    | Description                       |
| ------ | --------------------------------------------------------------- | -------- | --------------------------------- |
| supply | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | supply is the supply of the coins |

### Query

Query defines the gRPC querier service.

| Method Name | Request Type                                                   | Response Type                                                   | Description                                                        |
| ----------- | -------------------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------ |
| Balance     | [QueryBalanceRequest](broken://pages/gOJeSIL8phGPlQ62pLku)     | [QueryBalanceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | Balance queries the balance of a single coin for a single account. |
| AllBalances | [QueryAllBalancesRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryAllBalancesResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | AllBalances queries the balance of all coins for a single account. |
| TotalSupply | [QueryTotalSupplyRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryTotalSupplyResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | TotalSupply queries the total supply of all coins.                 |
| SupplyOf    | [QuerySupplyOfRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QuerySupplyOfResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | SupplyOf queries the supply of a single coin.                      |
| Params      | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)      | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | Params queries the parameters of x/bank module.                    |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/bank/v1beta1/genesis.proto

### Balance

Balance defines an account address and balance pair used in the bank module's genesis state.

| Field   | Type                                                            | Label    | Description                                           |
| ------- | --------------------------------------------------------------- | -------- | ----------------------------------------------------- |
| address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          | address is the address of the balance holder.         |
| coins   | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | coins defines the different coins this balance holds. |

### GenesisState

GenesisState defines the bank module's genesis state.

| Field           | Type                                                            | Label    | Description                                                       |
| --------------- | --------------------------------------------------------------- | -------- | ----------------------------------------------------------------- |
| params          | [Params](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          | params defines all the paramaters of the module.                  |
| balances        | [Balance](broken://pages/gOJeSIL8phGPlQ62pLku)                  | repeated | balances is an array containing the balances of all the accounts. |
| supply          | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | supply represents the total supply.                               |
| denom\_metadata | [Metadata](broken://pages/gOJeSIL8phGPlQ62pLku)                 | repeated | denom\_metadata defines the metadata of the differents coins.     |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/capability/v1beta1/capability.proto

### Capability

Capability defines an implementation of an object capability. The index provided to a Capability must be globally unique.

| Field | Type                                          | Label | Description |
| ----- | --------------------------------------------- | ----- | ----------- |
| index | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### CapabilityOwners

CapabilityOwners defines a set of owners of a single Capability. The set of owners must be unique.

| Field  | Type                                         | Label    | Description |
| ------ | -------------------------------------------- | -------- | ----------- |
| owners | [Owner](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### Owner

Owner defines a single capability owner. An owner is defined by the name of capability and the module name.

| Field  | Type                                          | Label | Description |
| ------ | --------------------------------------------- | ----- | ----------- |
| module | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| name   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/capability/v1beta1/genesis.proto

### GenesisOwners

GenesisOwners defines the capability owners with their corresponding index.

| Field         | Type                                                    | Label | Description                                      |
| ------------- | ------------------------------------------------------- | ----- | ------------------------------------------------ |
| index         | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)           |       | index is the index of the capability owner.      |
| index\_owners | [CapabilityOwners](broken://pages/gOJeSIL8phGPlQ62pLku) |       | index\_owners are the owners at the given index. |

### GenesisState

GenesisState defines the capability module's genesis state.

| Field  | Type                                                 | Label    | Description                                                                                                          |
| ------ | ---------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------- |
| index  | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | index is the capability global index.                                                                                |
| owners | [GenesisOwners](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | owners represents a map from index to owners of the capability index index key is string to allow amino marshalling. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/distribution/v1beta1/tx.proto

### MsgFundCommunityPool

MsgFundCommunityPool allows an account to directly fund the community pool.

| Field     | Type                                                            | Label    | Description |
| --------- | --------------------------------------------------------------- | -------- | ----------- |
| amount    | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| depositor | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |

### MsgFundCommunityPoolResponse

MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool response type.

### MsgSetWithdrawAddress

MsgSetWithdrawAddress sets the withdraw address for a delegator (or validator self-delegation).

| Field              | Type                                          | Label | Description |
| ------------------ | --------------------------------------------- | ----- | ----------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| withdraw\_address  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgSetWithdrawAddressResponse

MsgSetWithdrawAddressResponse defines the Msg/SetWithdrawAddress response type.

### MsgWithdrawDelegatorReward

MsgWithdrawDelegatorReward represents delegation withdrawal to a delegator from a single validator.

| Field              | Type                                          | Label | Description |
| ------------------ | --------------------------------------------- | ----- | ----------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgWithdrawDelegatorRewardResponse

MsgWithdrawDelegatorRewardResponse defines the Msg/WithdrawDelegatorReward response type.

### MsgWithdrawValidatorCommission

MsgWithdrawValidatorCommission withdraws the full commission to the validator address.

| Field              | Type                                          | Label | Description |
| ------------------ | --------------------------------------------- | ----- | ----------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgWithdrawValidatorCommissionResponse

MsgWithdrawValidatorCommissionResponse defines the Msg/WithdrawValidatorCommission response type.

### Msg

Msg defines the distribution Msg service.

| Method Name                 | Request Type                                                          | Response Type                                                                 | Description                                                                                                        |
| --------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| SetWithdrawAddress          | [MsgSetWithdrawAddress](broken://pages/gOJeSIL8phGPlQ62pLku)          | [MsgSetWithdrawAddressResponse](broken://pages/gOJeSIL8phGPlQ62pLku)          | SetWithdrawAddress defines a method to change the withdraw address for a delegator (or validator self-delegation). |
| WithdrawDelegatorReward     | [MsgWithdrawDelegatorReward](broken://pages/gOJeSIL8phGPlQ62pLku)     | [MsgWithdrawDelegatorRewardResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | WithdrawDelegatorReward defines a method to withdraw rewards of delegator from a single validator.                 |
| WithdrawValidatorCommission | [MsgWithdrawValidatorCommission](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgWithdrawValidatorCommissionResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | WithdrawValidatorCommission defines a method to withdraw the full commission to the validator address.             |
| FundCommunityPool           | [MsgFundCommunityPool](broken://pages/gOJeSIL8phGPlQ62pLku)           | [MsgFundCommunityPoolResponse](broken://pages/gOJeSIL8phGPlQ62pLku)           | FundCommunityPool defines a method to allow an account to directly fund the community pool.                        |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/distribution/v1beta1/distribution.proto

### CommunityPoolSpendProposal

CommunityPoolSpendProposal details a proposal for use of community funds, together with how many coins are proposed to be spent, and to which recipient account.

| Field       | Type                                                            | Label    | Description |
| ----------- | --------------------------------------------------------------- | -------- | ----------- |
| title       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| description | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| recipient   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| amount      | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### CommunityPoolSpendProposalWithDeposit

CommunityPoolSpendProposalWithDeposit defines a CommunityPoolSpendProposal with a deposit

| Field       | Type                                          | Label | Description |
| ----------- | --------------------------------------------- | ----- | ----------- |
| title       | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| description | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| recipient   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| amount      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| deposit     | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DelegationDelegatorReward

DelegationDelegatorReward represents the properties of a delegator's delegation reward.

| Field              | Type                                                               | Label    | Description |
| ------------------ | ------------------------------------------------------------------ | -------- | ----------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                      |          |             |
| reward             | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### DelegatorStartingInfo

DelegatorStartingInfo represents the starting info for a delegator reward period. It tracks the previous validator period, the delegation's amount of staking token, and the creation height (to check later on if any slashes have occurred). NOTE: Even though validators are slashed to whole staking tokens, the delegators within the validator may be left with less than a full token, thus sdk.Dec is used.

| Field            | Type                                          | Label | Description |
| ---------------- | --------------------------------------------- | ----- | ----------- |
| previous\_period | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| stake            | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| height           | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### FeePool

FeePool is the global fee pool for distribution.

| Field           | Type                                                               | Label    | Description |
| --------------- | ------------------------------------------------------------------ | -------- | ----------- |
| community\_pool | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### Params

Params defines the set of params for the distribution module.

| Field                   | Type                                          | Label | Description |
| ----------------------- | --------------------------------------------- | ----- | ----------- |
| community\_tax          | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| base\_proposer\_reward  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| bonus\_proposer\_reward | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| withdraw\_addr\_enabled | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |

### ValidatorAccumulatedCommission

ValidatorAccumulatedCommission represents accumulated commission for a validator kept as a running counter, can be withdrawn at any time.

| Field      | Type                                                               | Label    | Description |
| ---------- | ------------------------------------------------------------------ | -------- | ----------- |
| commission | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### ValidatorCurrentRewards

ValidatorCurrentRewards represents current rewards and current period for a validator kept as a running counter and incremented each block as long as the validator's tokens remain constant.

| Field   | Type                                                               | Label    | Description |
| ------- | ------------------------------------------------------------------ | -------- | ----------- |
| rewards | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| period  | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                      |          |             |

### ValidatorHistoricalRewards

ValidatorHistoricalRewards represents historical rewards for a validator. Height is implicit within the store key. Cumulative reward ratio is the sum from the zeroeth period until this period of rewards / tokens, per the spec. The reference count indicates the number of objects which might need to reference this historical entry at any point. ReferenceCount = number of outstanding delegations which ended the associated period (and might need to read that record) + number of slashes which ended the associated period (and might need to read that record) + one per validator for the zeroeth period, set on initialization

| Field                     | Type                                                               | Label    | Description |
| ------------------------- | ------------------------------------------------------------------ | -------- | ----------- |
| cumulative\_reward\_ratio | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| reference\_count          | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)                      |          |             |

### ValidatorOutstandingRewards

ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards for a validator inexpensive to track, allows simple sanity checks.

| Field   | Type                                                               | Label    | Description |
| ------- | ------------------------------------------------------------------ | -------- | ----------- |
| rewards | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### ValidatorSlashEvent

ValidatorSlashEvent represents a validator slash event. Height is implicit within the store key. This is needed to calculate appropriate amount of staking tokens for delegations which are withdrawn after a slash has occurred.

| Field             | Type                                          | Label | Description |
| ----------------- | --------------------------------------------- | ----- | ----------- |
| validator\_period | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| fraction          | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### ValidatorSlashEvents

ValidatorSlashEvents is a collection of ValidatorSlashEvent messages.

| Field                    | Type                                                       | Label    | Description |
| ------------------------ | ---------------------------------------------------------- | -------- | ----------- |
| validator\_slash\_events | [ValidatorSlashEvent](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/distribution/v1beta1/query.proto

### QueryCommunityPoolRequest

QueryCommunityPoolRequest is the request type for the Query/CommunityPool RPC method.

### QueryCommunityPoolResponse

QueryCommunityPoolResponse is the response type for the Query/CommunityPool RPC method.

| Field | Type                                                               | Label    | Description                          |
| ----- | ------------------------------------------------------------------ | -------- | ------------------------------------ |
| pool  | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | pool defines community pool's coins. |

### QueryDelegationRewardsRequest

QueryDelegationRewardsRequest is the request type for the Query/DelegationRewards RPC method.

| Field              | Type                                          | Label | Description                                                    |
| ------------------ | --------------------------------------------- | ----- | -------------------------------------------------------------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_address defines the delegator address to query for. |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_address defines the validator address to query for. |

### QueryDelegationRewardsResponse

QueryDelegationRewardsResponse is the response type for the Query/DelegationRewards RPC method.

| Field   | Type                                                               | Label    | Description                                          |
| ------- | ------------------------------------------------------------------ | -------- | ---------------------------------------------------- |
| rewards | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | rewards defines the rewards accrued by a delegation. |

### QueryDelegationTotalRewardsRequest

QueryDelegationTotalRewardsRequest is the request type for the Query/DelegationTotalRewards RPC method.

| Field              | Type                                          | Label | Description                                                    |
| ------------------ | --------------------------------------------- | ----- | -------------------------------------------------------------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_address defines the delegator address to query for. |

### QueryDelegationTotalRewardsResponse

QueryDelegationTotalRewardsResponse is the response type for the Query/DelegationTotalRewards RPC method.

| Field   | Type                                                               | Label    | Description                                             |
| ------- | ------------------------------------------------------------------ | -------- | ------------------------------------------------------- |
| rewards | [DelegationDelegatorReward](broken://pages/gOJeSIL8phGPlQ62pLku)   | repeated | rewards defines all the rewards accrued by a delegator. |
| total   | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | total defines the sum of all the rewards.               |

### QueryDelegatorValidatorsRequest

QueryDelegatorValidatorsRequest is the request type for the Query/DelegatorValidators RPC method.

| Field              | Type                                          | Label | Description                                                    |
| ------------------ | --------------------------------------------- | ----- | -------------------------------------------------------------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_address defines the delegator address to query for. |

### QueryDelegatorValidatorsResponse

QueryDelegatorValidatorsResponse is the response type for the Query/DelegatorValidators RPC method.

| Field      | Type                                          | Label    | Description                                                      |
| ---------- | --------------------------------------------- | -------- | ---------------------------------------------------------------- |
| validators | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | validators defines the validators a delegator is delegating for. |

### QueryDelegatorWithdrawAddressRequest

QueryDelegatorWithdrawAddressRequest is the request type for the Query/DelegatorWithdrawAddress RPC method.

| Field              | Type                                          | Label | Description                                                    |
| ------------------ | --------------------------------------------- | ----- | -------------------------------------------------------------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_address defines the delegator address to query for. |

### QueryDelegatorWithdrawAddressResponse

QueryDelegatorWithdrawAddressResponse is the response type for the Query/DelegatorWithdrawAddress RPC method.

| Field             | Type                                          | Label | Description                                                   |
| ----------------- | --------------------------------------------- | ----- | ------------------------------------------------------------- |
| withdraw\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | withdraw\_address defines the delegator address to query for. |

### QueryParamsRequest

QueryParamsRequest is the request type for the Query/Params RPC method.

### QueryParamsResponse

QueryParamsResponse is the response type for the Query/Params RPC method.

| Field  | Type                                          | Label | Description                                  |
| ------ | --------------------------------------------- | ----- | -------------------------------------------- |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       | params defines the parameters of the module. |

### QueryValidatorCommissionRequest

QueryValidatorCommissionRequest is the request type for the Query/ValidatorCommission RPC method

| Field              | Type                                          | Label | Description                                                    |
| ------------------ | --------------------------------------------- | ----- | -------------------------------------------------------------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_address defines the validator address to query for. |

### QueryValidatorCommissionResponse

QueryValidatorCommissionResponse is the response type for the Query/ValidatorCommission RPC method

| Field      | Type                                                                  | Label | Description                                              |
| ---------- | --------------------------------------------------------------------- | ----- | -------------------------------------------------------- |
| commission | [ValidatorAccumulatedCommission](broken://pages/gOJeSIL8phGPlQ62pLku) |       | commission defines the commision the validator received. |

### QueryValidatorOutstandingRewardsRequest

QueryValidatorOutstandingRewardsRequest is the request type for the Query/ValidatorOutstandingRewards RPC method.

| Field              | Type                                          | Label | Description                                                    |
| ------------------ | --------------------------------------------- | ----- | -------------------------------------------------------------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_address defines the validator address to query for. |

### QueryValidatorOutstandingRewardsResponse

QueryValidatorOutstandingRewardsResponse is the response type for the Query/ValidatorOutstandingRewards RPC method.

| Field   | Type                                                               | Label | Description |
| ------- | ------------------------------------------------------------------ | ----- | ----------- |
| rewards | [ValidatorOutstandingRewards](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### QueryValidatorSlashesRequest

QueryValidatorSlashesRequest is the request type for the Query/ValidatorSlashes RPC method

| Field              | Type                                                                         | Label | Description                                                                 |
| ------------------ | ---------------------------------------------------------------------------- | ----- | --------------------------------------------------------------------------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | validator\_address defines the validator address to query for.              |
| starting\_height   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | starting\_height defines the optional starting height to query the slashes. |
| ending\_height     | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | starting\_height defines the optional ending height to query the slashes.   |
| pagination         | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.                  |

### QueryValidatorSlashesResponse

QueryValidatorSlashesResponse is the response type for the Query/ValidatorSlashes RPC method.

| Field      | Type                                                                          | Label    | Description                                         |
| ---------- | ----------------------------------------------------------------------------- | -------- | --------------------------------------------------- |
| slashes    | [ValidatorSlashEvent](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated | slashes defines the slashes the validator received. |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response.  |

### Query

Query defines the gRPC querier service for distribution module.

| Method Name                 | Request Type                                                                   | Response Type                                                                   | Description                                                                   |
| --------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Params                      | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                      | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                      | Params queries params of the distribution module.                             |
| ValidatorOutstandingRewards | [QueryValidatorOutstandingRewardsRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryValidatorOutstandingRewardsResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ValidatorOutstandingRewards queries rewards of a validator address.           |
| ValidatorCommission         | [QueryValidatorCommissionRequest](broken://pages/gOJeSIL8phGPlQ62pLku)         | [QueryValidatorCommissionResponse](broken://pages/gOJeSIL8phGPlQ62pLku)         | ValidatorCommission queries accumulated commission for a validator.           |
| ValidatorSlashes            | [QueryValidatorSlashesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)            | [QueryValidatorSlashesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)            | ValidatorSlashes queries slash events of a validator.                         |
| DelegationRewards           | [QueryDelegationRewardsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)           | [QueryDelegationRewardsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)           | DelegationRewards queries the total rewards accrued by a delegation.          |
| DelegationTotalRewards      | [QueryDelegationTotalRewardsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)      | [QueryDelegationTotalRewardsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | DelegationTotalRewards queries the total rewards accrued by a each validator. |
| DelegatorValidators         | [QueryDelegatorValidatorsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)         | [QueryDelegatorValidatorsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)         | DelegatorValidators queries the validators of a delegator.                    |
| DelegatorWithdrawAddress    | [QueryDelegatorWithdrawAddressRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryDelegatorWithdrawAddressResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | DelegatorWithdrawAddress queries withdraw address of a delegator.             |
| CommunityPool               | [QueryCommunityPoolRequest](broken://pages/gOJeSIL8phGPlQ62pLku)               | [QueryCommunityPoolResponse](broken://pages/gOJeSIL8phGPlQ62pLku)               | CommunityPool queries the community pool coins.                               |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/distribution/v1beta1/genesis.proto

### DelegatorStartingInfoRecord

DelegatorStartingInfoRecord used for import / export via genesis json.

| Field              | Type                                                         | Label | Description                                              |
| ------------------ | ------------------------------------------------------------ | ----- | -------------------------------------------------------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                |       | delegator\_address is the address of the delegator.      |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                |       | validator\_address is the address of the validator.      |
| starting\_info     | [DelegatorStartingInfo](broken://pages/gOJeSIL8phGPlQ62pLku) |       | starting\_info defines the starting info of a delegator. |

### DelegatorWithdrawInfo

DelegatorWithdrawInfo is the address for where distributions rewards are withdrawn to by default this struct is only used at genesis to feed in default withdraw addresses.

| Field              | Type                                          | Label | Description                                                             |
| ------------------ | --------------------------------------------- | ----- | ----------------------------------------------------------------------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_address is the address of the delegator.                     |
| withdraw\_address  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | withdraw\_address is the address to withdraw the delegation rewards to. |

### GenesisState

GenesisState defines the distribution module's genesis state.

| Field                               | Type                                                                        | Label    | Description                                                                |
| ----------------------------------- | --------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------- |
| params                              | [Params](broken://pages/gOJeSIL8phGPlQ62pLku)                               |          | params defines all the paramaters of the module.                           |
| fee\_pool                           | [FeePool](broken://pages/gOJeSIL8phGPlQ62pLku)                              |          | fee\_pool defines the fee pool at genesis.                                 |
| delegator\_withdraw\_infos          | [DelegatorWithdrawInfo](broken://pages/gOJeSIL8phGPlQ62pLku)                | repeated | fee\_pool defines the delegator withdraw infos at genesis.                 |
| previous\_proposer                  | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                               |          | fee\_pool defines the previous proposer at genesis.                        |
| outstanding\_rewards                | [ValidatorOutstandingRewardsRecord](broken://pages/gOJeSIL8phGPlQ62pLku)    | repeated | fee\_pool defines the outstanding rewards of all validators at genesis.    |
| validator\_accumulated\_commissions | [ValidatorAccumulatedCommissionRecord](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | fee\_pool defines the accumulated commisions of all validators at genesis. |
| validator\_historical\_rewards      | [ValidatorHistoricalRewardsRecord](broken://pages/gOJeSIL8phGPlQ62pLku)     | repeated | fee\_pool defines the historical rewards of all validators at genesis.     |
| validator\_current\_rewards         | [ValidatorCurrentRewardsRecord](broken://pages/gOJeSIL8phGPlQ62pLku)        | repeated | fee\_pool defines the current rewards of all validators at genesis.        |
| delegator\_starting\_infos          | [DelegatorStartingInfoRecord](broken://pages/gOJeSIL8phGPlQ62pLku)          | repeated | fee\_pool defines the delegator starting infos at genesis.                 |
| validator\_slash\_events            | [ValidatorSlashEventRecord](broken://pages/gOJeSIL8phGPlQ62pLku)            | repeated | fee\_pool defines the validator slash events at genesis.                   |

### ValidatorAccumulatedCommissionRecord

ValidatorAccumulatedCommissionRecord is used for import / export via genesis json.

| Field              | Type                                                                  | Label | Description                                               |
| ------------------ | --------------------------------------------------------------------- | ----- | --------------------------------------------------------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                         |       | validator\_address is the address of the validator.       |
| accumulated        | [ValidatorAccumulatedCommission](broken://pages/gOJeSIL8phGPlQ62pLku) |       | accumulated is the accumulated commission of a validator. |

### ValidatorCurrentRewardsRecord

ValidatorCurrentRewardsRecord is used for import / export via genesis json.

| Field              | Type                                                           | Label | Description                                         |
| ------------------ | -------------------------------------------------------------- | ----- | --------------------------------------------------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                  |       | validator\_address is the address of the validator. |
| rewards            | [ValidatorCurrentRewards](broken://pages/gOJeSIL8phGPlQ62pLku) |       | rewards defines the current rewards of a validator. |

### ValidatorHistoricalRewardsRecord

ValidatorHistoricalRewardsRecord is used for import / export via genesis json.

| Field              | Type                                                              | Label | Description                                                |
| ------------------ | ----------------------------------------------------------------- | ----- | ---------------------------------------------------------- |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | validator\_address is the address of the validator.        |
| period             | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | period defines the period the historical rewards apply to. |
| rewards            | [ValidatorHistoricalRewards](broken://pages/gOJeSIL8phGPlQ62pLku) |       | rewards defines the historical rewards of a validator.     |

### ValidatorOutstandingRewardsRecord

ValidatorOutstandingRewardsRecord is used for import/export via genesis json.

| Field                | Type                                                               | Label    | Description                                                            |
| -------------------- | ------------------------------------------------------------------ | -------- | ---------------------------------------------------------------------- |
| validator\_address   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                      |          | validator\_address is the address of the validator.                    |
| outstanding\_rewards | [cosmos.base.v1beta1.DecCoin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | outstanding\_rewards represents the oustanding rewards of a validator. |

### ValidatorSlashEventRecord

ValidatorSlashEventRecord is used for import / export via genesis json.

| Field                   | Type                                                       | Label | Description                                                       |
| ----------------------- | ---------------------------------------------------------- | ----- | ----------------------------------------------------------------- |
| validator\_address      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | validator\_address is the address of the validator.               |
| height                  | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | height defines the block height at which the slash event occured. |
| period                  | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | period is the period of the slash event.                          |
| validator\_slash\_event | [ValidatorSlashEvent](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_slash\_event describes the slash event.                |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/crisis/v1beta1/tx.proto

### MsgVerifyInvariant

MsgVerifyInvariant represents a message to verify a particular invariance.

| Field                   | Type                                          | Label | Description |
| ----------------------- | --------------------------------------------- | ----- | ----------- |
| sender                  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| invariant\_module\_name | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| invariant\_route        | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgVerifyInvariantResponse

MsgVerifyInvariantResponse defines the Msg/VerifyInvariant response type.

### Msg

Msg defines the bank Msg service.

| Method Name     | Request Type                                              | Response Type                                                     | Description                                                         |
| --------------- | --------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------- |
| VerifyInvariant | [MsgVerifyInvariant](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgVerifyInvariantResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | VerifyInvariant defines a method to verify a particular invariance. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/crisis/v1beta1/genesis.proto

### GenesisState

GenesisState defines the crisis module's genesis state.

| Field         | Type                                                            | Label | Description                                                                 |
| ------------- | --------------------------------------------------------------- | ----- | --------------------------------------------------------------------------- |
| constant\_fee | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       | constant\_fee is the fee used to verify the invariant in the crisis module. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/tx/signing/v1beta1/signing.proto

### SignatureDescriptor

SignatureDescriptor is a convenience type which represents the full data for a signature including the public key of the signer, signing modes and the signature itself. It is primarily used for coordinating signatures between clients.

| Field       | Type                                                            | Label | Description                                                                                                                                                    |
| ----------- | --------------------------------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| public\_key | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)      |       | public\_key is the public key of the signer                                                                                                                    |
| data        | [SignatureDescriptor.Data](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                                                                                                                                                                |
| sequence    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       | sequence is the sequence of the account, which describes the number of committed transactions signed by a given address. It is used to prevent replay attacks. |

### SignatureDescriptor.Data

Data represents signature data

| Field  | Type                                                                   | Label | Description                        |
| ------ | ---------------------------------------------------------------------- | ----- | ---------------------------------- |
| single | [SignatureDescriptor.Data.Single](broken://pages/gOJeSIL8phGPlQ62pLku) |       | single represents a single signer  |
| multi  | [SignatureDescriptor.Data.Multi](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | multi represents a multisig signer |

### SignatureDescriptor.Data.Multi

Multi is the signature data for a multisig public key

| Field      | Type                                                                                  | Label    | Description                                                   |
| ---------- | ------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------- |
| bitarray   | [cosmos.crypto.multisig.v1beta1.CompactBitArray](broken://pages/gOJeSIL8phGPlQ62pLku) |          | bitarray specifies which keys within the multisig are signing |
| signatures | [SignatureDescriptor.Data](broken://pages/gOJeSIL8phGPlQ62pLku)                       | repeated | signatures is the signatures of the multi-signature           |

### SignatureDescriptor.Data.Single

Single is the signature data for a single signer

| Field     | Type                                            | Label | Description                                   |
| --------- | ----------------------------------------------- | ----- | --------------------------------------------- |
| mode      | [SignMode](broken://pages/gOJeSIL8phGPlQ62pLku) |       | mode is the signing mode of the single signer |
| signature | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)    |       | signature is the raw signature bytes          |

### SignatureDescriptors

SignatureDescriptors wraps multiple SignatureDescriptor's.

| Field      | Type                                                       | Label    | Description                              |
| ---------- | ---------------------------------------------------------- | -------- | ---------------------------------------- |
| signatures | [SignatureDescriptor](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | signatures are the signature descriptors |

### SignMode

SignMode represents a signing mode with its own security guarantees.

| Name                            | Number | Description                                                                                                                                                          |
| ------------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SIGN\_MODE\_UNSPECIFIED         | 0      | SIGN\_MODE\_UNSPECIFIED specifies an unknown signing mode and will be rejected                                                                                       |
| SIGN\_MODE\_DIRECT              | 1      | SIGN\_MODE\_DIRECT specifies a signing mode which uses SignDoc and is verified with raw bytes from Tx                                                                |
| SIGN\_MODE\_TEXTUAL             | 2      | SIGN\_MODE\_TEXTUAL is a future signing mode that will verify some human-readable textual representation on top of the binary representation from SIGN\_MODE\_DIRECT |
| SIGN\_MODE\_LEGACY\_AMINO\_JSON | 127    | SIGN\_MODE\_LEGACY\_AMINO\_JSON is a backwards compatibility mode which uses Amino JSON and will be removed in the future                                            |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/tx/v1beta1/tx.proto

### AuthInfo

AuthInfo describes the fee and signer modes that are used to sign a transaction.

| Field         | Type                                              | Label    | Description                                                                                                                                                                                                                                                                        |
| ------------- | ------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| signer\_infos | [SignerInfo](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | signer\_infos defines the signing modes for the required signers. The number and order of elements must match the required signers from TxBody's messages. The first element is the primary signer and the one which pays the fee.                                                 |
| fee           | [Fee](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | Fee is the fee and gas limit for the transaction. The first signer is the primary signer and the one which pays the fee. The fee can be calculated based on the cost of evaluating the body and doing signature verification of the signers. This can be estimated via simulation. |

### Fee

Fee includes the amount of coins paid in fees and the maximum gas to be used by the transaction. The ratio yields an effective "gasprice", which must be above some miminum to be accepted into the mempool.

| Field      | Type                                                            | Label    | Description                                                                                                                                                                                                                                                                             |
| ---------- | --------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| amount     | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | amount is the amount of coins to be paid as a fee                                                                                                                                                                                                                                       |
| gas\_limit | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          | gas\_limit is the maximum gas that can be used in transaction processing before an out of gas error occurs                                                                                                                                                                              |
| payer      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          | if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees. the payer must be a tx signer (and thus have signed this field in AuthInfo). setting this field does *not* change the ordering of required signers for the transaction. |
| granter    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          | if set, the fee payer (either the first signer or the value of the payer field) requests that a fee grant be used to pay fees instead of the fee payer's own balance. If an appropriate fee grant does not exist or the chain does not support fee grants, this will fail               |

### ModeInfo

ModeInfo describes the signing mode of a single or nested multisig signer.

| Field  | Type                                                   | Label | Description                               |
| ------ | ------------------------------------------------------ | ----- | ----------------------------------------- |
| single | [ModeInfo.Single](broken://pages/gOJeSIL8phGPlQ62pLku) |       | single represents a single signer         |
| multi  | [ModeInfo.Multi](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | multi represents a nested multisig signer |

### ModeInfo.Multi

Multi is the mode info for a multisig public key

| Field       | Type                                                                                  | Label    | Description                                                                                                           |
| ----------- | ------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------- |
| bitarray    | [cosmos.crypto.multisig.v1beta1.CompactBitArray](broken://pages/gOJeSIL8phGPlQ62pLku) |          | bitarray specifies which keys within the multisig are signing                                                         |
| mode\_infos | [ModeInfo](broken://pages/gOJeSIL8phGPlQ62pLku)                                       | repeated | mode\_infos is the corresponding modes of the signers of the multisig which could include nested multisig public keys |

### ModeInfo.Single

Single is the mode info for a single signer. It is structured as a message to allow for additional fields such as locale for SIGN\_MODE\_TEXTUAL in the future

| Field | Type                                                                      | Label | Description                                   |
| ----- | ------------------------------------------------------------------------- | ----- | --------------------------------------------- |
| mode  | [cosmos.tx.signing.v1beta1.SignMode](broken://pages/gOJeSIL8phGPlQ62pLku) |       | mode is the signing mode of the single signer |

### SignDoc

SignDoc is the type used for generating sign bytes for SIGN\_MODE\_DIRECT.

| Field             | Type                                          | Label | Description                                                                                                                                               |
| ----------------- | --------------------------------------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| body\_bytes       | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | body\_bytes is protobuf serialization of a TxBody that matches the representation in TxRaw.                                                               |
| auth\_info\_bytes | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | auth\_info\_bytes is a protobuf serialization of an AuthInfo that matches the representation in TxRaw.                                                    |
| chain\_id         | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | chain\_id is the unique identifier of the chain this transaction targets. It prevents signed transactions from being used on another chain by an attacker |
| account\_number   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | account\_number is the account number of the account in state                                                                                             |

### SignerInfo

SignerInfo describes the public key and signing mode of a single top-level signer.

| Field       | Type                                                       | Label | Description                                                                                                                                                                                                     |
| ----------- | ---------------------------------------------------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| public\_key | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | public\_key is the public key of the signer. It is optional for accounts that already exist in state. If unset, the verifier can use the required \ signer address for this position and lookup the public key. |
| mode\_info  | [ModeInfo](broken://pages/gOJeSIL8phGPlQ62pLku)            |       | mode\_info describes the signing mode of the signer and is a nested structure to support nested multisig pubkey's                                                                                               |
| sequence    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | sequence is the sequence of the account, which describes the number of committed transactions signed by a given address. It is used to prevent replay attacks.                                                  |

### Tx

Tx is the standard type used for broadcasting transactions.

| Field      | Type                                            | Label    | Description                                                                                                                                                                                   |
| ---------- | ----------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| body       | [TxBody](broken://pages/gOJeSIL8phGPlQ62pLku)   |          | body is the processable content of the transaction                                                                                                                                            |
| auth\_info | [AuthInfo](broken://pages/gOJeSIL8phGPlQ62pLku) |          | auth\_info is the authorization related content of the transaction, specifically signers, signer modes and fee                                                                                |
| signatures | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)    | repeated | signatures is a list of signatures that matches the length and order of AuthInfo's signer\_infos to allow connecting signature meta information like public key and signing mode by position. |

### TxBody

TxBody is the body of a transaction that all signers sign over.

| Field    | Type                                                       | Label    | Description                                                                                                                                                                                                                                                     |
| -------- | ---------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| messages | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | messages is a list of messages to be executed. The required signers of those messages define the number and order of elements in AuthInfo's signer\_infos and Tx's signatures. Each required signer address is added to the list only the first time it occurs. |

By convention, the first required signer (usually from the first message) is referred to as the primary signer and pays the fee for the whole transaction. | | memo | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | | memo is any arbitrary memo to be added to the transaction | | timeout\_height | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) | | timeout is the block height after which this transaction will not be processed by the chain | | extension\_options | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | extension\_options are arbitrary options that can be added by chains when the default options are not sufficient. If any of these are present and can't be handled, the transaction will be rejected | | non\_critical\_extension\_options | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | extension\_options are arbitrary options that can be added by chains when the default options are not sufficient. If any of these are present and can't be handled, they will be ignored |

### TxRaw

TxRaw is a variant of Tx that pins the signer's exact binary representation of body and auth\_info. This is used for signing, broadcasting and verification. The binary `serialize(tx: TxRaw)` is stored in Tendermint and the hash `sha256(serialize(tx: TxRaw))` becomes the "txhash", commonly used as the transaction ID.

| Field             | Type                                         | Label    | Description                                                                                                                                                                                   |
| ----------------- | -------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| body\_bytes       | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |          | body\_bytes is a protobuf serialization of a TxBody that matches the representation in SignDoc.                                                                                               |
| auth\_info\_bytes | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |          | auth\_info\_bytes is a protobuf serialization of an AuthInfo that matches the representation in SignDoc.                                                                                      |
| signatures        | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | signatures is a list of signatures that matches the length and order of AuthInfo's signer\_infos to allow connecting signature meta information like public key and signing mode by position. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/vesting/v1beta1/tx.proto

### MsgCreateVestingAccount

MsgCreateVestingAccount defines a message that enables creating a vesting account.

| Field         | Type                                                            | Label    | Description |
| ------------- | --------------------------------------------------------------- | -------- | ----------- |
| from\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| to\_address   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| amount        | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| end\_time     | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          |             |
| delayed       | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)                     |          |             |

### MsgCreateVestingAccountResponse

MsgCreateVestingAccountResponse defines the Msg/CreateVestingAccount response type.

### Msg

Msg defines the bank Msg service.

| Method Name          | Request Type                                                   | Response Type                                                          | Description                                                                    |
| -------------------- | -------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| CreateVestingAccount | [MsgCreateVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgCreateVestingAccountResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | CreateVestingAccount defines a method that enables creating a vesting account. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/vesting/v1beta1/vesting.proto

### BaseVestingAccount

BaseVestingAccount implements the VestingAccount interface. It contains all the necessary fields needed for any vesting account implementation.

| Field              | Type                                                                   | Label    | Description |
| ------------------ | ---------------------------------------------------------------------- | -------- | ----------- |
| base\_account      | [cosmos.auth.v1beta1.BaseAccount](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |
| original\_vesting  | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku)        | repeated |             |
| delegated\_free    | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku)        | repeated |             |
| delegated\_vesting | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku)        | repeated |             |
| end\_time          | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                           |          |             |

### ContinuousVestingAccount

ContinuousVestingAccount implements the VestingAccount interface. It continuously vests by unlocking coins linearly with respect to time.

| Field                  | Type                                                      | Label | Description |
| ---------------------- | --------------------------------------------------------- | ----- | ----------- |
| base\_vesting\_account | [BaseVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| start\_time            | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |             |

### DelayedVestingAccount

DelayedVestingAccount implements the VestingAccount interface. It vests all coins after a specific time, but non prior. In other words, it keeps them locked until a specified time.

| Field                  | Type                                                      | Label | Description |
| ---------------------- | --------------------------------------------------------- | ----- | ----------- |
| base\_vesting\_account | [BaseVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Period

Period defines a length of time and amount of coins that will vest.

| Field  | Type                                                            | Label    | Description |
| ------ | --------------------------------------------------------------- | -------- | ----------- |
| length | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          |             |
| amount | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### PeriodicVestingAccount

PeriodicVestingAccount implements the VestingAccount interface. It periodically vests by unlocking coins during each specified period.

| Field                  | Type                                                      | Label    | Description |
| ---------------------- | --------------------------------------------------------- | -------- | ----------- |
| base\_vesting\_account | [BaseVestingAccount](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |
| start\_time            | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)              |          |             |
| vesting\_periods       | [Period](broken://pages/gOJeSIL8phGPlQ62pLku)             | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/staking/v1beta1/tx.proto

### MsgBeginRedelegate

MsgBeginRedelegate defines a SDK message for performing a redelegation of coins from a delegator and source validator to a destination validator.

| Field                   | Type                                                            | Label | Description |
| ----------------------- | --------------------------------------------------------------- | ----- | ----------- |
| delegator\_address      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| validator\_src\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| validator\_dst\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| amount                  | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgBeginRedelegateResponse

MsgBeginRedelegateResponse defines the Msg/BeginRedelegate response type.

| Field            | Type                                                             | Label | Description |
| ---------------- | ---------------------------------------------------------------- | ----- | ----------- |
| completion\_time | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgCreateValidator

MsgCreateValidator defines a SDK message for creating a new validator.

| Field                 | Type                                                            | Label | Description |
| --------------------- | --------------------------------------------------------------- | ----- | ----------- |
| description           | [Description](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |             |
| commission            | [CommissionRates](broken://pages/gOJeSIL8phGPlQ62pLku)          |       |             |
| min\_self\_delegation | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| delegator\_address    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| validator\_address    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| pubkey                | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| value                 | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgCreateValidatorResponse

MsgCreateValidatorResponse defines the Msg/CreateValidator response type.

### MsgDelegate

MsgDelegate defines a SDK message for performing a delegation of coins from a delegator to a validator.

| Field              | Type                                                            | Label | Description |
| ------------------ | --------------------------------------------------------------- | ----- | ----------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| amount             | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgDelegateResponse

MsgDelegateResponse defines the Msg/Delegate response type.

### MsgEditValidator

MsgEditValidator defines a SDK message for editing an existing validator.

| Field              | Type                                               | Label | Description                                                                                                                                                                                                      |
| ------------------ | -------------------------------------------------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| description        | [Description](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                                                                                                                                                                                                                  |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      |       |                                                                                                                                                                                                                  |
| commission\_rate   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      |       | We pass a reference to the new commission rate and min self delegation as it's not mandatory to update. If not updated, the deserialized rate will be zero with no way to distinguish if an update was intended. |

REF: #2373 | | min\_self\_delegation | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | | |

### MsgEditValidatorResponse

MsgEditValidatorResponse defines the Msg/EditValidator response type.

### MsgUndelegate

MsgUndelegate defines a SDK message for performing an undelegation from a delegate and a validator.

| Field              | Type                                                            | Label | Description |
| ------------------ | --------------------------------------------------------------- | ----- | ----------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| amount             | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgUndelegateResponse

MsgUndelegateResponse defines the Msg/Undelegate response type.

| Field            | Type                                                             | Label | Description |
| ---------------- | ---------------------------------------------------------------- | ----- | ----------- |
| completion\_time | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Msg

Msg defines the staking Msg service.

| Method Name     | Request Type                                              | Response Type                                                     | Description                                                                                                                               |
| --------------- | --------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| CreateValidator | [MsgCreateValidator](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgCreateValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | CreateValidator defines a method for creating a new validator.                                                                            |
| EditValidator   | [MsgEditValidator](broken://pages/gOJeSIL8phGPlQ62pLku)   | [MsgEditValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku)   | EditValidator defines a method for editing an existing validator.                                                                         |
| Delegate        | [MsgDelegate](broken://pages/gOJeSIL8phGPlQ62pLku)        | [MsgDelegateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)        | Delegate defines a method for performing a delegation of coins from a delegator to a validator.                                           |
| BeginRedelegate | [MsgBeginRedelegate](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgBeginRedelegateResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | BeginRedelegate defines a method for performing a redelegation of coins from a delegator and source validator to a destination validator. |
| Undelegate      | [MsgUndelegate](broken://pages/gOJeSIL8phGPlQ62pLku)      | [MsgUndelegateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | Undelegate defines a method for performing an undelegation from a delegate and a validator.                                               |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/staking/v1beta1/query.proto

### QueryDelegationRequest

QueryDelegationRequest is request type for the Query/Delegation RPC method.

| Field           | Type                                          | Label | Description                                                 |
| --------------- | --------------------------------------------- | ----- | ----------------------------------------------------------- |
| delegator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_addr defines the delegator address to query for. |
| validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_addr defines the validator address to query for. |

### QueryDelegationResponse

QueryDelegationResponse is response type for the Query/Delegation RPC method.

| Field                | Type                                                      | Label | Description                                                        |
| -------------------- | --------------------------------------------------------- | ----- | ------------------------------------------------------------------ |
| delegation\_response | [DelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegation\_responses defines the delegation info of a delegation. |

### QueryDelegatorDelegationsRequest

QueryDelegatorDelegationsRequest is request type for the Query/DelegatorDelegations RPC method.

| Field           | Type                                                                         | Label | Description                                                 |
| --------------- | ---------------------------------------------------------------------------- | ----- | ----------------------------------------------------------- |
| delegator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | delegator\_addr defines the delegator address to query for. |
| pagination      | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.  |

### QueryDelegatorDelegationsResponse

QueryDelegatorDelegationsResponse is response type for the Query/DelegatorDelegations RPC method.

| Field                 | Type                                                                          | Label    | Description                                                             |
| --------------------- | ----------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------- |
| delegation\_responses | [DelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                     | repeated | delegation\_responses defines all the delegations' info of a delegator. |
| pagination            | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response.                      |

### QueryDelegatorUnbondingDelegationsRequest

QueryDelegatorUnbondingDelegationsRequest is request type for the Query/DelegatorUnbondingDelegations RPC method.

| Field           | Type                                                                         | Label | Description                                                 |
| --------------- | ---------------------------------------------------------------------------- | ----- | ----------------------------------------------------------- |
| delegator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | delegator\_addr defines the delegator address to query for. |
| pagination      | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.  |

### QueryDelegatorUnbondingDelegationsResponse

QueryUnbondingDelegatorDelegationsResponse is response type for the Query/UnbondingDelegatorDelegations RPC method.

| Field                | Type                                                                          | Label    | Description                                        |
| -------------------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| unbonding\_responses | [UnbondingDelegation](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated |                                                    |
| pagination           | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryDelegatorValidatorRequest

QueryDelegatorValidatorRequest is request type for the Query/DelegatorValidator RPC method.

| Field           | Type                                          | Label | Description                                                 |
| --------------- | --------------------------------------------- | ----- | ----------------------------------------------------------- |
| delegator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_addr defines the delegator address to query for. |
| validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_addr defines the validator address to query for. |

### QueryDelegatorValidatorResponse

QueryDelegatorValidatorResponse response type for the Query/DelegatorValidator RPC method.

| Field     | Type                                             | Label | Description                               |
| --------- | ------------------------------------------------ | ----- | ----------------------------------------- |
| validator | [Validator](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator defines the the validator info. |

### QueryDelegatorValidatorsRequest

QueryDelegatorValidatorsRequest is request type for the Query/DelegatorValidators RPC method.

| Field           | Type                                                                         | Label | Description                                                 |
| --------------- | ---------------------------------------------------------------------------- | ----- | ----------------------------------------------------------- |
| delegator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | delegator\_addr defines the delegator address to query for. |
| pagination      | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.  |

### QueryDelegatorValidatorsResponse

QueryDelegatorValidatorsResponse is response type for the Query/DelegatorValidators RPC method.

| Field      | Type                                                                          | Label    | Description                                                 |
| ---------- | ----------------------------------------------------------------------------- | -------- | ----------------------------------------------------------- |
| validators | [Validator](broken://pages/gOJeSIL8phGPlQ62pLku)                              | repeated | validators defines the the validators' info of a delegator. |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response.          |

### QueryHistoricalInfoRequest

QueryHistoricalInfoRequest is request type for the Query/HistoricalInfo RPC method.

| Field  | Type                                         | Label | Description                                                  |
| ------ | -------------------------------------------- | ----- | ------------------------------------------------------------ |
| height | [int64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height defines at which height to query the historical info. |

### QueryHistoricalInfoResponse

QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC method.

| Field | Type                                                  | Label | Description                                           |
| ----- | ----------------------------------------------------- | ----- | ----------------------------------------------------- |
| hist  | [HistoricalInfo](broken://pages/gOJeSIL8phGPlQ62pLku) |       | hist defines the historical info at the given height. |

### QueryParamsRequest

QueryParamsRequest is request type for the Query/Params RPC method.

### QueryParamsResponse

QueryParamsResponse is response type for the Query/Params RPC method.

| Field  | Type                                          | Label | Description                                     |
| ------ | --------------------------------------------- | ----- | ----------------------------------------------- |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       | params holds all the parameters of this module. |

### QueryPoolRequest

QueryPoolRequest is request type for the Query/Pool RPC method.

### QueryPoolResponse

QueryPoolResponse is response type for the Query/Pool RPC method.

| Field | Type                                        | Label | Description                 |
| ----- | ------------------------------------------- | ----- | --------------------------- |
| pool  | [Pool](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pool defines the pool info. |

### QueryRedelegationsRequest

QueryRedelegationsRequest is request type for the Query/Redelegations RPC method.

| Field                | Type                                                                         | Label | Description                                                            |
| -------------------- | ---------------------------------------------------------------------------- | ----- | ---------------------------------------------------------------------- |
| delegator\_addr      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | delegator\_addr defines the delegator address to query for.            |
| src\_validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | src\_validator\_addr defines the validator address to redelegate from. |
| dst\_validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | dst\_validator\_addr defines the validator address to redelegate to.   |
| pagination           | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.             |

### QueryRedelegationsResponse

QueryRedelegationsResponse is response type for the Query/Redelegations RPC method.

| Field                   | Type                                                                          | Label    | Description                                        |
| ----------------------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| redelegation\_responses | [RedelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                   | repeated |                                                    |
| pagination              | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryUnbondingDelegationRequest

QueryUnbondingDelegationRequest is request type for the Query/UnbondingDelegation RPC method.

| Field           | Type                                          | Label | Description                                                 |
| --------------- | --------------------------------------------- | ----- | ----------------------------------------------------------- |
| delegator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | delegator\_addr defines the delegator address to query for. |
| validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_addr defines the validator address to query for. |

### QueryUnbondingDelegationResponse

QueryDelegationResponse is response type for the Query/UnbondingDelegation RPC method.

| Field  | Type                                                       | Label | Description                                               |
| ------ | ---------------------------------------------------------- | ----- | --------------------------------------------------------- |
| unbond | [UnbondingDelegation](broken://pages/gOJeSIL8phGPlQ62pLku) |       | unbond defines the unbonding information of a delegation. |

### QueryValidatorDelegationsRequest

QueryValidatorDelegationsRequest is request type for the Query/ValidatorDelegations RPC method

| Field           | Type                                                                         | Label | Description                                                 |
| --------------- | ---------------------------------------------------------------------------- | ----- | ----------------------------------------------------------- |
| validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | validator\_addr defines the validator address to query for. |
| pagination      | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.  |

### QueryValidatorDelegationsResponse

QueryValidatorDelegationsResponse is response type for the Query/ValidatorDelegations RPC method

| Field                 | Type                                                                          | Label    | Description                                        |
| --------------------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| delegation\_responses | [DelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                     | repeated |                                                    |
| pagination            | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryValidatorRequest

QueryValidatorRequest is response type for the Query/Validator RPC method

| Field           | Type                                          | Label | Description                                                 |
| --------------- | --------------------------------------------- | ----- | ----------------------------------------------------------- |
| validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_addr defines the validator address to query for. |

### QueryValidatorResponse

QueryValidatorResponse is response type for the Query/Validator RPC method

| Field     | Type                                             | Label | Description                               |
| --------- | ------------------------------------------------ | ----- | ----------------------------------------- |
| validator | [Validator](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator defines the the validator info. |

### QueryValidatorUnbondingDelegationsRequest

QueryValidatorUnbondingDelegationsRequest is required type for the Query/ValidatorUnbondingDelegations RPC method

| Field           | Type                                                                         | Label | Description                                                 |
| --------------- | ---------------------------------------------------------------------------- | ----- | ----------------------------------------------------------- |
| validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | validator\_addr defines the validator address to query for. |
| pagination      | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.  |

### QueryValidatorUnbondingDelegationsResponse

QueryValidatorUnbondingDelegationsResponse is response type for the Query/ValidatorUnbondingDelegations RPC method.

| Field                | Type                                                                          | Label    | Description                                        |
| -------------------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| unbonding\_responses | [UnbondingDelegation](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated |                                                    |
| pagination           | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryValidatorsRequest

QueryValidatorsRequest is request type for Query/Validators RPC method.

| Field      | Type                                                                         | Label | Description                                                     |
| ---------- | ---------------------------------------------------------------------------- | ----- | --------------------------------------------------------------- |
| status     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | status enables to query for validators matching a given status. |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.      |

### QueryValidatorsResponse

QueryValidatorsResponse is response type for the Query/Validators RPC method

| Field      | Type                                                                          | Label    | Description                                        |
| ---------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| validators | [Validator](broken://pages/gOJeSIL8phGPlQ62pLku)                              | repeated | validators contains all the queried validators.    |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### Query

Query defines the gRPC querier service.

| Method Name                   | Request Type                                                                     | Response Type                                                                     | Description                                                                                   |
| ----------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| Validators                    | [QueryValidatorsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                    | [QueryValidatorsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                    | Validators queries all validators that match the given status.                                |
| Validator                     | [QueryValidatorRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                     | [QueryValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                     | Validator queries validator info for given validator address.                                 |
| ValidatorDelegations          | [QueryValidatorDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)          | [QueryValidatorDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)          | ValidatorDelegations queries delegate info for given validator.                               |
| ValidatorUnbondingDelegations | [QueryValidatorUnbondingDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryValidatorUnbondingDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ValidatorUnbondingDelegations queries unbonding delegations of a validator.                   |
| Delegation                    | [QueryDelegationRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                    | [QueryDelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                    | Delegation queries delegate info for given validator delegator pair.                          |
| UnbondingDelegation           | [QueryUnbondingDelegationRequest](broken://pages/gOJeSIL8phGPlQ62pLku)           | [QueryUnbondingDelegationResponse](broken://pages/gOJeSIL8phGPlQ62pLku)           | UnbondingDelegation queries unbonding info for given validator delegator pair.                |
| DelegatorDelegations          | [QueryDelegatorDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)          | [QueryDelegatorDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)          | DelegatorDelegations queries all delegations of a given delegator address.                    |
| DelegatorUnbondingDelegations | [QueryDelegatorUnbondingDelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryDelegatorUnbondingDelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | DelegatorUnbondingDelegations queries all unbonding delegations of a given delegator address. |
| Redelegations                 | [QueryRedelegationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                 | [QueryRedelegationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                 | Redelegations queries redelegations of given address.                                         |
| DelegatorValidators           | [QueryDelegatorValidatorsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)           | [QueryDelegatorValidatorsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)           | DelegatorValidators queries all validators info for given delegator address.                  |
| DelegatorValidator            | [QueryDelegatorValidatorRequest](broken://pages/gOJeSIL8phGPlQ62pLku)            | [QueryDelegatorValidatorResponse](broken://pages/gOJeSIL8phGPlQ62pLku)            | DelegatorValidator queries validator info for given delegator validator pair.                 |
| HistoricalInfo                | [QueryHistoricalInfoRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                | [QueryHistoricalInfoResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                | HistoricalInfo queries the historical info for given height.                                  |
| Pool                          | [QueryPoolRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                          | [QueryPoolResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                          | Pool queries the pool info.                                                                   |
| Params                        | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)                        | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)                        | Parameters queries the staking parameters.                                                    |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/staking/v1beta1/genesis.proto

### GenesisState

GenesisState defines the staking module's genesis state.

| Field                   | Type                                                       | Label    | Description                                                                                                       |
| ----------------------- | ---------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------- |
| params                  | [Params](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | params defines all the paramaters of related to deposit.                                                          |
| last\_total\_power      | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)               |          | last\_total\_power tracks the total amounts of bonded tokens recorded during the previous end block.              |
| last\_validator\_powers | [LastValidatorPower](broken://pages/gOJeSIL8phGPlQ62pLku)  | repeated | last\_validator\_powers is a special index that provides a historical list of the last-block's bonded validators. |
| validators              | [Validator](broken://pages/gOJeSIL8phGPlQ62pLku)           | repeated | delegations defines the validator set at genesis.                                                                 |
| delegations             | [Delegation](broken://pages/gOJeSIL8phGPlQ62pLku)          | repeated | delegations defines the delegations active at genesis.                                                            |
| unbonding\_delegations  | [UnbondingDelegation](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | unbonding\_delegations defines the unbonding delegations active at genesis.                                       |
| redelegations           | [Redelegation](broken://pages/gOJeSIL8phGPlQ62pLku)        | repeated | redelegations defines the redelegations active at genesis.                                                        |
| exported                | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)                |          |                                                                                                                   |

### LastValidatorPower

LastValidatorPower required for validator set update logic.

| Field   | Type                                          | Label | Description                               |
| ------- | --------------------------------------------- | ----- | ----------------------------------------- |
| address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | address is the address of the validator.  |
| power   | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | power defines the power of the validator. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/staking/v1beta1/staking.proto

### Commission

Commission defines commission parameters for a given validator.

| Field             | Type                                                             | Label | Description |
| ----------------- | ---------------------------------------------------------------- | ----- | ----------- |
| commission\_rates | [CommissionRates](broken://pages/gOJeSIL8phGPlQ62pLku)           |       |             |
| update\_time      | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### CommissionRates

CommissionRates defines the initial commission rates to be used for creating a validator.

| Field             | Type                                          | Label | Description |
| ----------------- | --------------------------------------------- | ----- | ----------- |
| rate              | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| max\_rate         | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| max\_change\_rate | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DVPair

DVPair is struct that just has a delegator-validator pair with no other data. It is intended to be used as a marshalable pointer. For example, a DVPair can be used to construct the key to getting an UnbondingDelegation from state.

| Field              | Type                                          | Label | Description |
| ------------------ | --------------------------------------------- | ----- | ----------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DVPairs

DVPairs defines an array of DVPair objects.

| Field | Type                                          | Label    | Description |
| ----- | --------------------------------------------- | -------- | ----------- |
| pairs | [DVPair](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### DVVTriplet

DVVTriplet is struct that just has a delegator-validator-validator triplet with no other data. It is intended to be used as a marshalable pointer. For example, a DVVTriplet can be used to construct the key to getting a Redelegation from state.

| Field                   | Type                                          | Label | Description |
| ----------------------- | --------------------------------------------- | ----- | ----------- |
| delegator\_address      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| validator\_src\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| validator\_dst\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DVVTriplets

DVVTriplets defines an array of DVVTriplet objects.

| Field    | Type                                              | Label    | Description |
| -------- | ------------------------------------------------- | -------- | ----------- |
| triplets | [DVVTriplet](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### Delegation

Delegation represents the bond with tokens held by an account. It is owned by one delegator, and is associated with the voting power of one validator.

| Field              | Type                                          | Label | Description |
| ------------------ | --------------------------------------------- | ----- | ----------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| shares             | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DelegationResponse

DelegationResponse is equivalent to Delegation except that it contains a balance in addition to shares which is more suitable for client responses.

| Field      | Type                                                            | Label | Description |
| ---------- | --------------------------------------------------------------- | ----- | ----------- |
| delegation | [Delegation](broken://pages/gOJeSIL8phGPlQ62pLku)               |       |             |
| balance    | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Description

Description defines a validator description.

| Field             | Type                                          | Label | Description |
| ----------------- | --------------------------------------------- | ----- | ----------- |
| moniker           | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| identity          | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| website           | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| security\_contact | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| details           | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### HistoricalInfo

HistoricalInfo contains header and validator information for a given block. It is stored as part of staking module's state, which persists the `n` most recent HistoricalInfo (`n` is set by the staking module's `historical_entries` parameter).

| Field  | Type                                                           | Label    | Description |
| ------ | -------------------------------------------------------------- | -------- | ----------- |
| header | [tendermint.types.Header](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |
| valset | [Validator](broken://pages/gOJeSIL8phGPlQ62pLku)               | repeated |             |

### Params

Params defines the parameters for the staking module.

| Field               | Type                                                            | Label | Description |
| ------------------- | --------------------------------------------------------------- | ----- | ----------- |
| unbonding\_time     | [google.protobuf.Duration](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| max\_validators     | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| max\_entries        | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| historical\_entries | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| bond\_denom         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |

### Pool

Pool is used for tracking bonded and not-bonded token supply of the bond denomination.

| Field               | Type                                          | Label | Description |
| ------------------- | --------------------------------------------- | ----- | ----------- |
| not\_bonded\_tokens | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| bonded\_tokens      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Redelegation

Redelegation contains the list of a particular delegator's redelegating bonds from a particular source validator to a particular destination validator.

| Field                   | Type                                                     | Label    | Description          |
| ----------------------- | -------------------------------------------------------- | -------- | -------------------- |
| delegator\_address      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)            |          |                      |
| validator\_src\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)            |          |                      |
| validator\_dst\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)            |          |                      |
| entries                 | [RedelegationEntry](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | redelegation entries |

### RedelegationEntry

RedelegationEntry defines a redelegation object with relevant metadata.

| Field            | Type                                                             | Label | Description |
| ---------------- | ---------------------------------------------------------------- | ----- | ----------- |
| creation\_height | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| completion\_time | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| initial\_balance | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| shares\_dst      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### RedelegationEntryResponse

RedelegationEntryResponse is equivalent to a RedelegationEntry except that it contains a balance in addition to shares which is more suitable for client responses.

| Field               | Type                                                     | Label | Description |
| ------------------- | -------------------------------------------------------- | ----- | ----------- |
| redelegation\_entry | [RedelegationEntry](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| balance             | [string](broken://pages/gOJeSIL8phGPlQ62pLku)            |       |             |

### RedelegationResponse

RedelegationResponse is equivalent to a Redelegation except that its entries contain a balance in addition to shares which is more suitable for client responses.

| Field        | Type                                                             | Label    | Description |
| ------------ | ---------------------------------------------------------------- | -------- | ----------- |
| redelegation | [Redelegation](broken://pages/gOJeSIL8phGPlQ62pLku)              |          |             |
| entries      | [RedelegationEntryResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### UnbondingDelegation

UnbondingDelegation stores all of a single delegator's unbonding bonds for a single validator in an time-ordered list.

| Field              | Type                                                            | Label    | Description                  |
| ------------------ | --------------------------------------------------------------- | -------- | ---------------------------- |
| delegator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |                              |
| validator\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |                              |
| entries            | [UnbondingDelegationEntry](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | unbonding delegation entries |

### UnbondingDelegationEntry

UnbondingDelegationEntry defines an unbonding object with relevant metadata.

| Field            | Type                                                             | Label | Description |
| ---------------- | ---------------------------------------------------------------- | ----- | ----------- |
| creation\_height | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| completion\_time | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| initial\_balance | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| balance          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### ValAddresses

ValAddresses defines a repeated set of validator addresses.

| Field     | Type                                          | Label    | Description |
| --------- | --------------------------------------------- | -------- | ----------- |
| addresses | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### Validator

Validator defines a validator, together with the total amount of the Validator's bond shares and their exchange rate to coins. Slashing results in a decrease in the exchange rate, allowing correct calculation of future undelegations without iterating over delegators. When coins are delegated to this validator, the validator is credited with a delegation whose number of bond shares is based on the amount of coins delegated divided by the current exchange rate. Voting power can be calculated as total bonded shares multiplied by exchange rate.

| Field                 | Type                                                             | Label | Description |
| --------------------- | ---------------------------------------------------------------- | ----- | ----------- |
| operator\_address     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| consensus\_pubkey     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| jailed                | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)                      |       |             |
| status                | [BondStatus](broken://pages/gOJeSIL8phGPlQ62pLku)                |       |             |
| tokens                | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| delegator\_shares     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| description           | [Description](broken://pages/gOJeSIL8phGPlQ62pLku)               |       |             |
| unbonding\_height     | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| unbonding\_time       | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| commission            | [Commission](broken://pages/gOJeSIL8phGPlQ62pLku)                |       |             |
| min\_self\_delegation | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### BondStatus

BondStatus is the status of a validator.

| Name                      | Number | Description                                      |
| ------------------------- | ------ | ------------------------------------------------ |
| BOND\_STATUS\_UNSPECIFIED | 0      | UNSPECIFIED defines an invalid validator status. |
| BOND\_STATUS\_UNBONDED    | 1      | UNBONDED defines a validator that is not bonded. |
| BOND\_STATUS\_UNBONDING   | 2      | UNBONDING defines a validator that is unbonding. |
| BOND\_STATUS\_BONDED      | 3      | BONDED defines a validator that is bonded.       |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/genutil/v1beta1/genesis.proto

### GenesisState

GenesisState defines the raw genesis transaction in JSON.

| Field    | Type                                         | Label    | Description                                |
| -------- | -------------------------------------------- | -------- | ------------------------------------------ |
| gen\_txs | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | gen\_txs defines the genesis transactions. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/params/v1beta1/query.proto

### QueryParamsRequest

QueryParamsRequest is request type for the Query/Params RPC method.

| Field    | Type                                          | Label | Description                                             |
| -------- | --------------------------------------------- | ----- | ------------------------------------------------------- |
| subspace | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | subspace defines the module to query the parameter for. |
| key      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | key defines the key of the parameter in the subspace.   |

### QueryParamsResponse

QueryParamsResponse is response type for the Query/Params RPC method.

| Field | Type                                               | Label | Description                          |
| ----- | -------------------------------------------------- | ----- | ------------------------------------ |
| param | [ParamChange](broken://pages/gOJeSIL8phGPlQ62pLku) |       | param defines the queried parameter. |

### Query

Query defines the gRPC querier service.

| Method Name | Request Type                                              | Response Type                                              | Description                                                                  |
| ----------- | --------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------------------- |
| Params      | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | Params queries a specific parameter of a module, given its subspace and key. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/params/v1beta1/params.proto

### ParamChange

ParamChange defines an individual parameter change, for use in ParameterChangeProposal.

| Field    | Type                                          | Label | Description |
| -------- | --------------------------------------------- | ----- | ----------- |
| subspace | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| key      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| value    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### ParameterChangeProposal

ParameterChangeProposal defines a proposal to change one or more parameters.

| Field       | Type                                               | Label    | Description |
| ----------- | -------------------------------------------------- | -------- | ----------- |
| title       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      |          |             |
| description | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      |          |             |
| changes     | [ParamChange](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/slashing/v1beta1/tx.proto

### MsgUnjail

MsgUnjail defines the Msg/Unjail request type

| Field           | Type                                          | Label | Description |
| --------------- | --------------------------------------------- | ----- | ----------- |
| validator\_addr | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgUnjailResponse

MsgUnjailResponse defines the Msg/Unjail response type

### Msg

Msg defines the slashing Msg service.

| Method Name | Request Type                                     | Response Type                                            | Description                                                                                                                                                            |
| ----------- | ------------------------------------------------ | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Unjail      | [MsgUnjail](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgUnjailResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | Unjail defines a method for unjailing a jailed validator, thus returning them into the bonded validator set, so they can begin receiving provisions and rewards again. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/slashing/v1beta1/slashing.proto

### Params

Params represents the parameters used for by the slashing module.

| Field                         | Type                                                            | Label | Description |
| ----------------------------- | --------------------------------------------------------------- | ----- | ----------- |
| signed\_blocks\_window        | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| min\_signed\_per\_window      | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| downtime\_jail\_duration      | [google.protobuf.Duration](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| slash\_fraction\_double\_sign | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| slash\_fraction\_downtime     | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### ValidatorSigningInfo

ValidatorSigningInfo defines a validator's signing info for monitoring their liveness activity.

| Field                   | Type                                                             | Label | Description                                                                  |
| ----------------------- | ---------------------------------------------------------------- | ----- | ---------------------------------------------------------------------------- |
| address                 | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |                                                                              |
| start\_height           | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | height at which validator was first a candidate OR was unjailed              |
| index\_offset           | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | index offset into signed block bit array                                     |
| jailed\_until           | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |       | timestamp validator cannot be unjailed until                                 |
| tombstoned              | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)                      |       | whether or not a validator has been tombstoned (killed out of validator set) |
| missed\_blocks\_counter | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | missed blocks counter (to avoid scanning the array every time)               |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/slashing/v1beta1/query.proto

### QueryParamsRequest

QueryParamsRequest is the request type for the Query/Params RPC method

### QueryParamsResponse

QueryParamsResponse is the response type for the Query/Params RPC method

| Field  | Type                                          | Label | Description |
| ------ | --------------------------------------------- | ----- | ----------- |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### QuerySigningInfoRequest

QuerySigningInfoRequest is the request type for the Query/SigningInfo RPC method

| Field         | Type                                          | Label | Description                                           |
| ------------- | --------------------------------------------- | ----- | ----------------------------------------------------- |
| cons\_address | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | cons\_address is the address to query signing info of |

### QuerySigningInfoResponse

QuerySigningInfoResponse is the response type for the Query/SigningInfo RPC method

| Field              | Type                                                        | Label | Description                                                          |
| ------------------ | ----------------------------------------------------------- | ----- | -------------------------------------------------------------------- |
| val\_signing\_info | [ValidatorSigningInfo](broken://pages/gOJeSIL8phGPlQ62pLku) |       | val\_signing\_info is the signing info of requested val cons address |

### QuerySigningInfosRequest

QuerySigningInfosRequest is the request type for the Query/SigningInfos RPC method

| Field      | Type                                                                         | Label | Description |
| ---------- | ---------------------------------------------------------------------------- | ----- | ----------- |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### QuerySigningInfosResponse

QuerySigningInfosResponse is the response type for the Query/SigningInfos RPC method

| Field      | Type                                                                          | Label    | Description                                |
| ---------- | ----------------------------------------------------------------------------- | -------- | ------------------------------------------ |
| info       | [ValidatorSigningInfo](broken://pages/gOJeSIL8phGPlQ62pLku)                   | repeated | info is the signing info of all validators |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          |                                            |

### Query

Query provides defines the gRPC querier service

| Method Name  | Request Type                                                    | Response Type                                                    | Description                                                |
| ------------ | --------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------- |
| Params       | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)       | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)       | Params queries the parameters of slashing module           |
| SigningInfo  | [QuerySigningInfoRequest](broken://pages/gOJeSIL8phGPlQ62pLku)  | [QuerySigningInfoResponse](broken://pages/gOJeSIL8phGPlQ62pLku)  | SigningInfo queries the signing info of given cons address |
| SigningInfos | [QuerySigningInfosRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QuerySigningInfosResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | SigningInfos queries signing info of all validators        |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/slashing/v1beta1/genesis.proto

### GenesisState

GenesisState defines the slashing module's genesis state.

| Field          | Type                                                         | Label    | Description                                                                          |
| -------------- | ------------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------ |
| params         | [Params](broken://pages/gOJeSIL8phGPlQ62pLku)                |          | params defines all the paramaters of related to deposit.                             |
| signing\_infos | [SigningInfo](broken://pages/gOJeSIL8phGPlQ62pLku)           | repeated | signing\_infos represents a map between validator addresses and their signing infos. |
| missed\_blocks | [ValidatorMissedBlocks](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | signing\_infos represents a map between validator addresses and their missed blocks. |

### MissedBlock

MissedBlock contains height and missed status as boolean.

| Field  | Type                                         | Label | Description                                        |
| ------ | -------------------------------------------- | ----- | -------------------------------------------------- |
| index  | [int64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | index is the height at which the block was missed. |
| missed | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | missed is the missed status.                       |

### SigningInfo

SigningInfo stores validator signing info of corresponding address.

| Field                    | Type                                                        | Label | Description                                                             |
| ------------------------ | ----------------------------------------------------------- | ----- | ----------------------------------------------------------------------- |
| address                  | [string](broken://pages/gOJeSIL8phGPlQ62pLku)               |       | address is the validator address.                                       |
| validator\_signing\_info | [ValidatorSigningInfo](broken://pages/gOJeSIL8phGPlQ62pLku) |       | validator\_signing\_info represents the signing info of this validator. |

### ValidatorMissedBlocks

ValidatorMissedBlocks contains array of missed blocks of corresponding address.

| Field          | Type                                               | Label    | Description                                                   |
| -------------- | -------------------------------------------------- | -------- | ------------------------------------------------------------- |
| address        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      |          | address is the validator address.                             |
| missed\_blocks | [MissedBlock](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | missed\_blocks is an array of missed blocks by the validator. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/abci/v1beta1/abci.proto

### ABCIMessageLog

ABCIMessageLog defines a structure containing an indexed tx ABCI message log.

| Field      | Type                                               | Label    | Description                                                                       |
| ---------- | -------------------------------------------------- | -------- | --------------------------------------------------------------------------------- |
| msg\_index | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)      |          |                                                                                   |
| log        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)      |          |                                                                                   |
| events     | [StringEvent](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | Events contains a slice of Event objects that were emitted during some execution. |

### Attribute

Attribute defines an attribute wrapper where the key and value are strings instead of raw bytes.

| Field | Type                                          | Label | Description |
| ----- | --------------------------------------------- | ----- | ----------- |
| key   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| value | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### GasInfo

GasInfo defines tx execution gas context.

| Field       | Type                                          | Label | Description                                                         |
| ----------- | --------------------------------------------- | ----- | ------------------------------------------------------------------- |
| gas\_wanted | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | GasWanted is the maximum units of work we allow this tx to perform. |
| gas\_used   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | GasUsed is the amount of gas actually consumed.                     |

### MsgData

MsgData defines the data returned in a Result object during message execution.

| Field     | Type                                          | Label | Description |
| --------- | --------------------------------------------- | ----- | ----------- |
| msg\_type | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| data      | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |

### Result

Result is the union of ResponseFormat and ResponseCheckTx.

| Field  | Type                                                         | Label    | Description                                                                                                                                         |
| ------ | ------------------------------------------------------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| data   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                 |          | Data is any data returned from message or handler execution. It MUST be length prefixed in order to separate data from multiple message executions. |
| log    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                |          | Log contains the log information from message or handler execution.                                                                                 |
| events | [tendermint.abci.Event](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | Events contains a slice of Event objects that were emitted during message or handler execution.                                                     |

### SearchTxsResult

SearchTxsResult defines a structure for querying txs pageable

| Field        | Type                                              | Label    | Description                         |
| ------------ | ------------------------------------------------- | -------- | ----------------------------------- |
| total\_count | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)     |          | Count of all txs                    |
| count        | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)     |          | Count of txs in current page        |
| page\_number | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)     |          | Index of current page, start from 1 |
| page\_total  | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)     |          | Count of total pages                |
| limit        | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)     |          | Max count txs per page              |
| txs          | [TxResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | List of txs in current page         |

### SimulationResponse

SimulationResponse defines the response generated when a transaction is successfully simulated.

| Field     | Type                                           | Label | Description |
| --------- | ---------------------------------------------- | ----- | ----------- |
| gas\_info | [GasInfo](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| result    | [Result](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |

### StringEvent

StringEvent defines en Event object wrapper where all the attributes contain key/value pairs that are strings instead of raw bytes.

| Field      | Type                                             | Label    | Description |
| ---------- | ------------------------------------------------ | -------- | ----------- |
| type       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)    |          |             |
| attributes | [Attribute](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### TxMsgData

TxMsgData defines a list of MsgData. A transaction will have a MsgData object for each message.

| Field | Type                                           | Label    | Description |
| ----- | ---------------------------------------------- | -------- | ----------- |
| data  | [MsgData](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### TxResponse

TxResponse defines a structure containing relevant tx data and metadata. The tags are stringified and the log is JSON decoded.

| Field       | Type                                                       | Label    | Description                                                                                                                                                             |
| ----------- | ---------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| height      | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)               |          | The block height                                                                                                                                                        |
| txhash      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | The transaction hash.                                                                                                                                                   |
| codespace   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | Namespace for the Code                                                                                                                                                  |
| code        | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | Response code.                                                                                                                                                          |
| data        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | Result bytes, if any.                                                                                                                                                   |
| raw\_log    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | The output of the application's logger (raw string). May be non-deterministic.                                                                                          |
| logs        | [ABCIMessageLog](broken://pages/gOJeSIL8phGPlQ62pLku)      | repeated | The output of the application's logger (typed). May be non-deterministic.                                                                                               |
| info        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | Additional information. May be non-deterministic.                                                                                                                       |
| gas\_wanted | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)               |          | Amount of gas requested for transaction.                                                                                                                                |
| gas\_used   | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)               |          | Amount of gas consumed by transaction.                                                                                                                                  |
| tx          | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |          | The request transaction bytes.                                                                                                                                          |
| timestamp   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | Time of the previous block. For heights > 1, it's the weighted median of the timestamps of the valid votes in the block.LastCommit. For height == 1, it's genesis time. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/kv/v1beta1/kv.proto

### Pair

Pair defines a key/value bytes tuple.

| Field | Type                                         | Label | Description |
| ----- | -------------------------------------------- | ----- | ----------- |
| key   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| value | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Pairs

Pairs defines a repeated slice of Pair objects.

| Field | Type                                        | Label    | Description |
| ----- | ------------------------------------------- | -------- | ----------- |
| pairs | [Pair](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/snapshots/v1beta1/snapshot.proto

### Metadata

Metadata contains SDK-specific snapshot metadata.

| Field         | Type                                         | Label    | Description          |
| ------------- | -------------------------------------------- | -------- | -------------------- |
| chunk\_hashes | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | SHA-256 chunk hashes |

### Snapshot

Snapshot contains Tendermint state sync snapshot info.

| Field    | Type                                            | Label | Description |
| -------- | ----------------------------------------------- | ----- | ----------- |
| height   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |
| format   | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |
| chunks   | [uint32](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |
| hash     | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)    |       |             |
| metadata | [Metadata](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/simulate/v1beta1/simulate.proto

### SimulateRequest

SimulateRequest is the request type for the SimulateServiceService.Simulate RPC method.

| Field | Type                                                        | Label | Description                        |
| ----- | ----------------------------------------------------------- | ----- | ---------------------------------- |
| tx    | [cosmos.tx.v1beta1.Tx](broken://pages/gOJeSIL8phGPlQ62pLku) |       | tx is the transaction to simulate. |

### SimulateResponse

SimulateResponse is the response type for the SimulateServiceService.SimulateRPC method.

| Field     | Type                                                                    | Label | Description                                                    |
| --------- | ----------------------------------------------------------------------- | ----- | -------------------------------------------------------------- |
| gas\_info | [cosmos.base.abci.v1beta1.GasInfo](broken://pages/gOJeSIL8phGPlQ62pLku) |       | gas\_info is the information about gas used in the simulation. |
| result    | [cosmos.base.abci.v1beta1.Result](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | result is the result of the simulation.                        |

### SimulateService

SimulateService defines a gRPC service for simulating transactions. It may also support querying and broadcasting in the future.

| Method Name | Request Type                                           | Response Type                                           | Description                                                          |
| ----------- | ------------------------------------------------------ | ------------------------------------------------------- | -------------------------------------------------------------------- |
| Simulate    | [SimulateRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [SimulateResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | Simulate simulates executing a transaction for estimating gas usage. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/v1beta1/coin.proto

### Coin

Coin defines a token with a denomination and an amount.

NOTE: The amount field is an Int which implements the custom method signatures required by gogoproto.

| Field  | Type                                          | Label | Description |
| ------ | --------------------------------------------- | ----- | ----------- |
| denom  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| amount | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DecCoin

DecCoin defines a token with a denomination and a decimal amount.

NOTE: The amount field is an Dec which implements the custom method signatures required by gogoproto.

| Field  | Type                                          | Label | Description |
| ------ | --------------------------------------------- | ----- | ----------- |
| denom  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| amount | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DecProto

DecProto defines a Protobuf wrapper around a Dec object.

| Field | Type                                          | Label | Description |
| ----- | --------------------------------------------- | ----- | ----------- |
| dec   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### IntProto

IntProto defines a Protobuf wrapper around an Int object.

| Field | Type                                          | Label | Description |
| ----- | --------------------------------------------- | ----- | ----------- |
| int   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/query/v1beta1/pagination.proto

### PageRequest

PageRequest is to be embedded in gRPC request messages for efficient pagination. Ex:

message SomeRequest { Foo some\_parameter = 1; PageRequest pagination = 2; }

| Field        | Type                                          | Label | Description                                                                                                                                                                                                                         |
| ------------ | --------------------------------------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| key          | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | key is a value returned in PageResponse.next\_key to begin querying the next page most efficiently. Only one of offset or key should be set.                                                                                        |
| offset       | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | offset is a numeric offset that can be used when key is unavailable. It is less efficient than using key. Only one of offset or key should be set.                                                                                  |
| limit        | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | limit is the total number of results to be returned in the result page. If left empty it will default to a value to be set by each app.                                                                                             |
| count\_total | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)   |       | count\_total is set to true to indicate that the result set should include a count of the total number of items available for pagination in UIs. count\_total is only respected when offset is used. It is ignored when key is set. |

### PageResponse

PageResponse is to be embedded in gRPC response messages where the corresponding request message has used PageRequest.

message SomeResponse { repeated Bar results = 1; PageResponse page = 2; }

| Field     | Type                                          | Label | Description                                                                                                      |
| --------- | --------------------------------------------- | ----- | ---------------------------------------------------------------------------------------------------------------- |
| next\_key | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | next\_key is the key to be passed to PageRequest.key to query the next page most efficiently                     |
| total     | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | total is total number of results available if PageRequest.count\_total was set, its value is undefined otherwise |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/store/v1beta1/commit\_info.proto

### CommitID

CommitID defines the committment information when a specific store is committed.

| Field   | Type                                         | Label | Description |
| ------- | -------------------------------------------- | ----- | ----------- |
| version | [int64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| hash    | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### CommitInfo

CommitInfo defines commit information used by the multi-store when committing a version/height.

| Field        | Type                                             | Label    | Description |
| ------------ | ------------------------------------------------ | -------- | ----------- |
| version      | [int64](broken://pages/gOJeSIL8phGPlQ62pLku)     |          |             |
| store\_infos | [StoreInfo](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### StoreInfo

StoreInfo defines store-specific commit information. It contains a reference between a store name and the commit ID.

| Field      | Type                                            | Label | Description |
| ---------- | ----------------------------------------------- | ----- | ----------- |
| name       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |
| commit\_id | [CommitID](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/store/v1beta1/snapshot.proto

### SnapshotIAVLItem

SnapshotIAVLItem is an exported IAVL node.

| Field   | Type                                         | Label | Description |
| ------- | -------------------------------------------- | ----- | ----------- |
| key     | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| value   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| version | [int64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| height  | [int32](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### SnapshotItem

SnapshotItem is an item contained in a rootmulti.Store snapshot.

| Field | Type                                                     | Label | Description |
| ----- | -------------------------------------------------------- | ----- | ----------- |
| store | [SnapshotStoreItem](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| iavl  | [SnapshotIAVLItem](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |

### SnapshotStoreItem

SnapshotStoreItem contains metadata about a snapshotted store.

| Field | Type                                          | Label | Description |
| ----- | --------------------------------------------- | ----- | ----------- |
| name  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/base/reflection/v1beta1/reflection.proto

### ListAllInterfacesRequest

ListAllInterfacesRequest is the request type of the ListAllInterfaces RPC.

### ListAllInterfacesResponse

ListAllInterfacesResponse is the response type of the ListAllInterfaces RPC.

| Field            | Type                                          | Label    | Description                                                    |
| ---------------- | --------------------------------------------- | -------- | -------------------------------------------------------------- |
| interface\_names | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | interface\_names is an array of all the registered interfaces. |

### ListImplementationsRequest

ListImplementationsRequest is the request type of the ListImplementations RPC.

| Field           | Type                                          | Label | Description                                                             |
| --------------- | --------------------------------------------- | ----- | ----------------------------------------------------------------------- |
| interface\_name | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | interface\_name defines the interface to query the implementations for. |

### ListImplementationsResponse

ListImplementationsResponse is the response type of the ListImplementations RPC.

| Field                          | Type                                          | Label    | Description |
| ------------------------------ | --------------------------------------------- | -------- | ----------- |
| implementation\_message\_names | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### ReflectionService

ReflectionService defines a service for interface reflection.

| Method Name         | Request Type                                                      | Response Type                                                      | Description                                                                       |
| ------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------ | --------------------------------------------------------------------------------- |
| ListAllInterfaces   | [ListAllInterfacesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)   | [ListAllInterfacesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)   | ListAllInterfaces lists all the interfaces registered in the interface registry.  |
| ListImplementations | [ListImplementationsRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [ListImplementationsResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ListImplementations list all the concrete types that implement a given interface. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/gov/v1beta1/tx.proto

### MsgDeposit

MsgDeposit defines a message to submit a deposit to an existing proposal.

| Field        | Type                                                            | Label    | Description |
| ------------ | --------------------------------------------------------------- | -------- | ----------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| depositor    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| amount       | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### MsgDepositResponse

MsgDepositResponse defines the Msg/Deposit response type.

### MsgSubmitProposal

MsgSubmitProposal defines an sdk.Msg type that supports submitting arbitrary proposal Content.

| Field            | Type                                                            | Label    | Description |
| ---------------- | --------------------------------------------------------------- | -------- | ----------- |
| content          | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)      |          |             |
| initial\_deposit | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| proposer         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |

### MsgSubmitProposalResponse

MsgSubmitProposalResponse defines the Msg/SubmitProposal response type.

| Field        | Type                                          | Label | Description |
| ------------ | --------------------------------------------- | ----- | ----------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgVote

MsgVote defines a message to cast a vote.

| Field        | Type                                              | Label | Description |
| ------------ | ------------------------------------------------- | ----- | ----------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)     |       |             |
| voter        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)     |       |             |
| option       | [VoteOption](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgVoteResponse

MsgVoteResponse defines the Msg/Vote response type.

### Msg

Msg defines the bank Msg service.

| Method Name    | Request Type                                             | Response Type                                                    | Description                                                             |
| -------------- | -------------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------- |
| SubmitProposal | [MsgSubmitProposal](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgSubmitProposalResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | SubmitProposal defines a method to create new proposal given a content. |
| Vote           | [MsgVote](broken://pages/gOJeSIL8phGPlQ62pLku)           | [MsgVoteResponse](broken://pages/gOJeSIL8phGPlQ62pLku)           | Vote defines a method to add a vote on a specific proposal.             |
| Deposit        | [MsgDeposit](broken://pages/gOJeSIL8phGPlQ62pLku)        | [MsgDepositResponse](broken://pages/gOJeSIL8phGPlQ62pLku)        | Deposit defines a method to add deposit on a specific proposal.         |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/gov/v1beta1/gov.proto

### Deposit

Deposit defines an amount deposited by an account address to an active proposal.

| Field        | Type                                                            | Label    | Description |
| ------------ | --------------------------------------------------------------- | -------- | ----------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| depositor    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          |             |
| amount       | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### DepositParams

DepositParams defines the params for deposits on governance proposals.

| Field                | Type                                                            | Label    | Description                                                                        |
| -------------------- | --------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------- |
| min\_deposit         | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | Minimum deposit for a proposal to enter voting period.                             |
| max\_deposit\_period | [google.protobuf.Duration](broken://pages/gOJeSIL8phGPlQ62pLku) |          | Maximum period for Atom holders to deposit on a proposal. Initial value: 2 months. |

### Proposal

Proposal defines the core field members of a governance proposal.

| Field                | Type                                                             | Label    | Description |
| -------------------- | ---------------------------------------------------------------- | -------- | ----------- |
| proposal\_id         | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          |             |
| content              | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)       |          |             |
| status               | [ProposalStatus](broken://pages/gOJeSIL8phGPlQ62pLku)            |          |             |
| final\_tally\_result | [TallyResult](broken://pages/gOJeSIL8phGPlQ62pLku)               |          |             |
| submit\_time         | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |
| deposit\_end\_time   | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |
| total\_deposit       | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku)  | repeated |             |
| voting\_start\_time  | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |
| voting\_end\_time    | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku) |          |             |

### TallyParams

TallyParams defines the params for tallying votes on governance proposals.

| Field           | Type                                         | Label | Description                                                                                     |
| --------------- | -------------------------------------------- | ----- | ----------------------------------------------------------------------------------------------- |
| quorum          | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       | Minimum percentage of total stake needed to vote for a result to be considered valid.           |
| threshold       | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       | Minimum proportion of Yes votes for proposal to pass. Default value: 0.5.                       |
| veto\_threshold | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       | Minimum value of Veto votes to Total votes ratio for proposal to be vetoed. Default value: 1/3. |

### TallyResult

TallyResult defines a standard tally for a governance proposal.

| Field          | Type                                          | Label | Description |
| -------------- | --------------------------------------------- | ----- | ----------- |
| yes            | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| abstain        | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| no             | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| no\_with\_veto | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### TextProposal

TextProposal defines a standard text proposal whose changes need to be manually updated in case of approval.

| Field       | Type                                          | Label | Description |
| ----------- | --------------------------------------------- | ----- | ----------- |
| title       | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| description | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Vote

Vote defines a vote on a governance proposal. A Vote consists of a proposal ID, the voter, and the vote option.

| Field        | Type                                              | Label | Description |
| ------------ | ------------------------------------------------- | ----- | ----------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)     |       |             |
| voter        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)     |       |             |
| option       | [VoteOption](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### VotingParams

VotingParams defines the params for voting on governance proposals.

| Field          | Type                                                            | Label | Description                  |
| -------------- | --------------------------------------------------------------- | ----- | ---------------------------- |
| voting\_period | [google.protobuf.Duration](broken://pages/gOJeSIL8phGPlQ62pLku) |       | Length of the voting period. |

### ProposalStatus

ProposalStatus enumerates the valid statuses of a proposal.

| Name                              | Number | Description                                                                                |
| --------------------------------- | ------ | ------------------------------------------------------------------------------------------ |
| PROPOSAL\_STATUS\_UNSPECIFIED     | 0      | PROPOSAL\_STATUS\_UNSPECIFIED defines the default propopsal status.                        |
| PROPOSAL\_STATUS\_DEPOSIT\_PERIOD | 1      | PROPOSAL\_STATUS\_DEPOSIT\_PERIOD defines a proposal status during the deposit period.     |
| PROPOSAL\_STATUS\_VOTING\_PERIOD  | 2      | PROPOSAL\_STATUS\_VOTING\_PERIOD defines a proposal status during the voting period.       |
| PROPOSAL\_STATUS\_PASSED          | 3      | PROPOSAL\_STATUS\_PASSED defines a proposal status of a proposal that has passed.          |
| PROPOSAL\_STATUS\_REJECTED        | 4      | PROPOSAL\_STATUS\_REJECTED defines a proposal status of a proposal that has been rejected. |
| PROPOSAL\_STATUS\_FAILED          | 5      | PROPOSAL\_STATUS\_FAILED defines a proposal status of a proposal that has failed.          |

### VoteOption

VoteOption enumerates the valid vote options for a given governance proposal.

| Name                         | Number | Description                                                      |
| ---------------------------- | ------ | ---------------------------------------------------------------- |
| VOTE\_OPTION\_UNSPECIFIED    | 0      | VOTE\_OPTION\_UNSPECIFIED defines a no-op vote option.           |
| VOTE\_OPTION\_YES            | 1      | VOTE\_OPTION\_YES defines a yes vote option.                     |
| VOTE\_OPTION\_ABSTAIN        | 2      | VOTE\_OPTION\_ABSTAIN defines an abstain vote option.            |
| VOTE\_OPTION\_NO             | 3      | VOTE\_OPTION\_NO defines a no vote option.                       |
| VOTE\_OPTION\_NO\_WITH\_VETO | 4      | VOTE\_OPTION\_NO\_WITH\_VETO defines a no with veto vote option. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/gov/v1beta1/query.proto

### QueryDepositRequest

QueryDepositRequest is the request type for the Query/Deposit RPC method.

| Field        | Type                                          | Label | Description                                                 |
| ------------ | --------------------------------------------- | ----- | ----------------------------------------------------------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | proposal\_id defines the unique id of the proposal.         |
| depositor    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | depositor defines the deposit addresses from the proposals. |

### QueryDepositResponse

QueryDepositResponse is the response type for the Query/Deposit RPC method.

| Field   | Type                                           | Label | Description                            |
| ------- | ---------------------------------------------- | ----- | -------------------------------------- |
| deposit | [Deposit](broken://pages/gOJeSIL8phGPlQ62pLku) |       | deposit defines the requested deposit. |

### QueryDepositsRequest

QueryDepositsRequest is the request type for the Query/Deposits RPC method.

| Field        | Type                                                                         | Label | Description                                                |
| ------------ | ---------------------------------------------------------------------------- | ----- | ---------------------------------------------------------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | proposal\_id defines the unique id of the proposal.        |
| pagination   | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request. |

### QueryDepositsResponse

QueryDepositsResponse is the response type for the Query/Deposits RPC method.

| Field      | Type                                                                          | Label    | Description                                        |
| ---------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| deposits   | [Deposit](broken://pages/gOJeSIL8phGPlQ62pLku)                                | repeated |                                                    |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryParamsRequest

QueryParamsRequest is the request type for the Query/Params RPC method.

| Field        | Type                                          | Label | Description                                                                                          |
| ------------ | --------------------------------------------- | ----- | ---------------------------------------------------------------------------------------------------- |
| params\_type | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | params\_type defines which parameters to query for, can be one of "voting", "tallying" or "deposit". |

### QueryParamsResponse

QueryParamsResponse is the response type for the Query/Params RPC method.

| Field           | Type                                                 | Label | Description                                                |
| --------------- | ---------------------------------------------------- | ----- | ---------------------------------------------------------- |
| voting\_params  | [VotingParams](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | voting\_params defines the parameters related to voting.   |
| deposit\_params | [DepositParams](broken://pages/gOJeSIL8phGPlQ62pLku) |       | deposit\_params defines the parameters related to deposit. |
| tally\_params   | [TallyParams](broken://pages/gOJeSIL8phGPlQ62pLku)   |       | tally\_params defines the parameters related to tally.     |

### QueryProposalRequest

QueryProposalRequest is the request type for the Query/Proposal RPC method.

| Field        | Type                                          | Label | Description                                         |
| ------------ | --------------------------------------------- | ----- | --------------------------------------------------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | proposal\_id defines the unique id of the proposal. |

### QueryProposalResponse

QueryProposalResponse is the response type for the Query/Proposal RPC method.

| Field    | Type                                            | Label | Description |
| -------- | ----------------------------------------------- | ----- | ----------- |
| proposal | [Proposal](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### QueryProposalsRequest

QueryProposalsRequest is the request type for the Query/Proposals RPC method.

| Field            | Type                                                                         | Label | Description                                                 |
| ---------------- | ---------------------------------------------------------------------------- | ----- | ----------------------------------------------------------- |
| proposal\_status | [ProposalStatus](broken://pages/gOJeSIL8phGPlQ62pLku)                        |       | proposal\_status defines the status of the proposals.       |
| voter            | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | voter defines the voter address for the proposals.          |
| depositor        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | depositor defines the deposit addresses from the proposals. |
| pagination       | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request.  |

### QueryProposalsResponse

QueryProposalsResponse is the response type for the Query/Proposals RPC method.

| Field      | Type                                                                          | Label    | Description                                        |
| ---------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| proposals  | [Proposal](broken://pages/gOJeSIL8phGPlQ62pLku)                               | repeated |                                                    |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### QueryTallyResultRequest

QueryTallyResultRequest is the request type for the Query/Tally RPC method.

| Field        | Type                                          | Label | Description                                         |
| ------------ | --------------------------------------------- | ----- | --------------------------------------------------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | proposal\_id defines the unique id of the proposal. |

### QueryTallyResultResponse

QueryTallyResultResponse is the response type for the Query/Tally RPC method.

| Field | Type                                               | Label | Description                        |
| ----- | -------------------------------------------------- | ----- | ---------------------------------- |
| tally | [TallyResult](broken://pages/gOJeSIL8phGPlQ62pLku) |       | tally defines the requested tally. |

### QueryVoteRequest

QueryVoteRequest is the request type for the Query/Vote RPC method.

| Field        | Type                                          | Label | Description                                         |
| ------------ | --------------------------------------------- | ----- | --------------------------------------------------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | proposal\_id defines the unique id of the proposal. |
| voter        | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | voter defines the oter address for the proposals.   |

### QueryVoteResponse

QueryVoteResponse is the response type for the Query/Vote RPC method.

| Field | Type                                        | Label | Description                    |
| ----- | ------------------------------------------- | ----- | ------------------------------ |
| vote  | [Vote](broken://pages/gOJeSIL8phGPlQ62pLku) |       | vote defined the queried vote. |

### QueryVotesRequest

QueryVotesRequest is the request type for the Query/Votes RPC method.

| Field        | Type                                                                         | Label | Description                                                |
| ------------ | ---------------------------------------------------------------------------- | ----- | ---------------------------------------------------------- |
| proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | proposal\_id defines the unique id of the proposal.        |
| pagination   | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request. |

### QueryVotesResponse

QueryVotesResponse is the response type for the Query/Votes RPC method.

| Field      | Type                                                                          | Label    | Description                                        |
| ---------- | ----------------------------------------------------------------------------- | -------- | -------------------------------------------------- |
| votes      | [Vote](broken://pages/gOJeSIL8phGPlQ62pLku)                                   | repeated | votes defined the queried votes.                   |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response. |

### Query

Query defines the gRPC querier service for gov module

| Method Name | Request Type                                                   | Response Type                                                   | Description                                                               |
| ----------- | -------------------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Proposal    | [QueryProposalRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryProposalResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | Proposal queries proposal details based on ProposalID.                    |
| Proposals   | [QueryProposalsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)   | [QueryProposalsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)   | Proposals queries all proposals based on given status.                    |
| Vote        | [QueryVoteRequest](broken://pages/gOJeSIL8phGPlQ62pLku)        | [QueryVoteResponse](broken://pages/gOJeSIL8phGPlQ62pLku)        | Vote queries voted information based on proposalID, voterAddr.            |
| Votes       | [QueryVotesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)       | [QueryVotesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)       | Votes queries votes of a given proposal.                                  |
| Params      | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)      | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | Params queries all parameters of the gov module.                          |
| Deposit     | [QueryDepositRequest](broken://pages/gOJeSIL8phGPlQ62pLku)     | [QueryDepositResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | Deposit queries single deposit information based proposalID, depositAddr. |
| Deposits    | [QueryDepositsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryDepositsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | Deposits queries all deposits of a single proposal.                       |
| TallyResult | [QueryTallyResultRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryTallyResultResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | TallyResult queries the tally of a proposal vote.                         |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## cosmos/gov/v1beta1/genesis.proto

### GenesisState

GenesisState defines the gov module's genesis state.

| Field                  | Type                                                 | Label    | Description                                                |
| ---------------------- | ---------------------------------------------------- | -------- | ---------------------------------------------------------- |
| starting\_proposal\_id | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | starting\_proposal\_id is the ID of the starting proposal. |
| deposits               | [Deposit](broken://pages/gOJeSIL8phGPlQ62pLku)       | repeated | deposits defines all the deposits present at genesis.      |
| votes                  | [Vote](broken://pages/gOJeSIL8phGPlQ62pLku)          | repeated | votes defines all the votes present at genesis.            |
| proposals              | [Proposal](broken://pages/gOJeSIL8phGPlQ62pLku)      | repeated | proposals defines all the proposals present at genesis.    |
| deposit\_params        | [DepositParams](broken://pages/gOJeSIL8phGPlQ62pLku) |          | params defines all the paramaters of related to deposit.   |
| voting\_params         | [VotingParams](broken://pages/gOJeSIL8phGPlQ62pLku)  |          | params defines all the paramaters of related to voting.    |
| tally\_params          | [TallyParams](broken://pages/gOJeSIL8phGPlQ62pLku)   |          | params defines all the paramaters of related to tally.     |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/types/v1/genesis.proto

### GenesisState

GenesisState defines the ibc module's genesis state.

| Field               | Type                                                                       | Label | Description                        |
| ------------------- | -------------------------------------------------------------------------- | ----- | ---------------------------------- |
| client\_genesis     | [ibc.core.client.v1.GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)     |       | ICS002 - Clients genesis state     |
| connection\_genesis | [ibc.core.connection.v1.GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku) |       | ICS003 - Connections genesis state |
| channel\_genesis    | [ibc.core.channel.v1.GenesisState](broken://pages/gOJeSIL8phGPlQ62pLku)    |       | ICS004 - Channel genesis state     |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/connection/v1/query.proto

### QueryClientConnectionsRequest

QueryClientConnectionsRequest is the request type for the Query/ClientConnections RPC method

| Field      | Type                                          | Label | Description                                    |
| ---------- | --------------------------------------------- | ----- | ---------------------------------------------- |
| client\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | client identifier associated with a connection |

### QueryClientConnectionsResponse

QueryClientConnectionsResponse is the response type for the Query/ClientConnections RPC method

| Field             | Type                                                             | Label    | Description                                                 |
| ----------------- | ---------------------------------------------------------------- | -------- | ----------------------------------------------------------- |
| connection\_paths | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated | slice of all the connection paths associated with a client. |
| proof             | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |          | merkle proof of existence                                   |
| proof\_path       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          | merkle proof path                                           |
| proof\_height     | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |          | height at which the proof was generated                     |

### QueryConnectionClientStateRequest

QueryConnectionClientStateRequest is the request type for the Query/ConnectionClientState RPC method

| Field          | Type                                          | Label | Description           |
| -------------- | --------------------------------------------- | ----- | --------------------- |
| connection\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | connection identifier |

### QueryConnectionClientStateResponse

QueryConnectionClientStateResponse is the response type for the Query/ConnectionClientState RPC method

| Field                     | Type                                                                            | Label | Description                              |
| ------------------------- | ------------------------------------------------------------------------------- | ----- | ---------------------------------------- |
| identified\_client\_state | [ibc.core.client.v1.IdentifiedClientState](broken://pages/gOJeSIL8phGPlQ62pLku) |       | client state associated with the channel |
| proof                     | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                                    |       | merkle proof of existence                |
| proof\_path               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                   |       | merkle proof path                        |
| proof\_height             | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)                |       | height at which the proof was retrieved  |

### QueryConnectionConsensusStateRequest

QueryConnectionConsensusStateRequest is the request type for the Query/ConnectionConsensusState RPC method

| Field           | Type                                          | Label | Description           |
| --------------- | --------------------------------------------- | ----- | --------------------- |
| connection\_id  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | connection identifier |
| version\_number | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                       |
| version\_height | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                       |

### QueryConnectionConsensusStateResponse

QueryConnectionConsensusStateResponse is the response type for the Query/ConnectionConsensusState RPC method

| Field            | Type                                                             | Label | Description                                   |
| ---------------- | ---------------------------------------------------------------- | ----- | --------------------------------------------- |
| consensus\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)       |       | consensus state associated with the channel   |
| client\_id       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | client ID associated with the consensus state |
| proof            | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | merkle proof of existence                     |
| proof\_path      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | merkle proof path                             |
| proof\_height    | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height at which the proof was retrieved       |

### QueryConnectionRequest

QueryConnectionRequest is the request type for the Query/Connection RPC method

| Field          | Type                                          | Label | Description                  |
| -------------- | --------------------------------------------- | ----- | ---------------------------- |
| connection\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | connection unique identifier |

### QueryConnectionResponse

QueryConnectionResponse is the response type for the Query/Connection RPC method. Besides the connection end, it includes a proof and the height from which the proof was retrieved.

| Field         | Type                                                             | Label | Description                                       |
| ------------- | ---------------------------------------------------------------- | ----- | ------------------------------------------------- |
| connection    | [ConnectionEnd](broken://pages/gOJeSIL8phGPlQ62pLku)             |       | connection associated with the request identifier |
| proof         | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | merkle proof of existence                         |
| proof\_path   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | merkle proof path                                 |
| proof\_height | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height at which the proof was retrieved           |

### QueryConnectionsRequest

QueryConnectionsRequest is the request type for the Query/Connections RPC method

| Field      | Type                                                                         | Label | Description |
| ---------- | ---------------------------------------------------------------------------- | ----- | ----------- |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### QueryConnectionsResponse

QueryConnectionsResponse is the response type for the Query/Connections RPC method.

| Field       | Type                                                                          | Label    | Description                              |
| ----------- | ----------------------------------------------------------------------------- | -------- | ---------------------------------------- |
| connections | [IdentifiedConnection](broken://pages/gOJeSIL8phGPlQ62pLku)                   | repeated | list of stored connections of the chain. |
| pagination  | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination response                      |
| height      | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | query block height                       |

### Query

Query provides defines the gRPC querier service

| Method Name              | Request Type                                                                | Response Type                                                                | Description                                                                          |
| ------------------------ | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| Connection               | [QueryConnectionRequest](broken://pages/gOJeSIL8phGPlQ62pLku)               | [QueryConnectionResponse](broken://pages/gOJeSIL8phGPlQ62pLku)               | Connection queries an IBC connection end.                                            |
| Connections              | [QueryConnectionsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)              | [QueryConnectionsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)              | Connections queries all the IBC connections of a chain.                              |
| ClientConnections        | [QueryClientConnectionsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)        | [QueryClientConnectionsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)        | ClientConnections queries the connection paths associated with a client state.       |
| ConnectionClientState    | [QueryConnectionClientStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryConnectionClientStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | ConnectionClientState queries the client state associated with the connection.       |
| ConnectionConsensusState | [QueryConnectionConsensusStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryConnectionConsensusStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ConnectionConsensusState queries the consensus state associated with the connection. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/connection/v1/connection.proto

### ClientPaths

ClientPaths define all the connection paths for a client state.

| Field | Type                                          | Label    | Description              |
| ----- | --------------------------------------------- | -------- | ------------------------ |
| paths | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | list of connection paths |

### ConnectionEnd

ConnectionEnd defines a stateful object on a chain connected to another separate one. NOTE: there must only be 2 defined ConnectionEnds to establish a connection between two chains.

| Field        | Type                                                | Label    | Description                                                                                                             |
| ------------ | --------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- |
| client\_id   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | client associated with this connection.                                                                                 |
| versions     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       | repeated | IBC version which can be utilised to determine encodings or protocols for channels or packets utilising this connection |
| state        | [State](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | current state of the connection end.                                                                                    |
| counterparty | [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku) |          | counterparty chain associated with this connection.                                                                     |

### ConnectionPaths

ConnectionPaths define all the connection paths for a given client state.

| Field      | Type                                          | Label    | Description                    |
| ---------- | --------------------------------------------- | -------- | ------------------------------ |
| client\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |          | client state unique identifier |
| paths      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | list of connection paths       |

### Counterparty

Counterparty defines the counterparty chain associated with a connection end.

| Field          | Type                                                                       | Label | Description                                                                                 |
| -------------- | -------------------------------------------------------------------------- | ----- | ------------------------------------------------------------------------------------------- |
| client\_id     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                              |       | identifies the client on the counterparty chain associated with a given connection.         |
| connection\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                              |       | identifies the connection end on the counterparty chain associated with a given connection. |
| prefix         | [ibc.core.commitment.v1.MerklePrefix](broken://pages/gOJeSIL8phGPlQ62pLku) |       | commitment merkle prefix of the counterparty chain                                          |

### IdentifiedConnection

IdentifiedConnection defines a connection with additional connection identifier field.

| Field        | Type                                                | Label    | Description                                                                                                             |
| ------------ | --------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- |
| id           | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | connection identifier.                                                                                                  |
| client\_id   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | client associated with this connection.                                                                                 |
| versions     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       | repeated | IBC version which can be utilised to determine encodings or protocols for channels or packets utilising this connection |
| state        | [State](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | current state of the connection end.                                                                                    |
| counterparty | [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku) |          | counterparty chain associated with this connection.                                                                     |

### MsgConnectionOpenAck

MsgConnectionOpenAck defines a msg sent by a Relayer to Chain A to acknowledge the change of connection state to TRYOPEN on Chain B.

| Field                        | Type                                                             | Label | Description                                                                        |
| ---------------------------- | ---------------------------------------------------------------- | ----- | ---------------------------------------------------------------------------------- |
| connection\_id               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |                                                                                    |
| counterparty\_connection\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |                                                                                    |
| version                      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |                                                                                    |
| client\_state                | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)       |       |                                                                                    |
| proof\_height                | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                                                                                    |
| proof\_try                   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | proof of the initialization the connection on Chain B: `UNITIALIZED -&gt; TRYOPEN` |
| proof\_client                | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | proof of client state included in message                                          |
| proof\_consensus             | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | proof of client consensus state                                                    |
| consensus\_height            | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                                                                                    |
| signer                       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |                                                                                    |

### MsgConnectionOpenAckResponse

MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response type.

### MsgConnectionOpenConfirm

MsgConnectionOpenConfirm defines a msg sent by a Relayer to Chain B to acknowledge the change of connection state to OPEN on Chain A.

| Field          | Type                                                             | Label | Description                                                                |
| -------------- | ---------------------------------------------------------------- | ----- | -------------------------------------------------------------------------- |
| connection\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |                                                                            |
| proof\_ack     | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | proof for the change of the connection state on Chain A: `INIT -&gt; OPEN` |
| proof\_height  | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                                                                            |
| signer         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |                                                                            |

### MsgConnectionOpenConfirmResponse

MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm response type.

### MsgConnectionOpenInit

MsgConnectionOpenInit defines the msg sent by an account on Chain A to initialize a connection with Chain B.

| Field          | Type                                                | Label | Description |
| -------------- | --------------------------------------------------- | ----- | ----------- |
| client\_id     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |       |             |
| connection\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |       |             |
| counterparty   | [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| version        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |       |             |
| signer         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |       |             |

### MsgConnectionOpenInitResponse

MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response type.

### MsgConnectionOpenTry

MsgConnectionOpenTry defines a msg sent by a Relayer to try to open a connection on Chain B.

| Field                                | Type                                                             | Label    | Description                                                                     |
| ------------------------------------ | ---------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------- |
| client\_id                           | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          |                                                                                 |
| desired\_connection\_id              | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          |                                                                                 |
| counterparty\_chosen\_connection\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          |                                                                                 |
| client\_state                        | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)       |          |                                                                                 |
| counterparty                         | [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku)              |          |                                                                                 |
| counterparty\_versions               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated |                                                                                 |
| proof\_height                        | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |          |                                                                                 |
| proof\_init                          | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |          | proof of the initialization the connection on Chain A: `UNITIALIZED -&gt; INIT` |
| proof\_client                        | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |          | proof of client state included in message                                       |
| proof\_consensus                     | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |          | proof of client consensus state                                                 |
| consensus\_height                    | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |          |                                                                                 |
| signer                               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |          |                                                                                 |

### MsgConnectionOpenTryResponse

MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response type.

### Version

Version defines the versioning scheme used to negotiate the IBC verison in the connection handshake.

| Field      | Type                                          | Label    | Description                                               |
| ---------- | --------------------------------------------- | -------- | --------------------------------------------------------- |
| identifier | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |          | unique version identifier                                 |
| features   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | list of features compatible with the specified identifier |

### State

State defines if a connection is in one of the following states: INIT, TRYOPEN, OPEN or UNINITIALIZED.

| Name                              | Number | Description                                                                     |
| --------------------------------- | ------ | ------------------------------------------------------------------------------- |
| STATE\_UNINITIALIZED\_UNSPECIFIED | 0      | Default State                                                                   |
| STATE\_INIT                       | 1      | A connection end has just started the opening handshake.                        |
| STATE\_TRYOPEN                    | 2      | A connection end has acknowledged the handshake step on the counterparty chain. |
| STATE\_OPEN                       | 3      | A connection end has completed the handshake.                                   |

### Msg

Msg defines the ibc/connection Msg service.

| Method Name           | Request Type                                                    | Response Type                                                           | Description                                                                      |
| --------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| ConnectionOpenInit    | [MsgConnectionOpenInit](broken://pages/gOJeSIL8phGPlQ62pLku)    | [MsgConnectionOpenInitResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | ConnectionOpenInit defines a rpc handler method for MsgConnectionOpenInit.       |
| ConnectionOpenTry     | [MsgConnectionOpenTry](broken://pages/gOJeSIL8phGPlQ62pLku)     | [MsgConnectionOpenTryResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | ConnectionOpenTry defines a rpc handler method for MsgConnectionOpenTry.         |
| ConnectionOpenAck     | [MsgConnectionOpenAck](broken://pages/gOJeSIL8phGPlQ62pLku)     | [MsgConnectionOpenAckResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | ConnectionOpenAck defines a rpc handler method for MsgConnectionOpenAck.         |
| ConnectionOpenConfirm | [MsgConnectionOpenConfirm](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgConnectionOpenConfirmResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ConnectionOpenConfirm defines a rpc handler method for MsgConnectionOpenConfirm. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/connection/v1/genesis.proto

### GenesisState

GenesisState defines the ibc connection submodule's genesis state.

| Field                     | Type                                                        | Label    | Description |
| ------------------------- | ----------------------------------------------------------- | -------- | ----------- |
| connections               | [IdentifiedConnection](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| client\_connection\_paths | [ConnectionPaths](broken://pages/gOJeSIL8phGPlQ62pLku)      | repeated |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/commitment/v1/commitment.proto

### Key

Key defines a proof Key

| Field | Type                                               | Label | Description |
| ----- | -------------------------------------------------- | ----- | ----------- |
| name  | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)       |       |             |
| enc   | [KeyEncoding](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### KeyPath

KeyPath defines a slice of keys

| Field | Type                                       | Label    | Description |
| ----- | ------------------------------------------ | -------- | ----------- |
| keys  | [Key](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |

### MerklePath

MerklePath is the path used to verify commitment proofs, which can be an arbitrary structured object (defined by a commitment type).

| Field     | Type                                           | Label | Description |
| --------- | ---------------------------------------------- | ----- | ----------- |
| key\_path | [KeyPath](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MerklePrefix

MerklePrefix is merkle path prefixed to the key. The constructed key from the Path and the key will be append(Path.KeyPath, append(Path.KeyPrefix, key...))

| Field       | Type                                         | Label | Description |
| ----------- | -------------------------------------------- | ----- | ----------- |
| key\_prefix | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MerkleProof

MerkleProof is a wrapper type that contains a merkle proof. It demonstrates membership or non-membership for an element or set of elements, verifiable in conjunction with a known commitment root. Proofs should be succinct.

| Field | Type                                                              | Label | Description |
| ----- | ----------------------------------------------------------------- | ----- | ----------- |
| proof | [tendermint.crypto.ProofOps](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MerkleRoot

MerkleRoot defines a merkle root hash. In the Cosmos SDK, the AppHash of a block header becomes the root.

| Field | Type                                         | Label | Description |
| ----- | -------------------------------------------- | ----- | ----------- |
| hash  | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### KeyEncoding

KeyEncoding defines the encoding format of a key's bytes.

| Name                            | Number | Description  |
| ------------------------------- | ------ | ------------ |
| KEY\_ENCODING\_URL\_UNSPECIFIED | 0      | URL encoding |
| KEY\_ENCODING\_HEX              | 1      | Hex encoding |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/channel/v1/query.proto

### QueryChannelClientStateRequest

QueryChannelClientStateRequest is the request type for the Query/ClientState RPC method

| Field       | Type                                          | Label | Description               |
| ----------- | --------------------------------------------- | ----- | ------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | port unique identifier    |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel unique identifier |

### QueryChannelClientStateResponse

QueryChannelClientStateResponse is the Response type for the Query/QueryChannelClientState RPC method

| Field                     | Type                                                                            | Label | Description                              |
| ------------------------- | ------------------------------------------------------------------------------- | ----- | ---------------------------------------- |
| identified\_client\_state | [ibc.core.client.v1.IdentifiedClientState](broken://pages/gOJeSIL8phGPlQ62pLku) |       | client state associated with the channel |
| proof                     | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                                    |       | merkle proof of existence                |
| proof\_path               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                   |       | merkle proof path                        |
| proof\_height             | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)                |       | height at which the proof was retrieved  |

### QueryChannelConsensusStateRequest

QueryChannelConsensusStateRequest is the request type for the Query/ConsensusState RPC method

| Field           | Type                                          | Label | Description                           |
| --------------- | --------------------------------------------- | ----- | ------------------------------------- |
| port\_id        | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | port unique identifier                |
| channel\_id     | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel unique identifier             |
| version\_number | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | version number of the consensus state |
| version\_height | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | version height of the consensus state |

### QueryChannelConsensusStateResponse

QueryChannelClientStateResponse is the Response type for the Query/QueryChannelClientState RPC method

| Field            | Type                                                             | Label | Description                                   |
| ---------------- | ---------------------------------------------------------------- | ----- | --------------------------------------------- |
| consensus\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku)       |       | consensus state associated with the channel   |
| client\_id       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | client ID associated with the consensus state |
| proof            | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | merkle proof of existence                     |
| proof\_path      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | merkle proof path                             |
| proof\_height    | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height at which the proof was retrieved       |

### QueryChannelRequest

QueryChannelRequest is the request type for the Query/Channel RPC method

| Field       | Type                                          | Label | Description               |
| ----------- | --------------------------------------------- | ----- | ------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | port unique identifier    |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel unique identifier |

### QueryChannelResponse

QueryChannelResponse is the response type for the Query/Channel RPC method. Besides the Channel end, it includes a proof and the height from which the proof was retrieved.

| Field         | Type                                                             | Label | Description                                     |
| ------------- | ---------------------------------------------------------------- | ----- | ----------------------------------------------- |
| channel       | [Channel](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       | channel associated with the request identifiers |
| proof         | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | merkle proof of existence                       |
| proof\_path   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | merkle proof path                               |
| proof\_height | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height at which the proof was retrieved         |

### QueryChannelsRequest

QueryChannelsRequest is the request type for the Query/Channels RPC method

| Field      | Type                                                                         | Label | Description        |
| ---------- | ---------------------------------------------------------------------------- | ----- | ------------------ |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination request |

### QueryChannelsResponse

QueryChannelsResponse is the response type for the Query/Channels RPC method.

| Field      | Type                                                                          | Label    | Description                           |
| ---------- | ----------------------------------------------------------------------------- | -------- | ------------------------------------- |
| channels   | [IdentifiedChannel](broken://pages/gOJeSIL8phGPlQ62pLku)                      | repeated | list of stored channels of the chain. |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination response                   |
| height     | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | query block height                    |

### QueryConnectionChannelsRequest

QueryConnectionChannelsRequest is the request type for the Query/QueryConnectionChannels RPC method

| Field      | Type                                                                         | Label | Description                  |
| ---------- | ---------------------------------------------------------------------------- | ----- | ---------------------------- |
| connection | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | connection unique identifier |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination request           |

### QueryConnectionChannelsResponse

QueryConnectionChannelsResponse is the Response type for the Query/QueryConnectionChannels RPC method

| Field      | Type                                                                          | Label    | Description                                    |
| ---------- | ----------------------------------------------------------------------------- | -------- | ---------------------------------------------- |
| channels   | [IdentifiedChannel](broken://pages/gOJeSIL8phGPlQ62pLku)                      | repeated | list of channels associated with a connection. |
| pagination | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination response                            |
| height     | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | query block height                             |

### QueryNextSequenceReceiveRequest

QueryNextSequenceReceiveRequest is the request type for the Query/QueryNextSequenceReceiveRequest RPC method

| Field       | Type                                          | Label | Description               |
| ----------- | --------------------------------------------- | ----- | ------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | port unique identifier    |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel unique identifier |

### QueryNextSequenceReceiveResponse

QuerySequenceResponse is the request type for the Query/QueryNextSequenceReceiveResponse RPC method

| Field                   | Type                                                             | Label | Description                             |
| ----------------------- | ---------------------------------------------------------------- | ----- | --------------------------------------- |
| next\_sequence\_receive | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | next sequence receive number            |
| proof                   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | merkle proof of existence               |
| proof\_path             | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | merkle proof path                       |
| proof\_height           | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height at which the proof was retrieved |

### QueryPacketAcknowledgementRequest

QueryPacketAcknowledgementRequest is the request type for the Query/PacketAcknowledgement RPC method

| Field       | Type                                          | Label | Description               |
| ----------- | --------------------------------------------- | ----- | ------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | port unique identifier    |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel unique identifier |
| sequence    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | packet sequence           |

### QueryPacketAcknowledgementResponse

QueryPacketAcknowledgementResponse defines the client query response for a packet which also includes a proof, its path and the height form which the proof was retrieved

| Field           | Type                                                             | Label | Description                               |
| --------------- | ---------------------------------------------------------------- | ----- | ----------------------------------------- |
| acknowledgement | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | packet associated with the request fields |
| proof           | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | merkle proof of existence                 |
| proof\_path     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | merkle proof path                         |
| proof\_height   | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height at which the proof was retrieved   |

### QueryPacketCommitmentRequest

QueryPacketCommitmentRequest is the request type for the Query/PacketCommitment RPC method

| Field       | Type                                          | Label | Description               |
| ----------- | --------------------------------------------- | ----- | ------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | port unique identifier    |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel unique identifier |
| sequence    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | packet sequence           |

### QueryPacketCommitmentResponse

QueryPacketCommitmentResponse defines the client query response for a packet which also includes a proof, its path and the height form which the proof was retrieved

| Field         | Type                                                             | Label | Description                               |
| ------------- | ---------------------------------------------------------------- | ----- | ----------------------------------------- |
| commitment    | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | packet associated with the request fields |
| proof         | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | merkle proof of existence                 |
| proof\_path   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | merkle proof path                         |
| proof\_height | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | height at which the proof was retrieved   |

### QueryPacketCommitmentsRequest

QueryPacketCommitmentsRequest is the request type for the Query/QueryPacketCommitments RPC method

| Field       | Type                                                                         | Label | Description               |
| ----------- | ---------------------------------------------------------------------------- | ----- | ------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | port unique identifier    |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | channel unique identifier |
| pagination  | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination request        |

### QueryPacketCommitmentsResponse

QueryPacketCommitmentsResponse is the request type for the Query/QueryPacketCommitments RPC method

| Field       | Type                                                                          | Label    | Description         |
| ----------- | ----------------------------------------------------------------------------- | -------- | ------------------- |
| commitments | [PacketAckCommitment](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated |                     |
| pagination  | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination response |
| height      | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |          | query block height  |

### QueryUnreceivedPacketsRequest

QueryUnreceivedPacketsRequest is the request type for the Query/UnreceivedPackets RPC method

| Field                         | Type                                          | Label    | Description               |
| ----------------------------- | --------------------------------------------- | -------- | ------------------------- |
| port\_id                      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |          | port unique identifier    |
| channel\_id                   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |          | channel unique identifier |
| packet\_commitment\_sequences | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | list of packet sequences  |

### QueryUnreceivedPacketsResponse

QueryUnreceivedPacketsResponse is the response type for the Query/UnreceivedPacketCommitments RPC method

| Field     | Type                                                             | Label    | Description                         |
| --------- | ---------------------------------------------------------------- | -------- | ----------------------------------- |
| sequences | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated | list of unreceived packet sequences |
| height    | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |          | query block height                  |

### QueryUnrelayedAcksRequest

QueryUnrelayedAcksRequest is the request type for the Query/UnrelayedAcks RPC method

| Field                         | Type                                          | Label    | Description                  |
| ----------------------------- | --------------------------------------------- | -------- | ---------------------------- |
| port\_id                      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |          | port unique identifier       |
| channel\_id                   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |          | channel unique identifier    |
| packet\_commitment\_sequences | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | list of commitment sequences |

### QueryUnrelayedAcksResponse

QueryUnrelayedAcksResponse is the response type for the Query/UnrelayedAcks RPC method

| Field     | Type                                                             | Label    | Description                                 |
| --------- | ---------------------------------------------------------------- | -------- | ------------------------------------------- |
| sequences | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    | repeated | list of unrelayed acknowledgement sequences |
| height    | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |          | query block height                          |

### Query

Query provides defines the gRPC querier service

| Method Name           | Request Type                                                             | Response Type                                                             | Description                                                                                                             |
| --------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Channel               | [QueryChannelRequest](broken://pages/gOJeSIL8phGPlQ62pLku)               | [QueryChannelResponse](broken://pages/gOJeSIL8phGPlQ62pLku)               | Channel queries an IBC Channel.                                                                                         |
| Channels              | [QueryChannelsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)              | [QueryChannelsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)              | Channels queries all the IBC channels of a chain.                                                                       |
| ConnectionChannels    | [QueryConnectionChannelsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryConnectionChannelsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | ConnectionChannels queries all the channels associated with a connection end.                                           |
| ChannelClientState    | [QueryChannelClientStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryChannelClientStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | ChannelClientState queries for the client state for the channel associated with the provided channel identifiers.       |
| ChannelConsensusState | [QueryChannelConsensusStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryChannelConsensusStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ChannelConsensusState queries for the consensus state for the channel associated with the provided channel identifiers. |
| PacketCommitment      | [QueryPacketCommitmentRequest](broken://pages/gOJeSIL8phGPlQ62pLku)      | [QueryPacketCommitmentResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | PacketCommitment queries a stored packet commitment hash.                                                               |
| PacketCommitments     | [QueryPacketCommitmentsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)     | [QueryPacketCommitmentsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | PacketCommitments returns the all the packet commitments hashes associated with a channel.                              |
| PacketAcknowledgement | [QueryPacketAcknowledgementRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryPacketAcknowledgementResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | PacketAcknowledgement queries a stored packet acknowledgement hash.                                                     |
| UnreceivedPackets     | [QueryUnreceivedPacketsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)     | [QueryUnreceivedPacketsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | UnreceivedPackets returns all the unrelayed IBC packets associated with a channel and sequences.                        |
| UnrelayedAcks         | [QueryUnrelayedAcksRequest](broken://pages/gOJeSIL8phGPlQ62pLku)         | [QueryUnrelayedAcksResponse](broken://pages/gOJeSIL8phGPlQ62pLku)         | UnrelayedAcks returns all the unrelayed IBC acknowledgements associated with a channel and sequences.                   |
| NextSequenceReceive   | [QueryNextSequenceReceiveRequest](broken://pages/gOJeSIL8phGPlQ62pLku)   | [QueryNextSequenceReceiveResponse](broken://pages/gOJeSIL8phGPlQ62pLku)   | NextSequenceReceive returns the next receive sequence for a given channel.                                              |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/channel/v1/genesis.proto

### GenesisState

GenesisState defines the ibc channel submodule's genesis state.

| Field            | Type                                                       | Label    | Description |
| ---------------- | ---------------------------------------------------------- | -------- | ----------- |
| channels         | [IdentifiedChannel](broken://pages/gOJeSIL8phGPlQ62pLku)   | repeated |             |
| acknowledgements | [PacketAckCommitment](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| commitments      | [PacketAckCommitment](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| send\_sequences  | [PacketSequence](broken://pages/gOJeSIL8phGPlQ62pLku)      | repeated |             |
| recv\_sequences  | [PacketSequence](broken://pages/gOJeSIL8phGPlQ62pLku)      | repeated |             |
| ack\_sequences   | [PacketSequence](broken://pages/gOJeSIL8phGPlQ62pLku)      | repeated |             |

### PacketSequence

PacketSequence defines the genesis type necessary to retrieve and store next send and receive sequences.

| Field       | Type                                          | Label | Description |
| ----------- | --------------------------------------------- | ----- | ----------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| sequence    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/channel/v1/channel.proto

### Acknowledgement

Acknowledgement is the recommended acknowledgement format to be used by app-specific protocols. NOTE: The field numbers 21 and 22 were explicitly chosen to avoid accidental conflicts with other protobuf message formats used for acknowledgements. The first byte of any message with this format will be the non-ASCII values `0xaa` (result) or `0xb2` (error). Implemented as defined by ICS: <https://github.com/cosmos/ics/tree/master/spec/ics-004-channel-and-packet-semantics#acknowledgement-envelope>

| Field  | Type                                          | Label | Description |
| ------ | --------------------------------------------- | ----- | ----------- |
| result | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |
| error  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Channel

Channel defines pipeline for exactly-once packet delivery between specific modules on separate blockchains, which has at least one end capable of sending packets and one end capable of receiving packets.

| Field            | Type                                                | Label    | Description                                                                                    |
| ---------------- | --------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------- |
| state            | [State](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | current state of the channel end                                                               |
| ordering         | [Order](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | whether the channel is ordered or unordered                                                    |
| counterparty     | [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku) |          | counterparty channel end                                                                       |
| connection\_hops | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       | repeated | list of connection identifiers, in order, along which packets sent on this channel will travel |
| version          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | opaque channel version, which is agreed upon during the handshake                              |

### Counterparty

Counterparty defines a channel end counterparty

| Field       | Type                                          | Label | Description                                                             |
| ----------- | --------------------------------------------- | ----- | ----------------------------------------------------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | port on the counterparty chain which owns the other end of the channel. |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel end on the counterparty chain                                   |

### IdentifiedChannel

IdentifiedChannel defines a channel with additional port and channel identifier fields.

| Field            | Type                                                | Label    | Description                                                                                    |
| ---------------- | --------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------- |
| state            | [State](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | current state of the channel end                                                               |
| ordering         | [Order](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | whether the channel is ordered or unordered                                                    |
| counterparty     | [Counterparty](broken://pages/gOJeSIL8phGPlQ62pLku) |          | counterparty channel end                                                                       |
| connection\_hops | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       | repeated | list of connection identifiers, in order, along which packets sent on this channel will travel |
| version          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | opaque channel version, which is agreed upon during the handshake                              |
| port\_id         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | port identifier                                                                                |
| channel\_id      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | channel identifier                                                                             |

### MsgAcknowledgement

MsgAcknowledgement receives incoming IBC acknowledgement

| Field           | Type                                                             | Label | Description |
| --------------- | ---------------------------------------------------------------- | ----- | ----------- |
| packet          | [Packet](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| acknowledgement | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof           | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height   | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgAcknowledgementResponse

MsgAcknowledgementResponse defines the Msg/Acknowledgement response type.

### MsgChannelCloseConfirm

MsgChannelCloseConfirm defines a msg sent by a Relayer to Chain B to acknowledge the change of channel state to CLOSED on Chain A.

| Field         | Type                                                             | Label | Description |
| ------------- | ---------------------------------------------------------------- | ----- | ----------- |
| port\_id      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| channel\_id   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| proof\_init   | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgChannelCloseConfirmResponse

MsgChannelCloseConfirmResponse defines the Msg/ChannelCloseConfirm response type.

### MsgChannelCloseInit

MsgChannelCloseInit defines a msg sent by a Relayer to Chain A to close a channel with Chain B.

| Field       | Type                                          | Label | Description |
| ----------- | --------------------------------------------- | ----- | ----------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### MsgChannelCloseInitResponse

MsgChannelCloseInitResponse defines the Msg/ChannelCloseInit response type.

### MsgChannelOpenAck

MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge the change of channel state to TRYOPEN on Chain B.

| Field                     | Type                                                             | Label | Description |
| ------------------------- | ---------------------------------------------------------------- | ----- | ----------- |
| port\_id                  | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| channel\_id               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| counterparty\_channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| counterparty\_version     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| proof\_try                | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height             | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer                    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgChannelOpenAckResponse

MsgChannelOpenAckResponse defines the Msg/ChannelOpenAck response type.

### MsgChannelOpenConfirm

MsgChannelOpenConfirm defines a msg sent by a Relayer to Chain B to acknowledge the change of channel state to OPEN on Chain A.

| Field         | Type                                                             | Label | Description |
| ------------- | ---------------------------------------------------------------- | ----- | ----------- |
| port\_id      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| channel\_id   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| proof\_ack    | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgChannelOpenConfirmResponse

MsgChannelOpenConfirmResponse defines the Msg/ChannelOpenConfirm response type.

### MsgChannelOpenInit

MsgChannelOpenInit defines an sdk.Msg to initialize a channel handshake. It is called by a relayer on Chain A.

| Field       | Type                                           | Label | Description |
| ----------- | ---------------------------------------------- | ----- | ----------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |
| channel     | [Channel](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |

### MsgChannelOpenInitResponse

MsgChannelOpenInitResponse defines the Msg/ChannelOpenInit response type.

### MsgChannelOpenTry

MsgChannelOpenInit defines a msg sent by a Relayer to try to open a channel on Chain B.

| Field                             | Type                                                             | Label | Description |
| --------------------------------- | ---------------------------------------------------------------- | ----- | ----------- |
| port\_id                          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| desired\_channel\_id              | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| counterparty\_chosen\_channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| channel                           | [Channel](broken://pages/gOJeSIL8phGPlQ62pLku)                   |       |             |
| counterparty\_version             | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| proof\_init                       | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height                     | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer                            | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgChannelOpenTryResponse

MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type.

### MsgRecvPacket

MsgRecvPacket receives incoming IBC packet

| Field         | Type                                                             | Label | Description |
| ------------- | ---------------------------------------------------------------- | ----- | ----------- |
| packet        | [Packet](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| proof         | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signer        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgRecvPacketResponse

MsgRecvPacketResponse defines the Msg/RecvPacket response type.

### MsgTimeout

MsgTimeout receives timed-out packet

| Field                | Type                                                             | Label | Description |
| -------------------- | ---------------------------------------------------------------- | ----- | ----------- |
| packet               | [Packet](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| proof                | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height        | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| next\_sequence\_recv | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| signer               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgTimeoutOnClose

MsgTimeoutOnClose timed-out packet upon counterparty channel closure.

| Field                | Type                                                             | Label | Description |
| -------------------- | ---------------------------------------------------------------- | ----- | ----------- |
| packet               | [Packet](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| proof                | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_close         | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       |             |
| proof\_height        | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| next\_sequence\_recv | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |
| signer               | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       |             |

### MsgTimeoutOnCloseResponse

MsgTimeoutOnCloseResponse defines the Msg/TimeoutOnClose response type.

### MsgTimeoutResponse

MsgTimeoutResponse defines the Msg/Timeout response type.

### Packet

Packet defines a type that carries data across different chains through IBC

| Field                | Type                                                             | Label | Description                                                                                                                                                                   |
| -------------------- | ---------------------------------------------------------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sequence             | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | number corresponds to the order of sends and receives, where a Packet with an earlier sequence number must be sent and received before a Packet with a later sequence number. |
| source\_port         | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | identifies the port on the sending chain.                                                                                                                                     |
| source\_channel      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | identifies the channel end on the sending chain.                                                                                                                              |
| destination\_port    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | identifies the port on the receiving chain.                                                                                                                                   |
| destination\_channel | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | identifies the channel end on the receiving chain.                                                                                                                            |
| data                 | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                     |       | actual opaque bytes transferred directly to the application module                                                                                                            |
| timeout\_height      | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | block height after which the packet times out                                                                                                                                 |
| timeout\_timestamp   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | block timestamp (in nanoseconds) after which the packet times out                                                                                                             |

### PacketAckCommitment

PacketAckCommitment defines the genesis type necessary to retrieve and store acknowlegements.

| Field       | Type                                          | Label | Description                |
| ----------- | --------------------------------------------- | ----- | -------------------------- |
| port\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel port identifier.   |
| channel\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | channel unique identifier. |
| sequence    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | packet sequence.           |
| hash        | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | packet commitment hash.    |

### Order

Order defines if a channel is ORDERED or UNORDERED

| Name                     | Number | Description                                                                                     |
| ------------------------ | ------ | ----------------------------------------------------------------------------------------------- |
| ORDER\_NONE\_UNSPECIFIED | 0      | zero-value for channel ordering                                                                 |
| ORDER\_UNORDERED         | 1      | packets can be delivered in any order, which may differ from the order in which they were sent. |
| ORDER\_ORDERED           | 2      | packets are delivered exactly in the order which they were sent                                 |

### State

State defines if a channel is in one of the following states: CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.

| Name                              | Number | Description                                                                                 |
| --------------------------------- | ------ | ------------------------------------------------------------------------------------------- |
| STATE\_UNINITIALIZED\_UNSPECIFIED | 0      | Default State                                                                               |
| STATE\_INIT                       | 1      | A channel has just started the opening handshake.                                           |
| STATE\_TRYOPEN                    | 2      | A channel has acknowledged the handshake step on the counterparty chain.                    |
| STATE\_OPEN                       | 3      | A channel has completed the handshake. Open channels are ready to send and receive packets. |
| STATE\_CLOSED                     | 4      | A channel has been closed and can no longer be used to send or receive packets.             |

### Msg

Msg defines the ibc/channel Msg service.

| Method Name         | Request Type                                                  | Response Type                                                         | Description                                                                  |
| ------------------- | ------------------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| ChannelOpenInit     | [MsgChannelOpenInit](broken://pages/gOJeSIL8phGPlQ62pLku)     | [MsgChannelOpenInitResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | ChannelOpenInit defines a rpc handler method for MsgChannelOpenInit.         |
| ChannelOpenTry      | [MsgChannelOpenTry](broken://pages/gOJeSIL8phGPlQ62pLku)      | [MsgChannelOpenTryResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | ChannelOpenTry defines a rpc handler method for MsgChannelOpenTry.           |
| ChannelOpenAck      | [MsgChannelOpenAck](broken://pages/gOJeSIL8phGPlQ62pLku)      | [MsgChannelOpenAckResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | ChannelOpenAck defines a rpc handler method for MsgChannelOpenAck.           |
| ChannelOpenConfirm  | [MsgChannelOpenConfirm](broken://pages/gOJeSIL8phGPlQ62pLku)  | [MsgChannelOpenConfirmResponse](broken://pages/gOJeSIL8phGPlQ62pLku)  | ChannelOpenConfirm defines a rpc handler method for MsgChannelOpenConfirm.   |
| ChannelCloseInit    | [MsgChannelCloseInit](broken://pages/gOJeSIL8phGPlQ62pLku)    | [MsgChannelCloseInitResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | ChannelCloseInit defines a rpc handler method for MsgChannelCloseInit.       |
| ChannelCloseConfirm | [MsgChannelCloseConfirm](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgChannelCloseConfirmResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ChannelCloseConfirm defines a rpc handler method for MsgChannelCloseConfirm. |
| RecvPacket          | [MsgRecvPacket](broken://pages/gOJeSIL8phGPlQ62pLku)          | [MsgRecvPacketResponse](broken://pages/gOJeSIL8phGPlQ62pLku)          | RecvPacket defines a rpc handler method for MsgRecvPacket.                   |
| Timeout             | [MsgTimeout](broken://pages/gOJeSIL8phGPlQ62pLku)             | [MsgTimeoutResponse](broken://pages/gOJeSIL8phGPlQ62pLku)             | Timeout defines a rpc handler method for MsgTimeout.                         |
| TimeoutOnClose      | [MsgTimeoutOnClose](broken://pages/gOJeSIL8phGPlQ62pLku)      | [MsgTimeoutOnCloseResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | TimeoutOnClose defines a rpc handler method for MsgTimeoutOnClose.           |
| Acknowledgement     | [MsgAcknowledgement](broken://pages/gOJeSIL8phGPlQ62pLku)     | [MsgAcknowledgementResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | Acknowledgement defines a rpc handler method for MsgAcknowledgement.         |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/client/v1/client.proto

### ClientConsensusStates

ClientConsensusStates defines all the stored consensus states for a given client.

| Field             | Type                                                            | Label    | Description                                                   |
| ----------------- | --------------------------------------------------------------- | -------- | ------------------------------------------------------------- |
| client\_id        | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                   |          | client identifier                                             |
| consensus\_states | [ConsensusStateWithHeight](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | consensus states and their heights associated with the client |

### ClientUpdateProposal

ClientUpdateProposal is a governance proposal. If it passes, the client is updated with the provided header. The update may fail if the header is not valid given certain conditions specified by the client implementation.

| Field       | Type                                                       | Label | Description                                                               |
| ----------- | ---------------------------------------------------------- | ----- | ------------------------------------------------------------------------- |
| title       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | the title of the update proposal                                          |
| description | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | the description of the proposal                                           |
| client\_id  | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | the client identifier for the client to be updated if the proposal passes |
| header      | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | the header used to update the client if the proposal passes               |

### ConsensusStateWithHeight

ConsensusStateWithHeight defines a consensus state with an additional height field.

| Field            | Type                                                       | Label | Description            |
| ---------------- | ---------------------------------------------------------- | ----- | ---------------------- |
| height           | [Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | consensus state height |
| consensus\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | consensus state        |

### Height

Height is a monotonically increasing data type that can be compared against another Height for the purposes of updating and freezing clients

Normally the VersionHeight is incremented at each height while keeping version number the same However some consensus algorithms may choose to reset the height in certain conditions e.g. hard forks, state-machine breaking changes In these cases, the version number is incremented so that height continues to be monitonically increasing even as the VersionHeight gets reset

| Field           | Type                                          | Label | Description                                 |
| --------------- | --------------------------------------------- | ----- | ------------------------------------------- |
| version\_number | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | the version that the client is currently on |
| version\_height | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | the height within the given version         |

### IdentifiedClientState

IdentifiedClientState defines a client state with an additional client identifier field.

| Field         | Type                                                       | Label | Description       |
| ------------- | ---------------------------------------------------------- | ----- | ----------------- |
| client\_id    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | client identifier |
| client\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | client state      |

### MsgCreateClient

MsgCreateClient defines a message to create an IBC client

| Field            | Type                                                       | Label | Description                                                                    |
| ---------------- | ---------------------------------------------------------- | ----- | ------------------------------------------------------------------------------ |
| client\_id       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | client unique identifier                                                       |
| client\_state    | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | light client state                                                             |
| consensus\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | consensus state associated with the client that corresponds to a given height. |
| signer           | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | signer address                                                                 |

### MsgCreateClientResponse

MsgCreateClientResponse defines the Msg/CreateClient response type.

### MsgSubmitMisbehaviour

MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for light client misbehaviour.

| Field        | Type                                                       | Label | Description                                     |
| ------------ | ---------------------------------------------------------- | ----- | ----------------------------------------------- |
| client\_id   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | client unique identifier                        |
| misbehaviour | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | misbehaviour used for freezing the light client |
| signer       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | signer address                                  |

### MsgSubmitMisbehaviourResponse

MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type.

### MsgUpdateClient

MsgUpdateClient defines an sdk.Msg to update a IBC client state using the given header.

| Field      | Type                                                       | Label | Description                       |
| ---------- | ---------------------------------------------------------- | ----- | --------------------------------- |
| client\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | client unique identifier          |
| header     | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | header to update the light client |
| signer     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | signer address                    |

### MsgUpdateClientResponse

MsgUpdateClientResponse defines the Msg/UpdateClient response type.

### MsgUpgradeClient

MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state

| Field           | Type                                                       | Label | Description                                                            |
| --------------- | ---------------------------------------------------------- | ----- | ---------------------------------------------------------------------- |
| client\_id      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | client unique identifier                                               |
| client\_state   | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | upgraded client state                                                  |
| upgrade\_height | [Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | height at which old chain halts and upgrades (i.e last block executed) |
| proof\_upgrade  | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)               |       | proof that old chain committed to new client                           |
| signer          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | signer address                                                         |

### MsgUpgradeClientResponse

MsgUpgradeClientResponse defines the Msg/UpgradeClient response type.

### Msg

Msg defines the ibc/client Msg service.

| Method Name        | Request Type                                                 | Response Type                                                        | Description                                                                |
| ------------------ | ------------------------------------------------------------ | -------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| CreateClient       | [MsgCreateClient](broken://pages/gOJeSIL8phGPlQ62pLku)       | [MsgCreateClientResponse](broken://pages/gOJeSIL8phGPlQ62pLku)       | CreateClient defines a rpc handler method for MsgCreateClient.             |
| UpdateClient       | [MsgUpdateClient](broken://pages/gOJeSIL8phGPlQ62pLku)       | [MsgUpdateClientResponse](broken://pages/gOJeSIL8phGPlQ62pLku)       | UpdateClient defines a rpc handler method for MsgUpdateClient.             |
| UpgradeClient      | [MsgUpgradeClient](broken://pages/gOJeSIL8phGPlQ62pLku)      | [MsgUpgradeClientResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | UpgradeClient defines a rpc handler method for MsgUpgradeClient.           |
| SubmitMisbehaviour | [MsgSubmitMisbehaviour](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgSubmitMisbehaviourResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/client/v1/query.proto

### QueryClientStateRequest

QueryClientStateRequest is the request type for the Query/ClientState RPC method

| Field      | Type                                          | Label | Description                    |
| ---------- | --------------------------------------------- | ----- | ------------------------------ |
| client\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | client state unique identifier |

### QueryClientStateResponse

QueryClientStateResponse is the response type for the Query/ClientState RPC method. Besides the client state, it includes a proof and the height from which the proof was retrieved.

| Field         | Type                                                       | Label | Description                                         |
| ------------- | ---------------------------------------------------------- | ----- | --------------------------------------------------- |
| client\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | client state associated with the request identifier |
| proof         | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)               |       | merkle proof of existence                           |
| proof\_path   | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | merkle proof path                                   |
| proof\_height | [Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | height at which the proof was retrieved             |

### QueryClientStatesRequest

QueryClientStatesRequest is the request type for the Query/ClientStates RPC method

| Field      | Type                                                                         | Label | Description        |
| ---------- | ---------------------------------------------------------------------------- | ----- | ------------------ |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination request |

### QueryClientStatesResponse

QueryClientStatesResponse is the response type for the Query/ClientStates RPC method.

| Field          | Type                                                                          | Label    | Description                               |
| -------------- | ----------------------------------------------------------------------------- | -------- | ----------------------------------------- |
| client\_states | [IdentifiedClientState](broken://pages/gOJeSIL8phGPlQ62pLku)                  | repeated | list of stored ClientStates of the chain. |
| pagination     | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination response                       |

### QueryConsensusStateRequest

QueryConsensusStateRequest is the request type for the Query/ConsensusState RPC method. Besides the consensus state, it includes a proof and the height from which the proof was retrieved.

| Field           | Type                                          | Label | Description                                                                             |
| --------------- | --------------------------------------------- | ----- | --------------------------------------------------------------------------------------- |
| client\_id      | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | client identifier                                                                       |
| version\_number | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | consensus state version number                                                          |
| version\_height | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | consensus state version height                                                          |
| latest\_height  | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)   |       | latest\_height overrrides the height field and queries the latest stored ConsensusState |

### QueryConsensusStateResponse

QueryConsensusStateResponse is the response type for the Query/ConsensusState RPC method

| Field            | Type                                                       | Label | Description                                                               |
| ---------------- | ---------------------------------------------------------- | ----- | ------------------------------------------------------------------------- |
| consensus\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | consensus state associated with the client identifier at the given height |
| proof            | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)               |       | merkle proof of existence                                                 |
| proof\_path      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | merkle proof path                                                         |
| proof\_height    | [Height](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | height at which the proof was retrieved                                   |

### QueryConsensusStatesRequest

QueryConsensusStatesRequest is the request type for the Query/ConsensusStates RPC method.

| Field      | Type                                                                         | Label | Description        |
| ---------- | ---------------------------------------------------------------------------- | ----- | ------------------ |
| client\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       | client identifier  |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination request |

### QueryConsensusStatesResponse

QueryConsensusStatesResponse is the response type for the Query/ConsensusStates RPC method

| Field             | Type                                                                          | Label    | Description                                     |
| ----------------- | ----------------------------------------------------------------------------- | -------- | ----------------------------------------------- |
| consensus\_states | [ConsensusStateWithHeight](broken://pages/gOJeSIL8phGPlQ62pLku)               | repeated | consensus states associated with the identifier |
| pagination        | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination response                             |

### Query

Query provides defines the gRPC querier service

| Method Name     | Request Type                                                       | Response Type                                                       | Description                                                                                |
| --------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| ClientState     | [QueryClientStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)     | [QueryClientStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)     | ClientState queries an IBC light client.                                                   |
| ClientStates    | [QueryClientStatesRequest](broken://pages/gOJeSIL8phGPlQ62pLku)    | [QueryClientStatesResponse](broken://pages/gOJeSIL8phGPlQ62pLku)    | ClientStates queries all the IBC light clients of a chain.                                 |
| ConsensusState  | [QueryConsensusStateRequest](broken://pages/gOJeSIL8phGPlQ62pLku)  | [QueryConsensusStateResponse](broken://pages/gOJeSIL8phGPlQ62pLku)  | ConsensusState queries a consensus state associated with a client state at a given height. |
| ConsensusStates | [QueryConsensusStatesRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryConsensusStatesResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | ConsensusStates queries all the consensus state associated with a given client.            |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/core/client/v1/genesis.proto

### GenesisState

GenesisState defines the ibc client submodule's genesis state.

| Field              | Type                                                         | Label    | Description                                        |
| ------------------ | ------------------------------------------------------------ | -------- | -------------------------------------------------- |
| clients            | [IdentifiedClientState](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | client states with their corresponding identifiers |
| clients\_consensus | [ClientConsensusStates](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated | consensus states from each client                  |
| create\_localhost  | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)                  |          | create localhost on initialization                 |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/lightclients/solomachine/v1/solomachine.proto

### ChannelStateData

ChannelStateData returns the SignBytes data for channel state verification.

| Field   | Type                                                               | Label | Description |
| ------- | ------------------------------------------------------------------ | ----- | ----------- |
| path    | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                       |       |             |
| channel | [ibc.core.channel.v1.Channel](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### ClientState

ClientState defines a solo machine client that tracks the current consensus state and if the client is frozen.

| Field                          | Type                                                  | Label | Description                                                                                                           |
| ------------------------------ | ----------------------------------------------------- | ----- | --------------------------------------------------------------------------------------------------------------------- |
| sequence                       | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)         |       | latest sequence of the client state                                                                                   |
| frozen\_sequence               | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)         |       | frozen sequence of the solo machine                                                                                   |
| consensus\_state               | [ConsensusState](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                                                                                                                       |
| allow\_update\_after\_proposal | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)           |       | when set to true, will allow governance to update a solo machine client. The client will be unfrozen if it is frozen. |

### ClientStateData

ClientStateData returns the SignBytes data for client state verification.

| Field         | Type                                                       | Label | Description |
| ------------- | ---------------------------------------------------------- | ----- | ----------- |
| path          | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)               |       |             |
| client\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### ConnectionStateData

ConnectionStateData returns the SignBytes data for connection state verification.

| Field      | Type                                                                        | Label | Description |
| ---------- | --------------------------------------------------------------------------- | ----- | ----------- |
| path       | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                                |       |             |
| connection | [ibc.core.connection.v1.ConnectionEnd](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### ConsensusState

ConsensusState defines a solo machine consensus state. The sequence of a consensus state is contained in the "height" key used in storing the consensus state.

| Field       | Type                                                       | Label | Description                                                                                                                                                         |
| ----------- | ---------------------------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| public\_key | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | public key of the solo machine                                                                                                                                      |
| diversifier | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | diversifier allows the same public key to be re-used across different solo machine clients (potentially on different chains) without being considered misbehaviour. |
| timestamp   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |                                                                                                                                                                     |

### ConsensusStateData

ConsensusStateData returns the SignBytes data for consensus state verification.

| Field            | Type                                                       | Label | Description |
| ---------------- | ---------------------------------------------------------- | ----- | ----------- |
| path             | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)               |       |             |
| consensus\_state | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Header

Header defines a solo machine consensus header

| Field            | Type                                                       | Label | Description                                   |
| ---------------- | ---------------------------------------------------------- | ----- | --------------------------------------------- |
| sequence         | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | sequence to update solo machine public key at |
| timestamp        | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |                                               |
| signature        | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)               |       |                                               |
| new\_public\_key | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       |                                               |
| new\_diversifier | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       |                                               |

### HeaderData

HeaderData returns the SignBytes data for update verification.

| Field            | Type                                                       | Label | Description        |
| ---------------- | ---------------------------------------------------------- | ----- | ------------------ |
| new\_pub\_key    | [google.protobuf.Any](broken://pages/gOJeSIL8phGPlQ62pLku) |       | header public key  |
| new\_diversifier | [string](broken://pages/gOJeSIL8phGPlQ62pLku)              |       | header diversifier |

### Misbehaviour

Misbehaviour defines misbehaviour for a solo machine which consists of a sequence and two signatures over different messages at that sequence.

| Field          | Type                                                    | Label | Description |
| -------------- | ------------------------------------------------------- | ----- | ----------- |
| client\_id     | [string](broken://pages/gOJeSIL8phGPlQ62pLku)           |       |             |
| sequence       | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)           |       |             |
| signature\_one | [SignatureAndData](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| signature\_two | [SignatureAndData](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### NextSequenceRecvData

NextSequenceRecvData returns the SignBytes data for verification of the next sequence to be received.

| Field           | Type                                          | Label | Description |
| --------------- | --------------------------------------------- | ----- | ----------- |
| path            | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |
| next\_seq\_recv | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### PacketAcknowledgementData

PacketAcknowledgementData returns the SignBytes data for acknowledgement verification.

| Field           | Type                                         | Label | Description |
| --------------- | -------------------------------------------- | ----- | ----------- |
| path            | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| acknowledgement | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### PacketCommitmentData

PacketCommitmentData returns the SignBytes data for packet commitment verification.

| Field      | Type                                         | Label | Description |
| ---------- | -------------------------------------------- | ----- | ----------- |
| path       | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| commitment | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### PacketReceiptAbsenceData

PacketReceiptAbsenceData returns the SignBytes data for packet receipt absence verification.

| Field | Type                                         | Label | Description |
| ----- | -------------------------------------------- | ----- | ----------- |
| path  | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### SignBytes

SignBytes defines the signed bytes used for signature verification.

| Field       | Type                                            | Label | Description           |
| ----------- | ----------------------------------------------- | ----- | --------------------- |
| sequence    | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |                       |
| timestamp   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |                       |
| diversifier | [string](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |                       |
| data\_type  | [DataType](broken://pages/gOJeSIL8phGPlQ62pLku) |       | type of the data used |
| data        | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)    |       | marshaled data        |

### SignatureAndData

SignatureAndData contains a signature and the data signed over to create that signature.

| Field      | Type                                            | Label | Description |
| ---------- | ----------------------------------------------- | ----- | ----------- |
| signature  | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)    |       |             |
| data\_type | [DataType](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| data       | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)    |       |             |
| timestamp  | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)   |       |             |

### TimestampedSignatureData

TimestampedSignatureData contains the signature data and the timestamp of the signature.

| Field           | Type                                          | Label | Description |
| --------------- | --------------------------------------------- | ----- | ----------- |
| signature\_data | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)  |       |             |
| timestamp       | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### DataType

DataType defines the type of solo machine proof being created. This is done to preserve uniqueness of different data sign byte encodings.

| Name                                   | Number | Description                                       |
| -------------------------------------- | ------ | ------------------------------------------------- |
| DATA\_TYPE\_UNINITIALIZED\_UNSPECIFIED | 0      | Default State                                     |
| DATA\_TYPE\_CLIENT\_STATE              | 1      | Data type for client state verification           |
| DATA\_TYPE\_CONSENSUS\_STATE           | 2      | Data type for consensus state verification        |
| DATA\_TYPE\_CONNECTION\_STATE          | 3      | Data type for connection state verification       |
| DATA\_TYPE\_CHANNEL\_STATE             | 4      | Data type for channel state verification          |
| DATA\_TYPE\_PACKET\_COMMITMENT         | 5      | Data type for packet commitment verification      |
| DATA\_TYPE\_PACKET\_ACKNOWLEDGEMENT    | 6      | Data type for packet acknowledgement verification |
| DATA\_TYPE\_PACKET\_RECEIPT\_ABSENCE   | 7      | Data type for packet receipt absence verification |
| DATA\_TYPE\_NEXT\_SEQUENCE\_RECV       | 8      | Data type for next sequence recv verification     |
| DATA\_TYPE\_HEADER                     | 9      | Data type for header verification                 |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/lightclients/tendermint/v1/tendermint.proto

### ClientState

ClientState from Tendermint tracks the current validator set, latest height, and a possible frozen height.

| Field                              | Type                                                                   | Label    | Description                                                                                                              |
| ---------------------------------- | ---------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------ |
| chain\_id                          | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                          |          |                                                                                                                          |
| trust\_level                       | [Fraction](broken://pages/gOJeSIL8phGPlQ62pLku)                        |          |                                                                                                                          |
| trusting\_period                   | [google.protobuf.Duration](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | duration of the period since the LatestTimestamp during which the submitted headers are valid for upgrade                |
| unbonding\_period                  | [google.protobuf.Duration](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | duration of the staking unbonding period                                                                                 |
| max\_clock\_drift                  | [google.protobuf.Duration](broken://pages/gOJeSIL8phGPlQ62pLku)        |          | defines how much new (untrusted) header's Time can drift into the future.                                                |
| frozen\_height                     | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | Block height when the client was frozen due to a misbehaviour                                                            |
| latest\_height                     | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)       |          | Latest height the client was updated to                                                                                  |
| consensus\_params                  | [tendermint.abci.ConsensusParams](broken://pages/gOJeSIL8phGPlQ62pLku) |          | Consensus params of the chain                                                                                            |
| proof\_specs                       | [ics23.ProofSpec](broken://pages/gOJeSIL8phGPlQ62pLku)                 | repeated | Proof specifications used in verifying counterparty state                                                                |
| upgrade\_path                      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                          |          | Path at which next upgraded client will be committed                                                                     |
| allow\_update\_after\_expiry       | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)                            |          | This flag, when set to true, will allow governance to recover a client which has expired                                 |
| allow\_update\_after\_misbehaviour | [bool](broken://pages/gOJeSIL8phGPlQ62pLku)                            |          | This flag, when set to true, will allow governance to unfreeze a client whose chain has experienced a misbehaviour event |

### ConsensusState

ConsensusState defines the consensus state from Tendermint.

| Field                  | Type                                                                     | Label | Description                                                                            |
| ---------------------- | ------------------------------------------------------------------------ | ----- | -------------------------------------------------------------------------------------- |
| timestamp              | [google.protobuf.Timestamp](broken://pages/gOJeSIL8phGPlQ62pLku)         |       | timestamp that corresponds to the block height in which the ConsensusState was stored. |
| root                   | [ibc.core.commitment.v1.MerkleRoot](broken://pages/gOJeSIL8phGPlQ62pLku) |       | commitment root (i.e app hash)                                                         |
| next\_validators\_hash | [bytes](broken://pages/gOJeSIL8phGPlQ62pLku)                             |       |                                                                                        |

### Fraction

Fraction defines the protobuf message type for tmmath.Fraction

| Field       | Type                                         | Label | Description |
| ----------- | -------------------------------------------- | ----- | ----------- |
| numerator   | [int64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| denominator | [int64](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Header

Header defines the Tendermint client consensus Header. It encapsulates all the information necessary to update from a trusted Tendermint ConsensusState. The inclusion of TrustedHeight and TrustedValidators allows this update to process correctly, so long as the ConsensusState for the TrustedHeight exists, this removes race conditions among relayers The SignedHeader and ValidatorSet are the new untrusted update fields for the client. The TrustedHeight is the height of a stored ConsensusState on the client that will be used to verify the new untrusted header. The Trusted ConsensusState must be within the unbonding period of current time in order to correctly verify, and the TrustedValidators must hash to TrustedConsensusState.NextValidatorsHash since that is the last trusted validator set at the TrustedHeight.

| Field               | Type                                                                 | Label | Description |
| ------------------- | -------------------------------------------------------------------- | ----- | ----------- |
| signed\_header      | [tendermint.types.SignedHeader](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| validator\_set      | [tendermint.types.ValidatorSet](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| trusted\_height     | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku)     |       |             |
| trusted\_validators | [tendermint.types.ValidatorSet](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

### Misbehaviour

Misbehaviour is a wrapper over two conflicting Headers that implements Misbehaviour interface expected by ICS-02

| Field      | Type                                          | Label | Description |
| ---------- | --------------------------------------------- | ----- | ----------- |
| client\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| chain\_id  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| header\_1  | [Header](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |
| header\_2  | [Header](broken://pages/gOJeSIL8phGPlQ62pLku) |       |             |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/lightclients/localhost/v1/localhost.proto

### ClientState

ClientState defines a loopback (localhost) client. It requires (read-only) access to keys outside the client prefix.

| Field     | Type                                                             | Label | Description              |
| --------- | ---------------------------------------------------------------- | ----- | ------------------------ |
| chain\_id | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | self chain ID            |
| height    | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | self latest block height |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/applications/transfer/v1/transfer.proto

### DenomTrace

DenomTrace contains the base denomination for ICS20 fungible tokens and the source tracing information path.

| Field       | Type                                          | Label | Description                                                                                           |
| ----------- | --------------------------------------------- | ----- | ----------------------------------------------------------------------------------------------------- |
| path        | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | path defines the chain of port/channel identifiers used for tracing the source of the fungible token. |
| base\_denom | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | base denomination of the relayed fungible token.                                                      |

### FungibleTokenPacketData

FungibleTokenPacketData defines a struct for the packet payload See FungibleTokenPacketData spec: <https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer#data-structures>

| Field    | Type                                          | Label | Description                                    |
| -------- | --------------------------------------------- | ----- | ---------------------------------------------- |
| denom    | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | the token denomination to be transferred       |
| amount   | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku) |       | the token amount to be transferred             |
| sender   | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | the sender address                             |
| receiver | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | the recipient address on the destination chain |

### MsgTransfer

MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between ICS20 enabled chains. See ICS Spec here: <https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer#data-structures>

| Field              | Type                                                             | Label | Description                                                                                                        |
| ------------------ | ---------------------------------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------ |
| source\_port       | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | the port on which the packet will be sent                                                                          |
| source\_channel    | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | the channel by which the packet will be sent                                                                       |
| token              | [cosmos.base.v1beta1.Coin](broken://pages/gOJeSIL8phGPlQ62pLku)  |       | the tokens to be transferred                                                                                       |
| sender             | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | the sender address                                                                                                 |
| receiver           | [string](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | the recipient address on the destination chain                                                                     |
| timeout\_height    | [ibc.core.client.v1.Height](broken://pages/gOJeSIL8phGPlQ62pLku) |       | Timeout height relative to the current block height. The timeout is disabled when set to 0.                        |
| timeout\_timestamp | [uint64](broken://pages/gOJeSIL8phGPlQ62pLku)                    |       | Timeout timestamp (in nanoseconds) relative to the current block timestamp. The timeout is disabled when set to 0. |

### MsgTransferResponse

MsgTransferResponse defines the Msg/Transfer response type.

### Params

Params defines the set of IBC transfer parameters. NOTE: To prevent a single token from being transferred, set the TransfersEnabled parameter to true and then set the bank module's SendEnabled parameter for the denomination to false.

| Field            | Type                                        | Label | Description                                                                         |
| ---------------- | ------------------------------------------- | ----- | ----------------------------------------------------------------------------------- |
| send\_enabled    | [bool](broken://pages/gOJeSIL8phGPlQ62pLku) |       | send\_enabled enables or disables all cross-chain token transfers from this chain.  |
| receive\_enabled | [bool](broken://pages/gOJeSIL8phGPlQ62pLku) |       | receive\_enabled enables or disables all cross-chain token transfers to this chain. |

### Msg

Msg defines the ibc/transfer Msg service.

| Method Name | Request Type                                       | Response Type                                              | Description                                            |
| ----------- | -------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------ |
| Transfer    | [MsgTransfer](broken://pages/gOJeSIL8phGPlQ62pLku) | [MsgTransferResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | Transfer defines a rpc handler method for MsgTransfer. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/applications/transfer/v1/query.proto

### QueryDenomTraceRequest

QueryDenomTraceRequest is the request type for the Query/DenomTrace RPC method

| Field | Type                                          | Label | Description                                                 |
| ----- | --------------------------------------------- | ----- | ----------------------------------------------------------- |
| hash  | [string](broken://pages/gOJeSIL8phGPlQ62pLku) |       | hash (in hex format) of the denomination trace information. |

### QueryDenomTraceResponse

QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC method.

| Field        | Type                                              | Label | Description                                                        |
| ------------ | ------------------------------------------------- | ----- | ------------------------------------------------------------------ |
| denom\_trace | [DenomTrace](broken://pages/gOJeSIL8phGPlQ62pLku) |       | denom\_trace returns the requested denomination trace information. |

### QueryDenomTracesRequest

QueryConnectionsRequest is the request type for the Query/DenomTraces RPC method

| Field      | Type                                                                         | Label | Description                                                |
| ---------- | ---------------------------------------------------------------------------- | ----- | ---------------------------------------------------------- |
| pagination | [cosmos.base.query.v1beta1.PageRequest](broken://pages/gOJeSIL8phGPlQ62pLku) |       | pagination defines an optional pagination for the request. |

### QueryDenomTracesResponse

QueryConnectionsResponse is the response type for the Query/DenomTraces RPC method.

| Field         | Type                                                                          | Label    | Description                                                |
| ------------- | ----------------------------------------------------------------------------- | -------- | ---------------------------------------------------------- |
| denom\_traces | [DenomTrace](broken://pages/gOJeSIL8phGPlQ62pLku)                             | repeated | denom\_traces returns all denominations trace information. |
| pagination    | [cosmos.base.query.v1beta1.PageResponse](broken://pages/gOJeSIL8phGPlQ62pLku) |          | pagination defines the pagination in the response.         |

### QueryParamsRequest

QueryParamsRequest is the request type for the Query/Params RPC method.

### QueryParamsResponse

QueryParamsResponse is the response type for the Query/Params RPC method.

| Field  | Type                                          | Label | Description                                  |
| ------ | --------------------------------------------- | ----- | -------------------------------------------- |
| params | [Params](broken://pages/gOJeSIL8phGPlQ62pLku) |       | params defines the parameters of the module. |

### Query

Query provides defines the gRPC querier service.

| Method Name | Request Type                                                   | Response Type                                                   | Description                                               |
| ----------- | -------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- |
| DenomTrace  | [QueryDenomTraceRequest](broken://pages/gOJeSIL8phGPlQ62pLku)  | [QueryDenomTraceResponse](broken://pages/gOJeSIL8phGPlQ62pLku)  | DenomTrace queries a denomination trace information.      |
| DenomTraces | [QueryDenomTracesRequest](broken://pages/gOJeSIL8phGPlQ62pLku) | [QueryDenomTracesResponse](broken://pages/gOJeSIL8phGPlQ62pLku) | DenomTraces queries all denomination traces.              |
| Params      | [QueryParamsRequest](broken://pages/gOJeSIL8phGPlQ62pLku)      | [QueryParamsResponse](broken://pages/gOJeSIL8phGPlQ62pLku)      | Params queries all parameters of the ibc-transfer module. |

[Top](broken://pages/gOJeSIL8phGPlQ62pLku)

## ibc/applications/transfer/v1/genesis.proto

### GenesisState

GenesisState defines the ibc-transfer genesis state

| Field         | Type                                              | Label    | Description |
| ------------- | ------------------------------------------------- | -------- | ----------- |
| port\_id      | [string](broken://pages/gOJeSIL8phGPlQ62pLku)     |          |             |
| denom\_traces | [DenomTrace](broken://pages/gOJeSIL8phGPlQ62pLku) | repeated |             |
| params        | [Params](broken://pages/gOJeSIL8phGPlQ62pLku)     |          |             |

## Scalar Value Types

| .proto Type | Notes                                                                                                                                           | C++    | Java       | Python      | Go      | C#         | PHP            | Ruby                           |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ---------- | ----------- | ------- | ---------- | -------------- | ------------------------------ |
| double      |                                                                                                                                                 | double | double     | float       | float64 | double     | float          | Float                          |
| float       |                                                                                                                                                 | float  | float      | float       | float32 | float      | float          | Float                          |
| int32       | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32  | int        | int         | int32   | int        | integer        | Bignum or Fixnum (as required) |
| int64       | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64  | long       | int/long    | int64   | long       | integer/string | Bignum                         |
| uint32      | Uses variable-length encoding.                                                                                                                  | uint32 | int        | int/long    | uint32  | uint       | integer        | Bignum or Fixnum (as required) |
| uint64      | Uses variable-length encoding.                                                                                                                  | uint64 | long       | int/long    | uint64  | ulong      | integer/string | Bignum or Fixnum (as required) |
| sint32      | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.                            | int32  | int        | int         | int32   | int        | integer        | Bignum or Fixnum (as required) |
| sint64      | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.                            | int64  | long       | int/long    | int64   | long       | integer/string | Bignum                         |
| fixed32     | Always four bytes. More efficient than uint32 if values are often greater than 2^28.                                                            | uint32 | int        | int         | uint32  | uint       | integer        | Bignum or Fixnum (as required) |
| fixed64     | Always eight bytes. More efficient than uint64 if values are often greater than 2^56.                                                           | uint64 | long       | int/long    | uint64  | ulong      | integer/string | Bignum                         |
| sfixed32    | Always four bytes.                                                                                                                              | int32  | int        | int         | int32   | int        | integer        | Bignum or Fixnum (as required) |
| sfixed64    | Always eight bytes.                                                                                                                             | int64  | long       | int/long    | int64   | long       | integer/string | Bignum                         |
| bool        |                                                                                                                                                 | bool   | boolean    | boolean     | bool    | bool       | boolean        | TrueClass/FalseClass           |
| string      | A string must always contain UTF-8 encoded or 7-bit ASCII text.                                                                                 | string | String     | str/unicode | string  | string     | string         | String (UTF-8)                 |
| bytes       | May contain any arbitrary sequence of bytes.                                                                                                    | string | ByteString | str         | \[]byte | ByteString | string         | String (ASCII-8BIT)            |
|             |                                                                                                                                                 |        |            |             |         |            |                |                                |

### x/inflation

Controls token supply and inflation decay. Introduced in `v7.0.0`.

**Messages:**

| Message           | Description                                                                                           |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| `MsgUpdateParams` | Update all inflation parameters (max\_supply, decay\_rate, burned\_addresses). Authority: governance. |

**Queries:**

| Query    | REST Endpoint                        | Description                                         |
| -------- | ------------------------------------ | --------------------------------------------------- |
| `Params` | `GET /chainmain/inflation/v1/params` | Returns max\_supply, decay\_rate, burned\_addresses |

**BeginBlocker:**

Runs every block after the Mint module. Checks circulating supply (total supply − burned address balances) does not exceed max\_supply. Chain halts if exceeded.

**Inflation decay formula:**

```
inflation_rate = base_rate × (1 − decay_rate) ^ months_elapsed

Where:
  base_rate      = 1% (InflationMin = InflationMax = 0.01)
  decay_rate     = 6.8% per month
  months_elapsed = (current_height − decay_epoch_start) / blocks_per_month
```

***

### x/tieredrewards

Manages tiered staking positions with bonus APY and exit commitments. Introduced in `v7.0.0`.

**Messages:**

| Message                     | Description                                                              |
| --------------------------- | ------------------------------------------------------------------------ |
| `MsgLockTier`               | Lock fresh CRO into a tier position and delegate to a validator          |
| `MsgCommitDelegationToTier` | Convert existing delegation into a tier position (no unbonding required) |
| `MsgAddToTierPosition`      | Add tokens to an existing position (rejected if exit in progress)        |
| `MsgTierRedelegate`         | Move position to a different validator (does not trigger exit)           |
| `MsgClaimTierRewards`       | Claim pending base + bonus rewards for one or more positions             |
| `MsgTriggerExitFromTier`    | Start exit commitment countdown                                          |
| `MsgClearPosition`          | Cancel a triggered exit; resets timer and resumes bonus                  |
| `MsgExitTierWithDelegation` | Instant exit — transfers delegation back to owner on same validator      |
| `MsgTierUndelegate`         | Start standard 28-day unbonding period                                   |
| `MsgWithdrawFromTier`       | Withdraw tokens after unbonding completes                                |

**Queries:**

| Query                       | REST Endpoint                                                  | Description                     |
| --------------------------- | -------------------------------------------------------------- | ------------------------------- |
| `Tiers`                     | `GET /chainmain/tieredrewards/v1/tiers`                        | All tier definitions            |
| `Params`                    | `GET /chainmain/tieredrewards/v1/params`                       | Module parameters               |
| `Position`                  | `GET /chainmain/tieredrewards/v1/position/{id}`                | Single position                 |
| `PositionsByOwner`          | `GET /chainmain/tieredrewards/v1/positions/{owner}`            | All positions for an address    |
| `Positions`                 | `GET /chainmain/tieredrewards/v1/positions`                    | All positions (paginated)       |
| `EstimateRewards`           | `GET /chainmain/tieredrewards/v1/estimate_rewards/{id}`        | Pending rewards estimate        |
| `RewardsPoolBalances`       | `GET /chainmain/tieredrewards/v1/rewards_pool_balances`        | Pool balance                    |
| `VotingPower`               | `GET /chainmain/tieredrewards/v1/voting_power/{owner}`         | Voting power                    |
| `TotalDelegatedVotingPower` | `GET /chainmain/tieredrewards/v1/total_delegated_voting_power` | Total voting power              |
| `ValidatorData`             | `GET /chainmain/tieredrewards/v1/validator_data/{validator}`   | Validator reward data           |
| `PositionMappings`          | `GET /chainmain/tieredrewards/v1/position_mappings/{id}`       | Unbonding/redelegation mappings |

**Key mechanics:**

* Base rewards (\~3% APY) topped up from rewards pool if block fees fall short
* Bonus rewards paid from Tier Rewards Pool based on tier selection
* Exit commitment starts when user triggers exit, not at entry
* Validator commission applies to base rewards only; bonus paid directly to stakers
* Rewards settled before any position mutation (redelegate, add, exit, clear)
* All parameters are governance-adjustable


# Chain ID, Address Format and Signatures

## Chain ID

Cronos POS Chain has different Chain ID to distinguish between *devnet*, *testnet* and *mainnet*. When running the Cronos POS Chain in your local environment, you will also need to decide your own Chain ID.

For example, our testnet Chain ID is `testnet-croeseid-4`.

## Address prefix

[BIP-0173](https://github.com/satoshilabs/slips/blob/master/slip-0173.md) defines a new format for segregated witness output addresses that contains a human-readable part that identifies the coin type. Cronos POS Chain has different address prefixes for its corresponding network types, these prefixes are:

| Mainnet | Testnet | Devnet |
| ------- | ------- | ------ |
| `cro`   | `tcro`  | `dcro` |

Cronos POS Chain uses the Bech32 address format wherever users must handle binary data. Bech32 encoding provides robust integrity checks on data and the human readable part(HRP) that provides contextual hints that can assist UI developers with providing informative error messages. Specifically, we have the following HRP prefix for different addresses types in the mainnet:

|                    | Address bech32 Prefix |
| ------------------ | --------------------- |
| Account            | `cro`                 |
| Validator Operator | `crocncl`             |
| Consensus Nodes    | `crocnclcons`         |

We can use the `keys show` command of `chain-maind` with the flag `--bech <type> (acc|val|cons)` to obtain the addresses and keys as mentioned above: for example,

```
$ chain-maind keys show test --bech acc
    - name: test0
    type: local
    address: cro1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s3zwpck7
    pubkey: cropub1addwnpepq0ua07k8p3vrv5dap4pl77n4gjyyqsqrndzu0tdrr60ddhfg6ah0c4mu5gw
    mnemonic: ""
    threshold: 0
    pubkeys: []

$ chain-maind keys show test --bech val
    - name: test0
    type: local
    address: crocncl1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s3prz35z
    pubkey: crocnclpub1addwnpepq0ua07k8p3vrv5dap4pl77n4gjyyqsqrndzu0tdrr60ddhfg6ah0ck5ad5l
    mnemonic: ""
    threshold: 0
    pubkeys: []

$ chain-maind keys show test --bech cons
    - name: test0
    type: local
    address: crocnclcons1zdlttjrqh9jsgk2l8tgn6f0kxlfy98s34pfmlc
    pubkey: crocnclconspub1addwnpepq0ua07k8p3vrv5dap4pl77n4gjyyqsqrndzu0tdrr60ddhfg6ah0ch6kdrc
    mnemonic: ""
    threshold: 0
    pubkeys: []
```

## Signatures

[Digital signature](https://en.wikipedia.org/wiki/Digital_signature) has been the main way to authenticate users, by allowing users to sign transactions using their own private key. The public key and other data that are required for proper transaction validation are stored in an `Account` object.

Since the [`chain-maind`](https://github.com/crypto-org-chain/chain-main/releases) v3.0.0, the new types of public keys and signing algorithms are supported, including secp256r1/NIST P-256. Secp256r1 is commonly applied in HSMs, [macOS/iOS/watchOS Secure Enclave](https://support.apple.com/en-ca/guide/security/sec59b0b31ff/web) and [Android hardware-backed Keystore](https://source.android.com/security/keystore/features), which allows the devices to function as hardware wallets. Based on secp256r1, the chosen parameters are supposed to be random numbers, while secp256k1 has had its parameters chosen [relatively rigidly](http://safecurves.cr.yp.to/rigid.html). Also, the address length (in bytes) in secp256k1 is 20 versus secp256r1 of 32.

At this stage, the following three digital key schemes for creating digital signatures are supported in Cosmos SDK. You can learn more at the [Cosmos SDK website](https://docs.cosmos.network/).

* `secp256k1`, as implemented in the [SDK's crypto/keys/secp256k1 package](https://github.com/cosmos/cosmos-sdk/blob/v0.42.1/crypto/keys/secp256k1/secp256k1.go)
* `secp256r1`, as implemented in the [SDK's crypto/keys/secp256r1 package](https://github.com/cosmos/cosmos-sdk/blob/master/crypto/keys/secp256r1/pubkey.go)
* `tm-ed25519`, as implemented in the [SDK crypto/keys/ed25519 package](https://github.com/cosmos/cosmos-sdk/blob/v0.42.1/crypto/keys/ed25519/ed25519.go) (supported only for the consensus validation)

| Key schemes  | Address length in bytes | Public key length in bytes | Used for transaction authentication | Used for consensus (Tendermint) |
| ------------ | ----------------------- | -------------------------- | ----------------------------------- | ------------------------------- |
| `secp256k1`  | 20                      | 33                         | yes                                 | no                              |
| `secp256r1`  | 32                      | 33                         | yes                                 | no                              |
| `tm-ed25519` | not used                | 32                         | no                                  | yes                             |


# Create the IBC-enabled tokens on the Cronos POS Chain with Solo Machine

A solo machine is a standalone process that can interact with blockchains through the Inter-Blockchain Communication Protocol (IBC). It can store key information like signed messages and private keys but has no consensus algorithm of its own. The solo machine client can be seen as a verification algorithm capable of authenticating messages sent from a chain or solo machine. With solo machines, one can access the IBC transport layer and blockchains (including features built on them) within the Cosmos ecosystem without developing their own blockchain. This provides great ease to token issuers who would like to natively mint IBC-enabled tokens.

Another feature of using a solo machine is that it can [leverage Interchain Accounts (ICA)](https://github.com/cosmos/ibc-go/tree/main/modules/apps/27-interchain-accounts). The key feature of the Interchain Accounts module is that it enables cross-chain account management via the IBC, which allows one blockchain to access the features of another blockchain. On the Cronos POS Chain, we have leveraged solo machines to issue tokens like [Polkadot (DOT)-pegged coins](https://medium.com/crypto-org-chain/crypto-org-chain-issues-dot-token-via-ibc-solo-machine-b0f58e605b0e). These DOT tokens can be natively transferred within the Cosmos interchain ecosystem using IBC.

Solo machines open up plenty of use cases in the Cosmos ecosystem. In this article, we will review simple approaches to implementing token operations using the IBC solo machine (e.g. mint and burn as well as delegation and undelegation) on the Cronos POS Chain locally, while any Cosmos SDK based blockchains should support it. Developers and users who are interested can clone our [Stag repository](https://github.com/devashishdxt/stag) to quickly go through these steps and try the approaches out.

## Prerequisite: Blockchain Configuration

The blockchain is running locally in this example and the proper configuration setup is required. In the genesis file, ensure 1) `transfer` in the genesis file is enabled (`receive_enabled: true` and `send_enabled: true`); 2) the staking message (`/cosmos.staking.v1beta1/MsgDelegate` and `/cosmos.staking.v1beta1/MsgUndelegate`)is enabled at `allow_message` under `host_genesis_state`. This lets them communicate properly later on.&#x20;

<div align="center" data-full-width="false"><figure><img src="https://user-images.githubusercontent.com/78806365/190537653-f7ea9530-c0ed-448a-89ba-48fbc7b9662b.png" alt=""><figcaption></figcaption></figure></div>

After completing the integration, run the chain in the background.

## Signer Configuration

Firstly, you need to install Rust to be able to conduct the operation with stag. The prerequisites setup guide is available [here](https://github.com/devashishdxt/stag/blob/main/README.md#installing) and the Stag CLI guide is available [here](https://github.com/devashishdxt/stag/blob/main/stag-cli/README.md). After installing Rust, you need to configure signers for your preferred chains. The sample config for a signer is included in `signer.yaml` by `stag signer sample-config`, where you can set up your own signer and update its details accordingly.

<figure><img src="https://user-images.githubusercontent.com/78806365/190538165-ddb74f28-a5c2-40b7-9196-01de29a4e062.png" alt="" width="563"><figcaption></figcaption></figure>

## Add a Blockchain and Create an IBC Channel

The next step is to add the chain to the solo machine. To run IBC operations on-chain, `stag` needs several basic configurations to be set up for that specific chain. You can tailor the `trusted_height` and `trusted_hash` to your chain's own trusted height and trusted hash using `stag core add-chain <path to chain.yaml>`.

A sample `chain.yaml` is shown here:

<figure><img src="https://user-images.githubusercontent.com/78806365/190538089-58a57734-b0f1-4aed-be57-8f2d57444531.png" alt="" width="563"><figcaption></figcaption></figure>

Now, you can establish an IBC connection with a blockchain using

```
$ stag core connect <chain_id>
```

(`chain-main-1` is the `chain_id` in our example here)

And create an IBC channel with a chain using

```
$ stag core channel create <channel_type> <chain_id>. 
```

There are two options for `channel_type`: `transfer` or `ica`. In the example below, the transfer channel is created, which looks like:

<figure><img src="https://user-images.githubusercontent.com/78806365/190538598-bfd60dd3-53bc-4dad-b930-6a4c44bfe351.png" alt="" width="563"><figcaption></figcaption></figure>

#### Use Case #1: Mint and Burn Tokens

A solo machine can be used to mint and burn tokens on any IBC chain. To mint and burn tokens on-chain using a solo machine, simply run

```
$ stag transfer mint <chain_id> <amount> <denom>. 
```

We will mint 1,000 GLD tokens as an example, allowing us to perform the

```
$ stag transfer mint chain-main-1 1000 gld 
```

operation. If you would like to check your current token balance, you can do so by executing

```
$ stag query balance <chain_id> <denom> --ibc-denom
```

In our example, we perform token minting with

```
$ stag transfer mint chain-main-1 1000 gld
```

In return, the response should look like this:

<figure><img src="https://user-images.githubusercontent.com/78806365/190538804-6e18b39c-ca7f-4276-b80f-03d7d8f486ab.png" alt="" width="563"><figcaption></figcaption></figure>

The same token can be burned with the query

```
$ stag transfer burn <chain_id> <amount> <denom>
```

<figure><img src="https://user-images.githubusercontent.com/78806365/190538891-a1204977-ef1c-40d3-965e-247a08321076.png" alt="" width="563"><figcaption></figcaption></figure>

#### Use Case #2: Delegation and Undelegation

Before delegating tokens from your interchain account to a validator, ensure that you have enough tokens in your account, which allows delegation to be executed successfully. If you would like to send tokens from one interchain account to another, you can do so with

```
$ stag ica bank send <chain_id> <to_address> <amount> <denom>.
```

Delegation and undelegation can be done with

```
$ stag ica staking delegate <chain_id> <validator_address> <amount> <denom> 

$ stag ica staking undelegate <chain_id> <validator_address> <amount> <denom>
```

In our example, we perform delegation using

```
$ stag ica staking delegate chain-main-1 tcro17jw7dzu9... 1000 basetcro
```

Similarly, we can undelegate with

```
$ stag ica staking undelegate chain-main-1 tcro17jw7dzu9... 1000 basetcro
```

### Solo Machine UI

Apart from Stag CLI, you can perform the same execution through a UI (User Interface). With the [Stag repository](https://github.com/devashishdxt/stag), you can simply run `just serve-ui` under the path of `../stag-ui`. Ensure that you have the [required target for Rustup setups](https://rustwasm.github.io/docs/wasm-pack/prerequisites/non-rustup-setups.html), which can be installed by `rustup target add wasm32-unknown-unknown`.

Once it is connected, the default server listening is at `http://127.0.0.1:8080` and the frontend should look like:

<figure><img src="https://user-images.githubusercontent.com/78806365/190540263-73b6385d-fff1-4dda-93ae-25af36ea1a06.png" alt="" width="563"><figcaption></figcaption></figure>

Like what we did with CLI, we first need to configure the signers, chains, and connections before building the channels.

<figure><img src="https://user-images.githubusercontent.com/78806365/190540369-a1bcb3c2-a4ee-4788-bc5f-dd68139db85a.png" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://user-images.githubusercontent.com/78806365/190540312-5f7a448e-b4d7-4e8b-95b8-4e5006fe8f8e.png" alt="" width="563"><figcaption></figcaption></figure>

Here’s how minting and burning tokens look like:

<figure><img src="https://user-images.githubusercontent.com/78806365/190540476-f7ad07e4-5a90-41ec-92a8-d7b02bba64ae.png" alt="" width="563"><figcaption></figcaption></figure>

This is how delegating and undelegating will appear:

<figure><img src="https://user-images.githubusercontent.com/78806365/190540529-252c4860-c2ef-4280-8e59-99869732b03c.png" alt="" width="563"><figcaption></figcaption></figure>


# List of parameters

This section aims to collect and provide brief a description of all the mentioned network parameters:

#### Distribution-related parameters - `distribution` module

| Key                     | Type         | Description                                                              |
| ----------------------- | ------------ | ------------------------------------------------------------------------ |
| `base_proposer_reward`  | string (dec) | Base bonus on transaction fees collected in a valid block                |
| `bonus_proposer_reward` | string (dec) | Max bonus on transaction fees collected in a valid block                 |
| `community_tax`         | string (dec) | The rate of community tax                                                |
| `withdraw_addr_enabled` | bool         | Whether delegators can set a different address to withdraw their rewards |

#### Punishment-related parameters - `gov` module

| Key                  | Type                 | Description                                                                                             |
| -------------------- | -------------------- | ------------------------------------------------------------------------------------------------------- |
| `min_deposit`        | array (coins)        | Minimum deposit for a proposal to enter voting period                                                   |
| `max_deposit_period` | string (time in ns)  | Maximum period for Cro holders to deposit on a proposal                                                 |
| `voting_period`      | string (time in ns)) | The length of voting period                                                                             |
| `quorum`             | string (dec)         | The minimum percentage of voting power that needs to be casted on a proposal for the result to be valid |
| `threshold`          | string (dec)         | Minimum proportion of `Yes` votes (excluding `Abstain` votes) for the proposal to be accepted.          |
| `veto`               | string (dec)         | Minimum proportion of `Veto` votes to Total votes ratio for proposal to be vetoed.                      |

#### Reward-related parameters - `mint` module

| Key                     | Type           | Description                                                                                                                                            |
| ----------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `blocks_per_year`       | string (int64) | The expected number of blocks being produced per year                                                                                                  |
| `goal_bonded`           | string (dec)   | Goal of bonded token in percentage                                                                                                                     |
| `inflation_max`         | string (dec)   | Maximum annual inflation rate                                                                                                                          |
| `inflation_min`         | string (dec)   | Minimum annual inflation rate                                                                                                                          |
| `inflation_rate_change` | string (dec)   | Maximum annual change in inflation rate                                                                                                                |
| `mint_denom`            | string         | Token type being minted. Denominations can be 3 \~ 128 characters long and support letters, followed by either a letter, a number or a separator ('/') |

#### Punishment-related parameters - `slashing` module

| Key                          | Type           | Description                                                                |
| ---------------------------- | -------------- | -------------------------------------------------------------------------- |
| `downtime_jail_duration`     | string (int64) | The jailing duration for validators with low availability                  |
| `min_signed_per_window`      | string (dec)   | Threshold of total missed blocks                                           |
| `signed_blocks_window`       | string (int64) | Window to calculate validators's liveness                                  |
| `slash_fraction_double_sign` | string (dec)   | Maximum percentage of stake reduction for byzantine validators             |
| `slash_fraction_downtime`    | string (dec)   | Maximum percentage of stake reduction for validators with low availability |

#### Staking-related parameters - `staking` module

| Key                  | Type   | Description                                                                                                                                                   |
| -------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `bond_denom`         | string | Coin denomination for staking. Denominations can be 3 \~ 128 characters long and support letters, followed by either a letter, a number or a separator ('/'). |
| `historical_entries` | uint16 | The number of historical entries to persist                                                                                                                   |
| `max_entries`        | uint16 | The max entries for either unbonding delegation or redelegation                                                                                               |
| `max_validators`     | uint16 | The maximum number of validator                                                                                                                               |
| `unbonding_time`     | string | The time duration of unbonding                                                                                                                                |

#### Inflation Module (`x/inflation`)

| Parameter          | Type      | Value                    | Description                                            |
| ------------------ | --------- | ------------------------ | ------------------------------------------------------ |
| `max_supply`       | Int       | 10^19 basecro (100B CRO) | Hard cap on circulating supply                         |
| `decay_rate`       | Dec       | `0.068` (6.8%)           | Monthly inflation decay rate                           |
| `burned_addresses` | \[]string | Chain-specific           | Addresses excluded from circulating supply calculation |

#### Tiered Rewards Module (`x/tieredrewards`)

| Parameter               | Type | Value       | Description                                   |
| ----------------------- | ---- | ----------- | --------------------------------------------- |
| `TargetBaseRewardsRate` | Dec  | `0.03` (3%) | Base APY floor maintained by the rewards pool |

#### **Tier definitions (queryable, governance-adjustable):**

| Parameter       | Tier 1    | Tier 2    | Tier 3    |
| --------------- | --------- | --------- | --------- |
| `ExitDuration`  | 1 year    | 2 years   | 4 years   |
| `BonusApy`      | 0.02 (2%) | 0.04 (4%) | 0.07 (7%) |
| `MinLockAmount` | 100 CRO   | 100 CRO   | 100 CRO   |
| `CloseOnly`     | false     | false     | false     |


# Proposal Process

*The governance process is divided into a few steps that are outlined below*:

### 1. The idea

Governance proposals potentially impact many stakeholders. It is suggested to introduce your idea with known community members before investing resources into drafting a proposal to get the very initial feedback. If you know someone who is very experienced in the topic, you may try to communicate with them about a concise overview of what you think will result from the proposed changes.

### 2. Begin your drafted proposal

After you confirm the idea, you may start to draft and describe some potential elements of the proposal. It is recommended to also consider the anticipated questions that the community will likely ask.

Please ensure to include the following information in your proposal:

* Overview of this proposal
* Introduction of team member(s)
* The problem/issue this project solves/The reason for creating this proposal
* The details of the solution
* The impact brings to the chain of the proposal
* Timeline, if applicable
* How can the quality of the deliverables be assessed, if applicable.

Proposal Types: You may choose to put your proposal in any of the following formats:

* Parameter Change Proposal\
  Creating a parameter-change governance proposal involves two kinds of risk: losing proposal deposit amounts and potentially altering the function of the network in an undesirable way. Some of the examples are:
  * SoftwareUpgradeProposal: for breaking changes and binary updates
  * CancelSoftwareUpgradeProposal: for revoking the planned upgraded proposal
* Community Pool Spend Proposal\
  It unlocks the potential for token-holders to vote to approve spending from the Community Pool. Engaging publicly with the community is the opportunity to develop relationships with stakeholders and to educate them about the importance of your work. If the proposal passes, your account will be credited the supported amount of your proposal request.
* Text Proposal\
  You can also choose to submit the proposal in plaintext format.

### 3. Collect feedback from the community

After the proposal is ready, you can post a thread to begin a discussion on the [Cronos POS Chain Github Discussions page](https://github.com/crypto-org-chain/chain-main/discussions) to gain initial feedback. Engagement is critical to the success of a proposal. The ideal strategy is to engage with experienced people in the community about your idea, to confirm the key points, such as if it makes sense, or if critical flaws exist, etc. You may also plan for a few stages of engagement to get as much as feedback possible before and after submitting a proposal on-chain. Let people in the [Discord community](https://discord.gg/5JTk2ppsY3) know about your draft proposal.

### 4. Revise your proposal

Depending on the collected feedback, you can revise the proposal accordingly.

### 5. Submit your proposal

* (Recommend) Submit the Proposal to the Testnet first&#x20;
  * You may want to push your proposal live to the testnet first before pushing to the mainnet. Once your proposal is on-chain, you will not be able to change it. By submitting it to testnet, you will gain a good sense of what the proposal description will look like and know how your proposal will be on the mainnet. Submitting your proposal to the testnet also increases the likelihood that you will discover a flaw before deploying your proposal on the mainnet. For testnet submission, please note: you'll need testnet tokens TCRO for your proposal, and the parameters for testnet proposals are different (eg. voting period timing, deposit amount, deposit denomination)
* Submit Your On-chain Proposal with Initial Deposit&#x20;
  * After everything is set and you are confident about the proposal, you can now submit the final proposal with chain-mind. You should have reasonable confidence that your proposal will pass before risking deposit contributions. Part of the voting community members should probably be aware of the proposal and if they see the proposal, they probably have considered it already before the proposal goes live on-chain.

### 6. Deposit tokens and fund an active proposal

The deposit period lasts either 14 days or until the proposal deposit totals 10,000 CROs, whichever happens first. Prior to a governance proposal entering the voting period (ie. for the proposal to be voted upon), a minimum number of CROs are deposited. Once the decision for the proposal is made - either passed or failed, the deposit will be returned to the contributors. People have considered contributions amounts differently and anyone can contribute to this deposit, while please note that the contributed CROs are potentially at risk of being burned\*.

\*Deposits are burned when proposals: Expire - deposits will be burned if the deposit period ends before reaching the minimum 10,000 CROs

* Fail to reach quorum - deposits will be burned for proposals that do not reach the voting power level ie. more than 33.4% of all staked CROs must vote
* Being vetoed - deposits for proposals with 33.4% of voting power backing the 'no-with-veto' option are also burned

### 7. Vote for an active proposal

The voting period is currently 14 days, and the vote can be changed anytime before the period ends. During the voting period, participants may select a vote of either 'yes', 'no', 'abstain', or 'no-with-veto'. Only bonded CROs count towards the voting power for a governance proposal, so the liquid CROs will not count toward a vote.

### 8. Criteria to determine whether a governance proposal passes

* A minimum deposit - 10,000 CRO is required for the proposal to enter the voting period, and the deposit must be reached within 14 days (this is the deposit period)
* A minimum of 33.4% of the network's voting power is required to participate to make the proposal valid
* A majority (greater than 50%) of the participating voting power must back the 'yes' vote during the required voting period
* Less than 33.4% of participating voting power votes 'no-with-veto'

Please note that it is a WIP. The governance will further be explored down the line and some parts in this documentation are in development, so please use this document as a reference and seek feedback when using this information.

For more details about governance transactions, queries, and relevant network parameters, please visit the [gov section](https://docs.cronos-pos.org/cronos-pos-integration/blocks-and-transactions).


# Technical glossary

A | [B](#b) | [C](#c) | [D](#d) | E | [F](#f) | [G](#g) | [H](#h) | [I](#i) | [J](#j) | K | [L](#l) | [M](#m) | [N](#n) | O | [P](#p) | [Q](#q) | [R](#r) | [S](#s) | [T](#t) | [U](#u) | [V](#v) | W | X | Y | Z

***

#### B

**Block Explorer**

An application that allows a user to explore the different blocks on a blockchain. It has a record of all the transactions in each block and is often made public to increase blockchain visibility and transparency. Here are our explorers: [Cronos POS Chain Explorer](https://crypto.org/explorer/) and [Croeseid Testnet Explorer](https://crypto.org/explorer/croeseid4/).

**Bonded (staking state)**

The non-transferable amount of token staked to the corresponding address and can be unlocked by the `unbond` transaction.

**Byzantine Faults (Double signing)**

A validator is said to make a byzantine fault when they sign conflicting messages/blocks at the same height and round.

#### C

**Chain ID** A unique identifier for the blockchain. Different prefixes of the Chain ID are used to distinguish between *mainnet*, *devnet*, and *testnet*. For example, the Chain ID of our [testnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet) is `testnet-croeseid-4`.

**Chain-abci**

The **A**pplication **B**lock**C**hain **I**nterface connects Tendermint (for consensus operations) to the actual applications.

**Chain-maind**

chain-maind is the all-in-one command-line interface. It supports wallet management, funds transfer, and staking operations.

**Client-rpc**

The JSONRPC interface of the wallet client. It can be used to be integrated with different services and also power the Sample Wallet. It provides nearly the same set of operations as Client-cli does.

**Commission Max Change Rate**

The maximum daily increase of the validator’s commission. This parameter cannot be changed by the validator operator.

**Consensus**

The process of a group of entities to agree on a particular data value, and there are a variety of algorithms used for determining consensus.

[**CosmWasm**](https://cosmwasm.com/)

It is a new smart contracting platform built for the cosmos ecosystem. It is written as a module that can plug into the Cosmos SDK.

**Create-validator(Transaction Type: `create-validator`)**

The transaction for joining the network as a validator.

#### D

**Delegate (Transaction type: `delegate`)**

The transaction that delagate funds to a validator for staking purposes. Delegators should perform due diligence on validator candidates before delegating, as well as spreading their stake over multiple validators. It will also help keep the network decentralized.

**Delegator**

CRO holders who do not run validator operations themselves. Users can delegate CRO to validators and obtain a part of its revenue in exchange. Because they share revenue with their validators, delegators also share responsibility. Should a validator misbehave, each of its delegators will be partially slashed in proportion to their stake.

#### F

[**Faucet**](https://crypto.org/faucet)

Service carried out that dispenses funds in the form of free test token that can be used on a testnet.

**Full Node**

A full node is a node that participates in the network but will not help secure it. Full nodes can be used to store the entire state of a blockchain. There are two forms of state for Tendermint. First, blockchain state, this represents the blocks of a blockchain. Secondly, there is the Application state, this represents the state that transactions modify.

#### G

**Genesis**

The origin of a blockchain, also known as block 1. It can also be used to reference the initial state of the blockchain at origination.

**Governance**

The process of determining what changes to the network are permissible, such as modifications to code or movement of funds. The governance system in Cronos POS Chain is on-chain and revolves around stakeholder voting.

#### H

**Hard Fork**

A permanent diversion of a blockchain can occur quickly due to a high priority change in a consensus rule. This change makes all-new recordings (blocks) very different from the original blocks. Any computer that is not updated with the new technology, will find these new blocks appear invalid.

**HD Wallet**

The [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) compatible Hierarchical Deterministic (HD) wallet is a system of deriving keys from a single starting point known as a [seed](https://en.bitcoin.it/wiki/Seed_phrase). The seed can be presented in the form of a human-readable [mnemonic](#m) that can be used for easily backup and restore the wallet.

#### I

**Index**

A network structure meant to optimize the querying of information from across the blockchain by providing an efficient path to its storage source.

**Inflation**

The annualized rate at which CRO supply grows.

**Initial Commission Rate**

The commission rate on revenue charged to any delegator by the validator.

[**Inter-Blockchain Communication Protocol (IBC)**](https://ibcprotocol.org/)

IBC enables self-sovereign blockchains to connect and build strong network ecosystems, intending to end ‘network tribalism’.

#### J

**Jailing**

A validator is jailed when they make a byzantine fault. Jailing also happens to low uptime. When a validator gets jailed, they cannot perform any staking related operations relating to their account.

#### L

**Liveness Faults**

A validator is said to be non-live when they fail to sign at least `missed_block_threshold` blocks in the last `block_signing_window` blocks successfully.

#### M

**Maximum Commission**

The maximum commission rate this validator candidate can charge. This parameter cannot be changed by the validator operator.

**Mempool**

It is the node's collection of all the unconfirmed transactions it has already seen enabling it to decide whether or not to relay a new transaction. In short, the mempool is the node's holding area for all the pending transactions.

**Metadata**

It is used to summarize basic information about data which can make tracking and working with specific data easier. It is the data providing information about one or more aspects of the data.

**Minimum Self-bond Amount**

The minimum amount of CROs the validator candidate need to have bonded at all time. If the validator’s self-bonded stake falls below this limit, their entire staking pool will unbond. This parameter exists as a safeguard for delegators. Indeed, when a validator misbehaves, part of their total stake gets slashed. This included the validator’s self-delegated stake as well as their delegators’ stake. The minimum self-bond amount parameter guarantees to delegators that a validator will never fall below a certain amount of self-bonded stake. This parameter can only be increased by the validator operator.

**Mnemonic (of a wallet)**

The [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) compatible 24-word mnemonic phrase of the wallet. User can restore their wallet and associated addresses with this human-readable mnemonic.

**Multisig Addresses**

Multisig (multi-signature) is a digital signature that makes it possible for multiple unique signatures to sign documents as a group. It is the [threshold multi-signature](https://blockstream.com/2019/02/18/en-musig-a-new-multisignature-standard/) addresses that require multiple keys to authorize a transaction, which means multiple keys owned by separate entities are needed to make the transaction happen in an address.

#### N

**Network ID**

The last two hex characters of the Chain ID. Using our testnet Chain ID `testnet-croeseid-2` as an example, the network ID would be `2`.

**Non-fungible Token (NFT)**

NFT represents uniquely identifiable tokens with common use cases such as art, gaming, and asset ownership. NFTs are tokenized versions of digital or real-world assets. They function as verifiable proofs of authenticity and ownership within a blockchain network.

#### P

**Proposal**

A potential function call to be voted on in a referendum. Proposals modify the behavior of the Cronos POS Chain network, from minor parameter tuning up to replacing the runtime code.

**Proposer (of a block)**

Validator can become a proposer and commit new blocks in the blockchain according to a deterministic [proposer selection procedure](https://docs.tendermint.com/master/spec/consensus/proposer-selection.html). The probability of a validator being selected as the proposer for a round is proportional to their [voting power](#v).

**Protocol**

A system of rules that allows two or more entities of a communications system to transmit information. The protocol defines the rules, syntax, semantics and synchronization of communication and possible recovery methods.

#### Q

**Quorum**

Quorum is defined as the minimum percentage of voting power that needs to be cast on a proposal for the result to be valid.

#### R

**Runtime**

The state transition function of a blockchain. It defines a valid algorithm for determining the state of the next block given the previous state.

#### S

**Seed Node**

A seed node provides a node with a list of peers to which a node can connect. When starting a node you must provide at least one type of node to be able to connect to the desired network. By providing a seed node you will be able to populate your address quickly. A seed node will not be kept as a peer but will disconnect from your node after it has provided a list of peers.

**Sentry Node**

A sentry node is similar to a full node in almost every way. The difference is a sentry node will have one or more private peers. These peers may be validators or other full nodes in the network. A sentry node is meant to provide a layer of security for your validator, similar to how a firewall works with a computer.

**SGX**

The Intel® Software Guard Extensions (SGX) is a set of instructions that increases the security of application code and data. It ensures the integrity and confidentiality of the data by isolating them from the OS or other enclaves.

**Slashing**

The penalty imposed on validators' misbehavior such as byzantine faults or liveness faults, which resulted in losing some amount of their staked tokens. Below are the main faults that can result in slashing of funds for a validator and its delegators:

* Double signing: If someone reports on chain A that a validator signed two blocks at the same height.
* Unavailability: If a validator signature has not been included in the last X blocks, the validator will get slashed by a marginal amount proportional to X. If X is above a certain limit Y, then the validator will get unbonded.

**State (of a staking address)**&#x54;he general state of a staking address that includes *nonce*, *bounded/unbonded* amount, *validator metadata*, and *slashing related information* (if any).

#### T

**Tendermint**

The underneath byzantine fault tolerant protocol for performing distributed consensus.

**Tendermint KMS(tmkms)**

The [key management system](https://github.com/iqlusioninc/tmkms) for tendermint validators.

**Threshold**

The threshold is defined as the minimum proportion of Yes votes (excluding Abstain votes) for the proposal to be accepted.

**Transactions Per Second (TPS)**

The number of transactions that a blockchain network is capable of processing each second.

**Transfer (Transaction type:`transfer`)**

The transaction that transfers funds between transfer addresses.

**Transfer Address**

The address for payments/value transfers. Different prefixes of the transfer address are used to distinguish between *testnet*, *devnet*, and *mainnet*.

#### U

**Unbond (Transaction type: `unbond`)**

The transaction to unbond funds in the staking address. Note that funds will only be available for withdrawal after the unbonding period has passed.

**Unbonding Period**

The time duration of unbonding, which is the waiting period of the stake state's unbonded amount can be withdrawn.

**Unjail (Transaction type: `unjail`)**

The transaction to unjail a validator.

#### V

**Validator**

The role of validators is to run a full-node and participate in consensus by broadcasting votes which contain cryptographic signatures signed by their private key. Validators commit new blocks in the blockchain and receive revenue in exchange for their work. They must also participate in governance by voting on proposals. Only the top 100 validators with the highest stake are part of the Active validator set.

**Validator Keys**

The key pair for signing messages from the validator. The full key pair is located under the tendermint `priv_validator_key.json` folder after the initialization. In a production deployment, it is strongly advised not to keep the private key reside on the machine (see the [deployment notes](https://github.com/crypto-org-chain/chain-docs/blob/master/docs/getting-started/notes-on-production-deployment.md) and [recommendations](https://github.com/iqlusioninc/tmkms#hardware-security-modules-recommended) )

**Voting**

The process of stakeholders determining whether or not a referendum should pass.

**Voting Power**

The voting power is determined by the bonded amount in the validator's staking address. The probability of a validator being selected as the proposer for a round is proportional to their voting power.


# Tiered Staking

Tiered staking is a new staking mechanism introduced in Cronos POS Chain v7 (via the `x/tieredrewards` module). CRO holders can lock their stake for a defined exit commitment period in exchange for a higher APY on top of standard staking rewards.

There are two components to staking rewards under the new model:

<table><thead><tr><th width="200.984375">Reward Type</th><th>Source</th><th>Condition</th></tr></thead><tbody><tr><td><strong>Base rewards</strong></td><td>The inflation + transaction fee + reserve top up</td><td>Must be delegated to a bonded validator</td></tr><tr><td><strong>Bonus rewards</strong></td><td>Tier Rewards Pool</td><td>Must be in a tier position AND delegated to a bonded validator</td></tr></tbody></table>

The base reward floor (\~3% APY) is guaranteed by the module - if block fees fall below the target rate, the rewards pool automatically tops up the shortfall. Bonus rewards are a fixed APY on top of the base rate, determined by the tier you choose.

**Key things to know:**

* **Voting rights preserved** \
  Tier-locked positions count toward governance voting power for the full duration of the lock.
* **Slashing applies** \
  Locked positions are subject to standard validator slashing rules.
* **Rewards are not automatic**\
  Rewards do not arrive in your wallet automatically. They are paid out when settlement runs inside a transaction or via hooks. Besides `claim-tier-rewards`, several other scenarios can implicitly **claim outstanding rewards** too (see Claim base and bonus rewards).
* **Change validator freely**  \
  You can move your position to a different validator at any time without triggering exit.

***

### Tier Structure

| Tier | Exit Commitment | Bonus APY | Total APY (approx.) | Min. Lock |
| ---- | --------------- | --------- | ------------------- | --------- |
| Base | —               | —         | \~3%                | —         |
| 1    | 1 year          | +2%       | \~5%                | 100 CRO   |
| 2    | 2 years         | +4%       | \~7%                | 100 CRO   |
| 3    | 4 years         | +7%       | \~10%               | 100 CRO   |

{% hint style="info" %}
APY values are illustrative. Actual rates depend on governance decisions and available protocol revenue. All tier parameters are governance-adjustable.
{% endhint %}

{% hint style="info" %}
**For integration:** Always fetch live tier values from the chain. Parameters can change via governance. \
Use `GET /chainmain/tieredrewards/v1/tiers` or `chain-maind query tieredrewards tiers`. \
The on-chain `Tier` struct fields are: `Id`, `ExitDuration`, `BonusApy` (decimal, e.g. `0.02` = 2%), `MinLockAmount`, `CloseOnly`.
{% endhint %}

The **exit commitment** is the waiting period that begins when you *choose* to exit - not when you originally locked your stake. You continue earning full base and bonus rewards throughout this waiting period.

When governance sets a tier to **close-only** (`CloseOnly = true`), no new positions can be opened in that tier. Existing positions continue earning rewards and can exit normally. This is how a tier is retired over time.

***

### Testnet vs Mainnet Parameters

Testnet uses shorter durations and lower minimums so full lifecycle flows can be tested in minutes.

| Parameter                   | Mainnet | Testnet   |
| --------------------------- | ------- | --------- |
| Tier 1 exit commitment      | 1 year  | 1 minute  |
| Tier 2 exit commitment      | 2 years | 2 minutes |
| Tier 3 exit commitment      | 4 years | 4 minutes |
| Min lock amount (all tiers) | 100 CRO | 1 CRO     |

**Endpoints:**

<table><thead><tr><th width="105.81640625">Network</th><th width="402.29296875">REST</th><th>Chain ID</th></tr></thead><tbody><tr><td>Mainnet</td><td><code>https://rest.mainnet.crypto.org</code></td><td><code>crypto-org-chain-mainnet-1</code></td></tr><tr><td>Testnet</td><td><code>https://rest.testnet-croeseid-4.cronos-pos.org</code></td><td><code>testnet-croeseid-4</code></td></tr></tbody></table>

***

### Position Lifecycle

```
Enter a tier
  ├── Lock fresh CRO            → lock-tier
  └── Commit existing stake     → commit-delegation-to-tier
            │
            ▼
     Active position
     Earning base + bonus rewards
     [can: add tokens, redelegate, claim rewards]
            │
            ▼
     Trigger exit               → trigger-exit
     Exit commitment countdown begins
     Still earning full rewards
     [can: redelegate, claim rewards, cancel exit]
            │
     Exit commitment elapses — bonus stops
            │
            ├── Instant exit    → exit-tier-with-delegation
            │   Stake returns to your wallet on the same validator. No unbonding wait.
            │   Partial exits supported.
            │
            └── Standard exit   → tier-undelegate
                Wait 28 days (unbonding period)
                                → withdraw-from-tier
                Tokens available for transfer
```

{% hint style="info" %}
You can cancel exit at any time using `clear-position`. The exit timer resets and bonus rewards resume immediately.
{% endhint %}

***

### Transaction Commands

Replace `[YOUR_KEY]` and `[CHAIN_ID]` with your key name and the appropriate chain ID.

**Common flags:**

```bash
--from [YOUR_KEY]        # Signing key
--chain-id [CHAIN_ID]    # e.g. crypto-org-chain-mainnet-1 or testnet-croeseid-4
--gas auto               # Recommended: auto-estimate gas
--fees [amount]basecro   # e.g. 20000basecro
```

#### Entering a Tier

**Option A - Lock fresh CRO into a tier:**

```bash
chain-maind tx tieredrewards lock-tier [tier-id] [amount] [validator-address] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

| Argument            | Description                                           |
| ------------------- | ----------------------------------------------------- |
| `tier-id`           | `1`, `2`, or `3`                                      |
| `amount`            | In basecro (1 CRO = 100,000,000 basecro)              |
| `validator-address` | Validator operator address (starts with `crocncl...`) |

Optional flag: `--trigger-exit-immediately` - starts the exit countdown immediately at lock time.

Example:

```bash
chain-maind tx tieredrewards lock-tier 1 10000000000basecro crocncl1abc...xyz \
  --from mykey --chain-id crypto-org-chain-mainnet-1 --gas auto
```

**Option B - Lock an existing delegation (no unbonding required):**

```bash
chain-maind tx tieredrewards commit-delegation-to-tier [validator-address] [amount] [tier-id] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

* Converts your existing stake on that validator into a tier position in one step
* Partial commits are supported — you can commit a portion of your delegation
* Optional flag: `--trigger-exit-immediately`

Example:

```bash
chain-maind tx tieredrewards commit-delegation-to-tier crocncl1abc...xyz 10000000000basecro 2 \
  --from mykey --chain-id crypto-org-chain-mainnet-1 --gas auto
```

#### Managing a Position

Query the positions by owner:

```bash
chain-maind query tieredrewards positions-by-owner [THE_ADDRESS_OF_YOUR_KEY] 
```

* here is [the explanation of fields in response](#key-fields-in-position-responses)

Add more CRO to an existing position:

```bash
chain-maind tx tieredrewards add-to-tier-position [position-id] [amount] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

{% hint style="warning" %}
Cannot add tokens while an exit is in progress. Cancel the exit with `clear-position` first.
{% endhint %}

Move your position (redelegate) to a different validator (does not trigger exit):

```bash
chain-maind tx tieredrewards tier-redelegate [position-id] [dst-validator-address] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

Claim base and bonus rewards (explicit):

```bash
chain-maind tx tieredrewards claim-tier-rewards [position-id ...] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

Multiple position IDs can be claimed in a single transaction (space-separated):

```bash
chain-maind tx tieredrewards claim-tier-rewards 313 314 315 \
  --from mykey --chain-id crypto-org-chain-mainnet-1 --gas auto
```

**Other user transactions that settle rewards first**

The keeper runs the same base + bonus settlement **before** the main execution of these messages: `tier-undelegate`, `tier-redelegate`, `add-to-tier-position`, `exit-tier-with-delegation`, and `clear-position`.

**Slashing a position**

When the staking module slashes an **active redelegation** that is mapped to your position, any **outstanding rewards** on the position will also be claimed.

{% hint style="warning" %}
Rewards are **not** distributed automatically. `claim-tier-rewards` is the dedicated explicit claim, and **other messages and hook settlements** may initiate claims too.
{% endhint %}

#### Exiting a Tier

**Step 1 - Trigger exit (starts the commitment countdown):**

```bash
chain-maind tx tieredrewards trigger-exit [position-id] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

Your position continues earning full base and bonus rewards during the commitment period.

**Cancel exit at any time:**

```bash
chain-maind tx tieredrewards clear-position [position-id] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

**Step 2 - After exit commitment elapses, choose one route:**

**Option A - Instant exit (no unbonding):**

```bash
chain-maind tx tieredrewards exit-tier-with-delegation [position-id] [amount] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

Your stake transfers back to your wallet on the same validator immediately. Partial exits are supported that the remaining position must still meet the tier minimum (100 CRO on mainnet).

**Option B - Standard unbonding (28-day wait):**

```bash
# Step 1: Start unbonding
chain-maind tx tieredrewards tier-undelegate [position-id] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto

# Step 2: After 28 days, withdraw tokens
chain-maind tx tieredrewards withdraw-from-tier [position-id] \
  --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

**Option C - Renew your commitment with `clearPosition`**&#x20;

After exit commitment elapses, you can use clear-position to cancel the exit instead of withdrawing. This resets the exit timer and resumes bonus rewards, effectively renewing your commitment without needing to re-lock.&#x20;

```shellscript
 chain-maind tx tieredrewards clear-position [position-id] \                                
    --from [YOUR_KEY] --chain-id [CHAIN_ID] --gas auto
```

### Query Commands

```bash
# List all available tiers and their parameters
chain-maind query tieredrewards tiers

# View all positions for an address
chain-maind query tieredrewards positions-by-owner [address]

# View a specific position by ID
chain-maind query tieredrewards position [position-id]

# Estimate pending base + bonus rewards for a position
chain-maind query tieredrewards estimate-position-rewards [position-id]

# Check the rewards pool balance
chain-maind query tieredrewards rewards-pool-balance

# Check module parameters (TargetBaseRewardsRate)
chain-maind query tieredrewards params

# Check governance voting power from tier positions
chain-maind query tieredrewards voting-power [address]

# Check validator reward data
chain-maind query tieredrewards validator-data [validator-address]

# Query inflation parameters (max supply, decay rate)
chain-maind query inflation params
```

***

### REST API Reference

No authentication required. Standard HTTP GET requests.

| Network | Base URL                                         |
| ------- | ------------------------------------------------ |
| Mainnet | `https://rest.mainnet.crypto.org`                |
| Testnet | `https://rest.testnet-croeseid-4.cronos-pos.org` |

#### x/tieredrewards Endpoints

<table><thead><tr><th width="528.37109375">Endpoint</th><th>Description</th></tr></thead><tbody><tr><td><code>GET /chainmain/tieredrewards/v1/tiers</code></td><td>All tier definitions</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/params</code></td><td>Module parameters</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/position/{position_id}</code></td><td>Single position by ID</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/positions/{owner_address}</code></td><td>All positions for an owner</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/positions</code></td><td>All positions (paginated)</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/estimate_rewards/{position_id}</code></td><td>Estimated pending rewards</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/rewards_pool_balances</code></td><td>Rewards pool balance</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/voting_power/{owner}</code></td><td>Voting power by owner</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/total_delegated_voting_power</code></td><td>Total voting power</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/validator_data/{validator}</code></td><td>Validator reward data</td></tr><tr><td><code>GET /chainmain/tieredrewards/v1/position_mappings/{position_id}</code></td><td>Unbonding/redelegation mappings</td></tr></tbody></table>

#### x/inflation Endpoints

| Endpoint                             | Description                                                        |
| ------------------------------------ | ------------------------------------------------------------------ |
| `GET /chainmain/inflation/v1/params` | Inflation parameters (max\_supply, decay\_rate, burned\_addresses) |

#### Pagination

List endpoints that support pagination via query parameters:

```
?pagination.limit=50&pagination.offset=0
```

***

### Integration

Tier positions are queryable via standard public REST endpoints.

#### Recommended queries for balance and position tracking

```bash
# All positions for a user
GET https://rest.mainnet.crypto.org/chainmain/tieredrewards/v1/positions/{owner_address}

# Estimated current rewards for a position
GET https://rest.mainnet.crypto.org/chainmain/tieredrewards/v1/estimate_rewards/{position_id}

# Current tier definitions
GET https://rest.mainnet.crypto.org/chainmain/tieredrewards/v1/tiers
```

#### Key fields in position responses

<table><thead><tr><th width="283.0234375">Field</th><th>Notes</th></tr></thead><tbody><tr><td><code>tier_id</code></td><td>Which tier: 1, 2, or 3</td></tr><tr><td><code>amount</code></td><td>Amount of tokens stored in the position</td></tr><tr><td><code>delegated_shares</code></td><td>Shares held by the tier module on behalf of this position</td></tr><tr><td><code>validator</code></td><td>Current validator operator address</td></tr><tr><td><code>exit_triggered_at</code></td><td>Zero value = not exiting</td></tr><tr><td><code>exit_unlock_at</code></td><td>When exit commitment elapses and tokens become withdrawable</td></tr><tr><td><code>last_bonus_accrual</code></td><td>Timestamp of last bonus settlement</td></tr></tbody></table>

Partners signing and submitting transactions use standard Cosmos SDK transaction signing - the same flow as regular staking transactions. No new signing logic is required.

***

### Key Rules and Gotchas

<table><thead><tr><th width="279.046875">Topic</th><th>Rule</th></tr></thead><tbody><tr><td>Rewards settlement</td><td>Rewards do not distribute automatically. Users either claim directly <code>claim-tier-rewards</code> or through other messages that will initiate an claim.</td></tr><tr><td>Exit commitment timing</td><td>The commitment period starts when you <em>trigger</em> exit, not when you entered the tier.</td></tr><tr><td>Bonus stops at exit unlock</td><td>Bonus stops accruing once the exit commitment elapses. Base rewards continue.</td></tr><tr><td>No auto-rollover</td><td>When exit commitment elapses, the position stays active until the user submits an exit transaction.</td></tr><tr><td>Add to position</td><td>Cannot add tokens while an exit is in progress. Cancel with <code>clear-position</code> first.</td></tr><tr><td>Redelegate freely</td><td>Moving to a different validator does not trigger exit or affect tier status.</td></tr><tr><td>Partial exits</td><td>Instant exit supports partial amounts. Remaining balance must still meet the tier minimum.</td></tr><tr><td>Pool can be empty</td><td>If the rewards pool has insufficient balance, the claim transaction fails. Retry after replenishment.</td></tr><tr><td>Slashing applies</td><td>Tier-locked positions are subject to standard validator slashing rules.</td></tr><tr><td>Voting rights retained</td><td>Tier-locked positions count toward governance voting power throughout the lock.</td></tr><tr><td>Validator jailed or removed</td><td>Position stays valid. User can redelegate to another validator without triggering exit.</td></tr></tbody></table>

***

### Quick Reference

<table><thead><tr><th width="228.08984375">Action</th><th>Command</th></tr></thead><tbody><tr><td>Lock fresh CRO</td><td><code>tx tieredrewards lock-tier [tier-id] [amount] [validator]</code></td></tr><tr><td>Commit existing stake</td><td><code>tx tieredrewards commit-delegation-to-tier [validator] [amount] [tier-id]</code></td></tr><tr><td>Add to position</td><td><code>tx tieredrewards add-to-tier-position [position-id] [amount]</code></td></tr><tr><td>Redelegate</td><td><code>tx tieredrewards tier-redelegate [position-id] [dst-validator]</code></td></tr><tr><td>Claim rewards</td><td><code>tx tieredrewards claim-tier-rewards [position-id ...]</code></td></tr><tr><td>Trigger exit</td><td><code>tx tieredrewards trigger-exit [position-id]</code></td></tr><tr><td>Cancel exit</td><td><code>tx tieredrewards clear-position [position-id]</code></td></tr><tr><td>Instant exit</td><td><code>tx tieredrewards exit-tier-with-delegation [position-id] [amount]</code></td></tr><tr><td>Start unbonding</td><td><code>tx tieredrewards tier-undelegate [position-id]</code></td></tr><tr><td>Withdraw after unbonding</td><td><code>tx tieredrewards withdraw-from-tier [position-id]</code></td></tr><tr><td>View my positions</td><td><code>query tieredrewards positions-by-owner [address]</code></td></tr><tr><td>Estimate rewards</td><td><code>query tieredrewards estimate-position-rewards [position-id]</code></td></tr><tr><td>View tiers</td><td><code>query tieredrewards tiers</code></td></tr><tr><td>Inflation params</td><td><code>query inflation params</code></td></tr></tbody></table>


# Tokenomics

Cronos POS Chain uses a sustainable staking model designed to reward long-term holders while keeping inflation under control.

***

### How CRO Emissions Work

New CRO tokens are minted each block to reward stakers. The emission rate starts at 1% annually and decays by 6.8% each month - meaning early stakers benefit from higher rewards, while total supply stays well under the 100 billion CRO hard cap.

#### Inflation Decay Schedule

<table><thead><tr><th>Time from v7.0.0 Upgrade</th><th width="202.50390625">Inflation Rate</th><th>Approx. Annual CRO Minted</th></tr></thead><tbody><tr><td>Month 0 (launch)</td><td>1.000%</td><td>~985M CRO/yr</td></tr><tr><td>Month 6</td><td>0.656%</td><td>~646M CRO/yr</td></tr><tr><td>Month 12 (Year 1)</td><td>0.431%</td><td>~427M CRO/yr</td></tr><tr><td>Month 24 (Year 2)</td><td>0.186%</td><td>~184M CRO/yr</td></tr><tr><td>Month 36 (Year 3)</td><td>0.080%</td><td>~79M CRO/yr</td></tr><tr><td>Month 48 (Year 4)</td><td>0.035%</td><td>~34M CRO/yr</td></tr><tr><td>Month 60 (Year 5)</td><td>0.015%</td><td>~15M CRO/yr</td></tr></tbody></table>

*Illustrative estimates based on \~98.5B total supply at launch.*

#### Supply Cap

The chain enforces a hard cap of 100 billion CRO. If circulating supply ever reaches this cap, no further tokens are minted. Balances held at designated burn addresses are excluded from the circulating supply calculation.

***

### Base Staking Rewards (\~3% APY)

All CRO delegated to a bonded validator earns base staking rewards. The protocol maintains a **\~3% APY floor**. If block fees are insufficient to meet this target, the Tier Rewards Pool automatically tops up the shortfall each block.

**Key points:**

* No action required - simply delegate CRO to any active validator
* Base rewards are distributed every block
* Validator commission applies to base rewards
* The 3% floor is a governance-adjustable parameter (`TargetBaseRewardsRate`)
* The Rewards Pool balance is publicly queryable on-chain at any time

This means your staked CRO earns a stable, predictable return regardless of network activity levels.

***

### Tiered Staking (Bonus APY)

For stakers who want higher returns, tiered staking offers bonus APY on top of the base rate in exchange for an exit commitment period.

#### Tier Structure

| Tier | Exit Commitment | Bonus APY | Total APY (approx.) | Min. Lock |
| ---- | --------------- | --------- | ------------------- | --------- |
| Base | —               | —         | \~3%                | —         |
| 1    | 1 year          | +2%       | \~5%                | 100 CRO   |
| 2    | 2 years         | +4%       | \~7%                | 100 CRO   |
| 3    | 4 years         | +7%       | \~10%               | 100 CRO   |

*APY values are illustrative. Actual rates depend on governance decisions and available protocol revenue. All tier parameters are governance-adjustable.*

#### How It Works

1. **Choose a tier:** select your exit commitment period and delegate to any validator
2. **Earn rewards:** receive base + bonus APY while your position is active
3. **Exit when ready**: trigger exit at any time; the commitment countdown starts then (not when you entered)
4. **Keep earning during exit:** you continue earning full base + bonus rewards throughout the exit commitment period
5. **Choose your exit route**: after the commitment elapses, either keep CRO staked at base rate (instant exit) or unbond for liquid tokens (28-day wait)

#### Key Things to Know

* **Opt-in:** tiered staking is entirely optional. Regular staking continues as before.
* **Any validator:** you choose which validator to delegate to, and can redelegate anytime without triggering exit.&#x20;
* **Voting rights preserved**: tier-locked positions count toward governance voting power.
* **Slashing applies**: locked positions are subject to standard validator slashing rules.
* **Rewards are not automatic:** you need to claim rewards by submitting a transaction.
* **Cancel anytime:** you can cancel an exit and resume earning bonus rewards immediately.
* **Trigger exit immediately**: when entering a tier, you have the option to start the exit countdown right away.

#### How the Rewards Pool Is Funded

The Tier Rewards Pool backs both base and bonus rewards:

<table><thead><tr><th width="280.40625">Phase</th><th>Funding Source</th></tr></thead><tbody><tr><td>Phase 1 (launch)</td><td>CRO reserve</td></tr><tr><td>Phase 2 (transition)</td><td>Reserve + protocol revenue</td></tr><tr><td>Phase 3 (target state)</td><td>Protocol revenue</td></tr></tbody></table>

The pool balance is publicly queryable on-chain. &#x20;

***

### Staking Guide

#### Option 1: Base Staking (no lock)

Simply delegate CRO to any active validator using your wallet or CLI. You earn the base \~3% APY with no commitment period. You can undelegate at any time (subject to the standard 28-day unbonding period).

#### Option 2: Tiered Staking (higher APY with exit commitment)

To earn bonus APY, enter a tier by either:

* **Locking fresh CRO** into a tier position, or
* **Converting an existing delegation** into a tier position (no unbonding required)

You choose your tier, your validator, and when (or if) you trigger exit.

For full technical details, CLI commands, and REST API reference, see the Tiered Staking page.

***

### Summary

|                  | Base Staking     | Tiered Staking                                |
| ---------------- | ---------------- | --------------------------------------------- |
| APY              | \~3% (floor)     | \~5% / \~7% / \~10%                           |
| Lock required    | No               | Yes (exit commitment)                         |
| Validator choice | Any              | Any                                           |
| Voting rights    | Yes              | Yes                                           |
| Claim rewards    | Manual           | Manual                                        |
| Exit             | 28-day unbonding | Exit commitment + instant or 28-day unbonding |

***

### Useful Links

* [Tiered Staking](/cronos-pos-chain-protocol/tiered-staking)&#x20;
* Rewards Pool Balance: `GET /chainmain/tieredrewards/v1/rewards_pool_balances`
* Inflation Parameters: `GET /chainmain/inflation/v1/params`
* Tier Definitions: `GET /chainmain/tieredrewards/v1/tiers`


# Modules

## Overview

Cronos POS Chain utilizes [Cosmos SDK](https://cosmos.network/sdk) and the [Tendermint](https://tendermint.com/) Core consensus engine underneath. Specifically, the Cosmos SDK is a framework that facilitates the development of secure state-machines on top of Tendermint. In particular, we utilize different SDK modules to facilitate the special features of the Cronos POS Chain.

In this documentation, we will be focusing on some of the important modules we used, for example:

* [Authz](#authz) - Facilitates authorizations granted to one account to perform actions on behalf of another account;
* [Bank](#bank) - Token transfer functionalities and query support for the total supply of all assets;
* [Distribution](#distribution) - Fee distribution, and staking rewards to the validators and delegator;
* [Governance](#gov) - On-chain proposals and voting;
* [Mint](#mint) - Creation of new units of staking token;
* [Nft](#nft) - Non-Fungible Token management;
* [Slashing](#slashing) - Validator punishment mechanisms;
* [Staking](#staking) - Proof-of-Stake layer for public blockchains;
* [Supply](#supply) - Retrieve total and liquid supply;
* [Inflation](/cronos-pos-chain-protocol/module_overview/module_inflation) - Manage the total supply cap and inflation decay;
* [Tier Reward](/cronos-pos-chain-protocol/module_overview/module_tieredrewards) - Manage tiered staking positions with bonus APY on top of base staking rewards.


# module\_supply

#### `supply` module

#### Introduction

The `supply` module is responsible for retrieve total and liquid supply.

#### Queries

**`query supply liquid` - Check the total supply of coins of the chain**

We can also use `query` command of the `supply` module to check the current total supply:

```json
$ chain-maind query supply total
    {
    "supply": [
        {
        "denom": "basecro",
        "amount": "[total_supply_amount]"
        }
    ]
    }
```

**`query supply liquid` - Check the liquid supply of coins of the chain**

We can also query the liquid supply, which is the total supply bonded subtracted by the non-circulating supply such as bonded amount, unvested amounts, and uncollected reward etc.

```json
$ chain-maind query supply total
    {
    "supply": [
        {
        "denom": "basecro",
        "amount": "[total_circulating_amount]"
        }
    ]
    }
```


# module\_slashing

#### `slashing` module

#### Introduction

Validators are responsible for signing or proposing block at each consensus round. A penalty should be imposed on validators' misbehavior to reinforce this.

Specifically, `slashing` functionality that aims to dis-incentivize network-observable actions, such as faulty validations. The penalties may include losing some amount of their stake, losing their ability to perform the network functionality for a period of time, collect rewards etc.

#### Overview

**Network parameters**

Below are all the network parameters used to configure the behavior of validator punishments. Details of all these parameters and their effect on behavior of validator punishments is discussed later in this document.

* `signed_blocks_window`: Number of blocks for which the liveness is calculated for uptime tracking;
* `min_signed_per_window`: Maximum percentage of blocks with faulty/missed validations allowed for an account in last; `signed_blocks_window` blocks before it gets deactivated;
* `downtime_jail_duration`: Duration for [jailing](#jailing);
* `slash_fraction_double_sign`: Percentage of funds being slashed when validator makes a byzantine fault; and
* `slash_fraction_downtime`: Percentage of funds being slashed when a validator is non-live.

**Slashing mechanism**

Punishments for a validator are triggered when they either make a *byzantine fault* or become *non-live*:

* Liveness Faults (Low availability)

  A validator is said to be **non-live** when they fail to sign at least `min_signed_per_window` blocks (in percentage) in the last `signed_blocks_window` blocks successfully. `signed_blocks_window` and `min_signed_per_window` are network parameters and can be configured during genesis and can be updated during runtime by the governance module.

{% hint style="info" %}
For example, if `block_signing_window` is `2000` blocks and `min_signed_per_window` is `0.5`, a validator will be marked as **non-live** and jailed if they fail to successfully sign at least `2000*0.5=1000` blocks in last `2000` blocks.
{% endhint %}

* Byzantine Faults

  A validator is said to make a byzantine fault when they sign conflicting messages/blocks at the same height and round. Tendermint has mechanisms to publish evidence of validators that signed conflicting votes so they can be punished by the slashing module. For example:

  * Validator who votes for two different blocks within a single round (*"Equivocation validator"*/ *"Double signing"*);
  * Validator who signs commit messages for arbitrary application state ( *"Lunatic validator"*).

**Remark**: The evidence of a set of validators attempting to mislead a light client can also be detected and captured. However, even the [Amnesia attack](https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-056-light-client-amnesia-attacks.md#amnesia-attack) can be detected, punishment can not be applied at this stage, as we can not deduce the malicious validators.

{% hint style="info" %}
Implementation note: Tendermint passes `Evidence` of a byzantine validator in `BeginBlock` request. Before jailing any account due to byzantine fault, that evidence should be verified. Also, it should be checked that evidence provided by tendermint is not older than `max_age` in tendermint.
{% endhint %}

#### Inactivity Slashing

It is important that the validators maintain excellent availability and network connectivity to perform their tasks. A penalty should be imposed on validators' misbehavior to reinforce this.

When a validator fails to successfully sign `missed_block_threshold` blocks in last `block_signing_window` blocks, it is immediately jailed and punished by deducting funds from their bonded and unbonded amount and removing them from active validator set. The funds to be deducted are calculated based on `slash_fraction_downtime`. Kindly refer to this [link](https://docs.cosmos.network/v0.40/modules/slashing/04_begin_block.html) on the logic of the liveness tracking.

#### Jailing

A validator is jailed when they make liveness or Byzantine fault, when a validator is jailed, it will no longer be considered as an active validator until they are un-jailed. Furthermore, it cannot be un-jailed before `downtime_jail_duration`. This `downtime_jail_duration` is a network parameter which can be configured during genesis.

{% hint style="info" %}
Important: When a validator is jailed because of a byzantine fault, their validator public key is added to a list of permanently banned validators and cannot re-join the network as a validator with the same public key, see [staking tombstone](https://docs.cosmos.network/master/modules/slashing/07_tombstone.html)&#x20;
{% endhint %}

**Un-jailing**

When a jailed validator wishes to resume normal operations (after `downtime_jail_duration` has passed), they can create an `unjail` transaction which marks them as un-jailed. Validator will then rejoin the validator set once it has been successful un-jailed.

#### Slashing for Byzantine Fault

When there is byzantine fault detected, they are immediately slashed other than jailed. The funds to be deducted are calculated based on `slash_fraction_double_sign`. Furthermore, validator who commit this double-signing fault will also be put into the "tombstone state", which means it will be blacklisted and jailed forever.

#### Transactions and Queries

#### Transactions

**`tx slashing unjail` - Unjailing a validator**

Validator could be punished and jailed due to network misbehaviour, for example if we check the validator set:

```bash
$ chain-maind query staking validators -o json | jq
................................
    "operator_address": "crocncl18prgwae59zdqpwye6t4xftmq3d87vl0h0rj0qq",
    "consensus_pubkey": "crocnclconspub1zcjduepqg0yml2l63qjnhr2cuw4tvprr72tle0twf3zymrxllmr0sj9uv3tqmpcrhs",
    "jailed": true,
    "status": 1,
................................
```

After the jailing period has passed, one can broadcast a `unjail` transaction to unjail the validator and resume its normal operations by

```bash
$ chain-maind tx slashing unjail --from node1 --chain-id cro-test
  {"body":{"messages":[{"@type":"/cosmos.slashing.v1beta1.MsgUnjail"...}]}
  confirm transaction before signing and broadcasting [y/N]: y
```

#### Queries

**`query slashing params` - Query the current slashing parameters**

We can query the current slashing parameters by

```json
$ chain-maind query slashing params --output json | jq

  {
    "signed_blocks_window": "2000",
    "min_signed_per_window": "0.500000000000000000",
    "downtime_jail_duration": "3600s",
    "slash_fraction_double_sign": "0.050000000000000000",
    "slash_fraction_downtime": "0.001000000000000000"
  }
```

#### Appendix

**`slashing` module: Network Parameters and configuration**

The following tables show overall effects on different configurations of the slashing related network parameters:

|                      | `signed_blocks_window`                      | `min_signed_per_window`         | `downtime_jail_duration`           |
| -------------------- | ------------------------------------------- | ------------------------------- | ---------------------------------- |
| Type                 | string (int64)                              | string (dec)                    | string (int64)                     |
| Higher               | Larger window for calculating the downtime  | Higher availability is required | Longer jailing duration            |
| Lower                | Smaller window for calculating the downtime | Lower availability is required  | Longer jailing duration            |
| Constraints          | Value has to be a positive integer          | Value has to be positive        | Value has to be a positive integer |
| Sample configuration | `2000` (2000 blocks)                        | `0.5` (50%)                     | `3600s` (1 hour)                   |

***

|                      | `slash_fraction_double_sign`         | `slash_fraction_downtime`            |
| -------------------- | ------------------------------------ | ------------------------------------ |
| Type                 | string (dec)                         | string (dec)                         |
| Higher               | Heavier penalty on byzantine faults  | Heavier penalty on liveness faults   |
| Lower                | Lighter penalty on byzantine faults  | Lighter penalty on liveness faults   |
| Constraints          | Value has to be less or equal to `1` | Value has to be less or equal to `1` |
| Sample configuration | `0.001` (0.1%)                       | `0.05` (5%)                          |


# module\_authz

#### `authz` module

#### Introduction

The `authz` module facilitates granting authorizations to perform actions, such as spending tokens, on behalf of one account to other accounts.

#### Overview

An *authorization* is an allowance to execute an action by the *grantee* on behalf of the authorization *granter*, e.g. to send tokens to an account from the *granter*, or to delegate tokens to a validator from the *granter*. There are 3 major built-in authorization types:

* `SendAuthorization`
* `StakeAuthorization`
* `GenericAuthorization`

***

**SendAuthorization**

`SendAuthorization` implements an authorization to the *grantee* to perform, on behalf of the *granter*, a basic `send` action defined in the [bank](/cronos-pos-chain-protocol/module_overview/module_bank) module. It takes a `SpendLimit` that is greater than 0 to specify the maximum amount of tokens the *grantee* can spend with. The `SpendLimit` keeps track of how many tokens allowed are left in the authorization and is updated as the tokens are spent until the `SendAuthorization` gets cleared when the `SpendLimit`reaches 0. Sending an amount greater than the `SpendLimit` is not allowed.

***

**StakeAuthorization**

`StakeAuthorization` implements an authorization to the *grantee* to perform, on behalf of the *granter*, `delegate`, `unbond` (undelegate), or `redelegate` actions defined in the [staking](/cronos-pos-chain-protocol/module_overview/module_staking) module. Each of the above actions needs to be authorized separately, with which either an `AllowList` or a `DenyList` must be specified to restrict which validators to or not to perform a staking action with. Optionally, `MaxTokens` can also be specified in the authorization that keeps track of a limit to the amount of tokens to be delegated/undelegated/redelegated. If left unspecified, the amount is unlimited. Similar to the `SpendLimit` in [`SendAuthorization`](#SendAuthorization), `MaxTokens` gets updated after each valid authorized staking action. An authorized staking action that uses tokens beyond the `MaxTokens` is not allowed.

***

**GenericAuthorization**

`GenericAuthorization` implements an authorization to the *grantee* to perform, on behalf of the *granter*, a generic action. In other words, `GenericAuthorization` facilitates an arbitrary action grant, where a `MsgTypeURL` must be specified to correspond to an action defined in the [modules](/cronos-pos-chain-protocol/module_overview). A `GenericAuthorization` is currently unrestricted beyond the `MsgTypeURL`. For example, when granting someone to send tokens, the `SpendLimit` in [`SendAuthorization`](#SendAuthorization) will not be enforced. Therefore, a [`SendAuthorization`](#SendAuthorization) without a spend limit may in fact be implemented as a `GenericAuthorization` with the `MsgTypeURL` been set to `/cosmos.bank.v1beta1.MsgSend`. The following are some common `MsgTypeURLs`:

* Send: `/cosmos.bank.v1beta1.MsgSend`
* Delegate: `/cosmos.staking.v1beta1.MsgDelegate`
* Unbond/Undelegate: `/cosmos.staking.v1beta1.MsgUndelegate`
* Redelegate: `/cosmos.staking.v1beta1.MsgBeginRedelegate`
* Withdraw delegator reward: `/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward`
* Mint NFT: `/chainmain.nft.v1.MsgMintNFT`
* Burn NFT: `/chainmain.nft.v1.MsgBurnNFT`
* Transfer NFT: `/chainmain.nft.v1.MsgTransferNFT`
* Edit NFT: `/chainmain.nft.v1.MsgEditNFT`

***

{% hint style="info" %}
NOTE **Expiration of Grant**: The *granter* can optionally set an `Expiration` time in form of a UNIX Timestamp for any authorization grant. The `Expiration` time should be later than current UNIX Timestamp and is defaulted to be one year from the current time if unspecified. An authorization may be executed only if the grant has not yet expired. Setting an `Expiration` time for an authorization grant is generally encouraged.
{% endhint %}

#### Transactions and Queries

#### Transactions

In general, a *granter* can `grant` an authorization to a *grantee* or `revoke` an existing authorization already granted to the *grantee*. A *grantee* can `execute` an authorization already granted by the *granter*.

#### `grant`:

An authorization starts from the *granter* granting the *grantee*.

***

* under `SendAuthorization`

**`tx authz grant [grantee_address] send --spend-limit [amount] --from [granter_address]`- Grant to send with a spend limit**

{% hint style="info" %}
Example: Grant to send with a spend limit and an expiration time The *granter* may grant a *grantee* to send tokens on the *granter*'s behalf, where a spend limit should be provided through the `--spend-limit` flag. For example, *granter* may authorize *grantee* to spend up to `10 CRO`, and sets an expiration time at the end of the year 2022 (i.e. `1672531199` in Unix timestamp) by running

```bash
$ chain-maind tx authz grant <grantee_address> send --spend-limit 10cro --from <granter_address> --expiration 1672531199 --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/cosmos.authz.v1beta1.MsgGrant",
    "grant": {
        "authorization": {
            "@type": "/cosmos.bank.v1beta1.SendAuthorization",
            "spend_limit": [
                {
                    "amount": "1000000000",
                    "denom": "basecro"
                }
            ]
        },
        "expiration": "2022-12-31T23:59:59Z"
    },
    "grantee": "cro1j...",
    "granter": "cro18..."
}
```

{% endhint %}

***

* under `StakeAuthorization`

**`tx authz grant [grantee_address] delegate --spend-limit [amount] --allowed-validators [list_of_allowed_validators_separated_by_,] --from [granter_address]`- Grant to delegate to validators on a specified list**

{% hint style="info" %}
Example: Grant to delegate to validators on a specified list with a spend limit The *granter* may grant a *grantee* to delegate tokens on the *granter*'s behalf, where either a list of allowed validators (through the `--allowed-validators` flag) or denied validators (through the `--deny-validators` flag) should be provided. For example, *granter* may authorize *grantee* to delegate on the *granter*'s behalf up to `10 CRO` towards a specified list of validators by running

```bash
$ chain-maind tx authz grant <grantee_address> delegate --spend-limit 10cro --allowed-validators <list_of_allowed_validators_separated_by_,> --from <granter_address> --expiration <expiration_time> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/cosmos.authz.v1beta1.MsgGrant",
    "grant": {
        "authorization": {
            "@type": "/cosmos.staking.v1beta1.StakeAuthorization",
            "allow_list": {
                "address": [
                    "crocn..."
                ]
            },
            "authorization_type": "AUTHORIZATION_TYPE_REDELEGATE",
            "max_tokens": {
                "amount": "1000000000",
                "denom": "basecro"
            }
        },
        "expiration": "2022-12-31T23:59:59Z"
    },
    "grantee": "cro1j...",
    "granter": "cro18..."
}
```

{% endhint %}

On the contrary, the *granter* may choose to exclude a list of validators the *grantee* can delegate to on the *granter*'s behalf:

**`tx authz grant [grantee_address] delegate --spend-limit [amount] --deny-validators [list_of_deny_validators_separated_by_,] --from [granter_address]`- Grant to delegate to validators excluding a specified list**

Granting to redelegate or undelegate (unbond) is very similar by just replacing the `delegate` with `redelegate` or `unbond`:

**`tx authz grant [grantee_address] redelegate --spend-limit [amount] --allowed-validators [list_of_allowed_validators_separated_by_,] --from [granter_address]`- Grant to redelegate to validators on a specified list**

**`tx authz grant [grantee_address] unbond --spend-limit [amount] --allowed-validators [list_of_allowed_validators_separated_by_,] --from [granter_address]`- Grant to unbond from validators on a specified list**

{% hint style="info" %}
NOTE **Spend Limit for `StakeAuthorization`**: A spend limit for a grant to delegate/redelegate/unbond is not necessary but generally recommended.&#x20;
{% endhint %}

***

* under `GenericAuthorization`

Other than the above grants under `SendAuthorization` or `StakeAuthorization`, one may authorize other grants through `GenericAuthorization`:

**`tx authz grant [grantee_address] generic --msg-type [msg_type_url] --from [granter_address]`- Grant for generic authorization with a specified Message Type URL**

{% hint style="info" %}
Example: Grant to withdraw delegator reward

```bash
$ chain-maind tx authz grant <grantee_address> generic --msg-type /cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward --from <granter_address> --expiration <expiration_time> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/cosmos.authz.v1beta1.MsgGrant",
    "grant": {
        "authorization": {
            "@type": "/cosmos.authz.v1beta1.GenericAuthorization",
            "msg": "/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"
        },
        "expiration": "2022-12-31T23:59:59Z"
    },
    "grantee": "cro1j...",
    "granter": "cro18..."
}
```

{% endhint %}

Similarly:

**`tx authz grant [grantee_address] generic --msg-type /chainmain.nft.v1.MsgMintNFT --from [granter_address]`- Grant to mint NFT**

**`tx authz grant [grantee_address] generic --msg-type /chainmain.nft.v1.MsgTransferNFT --from [granter_address]`- Grant to transfer NFT**

**`tx authz grant [grantee_address] generic --msg-type /chainmain.nft.v1.MsgEditNFT --from [granter_address]`- Grant to edit NFT**

so on and so forth.

***

{% hint style="info" %}
NOTE **Message Type URL & Updating an Existing Grant**: At any time, there is up to one grant allowed for each Message Type URL over a unique *granter*-*grantee* pair. To update an existing grant, the *granter* will need to re-grant the *grantee* and the new grant will overwrite the old grant.
{% endhint %}

#### `exec`:

The `exec` transaction composes of 2 transactions:

* the `authorized transaction`: the transaction to be executed on behalf of the *granter*; and
* the `execution transaction`: the transaction that contains and executes the above `authorized transaction`.

After a valid grant is set up, the *grantee* needs to first prepare the `authorized transaction`, in JSON format, on behalf of the *granter*. For instance, when the *grantee* wants to execute a `SendAuthorization` to send `10 CRO` from the *granter* to a `recipient`, one easy way to generate such `authorized transaction` and saves it to a file named `tx.json` is to use the `--generate-only` flag by running:

```bash
$ chain-maind tx bank send <granter_address> <recipient_address> 10cro --from <granter_address> --chain-id <chain-id> --generate-only > tx.json

## Illustrative partial transaction payload in tx.json ##
{
    "@type": "/cosmos.bank.v1beta1.MsgSend",
    "amount": [
        {
            "amount": "1000000000",
            "denom": "basecro"
        }
    ],
    "from_address": "cro18...",
    "to_address": "cro1j..."
}
```

{% hint style="info" %}
NOTE The `authorized transaction` here does not need to be signed and the address after the `--from` flag is the `granter_address` instead of the `grantee_address`. In other words, this `authorized transaction` is created by the *grantee* but prepared as if he/she were the *granter*.
{% endhint %}

After the `authorized transaction` is properly prepared, the *grantee* needs to issue an `execution transaction` to execute the `authorized transaction`:

**`tx authz exec [tx_json] --from [grantee_address]` - Execute an authorization**

```bash
$ chain-maind tx authz exec tx.json --from <grantee_address> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/cosmos.authz.v1beta1.MsgExec",
    "grantee": "cro1j...",
    "msgs": [
        {
            "@type": "/cosmos.bank.v1beta1.MsgSend",
            "amount": [
                {
                    "amount": "1000000000",
                    "denom": "basecro"
                }
            ],
            "from_address": "cro18...",
            "to_address": "cro1j..."
        }
    ]
}
```

Likewise, all valid authorized grants can be executed with proper `authorized transaction` and `execution transaction`.

#### `revoke`:

The *granter* may choose to `revoke` an existing authorization already granted to the *grantee* by running:

**`tx authz revoke [grantee_address] [msg_type_url] --from [granter_address]` - Revoke an authorization with a specified Message Type URL**

{% hint style="info" %}
Example: Revoke an existing SendAuthorization

```bash
$ chain-maind tx authz revoke <grantee_address> /cosmos.bank.v1beta1.MsgSend --from <granter_address> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/cosmos.authz.v1beta1.MsgRevoke",
    "grantee": "cro1j...",
    "granter": "cro18...",
    "msg_type_url": "/cosmos.bank.v1beta1.MsgSend"
}
```

{% endhint %}

#### Queries

**`query authz grants [granter_address] [grantee_address]` - Query all existing grants between a&#x20;*****granter*****-*****grantee*****&#x20;pair**

{% hint style="info" %}
Example: Query all existing grants between the specified granter and grantee

```bash
$ chain-maind query authz grants <granter_address> <grantee_address> --output json | jq
{
  "grants": [
    {
      "authorization": {
        "@type": "/cosmos.authz.v1beta1.GenericAuthorization",
        "msg": "/chainmain.nft.v1.MsgTransferNFT"
      },
      "expiration": "2022-12-31T23:59:59Z"
    },
    {
      "authorization": {
        "@type": "/cosmos.authz.v1beta1.GenericAuthorization",
        "msg": "/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"
      },
      "expiration": "2022-12-31T23:59:59Z"
    },
    {
      "authorization": {
        "@type": "/cosmos.staking.v1beta1.StakeAuthorization",
        "max_tokens": {
          "denom": "basecro",
          "amount": "1000000000"
        },
        "allow_list": {
          "address": [
            "crocn..."
          ]
        },
        "authorization_type": "AUTHORIZATION_TYPE_DELEGATE"
      },
      "expiration": "2022-12-31T23:59:59Z"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}
```

{% endhint %}

We may also specify a `MsgTypeURL` for the query:

**`query authz grants [granter_address] [grantee_address] [msg_type_url]` - Query the grant with a specified Message Type URL between a&#x20;*****granter*****-*****grantee*****&#x20;pair**

{% hint style="info" %}
Example: Query the grant to withdraw delegator reward between the specified granter and grantee

```bash
$ chain-maind query authz grants <granter_address> <grantee_address> /cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward --output json | jq
{
  "grants": [
    {
      "authorization": {
        "@type": "/cosmos.authz.v1beta1.GenericAuthorization",
        "msg": "/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"
      },
      "expiration": "2022-12-31T23:59:59Z"
    }
  ],
  "pagination": null
}
```

{% endhint %}


# module\_bank

#### `bank` module

#### Introduction

The `bank` module maintains the state of two primary objects:

* Account balances by address;
* Total supply of tokens on the chain

`bank` module tracks and provides query support for the total supply of all assets used in the application. It also supports token transfer functionalities. Specifically, the total supply is updated whenever a token is:

* **Minted**, e.g. Token created by the [mint](/cronos-pos-chain-protocol/module_overview/module_inflation-including-mint#mint-module) module; or
* **Burned**, e.g. Token distorted by the [slashing](https://github.com/crypto-org-chain/chain-docs/blob/Gitbook/docs/chain-details/module_slashing/README.md) module.

#### Transactions and Queries

#### Transactions

**`tx bank send [from_key_or_address] [to_address] [amount] [network_id]` - Send Funds**

You can transfer tokens to a designated address by the `tx bank send` command. For example, we can send 10 CRO from `address_a` to `address_b` by

```bash
$ chain-maind tx bank send <address_a> <address_b> 10cro --chain-id <chain-id>

## Transaction payload##
{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address"....}
confirm transaction before signing and broadcasting [y/N]: y
```

#### Queries

**`query bank balances [address]` - Check the balance of a specified account**

One can check the current balance of a specified account by:

```json
$ chain-maind query bank balances <address> --output json | jq
    {
    "balances": [
        {
        "denom": "basecro",
        "amount": "[token_balance]"
        }
    ],
    "pagination": {
        "next_key": null,
        "total": "0"
    }
    }
```

**`query bank total` - Check the total supply of the token**

You can also check the current total supply of the token by:

```json
$ chain-maind query bank total --output json | jq
    {
    "supply": [
        {
        "denom": "basecro",
        "amount": "[total_supply_amount]"
        }
    ]
    }
```

#### Appendix

**`bank` module: Network Parameters and configuration**

| Key                  | Type           | Example                               |
| -------------------- | -------------- | ------------------------------------- |
| `SendEnabled`        | \[]SendEnabled | \[{denom: "basecro", enabled: true }] |
| `DefaultSendEnabled` | bool           | true                                  |


# module\_mint

{% hint style="warning" %}
As of the v7 upgrade(May 2026), the `x/mint` parameters `inflation_min`, `inflation_max`, and `inflation_rate_change`have been pinned to static values: (InflationMin = InflationMax = 0.01, InflationRateChange = 0). The `bonded-ratio` based dynamic inflation described on this page no longer drives the live rate. So the formulas and parameter semantics described on this page are for historical reference only after v7.

The effective inflation is now controlled by the new [`x/inflation` module](/cronos-pos-chain-protocol/module_overview/module_inflation), which wraps `x/mint` and applies a 6.8% monthly compound decay. A hard 100B CRO `MaxSupply` cap and explicit `BurnedAddresses` list were also introduced.&#x20;

(See <https://github.com/crypto-org-chain/chain-main/discussions/1291> for the full proposal.)
{% endhint %}

#### `mint` module

#### Introduction

The `mint` module is responsible for creating tokens in a flexible way to reward the validators who participate in the proof of stake consensus process (see also the [distribution module](/cronos-pos-chain-protocol/module_overview/module_distribution)). It is also designed in a way to bring a balance between market liquidity and staked supply.

#### Overview

#### **Network parameters**

Below are all the network parameters for the `mint` module:

* `"blocks_per_year"` - The expected number of blocks being produced per year;
* `"goal_bonded"` - Goal of bonded token in percentage;
* `"inflation_max"` - Maximum annual inflation rate;
* `"inflation_min"` - Minimum annual inflation rate;
* `"inflation_rate_change"` - Maximum annual change in inflation rate;
* `"mint_denom"` - Token type being minted.

The target annual inflation rate is recalculated for each previous cycle. The inflation is also subject to a rate change (positive or negative) depending on the distance from the desired ratio (`"goal_bonded"`). The maximum rate change possible is defined to be `"inflation_rate_change"` per year, where the annual inflation is capped as between `"inflation_min"` and `"inflation_max"`.

#### **Parameters explained**

`"goal_bonded"`&#x20;

Goal of bonded token in percentage (also called staking ratio), the changes of the reward and the inflation rate related to this parameter can be summarized as follows cases:

* If the staking ratio is **below** the `"goal_bonded"` , the inflation rate will increase until reaching a maximum upper bound (`"inflation_max"`);
* If the staking ratio is **equal** to `"goal_bonded"`, the inflation rate will stay constant;
* If the staking ratio is **above** the `"goal_bonded"`, it will decrease until reaching a minimum lower bound `"inflation_min"`).

`"inflation_rate_change"`&#x20;

Maximum annual change in inflation rate, represents the maximum percentage by which the inflation rate can change in a year.&#x20;

***

## Emissions and supply of $CRO

The current emissions and supply of $CRO and its emission projections can be easily queried directly from URLs, as described in this section.

### How inflation rate is calculated

The magnitude of the rate of change of the inflation rate is controlled by an additional factor, which is the ratio between the current bonded ratio with the `"goal_bonded"`, the inflation rate is updated at the end of every block accordingly to the following formula:

```
Inflation Rate = min(max(params.InflationMin, currentInflation + ((1 - bondedRatio / params.GoalBonded) * params.InflationRateChange / params.BlocksPerYear)), params.InflationMax)
```

Or simply, when the inflation rate within the maximum and the minimum bounds

```
current inflation + ((1 - bondedRatio / params.GoalBonded) * params.InflationRateChange / params.BlocksPerYear)),
```

as

<figure><img src="/files/xRpe1L9kzOohY64Yay1L" alt=""><figcaption></figcaption></figure>

This function then updates the current inflation rate by adding the inflationRateChange to it. Finally, the function checks that the updated inflation rate is within the range defined by the InflationMin and InflationMax parameters, and returns the resulting inflation rate.

{% hint style="info" %}
From V7 upgrade, `params.InflationRateChange` is fixed to 0, fixing `Inflation Rate` above finally at 1%.
{% endhint %}

### How emissions are calculated

#### ***Annual provisions***

The emission of the Cronos POS Chain is controlled by the inflation rate and the total supply of $CRO. New $CRO tokens are minted at each block and distributed as block rewards to delegators. The inflation rate determines the amount of $CRO emitted to delegators at each block, with emissions being distributed as staking rewards according to the Proof-of-Stake consensus mechanism.

The annualized quantity of $CRO emitted is called Annual Provisions. It can be calculated based on the inflation rate with:

```
Annual provisions = Inflation rate * Total supply of CRO
```

{% hint style="info" %}
At any point, the inflation, in annualized percentage increase of CRO supply, can be queried from <https://rest.mainnet.cronos-pos.org/cosmos/mint/v1beta1/inflation>.
{% endhint %}

This can be seen in the [following code](https://github.com/cosmos/cosmos-sdk/blob/main/x/mint/types/minter.go#L74) in the Cosmos SDK:

```
m.Inflation.MulInt(totalSupply)
```

{% hint style="info" %}
**Easy to use endpoints to query $CRO emissions**

* The current value of annual provisions of CRO can be queried at any time [at this endpoint](https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/annual_provisions).
* The total supply of CRO can be queried at any time [at this endpoint](https://rest.mainnet.crypto.org/cosmos/bank/v1beta1/supply/by_denom?denom=basecro)&#x20;

Note: These numbers are provided in basecro, where `1 CRO = 10^8 basecro` on the Cronos POS chain.

* Annualized emissions can also be seen on the Blockchain Explorer at <https://cronos-pos.org/explorer> under "Events" of each block.
* This annualized emission value can be derived into a per-block value (see [#block-provisions](#block-provisions "mention")), using the block per year value provided by the following endpoint: \
  <https://rest.mainnet.cronos-pos.org/cosmos/mint/v1beta1/params>
  {% endhint %}

#### **Block provisions**

To calculate the number of $CRO emitted to delegators at each block, we need to divide the Annual Provisions by the expected number of blocks per year (`blocks_per_year`, an be queried at any time [at this endpoint](https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/params))

The resulting number is called the "Block Provision":

```
Reward per block = Block Provision = Annual provisions / Expected blocks per year
```

This can be seen in the [following code](https://github.com/cosmos/cosmos-sdk/blob/main/x/mint/types/minter.go#L80) in the CosmosSDK:

```
m.AnnualProvisions.QuoInt(math.NewInt(int64(params.BlocksPerYear)))
```

### **Total and Circulating** **Supply of $CRO**

* The **Total Supply** refers to the total amount of $CRO that has been created on Cronos POS chain;
* The **Circulating Supply** refers to the total supply minus the amount stored in the "[burn address](https://cronos-pos.org/explorer/account/cro1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqtcgxmv)", which has effectively been taken out of circulation by [community burn governance proposals](https://blog.cronos-pos.org/p/cro-community-burn-proposal-explainer), i.e.

```
Circulating Supply = Total supply - [$CRO balance held in the burn address]
```

{% hint style="info" %}
**Easy to use endpoints to query $CRO supplies:**

* The current **total supply** of $CRO can be obtained [here](https://cronos-pos.org/explorer/api/v1/supply/total).
* The current **circulating supply** of $CRO can be obtained [here](https://cronos-pos.org/explorer/api/v1/supply/circulating).
* The current **burned amount** of $CRO can be obtained [here](https://cronos-pos.org/explorer/api/v1/supply/burned).

*Note -* This number is provided in `basecro`, where *1 CRO = 10^8 `basecro`* on the Cronos POS chain.

* Total burned amount and progress can be found in the [Cronos Burninfo page](https://burninfo.cronos-pos.org/).
  {% endhint %}

***

#### Queries

**Query the current minting annual provisions value**

We can query the current minting annual provisions value, for example:

{% tabs %}
{% tab title="curl" %}

```
$ curl -X GET "https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/annual_provisions"
{ "annual_provisions": "100346483960386394.920000000000000000" }
```

implies that the current minting annual provisions will be 100346483960386394 basecro ( i.e. `1,003,464,839` CRO)
{% endtab %}

{% tab title="chain-maind cli" %}

```
$ chain-maind query mint annual-provisions 
100346483960386394
```

{% endtab %}
{% endtabs %}

**Query the current minting inflation value**

We can query the current minting inflation value, for example:

{% tabs %}
{% tab title="curl" %}

<pre><code><strong>$ curl -X GET "https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/inflation"
</strong>{
  "inflation": "0.010000000000000000"
}
</code></pre>

{% endtab %}

{% tab title="chain-maind cli" %}

```
 $ chain-maind query mint inflation
  0.037000000000000000
```

implies that the inflaction rate is `3.7%`&#x20;
{% endtab %}
{% endtabs %}

&#x20;**Query the current minting parameters**

We can query the current query parameters by

{% tabs %}
{% tab title="curl" %}

<pre><code><strong>$ curl -X GET "https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/params"
</strong>
{
  "params": {
    "mint_denom": "basecro",
    "inflation_rate_change": "0.000000000000000000",
    "inflation_max": "0.010000000000000000",
    "inflation_min": "0.010000000000000000",
    "goal_bonded": "0.600000000000000000",
    "blocks_per_year": "6311520"
  }
}
</code></pre>

{% endtab %}

{% tab title="chain-maind cli" %}

```
$ chain-maind query mint params --output json | jq

{
  "mint_denom": "basecro",
  "inflation_rate_change": "0.000000000000000000",
  "inflation_max": "0.010000000000000000",
  "inflation_min": "0.010000000000000000",
  "goal_bonded": "0.600000000000000000",
  "blocks_per_year": "6311520"
}
```

{% endtab %}
{% endtabs %}

| Parameter               | Value                        | Description                                                            |
| ----------------------- | ---------------------------- | ---------------------------------------------------------------------- |
| `inflation_max`         | `0.01` (fixed value from V7) | Maximum annual inflation rate (1%)                                     |
| `inflation_min`         | `0.01` (fixed value from V7) | Minimum annual inflation rate (1%)                                     |
| `inflation_rate_change` | `0` (fixed value from V7)    | Maximum annual change in inflation rate (fixed, no dynamic adjustment) |

***

#### Appendix

**`gov` module: Network Parameters and configuration**

The following tables show overall effects on different configurations of the mint related network parameters:

|                      | `blocks_per_year`                  | `goal_bonded`                        | `mint_denom` |
| -------------------- | ---------------------------------- | ------------------------------------ | ------------ |
| Type                 | string (uint64)                    | string (dec)                         | string       |
| Higher               | More expected blocks per year      | Higher target bonding ratio          | N/A          |
| Lower                | Less expected blocks per year      | Lower target bonding ratio           | N/A          |
| Constraints          | Value has to be a positive integer | Value has to be less or equal to `1` | N/A          |
| Sample configuration | `5256000` (5,256,000 blocks)       | `0.66` (66%)                         | `basecro`    |
|                      |                                    |                                      |              |

|                      | `inflation_max`              | `inflation_min`              | `inflation_rate_change` |
| -------------------- | ---------------------------- | ---------------------------- | ----------------------- |
| Type                 | string (dec)                 | string (dec)                 | string (dec)            |
| Higher               | N/A                          | N/A                          | N/A                     |
| Lower                | N/A                          | N/A                          | N/A                     |
| Constraints          | fixed to `0.01` (1%) from V7 | fixed to `0.01` (1%) from V7 | fixed to `0` from V7    |
| Sample configuration | `0.01` (1%)                  | `0.01` (1%)                  | `0` (0%)                |
|                      |                              |                              |                         |


# module\_gov

{% hint style="warning" %}
Since v7(May 2026), tally calculations now include **tier-locked voting power** (see [the proposal](https://github.com/crypto-org-chain/chain-main/discussions/1291)). Delegators who have opted into a time-locked tier position via the [`x/tieredrewards` module](/cronos-pos-chain-protocol/module_overview/module_tieredrewards) retain full voting weight throughout the lock and exit-commitment period.
{% endhint %}

#### `gov` module

#### Introduction

The `gov` module enables on-chain governance which allows Cronos POS Chain token holders to participate in the decision-making processes. For example, users can:

* Form an idea and seek the feedback;
* Create the proposal and adjust according to feedback as needed;
* Submit a proposal along with an initial deposit;
* Deposit tokens and fund an active proposal;
* Vote for an active proposal.

The details about the governance proposal process are available on [The Proposal Process page](https://docs.cronos-pos.org/cronos-pos-chain-protocol/chain-details/govprocess).

#### Overview

**Network parameters**

Below are all the network parameters for the `gov` module:

* `deposit_params` - Deposit related parameters:
  * `min_deposit`: Minimum deposit for a proposal to enter voting period; and
  * `max_deposit_period`: Maximum period for Cro holders to deposit on a proposal.
* `voting_params` - Voting related parameters
  * `voting_period`: The length of the voting period.
* `tally_params` - Tally related parameters
  * `quorum`: The minimum percentage of voting power that needs to be casted on a proposal for the result to be valid;
  * `threshold`: Minimum proportion of `Yes` votes (excluding `Abstain` votes) for the proposal to be accepted; and
  * `veto`: Minimum proportion of `Veto` votes to total votes ratio for proposal to be vetoed.

**The Governance Procedure**

**Phase 0 - Submit a proposal along with an initial deposit:**

Users can submit a proposal with an initial deposit. The proposal will then become "active" and entre the *deposit period*.

**Phase 1 - Deposit period**

During the *deposit period*, users can deposit and support an active proposal. Once the deposit of the proposal reached `min_deposit`, it will enter the *voting period*. Otherwise, if the proposal is not successfully funded within `max_deposit_period`, it will become inactive and the deposit will not be refunded.

**Phase 2 - Voting period**

During the *voting period*, staked (bonded) token will be able to participate in the voting. Users can choose one of the following option: `"yes"`, `"no"`, `"no_with_veto"` and `"abstain"`

After the `voting_period` has passed, there are several scenarios that a proposal will consider to be fail, for example, if

* No one votes (everyone `"abstain"`);
* Votes did not reach the `quorum`;
* More than `veto` of voters vote for `"no_with_veto"`;
* More than `threshold` that non-abstaining voters vote `"no"`.

Otherwise, the proposal will be accepted and changes will be implemented according to the proposal.

#### Transactions and Queries

#### Transactions

**`tx gov submit-proposal` - Submit a proposal along with an initial deposit**

* Submit a parameter change proposal - `param-change [proposal-file]`

  Users can submit a proposal to modify network parameters during run time, here is a demon proposal if we would like to change the parameter `MaxValidators` (maximum number of validator) in the `staking` module,

  ```json
  {
    "title": "Staking Param Change",
    "description": "Update max validators",
    "changes": [
      {
        "subspace": "staking",
        "key": "MaxValidators",
        "value": 151
      }
    ]
  }
  ```
* Submit a community pool spend proposal - `community-pool-spend [proposal-file]`

  Users can submit a proposal and request funds from the community pool to support their projects or other usages.
* Submit a software upgrade proposal- `software-upgrade [name] (--upgrade-height [height] | --upgrade-time [time]) (--upgrade-info [info])`

  Users can submit an upgrade proposal and suggest a software upgrade at a specific block height.
* Cancel the current software upgrade proposal - `cancel-software-upgrade`

  On the other hand, users can submit a proposal to cancel the planned software upgrade.

**`tx gov deposit [proposal-id] [deposit]` - Deposit tokens for an active proposal**

Users can submit a deposit transaction to fund and support an active proposal.

**`tx gov vote [proposal-id] [option]` - Vote for an active proposal**

Users can vote for an active proposal. Valid value of `"option"` field can be `"yes"`, `"no"`, `"no_with_veto"` and `"abstain"`.

#### Queries

**`query gov proposals [proposal-id]` - Query proposals with optional filters**

We can check the proposal with optional filters by:

```json
$ chain-maind query gov proposals -o json | jq

  {
    "proposals": [
      {
        "proposal_id": "1",
        "content": {
          "@type": "/cosmos.params.v1beta1.ParameterChangeProposal",
          "title": "Staking Param Change",
          "description": "Update max validators",
          "changes": [
            {
              "subspace": "staking",
              "key": "MaxValidators",
              "value": "151"
            }
          ]
        },
        "status": "PROPOSAL_STATUS_PASSED",
        "final_tally_result": {
          "yes": "50040000000000",
          "abstain": "0",
          "no": "0",
          "no_with_veto": "0"
        },
        "submit_time": "2020-10-15T10:05:49.996956080Z",
        "deposit_end_time": "2020-10-15T22:05:49.996956080Z",
        "total_deposit": [
          {
            "denom": "basecro",
            "amount": "100000000000"
          }
        ],
        "voting_start_time": "2020-10-15T10:14:56.958963929Z",
        "voting_end_time": "2020-10-15T22:14:56.958963929Z"
      }
    ],
    "pagination": {
      "next_key": null,
      "total": "0"
    }
  }
```

In the above example, there is only one proposal with `"proposal_id": "1"`, with the title: `"Staking Param Change"` that change the `MaxValidators` parameter of the `staking` module to `151`. We can also see that the status of the proposal is `"PROPOSAL_STATUS_PASSED"`, which means that this proposal has bee passed.

**`query gov proposal [proposal-id]` Query details of a single proposal**

Similarly, we can check the details of a proposal with a given `"proposal_id"`.

**`query gov tally [proposal-id]` Get the tally of a proposal vote**

We can also the tally of a proposal with a given `"proposal_id"`.

**`query gov params` - Query the current gov parameters**

We can query the current gov parameters by

```json
$ chain-maind query gov params --output json | jq

  {
    "voting_params": {
      "voting_period": "43200000000000"
    },
    "tally_params": {
      "quorum": "0.334000000000000000",
      "threshold": "0.500000000000000000",
      "veto_threshold": "0.334000000000000000"
    },
    "deposit_params": {
      "min_deposit": [
        {
          "denom": "basecro",
          "amount": "10000000"
        }
      ],
      "max_deposit_period": "43200000000000"
    }
  }
```

#### Appendix

**`gov` module: Network Parameters and configuration**

The following tables show overall effects on different configurations of the gov related network parameters:

|                      | `min_deposit`                               | `max_deposit_period`         | `voting_period`              |
| -------------------- | ------------------------------------------- | ---------------------------- | ---------------------------- |
| Type                 | array (coins)                               | string (time ns)             | string (time ns)             |
| Higher               | Larger window for calculating the downtime  | Longer deposit period        | Longer voting period         |
| Lower                | Smaller window for calculating the downtime | Shorter deposit period       | Shorter voting period        |
| Constraints          | Value has to be a positive integer          | Value has to be positive     | Value has to be positive     |
| Sample configuration | `100000` (100000 cro)                       | `1209600000000000` (2 weeks) | `1209600000000000` (2 weeks) |

|                      | `quorum`                             | `threshold`                          | `veto`                               |
| -------------------- | ------------------------------------ | ------------------------------------ | ------------------------------------ |
| Type                 | string (dec)                         | string (dec)                         | string (dec)                         |
| Higher               | Easier for a proposal to be passed   | Easier for a proposal to be passed   | Easier for a proposal to be passed   |
| Lower                | Harder for a proposal to be passed   | Harder for a proposal to be passed   | Harder for a proposal to be passed   |
| Constraints          | Value has to be less or equal to `1` | Value has to be less or equal to `1` | Value has to be less or equal to `1` |
| Sample configuration | `0.15` (15%)                         | `0.5` (50%)                          | `0.33` (33%)                         |


# module\_staking

{% hint style="warning" %}
Since v7(May 2026), the `staking` module itself is unchanged by v7, but two adjacent modules now extend its behavior:

* [**`x/tieredrewards`**](/cronos-pos-chain-protocol/module_overview/module_tieredrewards) lets a delegator opt-in to time-locked tier positions (1 / 2 / 4 years) on top of an ordinary delegation, earning a fixed bonus APY per tier. Existing delegations can be upgraded to a tier **without unbonding** via `MsgCommitDelegationToTier`.
* A base APY floor (`~3%` by default, governed by `TargetBaseRewardsRate`) is now maintained for all stakers — including base-tier delegators — when block fees fall short.

Standard slashing rules apply to tier-locked positions exactly as they do to ordinary delegations. Validator commission applies only to base rewards, not to tier bonus rewards.\
See <https://github.com/crypto-org-chain/chain-main/discussions/1291> for the full proposal.
{% endhint %}

#### `staking` module

#### Introduction

The `staking` module handles Proof-of-Stake related logic, which plays a very important part in the underlying consensus protocol.

#### Overview

Cronos POS Chain is based on Tendermint Core's consensus engine, it relies on a set of validators to participate in the proof of stake (POS) consensus protocol, and they are responsible for committing new blocks in the blockchain.

* `unbonding_time`: The time duration of unbonding;
* `max_validators`: The maximum number of validators;
* `max_entries`: The max entries for either unbonding delegation or redelegation;
* `historical_entries`: The number of historical entries to persist; and
* `bond_denom`: Coin denomination for staking.

#### Validator

Validators are responsible for signing or proposing block at each consensus round. It is important that the validators maintain excellent availability and network connectivity to perform their tasks. To incentivise the validator nodes to run the network, rewards are distributed to the validators according to their performance and amount of staked token (see [distribution](/cronos-pos-chain-protocol/module_overview/module_distribution) and [mint](/cronos-pos-chain-protocol/module_overview/module_inflation-including-mint#mint-module)). On the other hand, a penalty should be imposed on validators' misbehavior (see [slashing](/cronos-pos-chain-protocol/module_overview/module_slashing)).

#### Delegator

The `staking` module enables CRO owners to delegate their tokens to active validators and share part of the reward obtained by the validator during the proof of stake protocol(see [distribution](/cronos-pos-chain-protocol/module_overview/module_distribution) module). Specifically, It allows token owners to take part in the consensus process without running a validator themselves.

It is important to point out that the delegator and the validator are in the same boat: They share the reward and the risk. In particular, part of their delegated token could be slashed due to validator's misbehaviour (see [slashing](/cronos-pos-chain-protocol/module_overview/module_slashing)). Therefore, It is very important to choose a reliable validator to delegate. Kindly refer to this [link](https://docs.cosmos.network/main/build/modules/protocolpool#state-transitions) for detailed specification and state transitions of delegation.

{% hint style="info" %}
Since v7, delegators can additionally **opt-in to tier-locked positions** via the [`x/tieredrewards`](/cronos-pos-chain-protocol/module_overview/module_tieredrewards) module to earn a bonus APY on top of the base reward — without giving up voting rights or custody of their tokens. Existing delegations can be upgraded to a tier in one transaction (`commit-delegation-to-tier`), with no `unbonding` required.
{% endhint %}

#### Transactions and Queries

#### Transactions

**`tx staking create-validator` - Create new validator initialized with a self-delegation**

First of all, we can create a validator with the `create-validator` transaction, for example:

```bash
$ chain-maind tx staking create-validator \
--from=[name_of_your_key] \
--amount=[staking_amount] \
--pubkey=[trocnclconspub...]  \
--moniker="[moniker_id_of_your_node]" \
--security-contact="[security contact email/contact method]" \
--chain-id="[chain-id]" \
--commission-rate="[commission_rate]" \
--commission-max-rate="[maximum_commission_rate]" \
--commission-max-change-rate="[maximum_rate_of_change_of_commission]" \
--min-self-delegation="[min_self_delegation_amount]"

## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator"...}
confirm transaction before signing and broadcasting [y/N]: y
```

**`tx staking delegate [validator-addr] [amount]` - Delegate liquid tokens to a validator**

As discussed in the delegator section, one can delegate their tokens to an active validator by:

```bash
$ tx staking delegate [validator-addr] [amount]

## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgDelegate"...}
```

**`tx staking unbond [validator-addr] [amount]` - Unbond shares from a validator**

Delegator can unbond their staked tokens by

```bash
$ chain-maind tx staking unbond [validator-addr] [amount]

## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgUndelegate"...}
```

*Remark:* Note that funds will only be available after the `unbonding_time` has passed.

**`tx staking redelegate [src-validator-addr] [dst-validator-addr] [amount]` - Redelegate illiquid tokens from one validator to another**

We can also move our staked tokens from one validator to another by:

```bash
$ chain-maind tx staking redelegate [src-validator-addr] [dst-validator-addr] [amount]

## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgBeginRedelegate"...}
```

#### Queries

We will be covering most of the commonly used queries here. Meanwhile, you can use

```
chain-maind query staking -h
```

to check all the supported sub-commands.

**`query staking delegation [delegator-addr] [validator-addr]` - Query a delegation based on address and validator address**

With a given delegator address and the validator account that it is associated with, we can check the by:

```json
$ chain-maind query staking delegation [delegator-addr] [validator-addr] --output json | jq

  {
    "delegation": {
      "delegator_address": "[delegator-addr]",
      "validator_address": "[validator-addr]",
      "shares": "[delegator_shares]"
    },
    "balance": {
      "denom": "basecro",
      "amount": "[delegator_balance]"
    }
  }
```

**`query staking delegations-to [validator-addr]` - Query all delegations made to one validator**

We can check all the delegations made to a specific validator:

```json
$ chain-maind query staking delegations-to [validator-addr] --output json  | jq

  {
    "delegation_responses": [
      {
        "delegation": {
          "delegator_address": "[delegator-addr-1]",
          "validator_address": "[validator-addr]",
          "shares": "[delegator_shares]"
        },
        "balance": {
          "denom": "basecro",
          "amount": "[delegator_balance_1]"
        }
      },
      {
        "delegation": {
          "delegator_address": "[delegator-addr-2]",
          "validator_address": "[validator-addr]",
          "shares": "[delegator_shares-2]"
        },
        "balance": {
          "denom": "basecro",
          "amount": "[delegator_balance_2]"
        }
      }
    .......
    ],
    "pagination": {
      "next_key": null,
      "total": "0"
    }
  }
```

**`query staking pool` - Query the current staking pool values**

We can check the amount of bonded and unbonded amount in the staking pool:

```json
$ chain-maind query staking pool --output json | jq

  {
    "not_bonded_tokens": "[not_bonded_amount]",
    "bonded_tokens": "[bonded_amount]",
  }
```

**`query staking unbonding-delegation [delegator-addr] [validator-addr]` - Query an unbonding-delegation record based on delegator and validator address**

```json
$ chain-maind query staking unbonding-delegation [delegator-addr] [validator-addr] --output json | jq

  {
    "delegator_address": "[delegator-addr]",
    "validator_address": "[validator-addr]",
    "entries": [
      {
        "creation_height": "[height_of_unbonding]",
        "completion_time": "[completion_time]",
        "initial_balance": "[unbonding_initial_balance]",
        "balance": "[unbonding_balance]"
      }
    ]
  }
```

**`query staking validator [validator-addr]` - Query a specific validator**

We can query the details of a specific validator with its validator address (crocncl...) by:

```json
$ chain-maind query staking validator [validator-addr] --output json | jq

  {
    "operator_address": "[validator_address (crocncl...)]",
    // address of the validator's operator
    "consensus_pubkey": "[consensus_pubkey (crocnclconspub...)]",
    // the consensus public key of the validator
    "jailed": "[jailed_or_not]",
    // if it has been jailed from bonded status?
    "status": "[validator_statuses]",
    // validator status (bonded/unbonding/unbonded)
    "tokens": "[total_tokens]",
    // total delegated tokens
    "delegator_shares": "[delegator_shares]",
    // total shares issued to a validator's delegators
    "description": {
      "moniker": "[validator_moniker_id]",
      "identity": "",
      "website": "",
      "security_contact": "[security_contact]",
      "details": ""
    },
    // description terms for the validator
    "unbonding_height": "[unbonding_height]",
    "unbonding_time": "[unbonding_time]",
    "commission": {
      "commission_rates": {
        "rate": "[commission_rates]",
        // the commission rate charged to delegators
        "max_rate": "[maximum_commission_rates]",
        // maximum commission rate which validator can ever charge
        "max_change_rate": "[maximum_rate_of_change_of_commission]"
        // maximum daily increase of the validator commission
      },
      "update_time": "[last_update_time]"
      // the last time the commission rate was changed
    },
    "min_self_delegation": "[min_self_delegation_amount]"
    // validator's self declared minimum self delegation
  }
```

**`query staking validators` - Query all validators**

A full list of validators and their details can be found by this query.

**`query staking params` - Query the current staking parameters**

Finally, we can query the current staking parameters by

```json
$ chain-maind query staking params --output json | jq

  {
    "unbonding_time": "2419200s",
    "max_validators": 100,
    "max_entries": 7,
    "historical_entries": 100,
    "bond_denom": "basecro"
  }
```

#### Appendix

**`staking` module: Network Parameters Configuration**

the The following tables show overall effects on different configurations of the staking related network parameters:

|                      | `bond_denom` | `historical_entries`               | `max_entries`                                                 |
| -------------------- | ------------ | ---------------------------------- | ------------------------------------------------------------- |
| Type                 | string       | uint16                             | uint16                                                        |
| Higher               | N/A          | More historical entries to persist | More entries for either unbonding delegation or redelegation  |
| Lower                | N/A          | Less historical entries to persist | Fewer entries for either unbonding delegation or redelegation |
| Constraints          | N/A          | Value has to be positive           | Value has to be a positive                                    |
| Sample configuration | `basecro`    | `100` (50%)                        | `7`                                                           |

***

|                      | `max_validators`                     | `unbonding_time`                     |
| -------------------- | ------------------------------------ | ------------------------------------ |
| Type                 | uint16                               | string                               |
| Higher               | More active validators               | Longer waiting period for unbonding  |
| Lower                | Fewer active validators              | Shorter waiting period for unbonding |
| Constraints          | Value has to be less or equal to `1` | Positive value in seconds            |
| Sample configuration | `100` (maximum 100 active validator) | `"`2419200s`"` (28 Days)             |


# module\_distribution

{% hint style="warning" %}
Since v7(May 2026), reward distribution still flows through this module, but v7 introduces a parallel reward stream and changes commission semantics(see [`x/tieredrewards` module](/cronos-pos-chain-protocol/module_overview/module_tieredrewards)):

* **Base staking rewards** (the existing flow described below) now have a per-block floor governed by `TargetBaseRewardsRate` (default `~3%` APY): if block fees to stakers fall below this rate, the `x/tieredrewards` module tops up the shortfall from a dedicated rewards pool, allocated by consensus voting power.
* **Tier bonus rewards** (for delegators who opt-in to time-locked tiers) are paid through `x/tieredrewards`, **not** through this module.
* **Validator commission** applies only to base staking rewards. Tier bonus rewards are paid directly to the tier position holder with no commission deducted.

(See <https://github.com/crypto-org-chain/chain-main/discussions/1291> for the full proposal.)
{% endhint %}

#### `distribution` module

#### Introduction

The `distribution` module is responsible for the distribution of rewards to the validators and delegators.

#### Overview

**Network Parameters**

Below are all the network parameters for the `distribution` module:

* `community_tax` - The rate of community tax;
* `base_proposer_reward` - Base bonus on transaction fees collected in a valid block;
* `bonus_proposer_reward` - Maximum bonus on transaction fees collected in a valid block;
* `withdraw_addr_enabled` - Whether delegators can set a different address to withdraw their rewards.

**Rewards**

There are two main types of rewards

* Block rewards, governed by the [mint](/cronos-pos-chain-protocol/module_overview/module_inflation-including-mint#mint-module) module; and
* [Transaction fees bonus](#transaction-fees-bonus).

**Block reward**

Block rewards are distributed proportionally to all validators relative to their voting power. This means that even though each validator gains cro with each reward, all validators will maintain equal weight over time.

For the validator operator, the distribution information is updated if:

* the amount of delegation to a validator is updated (delegation, unbond, slashing etc.);
* a validator successfully proposes a block and receives the reward;
* any delegator withdraws from a validator, or
* the validator withdraws it's commission.

For delegators, once they have delegated to a validator, they will be entitled to a portion of the total reward obtained by the validators. The reward is proportional to their delegated amount, and the commission charged by the validator operator (if any).

**Transaction Fees Bonus**

When a validator is selected to propose the next block, they must include at least 66% precommits of the previous block. To incentivise validators to include more than 66% precommits, the module provide a bonus reward (a portion of the transaction fee in the block) to the proposer.

This bonus reward is dependent linearly on the precommits from the other validators. Stating from 66% of the precommits, the basic bonus will be `base_proposer_reward` and increase linearly to `bonus_proposer_reward` when the validator includes 100% of the precommits.

This mechanism aims to incentivize non-empty block proposals, better networking between validators as well as to mitigate censorship. For further example, kindly refers to this [link](https://hub.cosmos.network/main/validators/validator-faq.html).

**Community tax**

The `community_tax` is the tax rate to the reward obtained by the validator. Specifically, part of the reward will be taxed and send to the community pool. The funds in the community pool can be withdrawn by submitting a community pool spend proposal with the [gov](https://docs.cronos-pos.org/cronos-pos-chain-protocol/module_overview/module_gov) module.

Even if the `community_tax` is set to be zero, the balance of the community pool could be non-zero. For example, the truncated remainder in some accounting edge cases will be sent to the community pool as well. Besides that, users can fund the community pool voluntary, and there could be funds allocated to the community pool in the [genesis](/cronos-pos-chain-protocol/chain-details/genesis_file).

#### Transactions and Queries

#### Transactions

**`tx distribution withdraw-all-rewards` - Withdraw all delegations rewards for a delegator**

Delegator can withdraw their reward(s) from the validator(s) that they have delegated all at once.

**`tx distribution withdraw-rewards [validator-addr]` - Withdraw rewards from a given validator address**

Delegator can withdraw their reward from a specific validator.

{% hint style="info" %}
Remark: Validator operation can withdraw the commission in addition to the rewards by adding the commission flag `--commission`.
{% endhint %}

**`tx distribution set-withdraw-addr [withdraw-addr]` - Change the default withdraw address for rewards associated with an address**

Delegator can set a different address to withdraw their rewards.

**`tx distribution fund-community-pool [amount]` - Funds the community pool with the specified amount**

Users can make a contribution to the community pool with a specific amount.

#### Queries

**`query distribution commission [validator]` - Query distribution validator commission**

We can check the commission of a specific validator.

**`query distribution community-pool` - Query the amount of coins in the community pool**

We can check the balance of the community pool.

**`query distribution rewards [delegator-addr] [validator-addr]` - Query all distribution delegator rewards or rewards from a particular validator**

We can check the current rewards for a delegation on a specific validator.

**`query distribution slashes [validator] [start-height] [end-height]` - Query distribution validator slashes**

We can check the history of slashing event of a validator.

**`query distribution validator-outstanding-rewards [validator]` - Query distribution outstanding rewards for a validator and all their delegations**

We can check distribution outstanding (un-withdrawn) rewards for a validator and all of their delegations.

**`query distribution params` - Query the current distribution parameters**

We can query the current distribution parameters by

```json
$ chain-maind query distribution params --output json | jq

  {
    "community_tax": "0.000000000000000000",
    "base_proposer_reward": "0.010000000000000000",
    "bonus_proposer_reward": "0.040000000000000000",
    "withdraw_addr_enabled": true
  }
```

#### Appendix

**`distribution` module: Network Parameters and configuration**

The following tables show overall effects on different configurations of the distribution related network parameters:

|                      | `community_tax`                             | `base_proposer_reward`                               | `bonus_proposer_reward`              |
| -------------------- | ------------------------------------------- | ---------------------------------------------------- | ------------------------------------ |
| Type                 | string (dec)                                | string (dec)                                         | string (dec)                         |
| Higher               | More reward will go into the community pool | Higher basic transaction fees bonus for the proposer | Easier for a proposal to be passed   |
| Lower                | Less reward will go into the community pool | Lower basic transaction fees bonus for the proposer  | Harder for a proposal to be passed   |
| Constraints          | Value has to be less or equal to `1`        | Value has to be less or equal to `1`                 | Value has to be less or equal to `1` |
| Sample configuration | `0` (0%)                                    | `0.01` (1%)                                          | `0.04` (4%)                          |


# module\_nft

#### `nft` module

#### Introduction

NFT provides the ability to digitize assets. The NFT Module described here is meant to be used as a module across chains for managing non-fungible token that represents individual assets with unique features. This standard was developed on Ethereum within the ERC-721 and the subsequent ERC-1155 standard addressed some of the restrictions of Ethereum regarding storage costs and semi-fungible assets. The NFT on the chain is identified by an ID, and the transaction process will also be publicly recorded. NFT metadata is based on a specific JSON schema - it can be stored directly on the chain or the URI of its storage source outside the chain can be stored on the chain.

Fungible tokens are mutually interchangeable, and one most common example of fungible tokens is fiat currencies. Specifically, the $100.50 US dollars in my bank account is equally valuable as the $100.50 US dollars in someone else's bank account. Another example of fungible tokens would be the native cryptocurrency of **Ethereum**, one of the most popular blockchain networks, i.e. **Ether**. Ethers are totally fungible, meaning that one ether is equal to one ether, and it's equal to any other ether as well. Particularly, ethers are also highly divisible up to one **wei**, or 0.000000000000000001 (10-18) ether.

In contrast, non-fungible tokens (NFTs) are special tokens that are unique in the sense that they cannot be split or equally interchanged for other NFTs of the same type. **CryptoKitties** on **Ethereum** or **Loaded Lions** on **Cronos POS Chain** are both examples of NFTs: each **CryptoKitty** or **Loaded Lion** is unique and non-divisible, unlike **Bitcoin**. Generally speaking, NFTs are unique, non-interchangeable, and non-divisible.

On-chain NFT standards were first developed on **Ethereum** within the **ERC-721** standard and its subsequent **Ethereum Improvement Proposals**. The subsequent **ERC-1155** standard aims to address some restrictions of **Ethereum** such as storage costs and semi-fungible assets. NFTs on application specific blockchains share some but not all features as their **Ethereum** brethren, since application specific blockchains are more flexible in how their resources are utilized, such as the ability to use strings as IDs.

The `nft` module here facilitates managing non-fungible tokens that represent individual assets with unique features on **Cronos POS Chain**.

You can find the [NFT specification doc](https://github.com/crypto-org-chain/chain-main/tree/master/x/nft/spec) here.

####

#### Overview

Below are key concepts and properties for NFTs on **Cronos POS Chain**:

* **Denom**

  A denom represents a collection of NFTs. It is the globally unique nft category name. Denom ID is the globally unique nft category identifier of Denom. For example, I could issue a denom named "CryptoPuppies" under which my collection of 100 CryptoPuppies NFTs get minted. Each denom has a `denom ID` and a `denom name`, both are unique on chain. A `denom schema` should generally be set when a denom gets issued, which indicates the format of NFT metadata under this denom.
* **Token**

  An NFT, or simply "token", is a specific instance of NFT minted under a denom. Each token has a `token ID`, which is unique under a specific denom. Generally, a token also has its `token name` (name of the NFT), `token URI` (off-chain information or storage location of the NFT), and `token metadata` (on-chain data that provides information about the NFT).
* **Metadata**

  The structure containing the specific data of the nft
* **Metadata Specification**

  The JSON Schema that nft metadata should follow
* **Metadata URI**

  The URI indicates its storage location when metadata is stored off-chain

::: tip Specifications `denom ID`: a string of lowercase alphanumeric characters with length between 3 and 64 that begins with a letter, unique over the chain;

`denom name`: a non-empty string, unique over the chain;

`denom schema`: a JSON metadata format for NFTs under this denom;

`token ID`: a string that is unique under the denom;

`token name`: a string;

`token URI`: a string that directs to the off-chain information or storage location of the NFT;

`token metadata`: a JSON object that matches the denom schema and represents the on-chain data that provides information about the NFT. :::

Just as each user is uniquely identified by its address, each NFT is uniquely identified by the combination of its **denom ID** and its **token ID** (like a UID for the NFT), showing its uniqueness, non-interchangeability, and non-divisibility.

***

#### Transactions and Queries

#### Transactions

In general,

1. any user may `issue` a denom as long as neither the **denom ID** nor the **denom name** has been taken;
2. the creator of a denom, also know as the owner of the denom, is the only user who may `mint` an NFT under such denom;
3. a user may `edit` or `burn` an NFT only if he/she is both the creator and the owner of that NFT;
4. a user may `transfer` an NFT as long as he/she is the owner of that NFT.

***

#### `issue`:

Every NFT needs to "live" under a denom: an NFT collection. Therefore, the first step is to issue a denom before one can mint NFTs:

**`tx nft issue [denom_id] --name [denom_name] --schema [denom_schema] --from [user_address]`- Issue a denom**

{% hint style="info" %}
Example: Issue a new denom with specified name and schema

```bash
$ chain-maind tx nft issue fftb2050 --name "Fortune Favours the Brave 2050" --schema '{ "Name": "string", "Description": "string" }' --from <user_address> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/chainmain.nft.v1.MsgIssueDenom",
    "id": "fftb2050",
    "name": "Fortune Favours the Brave 2050",
    "schema": "{ \"Name\": \"string\", \"Description\": \"string\" }",
    "sender": "cro18..."
}
```

{% endhint %}

{% hint style="info" %}
**NOTE** Even though the denom schema is not a compulsory field, it is generally recommended to illustrate the format of NFT metadata as an informative summary of such denom. Moreover, a denom is non-transferable, non-editable, and non-deletable, so be mindful when issuing a denom.
{% endhint %}

***

#### `mint`:

The specific nft of this type can be created after the nft is issued. The denom ID, token ID, recipient address and URI need to be specified.

**`tx nft mint [denom_id] [token_id] --name [token_name] --uri [token_uri] --data [token_metadata] --recipient [recipient_address] --from [user_address]`- Mint an NFT**

{% hint style="info" %}
Example: Mint an NFT with specified name, URI, data, and recipient

```bash
$ chain-maind tx nft mint fftb2050 v1ed1 --name "Version 1 Edition 1" --uri "https://crypto.com/fftb" --data '{ "Name": "v1", "Description": "ed1"}' --recipient <recipient_address> --from <user_address> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/chainmain.nft.v1.MsgMintNFT",
    "id": "v1ed1",
    "denom_id": "fftb2050",
    "name": "Version 1 Edition 1",
    "uri": "https://crypto.com/fftb",
    "data": "{ \"Name\": \"v1\", \"Description\": \"ed1\"}",
    "sender": "cro18...",
    "recipient": "cro18..."
}
```

{% endhint %}

{% hint style="info" %}
**NOTE** The token name, URI, and metadata fields are optional but highly recommended fields during the minting process, even though they might also be edited later through `edit`. In addition, the minter may specify a recipient of the new NFT, where it defaults to be just the minter if not specified.
{% endhint %}

***

#### `edit`:

Unlike NFTs minted on **Ethereum**, an NFT minted on **Cronos POS Chain** may easily be edited, provided that the user editing it is both the owner and creator of such NFT.

**`tx nft edit [denom_id] [token_id] --name [new_name] --uri [new_uri] --data [new_metadata] --from [user_address]`- Edit an NFT**

{% hint style="info" %}
Example: Edit an NFT to change its URI

```bash
$ chain-maind tx nft edit fftb2050 v1ed1 --uri "https://crypto.com/nft" --from <user_address> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/chainmain.nft.v1.MsgEditNFT",
    "id": "v1ed1",
    "denom_id": "fftb2050",
    "name": "[do-not-modify]",
    "uri": "https://crypto.com/nft",
    "data": "[do-not-modify]",
    "sender": "cro18..."
}
```

{% endhint %}

{% hint style="info" %}
**NOTE** There are 3 fields available for NFT editing: name, URI, and the metadata. Any field that is not specified will remain unchanged.
{% endhint %}

***

#### `burn`:

A user may burn an existing NFT as long as he/she is both the owner and creator of such NFT, similar to editing the NFT.

**`tx nft burn [denom_id] [token_id] --from [user_address]`- Burn an NFT**

{% hint style="info" %}
Example: Burn an NFT

```bash
$ chain-maind tx nft burn fftb2050 v1ed1 --from <user_address> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/chainmain.nft.v1.MsgBurnNFT",
    "id": "v1ed1",
    "denom_id": "fftb2050",
    "sender": "cro18..."
}
```

{% endhint %}

{% hint style="info" %}
**NOTE** A token ID is unique under a specific denom, meaning no two existing NFTs can share the same token ID under the same denom. However, when an NFT gets burnt, its token ID is freed and is available for mint again.
{% endhint %}

***

#### `transfer`:

Transferring an NFT is easy: one only needs to be the owner of the NFT.

**`tx nft transfer [recipient_address] [denom_id] [token_id] --from [granter_address]` - Transfer an NFT**

{% hint style="info" %}
Example: Transfer an NFT to a recipient

```bash
$ chain-maind tx nft transfer <recipient_address> fftb2050 v1ed1 --from <user_address> --chain-id <chain-id>

## Illustrative partial transaction payload ##
{
    "@type": "/chainmain.nft.v1.MsgTransferNFT",
    "id": "v1ed1",
    "denom_id": "fftb2050",
    "sender": "cro18...",
    "recipient": "cro1j..."
}
```

{% endhint %}

***

#### Queries

In the NFT module, queries can be divided into 3 main categories:

* denom information;
* token information;
* owner information.

***

* **query denom information:**

**`query nft denom [denom_id]` - Query information of a denom by its denom ID**

{% hint style="info" %}
Example: Query information of a denom by its denom ID

```bash
$ chain-maind query nft denom fftb2050 --output json | jq
{
  "id": "fftb2050",
  "name": "Fortune Favours the Brave 2050",
  "schema": "{ \"Name\": \"string\", \"Description\": \"string\" }",
  "creator": "cro18..."
}
```

{% endhint %}

Effectively, one may also query information of a denom by its denom name instead of denom id:

**`query nft denom-by-name [denom_name]` - Query information of a denom by its denom name**

To check the number of existing NFTs in a denom:

**`query nft supply [denom_id]` - Query the number of existing NFTs in a denom**

{% hint style="info" %}
Example: Query the number of existing NFTs in a denom

```bash
$ chain-maind query nft supply fftb2050
amount: "3"
```

{% endhint %}

In addition, one may query the number of existing NFTs in a denom of a specific owner through the `--owner` flag:

**`query nft supply [denom_id] --owner [owner_address]` - Query the number of existing NFTs in a denom of a specific owner**

{% hint style="info" %}
Example: Query the number of existing NFTs in a denom of a specific owner

```bash
$ chain-maind query nft supply fftb2050 --owner <owner_address>
amount: "2"
```

{% endhint %}

***

* **query token information:**

One may query information of a specific NFT with its UID (denom ID and token ID):

**`query nft token [denom_id] [token_id]` - Query information of an NFT**

{% hint style="info" %}
Example: Query information of an NFT

```bash
$ chain-maind query nft token fftb2050 v1ed1 --output json | jq
{
  "id": "v1ed1",
  "name": "Version 1 Edition 1",
  "uri": "https://crypto.com/fftb",
  "data": "{ \"Name\": \"v1\", \"Description\": \"ed1\"}",
  "owner": "cro1j..."
}
```

{% endhint %}

One may also query information of all NFTs under a specific denom:

**`query nft collection [denom_id]` - Query information of all NFTs under a specific denom**

{% hint style="info" %}
Example: Query information of all NFTs under a specific denom

```bash
$ chain-maind query nft collection fftb2050 --output json | jq
{
  "collection": {
    "denom": {
      "id": "fftb2050",
      "name": "Fortune Favours the Brave 2050",
      "schema": "{ \"Name\": \"string\", \"Description\": \"string\" }",
      "creator": "cro18..."
    },
    "nfts": [
      {
        "id": "v1ed1",
        "name": "Version 1 Edition 1",
        "uri": "https://crypto.com/fftb",
        "data": "{ \"Name\": \"v1\", \"Description\": \"ed1\"}",
        "owner": "cro1j..."
      },
      {
        "id": "v1ed2",
        "name": "Version 1 Edition 2",
        "uri": "https://crypto.com/fftb",
        "data": "{ \"Name\": \"v1\", \"Description\": \"ed2\"}",
        "owner": "cro1j..."
      },
      {
        "id": "v1ed3",
        "name": "Version 1 Edition 3",
        "uri": "https://crypto.com/fftb",
        "data": "{ \"Name\": \"v1\", \"Description\": \"ed3\"}",
        "owner": "cro18..."
      }
    ]
  },
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}
```

{% endhint %}

***

* **query owner information:**

Last but not least, information about a specific NFT owner may also be queried.

**`query nft owner [owner_address]` - Query information of all NFTs owned by a specific owner**

{% hint style="info" %}
Example: Query information of all NFTs owned by a specific owner

```bash
$ chain-maind query nft owner <owner_address> --output json | jq
{
  "owner": {
    "address": "cro1j...",
    "id_collections": [
      {
        "denom_id": "fftb2022",
        "token_ids": [
          "fftb1"
        ]
      },
      {
        "denom_id": "fftb2050",
        "token_ids": [
          "v1ed1",
          "v1ed2"
        ]
      }
    ]
  },
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}
```

{% endhint %}

One may also use the `--denom-id` flag to query owner NFT information under a specific denom:

**`query nft owner [owner_address] --denom-id [denom_id]` - Query information of all NFTs owned by a specific owner under specified denom**

{% hint style="info" %}
Example: Query information of all NFTs owned by a specific owner under specified denom

```bash
$ chain-maind query nft owner <owner_address> --denom-id fftb2050 --output json | jq
{
  "owner": {
    "address": "cro1j...",
    "id_collections": [
      {
        "denom_id": "fftb2050",
        "token_ids": [
          "v1ed1",
          "v1ed2"
        ]
      }
    ]
  },
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}
```

{% endhint %}


# module\_inflation

{% hint style="info" %}
`x/inflation` is a new module introduced in the v7 upgrade. It wraps `x/mint` and takes over the calculation of the effective inflation rate.
{% endhint %}

#### `inflation` module

#### Introduction

v7 introduces `x/inflation`, which controls the total supply cap and gradually reduces the inflation rate over time.

#### How inflation decay works

The inflation rate decreases each month by a fixed percentage (compound decay), so early stakers benefit from higher inflation before it tapers off.

```
inflation_rate = base_rate × (1 − decay_rate) ^ months_elapsed

Where:
  base_rate      = 1% (fixed; InflationMin = InflationMax = 0.01)
  decay_rate     = 6.8% per month
  months_elapsed = blocks since upgrade height ÷ blocks per month
```

Inflation is always ≥ 0 and never goes negative.

#### Mainnet parameters

| Parameter   | Value                           |
| ----------- | ------------------------------- |
| Max supply  | 100 billion CRO (10^19 basecro) |
| Decay rate  | 6.8% per month                  |
| Decay start | v7 upgrade block height         |
| Base rate   | 1% (fixed min/max)              |

{% hint style="warning" %}
The chain halts if circulating supply exceeds the max supply cap. Balances held at designated burn addresses are excluded from the circulating supply calculation.
{% endhint %}

#### Query inflation parameters

```bash
# CLI
chain-maind query inflation params

# REST
GET https://rest.mainnet.crypto.org/chainmain/inflation/v1/params
```

All parameters are governance-adjustable.

| Query    | Description                                            |
| -------- | ------------------------------------------------------ |
| `params` | Returns `max_supply`, `decay_rate`, `burned_addresses` |

#### **Transactions:**

| Transaction       | Description                                   |
| ----------------- | --------------------------------------------- |
| `MsgUpdateParams` | Update inflation parameters (governance only) |


# module\_inflation (including mint)

{% hint style="info" %}
As of the v7 upgrade(May 2026), The effective inflation is now controlled by the new `module_inflation`, which wraps `module_mint` (See [here](https://github.com/crypto-org-chain/chain-main/discussions/1291) for the full proposal).

To avoid splitting the explanation across two pages, both modules are documented together here.
{% endhint %}

## `inflation` module

### Introduction

v7 introduces `x/inflation`, which controls the total supply cap and gradually reduces the inflation rate over time.

### Overview

#### How inflation decay works

The inflation rate decreases each month by a fixed percentage (compound decay), so early stakers benefit from higher inflation before it tapers off.

```
inflation_rate = base_rate × (1 − decay_rate) ^ months_elapsed

Where:
  base_rate      = 1% (fixed; InflationMin = InflationMax = 0.01)
  decay_rate     = 6.8% per month
  months_elapsed = blocks since upgrade height ÷ blocks per month
```

Inflation is always ≥ 0 and never goes negative.

#### Mainnet parameters

| Parameter   | Value                           |
| ----------- | ------------------------------- |
| Max supply  | 100 billion CRO (10^19 basecro) |
| Decay rate  | 6.8% per month                  |
| Decay start | v7 upgrade block height         |
| Base rate   | 1% (fixed min/max)              |

{% hint style="warning" %}
The chain halts if circulating supply exceeds the max supply cap. Balances held at designated burn addresses are excluded from the circulating supply calculation.
{% endhint %}

### **Transactions And** Query

#### Query inflation parameters

```bash
# CLI
chain-maind query inflation params

# REST
GET https://rest.mainnet.crypto.org/chainmain/inflation/v1/params
```

All parameters are governance-adjustable.

| Query    | Description                                            |
| -------- | ------------------------------------------------------ |
| `params` | Returns `max_supply`, `decay_rate`, `burned_addresses` |

#### **Transactions:**

| Transaction       | Description                                   |
| ----------------- | --------------------------------------------- |
| `MsgUpdateParams` | Update inflation parameters (governance only) |

***

## `mint` module

{% hint style="warning" %}
As of the v7 upgrade(May 2026), the `x/mint` parameters `inflation_min`, `inflation_max`, and `inflation_rate_change` have been pinned to static values: (InflationMin = InflationMax = 0.01, InflationRateChange = 0). The `bonded-ratio` based dynamic inflation described on this page no longer drives the live rate. **So the formulas and parameter semantics described below are for historical reference only after v7** (See [here](https://github.com/crypto-org-chain/chain-main/discussions/1291) for the full proposal).

The effective inflation is now controlled by the new `x/inflation` module([above](#inflation-module)), which wraps `x/mint` and applies a 6.8% monthly compound decay. A hard 100B CRO `MaxSupply` cap and explicit `BurnedAddresses` list were also introduced.
{% endhint %}

### Introduction

The `mint` module is responsible for creating tokens in a flexible way to reward the validators who participate in the proof of stake consensus process (see also the [distribution module](/cronos-pos-chain-protocol/module_overview/module_distribution)). It is also designed in a way to bring a balance between market liquidity and staked supply.

### Overview

#### **Network parameters**

Below are all the network parameters for the `mint` module:

* `"blocks_per_year"` - The expected number of blocks being produced per year;
* `"goal_bonded"` - Goal of bonded token in percentage;
* `"inflation_max"` - Maximum annual inflation rate;
* `"inflation_min"` - Minimum annual inflation rate;
* `"inflation_rate_change"` - Maximum annual change in inflation rate;
* `"mint_denom"` - Token type being minted.

The target annual inflation rate is recalculated for each previous cycle. The inflation is also subject to a rate change (positive or negative) depending on the distance from the desired ratio (`"goal_bonded"`). The maximum rate change possible is defined to be `"inflation_rate_change"` per year, where the annual inflation is capped as between `"inflation_min"` and `"inflation_max"`.

#### **Parameters explained**

`"goal_bonded"`&#x20;

Goal of bonded token in percentage (also called staking ratio), the changes of the reward and the inflation rate related to this parameter can be summarized as follows cases:

* If the staking ratio is **below** the `"goal_bonded"` , the inflation rate will increase until reaching a maximum upper bound (`"inflation_max"`);
* If the staking ratio is **equal** to `"goal_bonded"`, the inflation rate will stay constant;
* If the staking ratio is **above** the `"goal_bonded"`, it will decrease until reaching a minimum lower bound `"inflation_min"`).

`"inflation_rate_change"`&#x20;

Maximum annual change in inflation rate, represents the maximum percentage by which the inflation rate can change in a year.&#x20;

### Emissions and supply of $CRO

The current emissions and supply of $CRO and its emission projections can be easily queried directly from URLs, as described in this section.

#### How inflation rate is calculated

The magnitude of the rate of change of the inflation rate is controlled by an additional factor, which is the ratio between the current bonded ratio with the `"goal_bonded"`, the inflation rate is updated at the end of every block accordingly to the following formula:

```
Inflation Rate = min(max(params.InflationMin, currentInflation + ((1 - bondedRatio / params.GoalBonded) * params.InflationRateChange / params.BlocksPerYear)), params.InflationMax)
```

Or simply, when the inflation rate within the maximum and the minimum bounds

```
current inflation + ((1 - bondedRatio / params.GoalBonded) * params.InflationRateChange / params.BlocksPerYear)),
```

as

<figure><img src="/files/xRpe1L9kzOohY64Yay1L" alt=""><figcaption></figcaption></figure>

This function then updates the current inflation rate by adding the inflationRateChange to it. Finally, the function checks that the updated inflation rate is within the range defined by the InflationMin and InflationMax parameters, and returns the resulting inflation rate.

{% hint style="info" %}
From V7 upgrade, `params.InflationRateChange` is fixed to 0, fixing `Inflation Rate` above finally at 1%.
{% endhint %}

#### How emissions are calculated

#### **Annual provisions**

The emission of the Cronos POS Chain is controlled by the inflation rate and the total supply of $CRO. New $CRO tokens are minted at each block and distributed as block rewards to delegators. The inflation rate determines the amount of $CRO emitted to delegators at each block, with emissions being distributed as staking rewards according to the Proof-of-Stake consensus mechanism.

The annualized quantity of $CRO emitted is called Annual Provisions. It can be calculated based on the inflation rate with:

```
Annual provisions = Inflation rate * Total supply of CRO
```

{% hint style="info" %}
At any point, the inflation, in annualized percentage increase of CRO supply, can be queried from <https://rest.mainnet.cronos-pos.org/cosmos/mint/v1beta1/inflation>.
{% endhint %}

This can be seen in the [following code](https://github.com/cosmos/cosmos-sdk/blob/main/x/mint/types/minter.go#L74) in the Cosmos SDK:

```
m.Inflation.MulInt(totalSupply)
```

{% hint style="info" %}
**Easy to use endpoints to query $CRO emissions**

* The current value of annual provisions of CRO can be queried at any time [at this endpoint](https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/annual_provisions).
* The total supply of CRO can be queried at any time [at this endpoint](https://rest.mainnet.crypto.org/cosmos/bank/v1beta1/supply/by_denom?denom=basecro)&#x20;

Note: These numbers are provided in basecro, where `1 CRO = 10^8 basecro` on the Cronos POS chain.

* Annualized emissions can also be seen on the Blockchain Explorer at <https://cronos-pos.org/explorer> under "Events" of each block.
* This annualized emission value can be derived into a per-block value (see [#block-provisions](#block-provisions "mention")), using the block per year value provided by the following endpoint: \
  <https://rest.mainnet.cronos-pos.org/cosmos/mint/v1beta1/params>
  {% endhint %}

#### **Block provisions**

To calculate the number of $CRO emitted to delegators at each block, we need to divide the Annual Provisions by the expected number of blocks per year (`blocks_per_year`, an be queried at any time [at this endpoint](https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/params))

The resulting number is called the "Block Provision":

```
Reward per block = Block Provision = Annual provisions / Expected blocks per year
```

This can be seen in the [following code](https://github.com/cosmos/cosmos-sdk/blob/main/x/mint/types/minter.go#L80) in the CosmosSDK:

```
m.AnnualProvisions.QuoInt(math.NewInt(int64(params.BlocksPerYear)))
```

#### Total and Circulating Supply of $CRO

* The **Total Supply** refers to the total amount of $CRO that has been created on Cronos POS chain;
* The **Circulating Supply** refers to the total supply minus the amount stored in the "[burn address](https://cronos-pos.org/explorer/account/cro1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqtcgxmv)", which has effectively been taken out of circulation by [community burn governance proposals](https://blog.cronos-pos.org/p/cro-community-burn-proposal-explainer), i.e.

```
Circulating Supply = Total supply - [$CRO balance held in the burn address]
```

{% hint style="info" %}
**Easy to use endpoints to query $CRO supplies:**

* The current **total supply** of $CRO can be obtained [here](https://cronos-pos.org/explorer/api/v1/supply/total).
* The current **circulating supply** of $CRO can be obtained [here](https://cronos-pos.org/explorer/api/v1/supply/circulating).
* The current **burned amount** of $CRO can be obtained [here](https://cronos-pos.org/explorer/api/v1/supply/burned).

*Note -* This number is provided in `basecro`, where *1 CRO = 10^8 `basecro`* on the Cronos POS chain.

* Total burned amount and progress can be found in the [Cronos Burninfo page](https://burninfo.cronos-pos.org/).
  {% endhint %}

***

### Queries

**Query the current minting annual provisions value**

We can query the current minting annual provisions value, for example:

{% tabs %}
{% tab title="curl" %}

```
$ curl -X GET "https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/annual_provisions"
{ "annual_provisions": "100346483960386394.920000000000000000" }
```

implies that the current minting annual provisions will be 100346483960386394 basecro ( i.e. `1,003,464,839` CRO)
{% endtab %}

{% tab title="chain-maind cli" %}

```
$ chain-maind query mint annual-provisions 
100346483960386394
```

{% endtab %}
{% endtabs %}

**Query the current minting inflation value**

We can query the current minting inflation value, for example:

{% tabs %}
{% tab title="curl" %}

<pre><code><strong>$ curl -X GET "https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/inflation"
</strong>{
  "inflation": "0.010000000000000000"
}
</code></pre>

{% endtab %}

{% tab title="chain-maind cli" %}

```
 $ chain-maind query mint inflation
  0.037000000000000000
```

implies that the inflaction rate is `3.7%`&#x20;
{% endtab %}
{% endtabs %}

&#x20;**Query the current minting parameters**

We can query the current query parameters by

{% tabs %}
{% tab title="curl" %}

<pre><code><strong>$ curl -X GET "https://rest.mainnet.crypto.org/cosmos/mint/v1beta1/params"
</strong>
{
  "params": {
    "mint_denom": "basecro",
    "inflation_rate_change": "0.000000000000000000",
    "inflation_max": "0.010000000000000000",
    "inflation_min": "0.010000000000000000",
    "goal_bonded": "0.600000000000000000",
    "blocks_per_year": "6311520"
  }
}
</code></pre>

{% endtab %}

{% tab title="chain-maind cli" %}

```
$ chain-maind query mint params --output json | jq

{
  "mint_denom": "basecro",
  "inflation_rate_change": "0.000000000000000000",
  "inflation_max": "0.010000000000000000",
  "inflation_min": "0.010000000000000000",
  "goal_bonded": "0.600000000000000000",
  "blocks_per_year": "6311520"
}
```

{% endtab %}
{% endtabs %}

| Parameter               | Value                        | Description                                                            |
| ----------------------- | ---------------------------- | ---------------------------------------------------------------------- |
| `inflation_max`         | `0.01` (fixed value from V7) | Maximum annual inflation rate (1%)                                     |
| `inflation_min`         | `0.01` (fixed value from V7) | Minimum annual inflation rate (1%)                                     |
| `inflation_rate_change` | `0` (fixed value from V7)    | Maximum annual change in inflation rate (fixed, no dynamic adjustment) |

***

### Appendix

**`gov` module: Network Parameters and configuration**

The following tables show overall effects on different configurations of the mint related network parameters:

|                      | `blocks_per_year`                  | `goal_bonded`                        | `mint_denom` |
| -------------------- | ---------------------------------- | ------------------------------------ | ------------ |
| Type                 | string (uint64)                    | string (dec)                         | string       |
| Higher               | More expected blocks per year      | Higher target bonding ratio          | N/A          |
| Lower                | Less expected blocks per year      | Lower target bonding ratio           | N/A          |
| Constraints          | Value has to be a positive integer | Value has to be less or equal to `1` | N/A          |
| Sample configuration | `5256000` (5,256,000 blocks)       | `0.66` (66%)                         | `basecro`    |

|                      | `inflation_max`              | `inflation_min`              | `inflation_rate_change` |
| -------------------- | ---------------------------- | ---------------------------- | ----------------------- |
| Type                 | string (dec)                 | string (dec)                 | string (dec)            |
| Higher               | N/A                          | N/A                          | N/A                     |
| Lower                | N/A                          | N/A                          | N/A                     |
| Constraints          | fixed to `0.01` (1%) from V7 | fixed to `0.01` (1%) from V7 | fixed to `0` from V7    |
| Sample configuration | `0.01` (1%)                  | `0.01` (1%)                  | `0` (0%)                |


# module\_tieredrewards

#### `tier_rewards` module

#### Introduction

Manages tiered staking positions with bonus APY on top of base staking rewards. Introduced in v7.0.0, CRO holders can lock their stake for a defined exit commitment period (1/2/4 years) in exchange for bonus APY (up to +7%).&#x20;

The module also maintains a base reward floor (\~3% APY) by topping up shortfalls from the Tier Rewards Pool.

#### How tiered staking mechanism works

Kindly go [here](/cronos-pos-chain-protocol/tiered-staking) for the details.

#### Transactions and Queries

**Transactions:**

| Transaction                 | Description                                            |
| --------------------------- | ------------------------------------------------------ |
| `lock-tier`                 | Lock fresh CRO into a tier and delegate to a validator |
| `commit-delegation-to-tier` | Convert existing delegation into a tier position       |
| `add-to-tier-position`      | Add tokens to an existing position                     |
| `tier-redelegate`           | Move position to a different validator                 |
| `claim-tier-rewards`        | Claim pending base + bonus rewards                     |
| `trigger-exit`              | Start exit commitment countdown                        |
| `clear-position`            | Cancel a triggered exit                                |
| `exit-tier-with-delegation` | Instant exit (no unbonding)                            |
| `tier-undelegate`           | Start standard 28-day unbonding                        |
| `withdraw-from-tier`        | Withdraw tokens after unbonding                        |

**Queries:**

| Query                       | Description                                 |
| --------------------------- | ------------------------------------------- |
| `tiers`                     | All tier definitions                        |
| `params`                    | Module parameters (`TargetBaseRewardsRate`) |
| `position`                  | Single position by ID                       |
| `positions-by-owner`        | All positions for an address                |
| `estimate-position-rewards` | Estimated pending rewards                   |
| `rewards-pool-balance`      | Current rewards pool balance                |
| `voting-power`              | Governance voting power from tier positions |


# Integration documentation

## Useful Links

* [Cronos POS Chain website](https://crypto.org/)
* [GitHub Repository](https://github.com/crypto-org-chain/chain-main)

## Node and RPC setup notes

[Node Setup and RPC note](/cronos-pos-integration/node-and-rpc-setup-notes)

## Setup Guide

* **Mainnet**:
  * [Running a full node](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet)
  * [Running a validator](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator)
  * [Mainnet Validator Security Checklist](https://docs.cronos-pos.org/for-node-hosts/getting-started/security-checklist)
* **Testnet**:
  * [Joining the Croeseid Testnet](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet)
  * [Deploy testnet node with nix](https://docs.cronos-pos.org/for-node-hosts/getting-started/croeseid-testnet-nix)
* **Devnet**
  * [Running the latest development network locally](https://docs.cronos-pos.org/for-node-hosts/getting-started/local-devnet)

## API Documentation

There are a few ways to access the Cronos POS Chain

1. **Tendermint RPC**

* Raw but most-completed data
* Hosted documentation (use the latest master only): <https://docs.tendermint.com/master/rpc/>
* Swagger file: <https://github.com/tendermint/tendermint/blob/v0.34.3/rpc/openapi/openapi.yaml>

2. **gRPC Based**

* Processed chain information. Old state may be pruned from time-to-time. To avoid state pruning, update `pruning = "nothing"` in `~/.chain-maind/config/app.toml`
* There are two query methods based on gRPC:
  1. [gRPC Server](https://github.com/crypto-org-chain/chain-integration/blob/master/grpc/README.md)
  2. [gRPC Proxy RESTful Server](https://github.com/crypto-org-chain/chain-integration/blob/master/grpc-proxy-rest/README.md)
     * [Swagger UI](https://v1.cosmos.network/rpc/v0.41.4)
     * [Swagger file](https://github.com/crypto-org-chain/chain-integration/blob/master/grpc-proxy-rest/swagger.yml)

## API Clients and libraries

* [**TypeScript** library](https://github.com/crypto-org-chain/chain-jslib)
* [**Python** library](https://pypi.org/project/chainlibpy/#description)
* [**Rust** library](https://github.com/crypto-org-chain/chainlib-rs) (note that it is not feature complete)
* [@cosmjs/stargate](https://github.com/cosmos/cosmjs/tree/master/packages/stargate)

## Indexing

* [chain-indexing](https://github.com/crypto-com/chain-indexing) (indexing on-chain data)

## Node Monitoring (Prometheus)

The Ansible playbook for deploying Prometheus and some rules we are using are under [chain-integration/monitoring](https://github.com/crypto-org-chain/chain-integration/tree/master/monitoring).

## Public Nodes

### Mainnet - `crypto-org-chain-mainnet-1`

* [Tendermint](https://rpc.mainnet.crypto.org/)
* [Cosmos RESTful gRPC](https://rest.mainnet.crypto.org/)

### Croeseid Testnet - `testnet-croeseid-4`

* [Tendermint](https://testnet-croeseid-4.crypto.org:26657/)
* [Cosmos RESTful gRPC](https://testnet-croeseid-4.crypto.org:1317/)

## Block Explorer

### Mainnet

[https://](https://crypto.org/explorer)[cronos-pos.org/explorer](http://cronos-pos.org/explorer)

### Croeseid Testnet

[https://cronos-pos.org/explorer/croeseid4](https://crypto.org/explorer/croeseid4/)

## Community

[Discord](https://discord.gg/5JTk2ppsY3)


# Node Setup and RPC node

## Node minimum setup

Here we will be using a local `chain-maind` folder as the home directory. By default chain data are stored in your home directory `~/.chain-maind`. For example, when joining the testnet `testnet-croeseid-4`:

```bash
./chain-maind init mynode --chain-id testnet-croeseid-4 --home ./chain-maind

sed -i.bak -E 's#^(persistent_peers[[:space:]]+=[[:space:]]+).*$#\1"b2a4c8db43b815e1ed83ab4723a6af84ccb8e3e4@13.213.110.242:26656,c76d7d28141daf037bec919268d0f38e64fd8389@3.1.240.30:26656"#' ~/.chain-maind/config/config.toml
sed -i.bak -E 's#^(create_empty_blocks_interval[[:space:]]+=[[:space:]]+).*$#\1"5s"#' ~/.chain-maind/config/config.toml
sed -i.bak -E 's#^(timeout_commit[[:space:]]+=[[:space:]]+).*$#\1"2s"#' ~/.chain-maind/config/config.toml  
```

### Enable API and gRPC server

Edit `./chain-main/config/app.toml` and update the following section

```toml
[api]

# Enable defines if the API server should be enabled.
enable = true

# Swagger defines if swagger documentation should automatically be registered.
swagger = true

# Address defines the API server to listen on.
address = "tcp://0.0.0.0:1317"

...

[grpc]

# Enable defines if the gRPC server should be enabled.
enable = true

# Address defines the gRPC server address to bind to.
address = "0.0.0.0:9090"
```

### Start the node

Afterward, you should be able to start you node by running

```bash
./chain-maind start --home ./chain-maind/
```

where the blockchain data, keys will be stored at the folder `<current_path>/chain-maind/`

## Access RPC server

### Tendermint (Local access only)

You can access Tendermint Swagger UI here: <https://docs.tendermint.com/master/rpc/#/>

Switch the servers to localhost in the dropdown and you can interact with the Swagger UI.

### gRPC

There are a few clients our team has used before

#### BloomRPC

* <https://github.com/uw-labs/bloomrpc>
* GUI client for GRPC services

#### grpcurl

* <https://github.com/fullstorydev/grpcurl>
* Like curl, but for gRPC
* Install grpcurl (Mac)

  ```bash
  brew install grpcurl
  ```

  for other OSs please refer to GitHub
* Query gRPC API

  ```bash
  grpcurl -plaintext localhost:9090 list

  cd grpc/proto
  grpcurl -proto ./cosmos/staking/v1beta1/query.proto -plaintext localhost:9090 cosmos.staking.v1beta1.Query.Validators
  ```

  The reason we have to go to the `grpc/proto` directory is that gRPC will look for proto files dependency, and they expect that to be under the path you are currently at. To avoid this limitation, we can specify the proto import path.

  ```bash
  grpcurl -import-path ./grpc/proto -proto ./grpc/proto/cosmos/staking/v1beta1/query.proto -plaintext localhost:9090 cosmos.staking.v1beta1.Query.Validators
  ```
* More query examples

  ```bash
  grpcurl -d ' {"validator_addr": "tcrocncl1l74wnswzx4zsmv674tl99h3h3fgj3al2tdzne7"}' -import-path ./grpc/proto -proto ./grpc/proto/cosmos/staking/v1beta1/query.proto -plaintext localhost:9090 cosmos.staking.v1beta1.Query.Validator
  ```

## Tricks on creating a validator on testnet

1. Make sure your node is fully synced before you join as a validator.
2. Gas price error

   Sometimes the `create-valiator` may fail because of the gas. You can use the following command instead (notice we have provided `--gas` and `--gas-price`)

   ```bash
   $ ./chain-maind tx staking create-validator \
   --from=[name_of_your_key] \
   --amount=500000tcro \
   --pubkey='{"@type":"/cosmos.crypto.ed25519.PubKey","key":"PUBLIC_KEY"}'  \
   --moniker="[The_id_of_your_node]" \
   --security-contact="[security contact email/contact method]" \
   --chain-id="testnet-croeseid-4" \
   --commission-rate="0.10" \
   --commission-max-rate="0.20" \
   --commission-max-change-rate="0.01" \
   --min-self-delegation="1" \
   --gas="auto" \
   --gas-price="0.1basetcro"
   ```


# Blocks and Transactions

This document describes the block and transaction structure of the Cronos POS Chain and explains different ways to extract and parse the details of them.

## Table of Content

* [Cronos POS Blocks and Transactions](#cryptoorg-chain-blocks-and-transactions)
  * [Table of Content](#table-of-content)
  * [Common APIs](#common-apis)
    * [1. Tendermint Block API](#_1-tendermint-block-api)
    * [2. Tendermint Block Results API](#_2-tendermint-block-results-api)
    * [3. Cosmos Transaction Query API](#_3-cosmos-transaction-query-api)
    * [4. Cosmos Transaction Search API](#_4-cosmos-transaction-search-api)
  * [Common Block Details](#common-block-details)
    * [1. Mint](#_1-mint)
    * [2. Block Rewards](#_2-block-rewards)
    * [3. Proposer Rewards](#_3-proposer-rewards)
    * [4. Commissions](#_4-commissions)
  * [Common Transaction Details](#common-transaction-details)
    * [1. Block Height](#_1-block-height)
    * [2. Transaction Hash](#_2-transaction-hash)
    * [3. Transaction Fee](#_3-transaction-fee)
    * [4. Assets and Amount](#_4-assets-and-amount)
      * [1. Single object](#_1-single-object)
      * [2. Array](#_2-array)
      * [3. String](#_3-string)
  * [Bank](#bank)
    * [1. MsgSend](#_1-msgsend)
    * [2. MsgMultiSend](#_2-msgmultisend)
  * [Distribution](#distribution)
    * [1. MsgSetWithdrawAddress](#_1-msgsetwithdrawaddress)
    * [2. MsgWithdrawDelegatorReward](#_2-msgwithdrawdelegatorreward)
    * [3. MsgWithdrawValidatorCommission](#_3-msgwithdrawvalidatorcommission)
    * [4. MsgFundCommunityPool](#_4-msgfundcommunitypool)
  * [Staking](#staking)
    * [1. MsgCreateValidator](#_1-msgcreatevalidator)
    * [2. MsgEditValidator](#_2-msgeditvalidator)
    * [3. MsgDelegate](#_3-msgdelegate)
    * [4. MsgBeginRedelegate](#_4-msgbeginredelegate)
    * [5. MsgUndelegate](#_5-msgundelegate)
      * [5a. Upon MsgUndelegate completed](#_5a-upon-msgundelegate-completed)
  * [Slashing](#slashing)
    * [1. MsgUnjail](#_1-msgunjail)
    * [2. Being Jailed and Slashed](#_2-being-jailed-and-slashed)
      * [Liveness](#liveness)
      * [Double Sign](#double-sign)
      * [Limitations](#limitations)
  * [Governance](#governance)
    * [1. MsgSubmitProposal](#_1-msgsubmitproposal)
      * [1a. Community Pool Spend Proposal](#_1a-community-pool-spend-proposal)
    * [2. MsgDeposit](#_2-msgdeposit)
      * [2a. Burn Proposal's Deposit if Proposal does not Get Enough Deposit](#_2a-burn-proposals-deposit-if-proposal-does-not-get-enough-deposit)
      * [2b. Return Proposal's Deposit](#_2b-return-proposals-deposit)
      * [2c. Burn Proposal's Deposit](#_2c-burn-proposals-deposit)
    * [3. MsgVote](#_3-msgvote)
    * [4. Proposal Result](#_4-proposal-result)
  * [Appendix: Module Accounts on Mainnet](#appendix-module-accounts-on-mainnet)

## Common APIs

### Tendermint

### 1. Tendermint Block API

* **URL format:** <https://rpc.mainnet.crypto.org/block?height=>\[height]
* This API returns block details, a list of *transaction bytes* and *consensus commits*.&#x20;

{% hint style="info" %}
**Example: Checking the block at height `10000` of the mainnet:**\
[https://](https:/rpc.mainnet.crypto.org/block?height=10000)[rpc.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[/block?height=10000](https:/rpc.mainnet.crypto.org/block?height=10000)
{% endhint %}

### 2. Tendermint Block Results API

* **URL format:** [https://rpc.mainnet.crypto.org/block\_results?height=](https://rpc.mainnet.crypto.org/block_results?height=10000)\[height]
* This API returns the events of the block. These events include the outcomes from transactions, and block changes such as block rewards minted (`"mint"`) and distributed as well as consensus state updates such as validator missing block counts (`"liveness"`)

{% hint style="info" %}
Example: Checking the block result of height `10000`of the mainnet:\
[https://](https://rpc.mainnet.crypto.org/block_results?height=10000)[rpc.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[/block\_results?height=10000](https://rpc.mainnet.crypto.org/block_results?height=10000)
{% endhint %}

### Cosmos

### 3. Cosmos Transaction Query API

* **URL format:** [https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs)\[Transaction\_Hash]
* This API returns the parsed transaction details and events of a particular transaction hash
* **Example**: <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/0C5E617B0577B047D78EBF5313B8B70DF69E9535E17B964303BD04947B11B660>

### 4. Cosmos Transaction Search API

* **URL format:** <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs>
* This API support event-based query and returns parsed transactions. Common events include:

| Event                           | Description                                                                                                                                            | Example                                                                                                                                                                                                     |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| tx.height                       | Transaction(s) in a particular block                                                                                                                   | [txs?events=tx.height%3D10000](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs?events=tx.height%3D10000)                                                                                              |
| message.module & message.action | Search for messages belonged to a particular module and actions. *Note that this index will degrade when more transaction of its kind grows in number* | [txs?events=message.module%3D%27bank%27\&events=message.action%3D%27send%27](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs?events=message.module%3D%27bank%27\&events=message.action%3D%27send%27)  |
| message.sender                  | Search for message with particular signer                                                                                                              | [/txs?events=message.sender=%27cro18undzhe3fmmav2x3csx8m00m5yupkcc7qzz4ec%27](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs?events=message.sender=%27cro18undzhe3fmmav2x3csx8m00m5yupkcc7qzz4ec%27) |

**Note**:

1. The API supports pagination, make sure you have iterate all the pages `pagination.offset=[offset starting from 0]&pagination.limit=[record per page]`
2. The performance will degrade if you are searching for a result set that will grow over time. For example, if we search for events that grow with the block height, such as validator's reward distrubtion.
3. Multiple events in a single search are queried by `AND` condition. i.e If you do `tx.height` and `message.sender`. It will search for transactions that happened on that particular block height **AND** signed by the sender.

[Top](#table-of-content)

## Common Block Details

Most of the block events can be accessed using the [Tendermint Block Results API](#_2-tendermint-block-results-api). One caveat of using this API is that all the events key-value attributes are base64 encoded. Therefore it is **non-human readable**.

A simple Node.js tool has been written to help parse and decode all key-value attributes in the block results API response. It can be downloaded at <https://github.com/calvinaco/cosmos-api-tools>.

{% hint style="info" %}
Usage example:

```bash
$ git clone https://github.com/calvinaco/cosmos-api-tools
$ cd cosmos-api-tools
$ node block-results-decoder.js "https://rpc.mainnet.crypto.org/block_results?height=10000"
```

{% endhint %}

Note that when you integrate with the API you should still base64 decode the attributes programmatically.

### 1. Mint

In every block, CRO is minted and offered to the active validators and their delegators as block rewards. The actual minted token is subject to inflation and is adjusted every block. Further details on the minting parameters and configuration can be found [here](https://docs.cronos-pos.org/cronos-pos-chain-protocol/module_overview/module_mint).

Minted tokens are distributed as blocks and proposer rewards in the same block. However, since Cosmos SDK does the [lazy rewards calculation and collection](https://docs.cosmos.network/main/build/modules/distribution#shortcomings), the minted tokens are first sent to the "Distribution" module account and are later transferred to an account when a delegator withdraws the rewards or commissions by sending a [MsgWithdrawDelegatorReward](#_2-msgwithdrawdelegatorreward) or [MsgWithdrawValidatorCommission](#_3-msgwithdrawvalidatorcommission).

So [Block Rewards](#_2-block-rewards), [Proposer Rewards](#_3-proposer-rewards) and [Commissions](#_4-commissions) events are for record-keeping only and do not represent any actual token transfer between accounts.

To get the minted token every block:

| Accessor                                                                                                                                                                                                                                                                                                                      | Type                          |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| <p><code>Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>Base64Decode(result.begin\_block\_events\[event\_index].type) === "mint" && Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "amount"</code></p> | [Asset String](#asset-string) |

### 2. Block Rewards

In every block, mint tokens and transaction fees are distributed to every active validator in the network. As a result, there will be multiple events, each corresponding to a validator and the rewards it receives.

Block rewards are **not** credited to the delegator account directly. This event serves as a record-keeping purpose only. Each delegator account must explicitly send a [MsgWithdrawDelegatorReward](#_2-msgwithdrawdelegatorreward) message transaction to collect the rewards.

To get the reward **per validator**:

| Detail            | Accessor                                                                                                                                                                                                                                                                                                                            | Type                          |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| Validator Address | <p><code>Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>Base64Decode(result.begin\_block\_events\[event\_index].type) === "rewards" && Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "validator"</code></p> | [Asset String](#asset-string) |
| Reward Amount     | <p><code>Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>Base64Decode(result.begin\_block\_events\[event\_index].type) === "rewards" && Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "amount"</code></p>    | String                        |

### 3. Proposer Rewards

Block proposers can get extra transaction fees bonus for the block they have successfully proposed. More details can be found [here](https://docs.cronos-pos.org/cronos-pos-chain-protocol/module_overview/module_distribution) for reference.

Similar to block rewards, proposer rewards are **not** credited to the account directly. This event serves as a record-keeping purpose only. Each validator creator account must explicitly send a [MsgWithdrawDelegatorReward](#_3-msgwithdrawvalidatorcommission) message transaction to collect the rewards.

| Detail            | Accessor                                                                                                                                                                                                                                                                                                                                     | Type                          |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| Validator Address | <p><code>Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>Base64Decode(result.begin\_block\_events\[event\_index].type) === "proposer\_reward" && Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "validator"</code></p> | [Asset String](#asset-string) |
| Reward Amount     | <p><code>Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>Base64Decode(result.begin\_block\_events\[event\_index].type) === "proposer\_reward" && Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "amount"</code></p>    | String                        |

### 4. Commissions

Validator can charge a commission to the block rewards received by delegators. Commissions is already included in [Block Rewards](#_2-block-rewards) and [Proposer Rewards](#_3-proposer-rewards)

Similar to block rewards, commission rewards are **not** credited to the account directly. This event serves as a record-keeping purpose only. Each validator creator account must explicitly send a [MsgWithdrawValidatorCommission](#msg-withdraw-validator-commission) message transaction to collect the rewards.

To get the commission received by **each validator**:

| Detail            | Accessor                                                                                                                                                                                                                                                                                                                            | Type                          |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| Validator Address | <p><code>Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>Base64Decode(result.begin\_block\_events\[event\_index].type) === "rewards" && Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "validator"</code></p> | [Asset String](#asset-string) |
| Commission Amount | <p><code>Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>Base64Decode(result.begin\_block\_events\[event\_index].type) === "rewards" && Base64Decode(result.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "amount"</code></p>    | String                        |

[Top](#table-of-content)

## Common Transaction Details

### 1. Block Height

* [Tendermint Block API](#_1-tendermint-block-api): `result.block.header.height`
* [Tendermint Block Results API](#_2-blocktendermint-block-results-api): `result.height`
* [Cosmos Transaction Query API](#_3-cosmos-transaction-query-api): `tx_response.height`
* [Cosmos Transaction Search API](#_4-cosmos-transaction-search-api): `tx_response[index].height`

### 2. Transaction Hash

* [Tendermint Block API](#_1-tendermint-block-api): `Uppercase(SHA256(Base64Decode(result.block.data.txs[index])))`
* [Tendermint Block Results API](#_2-blocktendermint-block-results-api): Not available, should use [Tendermint Block API](#tendermint-block-api). Match transaction `[index]` in `result.txs_results` with `result.block.data.txs[index]`
* [Cosmos Transaction Query API](#_3-cosmos-transaction-query-api): `tx_response.txhash`
* [Cosmos Transaction Search API](#_4-cosmos-transaction-search-api): `tx_response[index].txhash`

### 3. Transaction Fee

* [Cosmos Transaction Query API](#_3-cosmos-transaction-query-api): `tx.auth_info.fee.amount`
* [Cosmos Transaction Search API](#_4-cosmos-transaction-search-api): `tx[index].auth_info.fee.amount`

Transaction fee is an [Asset Array](#_2-array), meaning that a transaction can pay fee in more than one token types.

### 4. Assets and Amount

There are mainly two types of assets and amount representation:

#### 1. Single object

This is commonly seen in `staking` module but may appear in other modules as well. It represents a single token type.

**Example**

```json
{
  "denom": "basecro",
  "amount": "10000"
}
```

where `denom` is the asset type and `amount` is the amount and `basecro` is the basic unit of CRO token (where 10^8 `basecro` = 1 cro)

Note that the `amount` is always in string for precision accuracy. Please make sure your language is capable of handling big integer numbers. It is highly recommended to use library similar to [bignumber.js](https://mikemcl.github.io/bignumber.js/) in your language to handle the `amount`.

#### 2. Array

This is commonly seen in most message types. It represents a list of tokens.

At the time of writing, there will only be a single entry in this array because `basecro` (or `basetcro` in Croeseid Testnet) is the only supported asset on Cronos POS Chain. However, after IBC transfer and other coins issuance methods are enabled, there will be more asset types, the coin source tracing and their denomination can be found [here](https://github.com/cosmos/cosmos-sdk/blob/main/docs/architecture/adr-024-coin-metadata.md)

**Example**:

```json
[
  {
    "denom": "basecro",
    "amount": "10000"
  },
  {
    "denom": "apple",
    "amount": "1000"
  }
]
```

Each object in the array has the same format as [Single Object](#_1-single-object).

#### 3. String

This is commonly seen in events' attributes of block and transaction.

**Example**:

```json
{
  "key": "amount",
  "value": "1234basecro,5678apple"
}
```

[Top](#table-of-content)

## Bank

### 1. MsgSend

* **Descriptions:** Simple transfer message
* Funds movement: Yes

#### Protobuf Structure

```go
type MsgSend struct {
	FromAddress string                                   `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty" yaml:"from_address"`
	ToAddress   string                                   `protobuf:"bytes,2,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty" yaml:"to_address"`
	Amount      github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"`
}
```

#### Example

Cosmos Transaction Query API: <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/0C5E617B0577B047D78EBF5313B8B70DF69E9535E17B964303BD04947B11B660>

#### Details

| Detail           | Accessor                                                                      | Type                     |
| ---------------- | ----------------------------------------------------------------------------- | ------------------------ |
| Transaction Type | `tx.body.messages[message_index]["@type"] === "/cosmos.bank.v1beta1.MsgSend"` | String                   |
| From address     | `tx.body.messages[message_index].from_address`                                | String                   |
| To address       | `tx.body.messages[message_index].to_address`                                  | String                   |
| Amount           | `tx.body.messages[message_index].amount`                                      | [Asset Array](#_2-array) |

### 2. MsgMultiSend

* **Descriptions:** Multiple inputs, multiple outputs transfer message.
* Funds movement: Yes

#### Protobuf

```go
type MsgMultiSend struct {
	Inputs  []Input  `protobuf:"bytes,1,rep,name=inputs,proto3" json:"inputs"`
	Outputs []Output `protobuf:"bytes,2,rep,name=outputs,proto3" json:"outputs"`
}
type Input struct {
	Address string                                   `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
	Coins   github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=coins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"coins"`
}
type Output struct {
	Address string                                   `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
	Coins   github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=coins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"coins"`
}
```

#### Example

Cosmos Transaction Query API: <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/6CD89C9F32A4F4E918B2BCD722A9429693E3372E3F882BA4A460F2588A2EE0B3>

#### Details

| Detail           | Accessor                                                                                                                                                 | Type                     |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| Transaction Type | `tx.body.messages[message_index]["@type"] === "/cosmos.bank.v1beta1.MsgMultiSend"`                                                                       | String                   |
| From Addresses   | `tx.body.messages[message_index].inputs[m].address` where `m>=1`. There can be multiple (`m`) from addresses.                                            | String                   |
| From Amounts     | `tx.body.messages[message_index].inputs[m].coins` where `m>=1`. There can be multiple (`m`) from addresses and their corresponding input amount.         | [Asset Array](#_2-array) |
| To Addresses     | `tx.body.messages[message_index].outputs[n].address` where `n>=1`. There can be multiple (`n`) destination addresses.                                    | String                   |
| To Amounts       | `tx.body.messages[message_index].outputs[n].coins` where `n>=1`. There can be multiple (`n`) destination addresses and their corresponding input amount. | [Asset Array](#_2-array) |

## Distribution

### 1. MsgSetWithdrawAddress

* **Descriptions:** Sets the withdraw address for a delegator (or validator self-delegation)
* Funds movement: No (Pay for fee only)

#### Protobuf

```go
type MsgSetWithdrawAddress struct {
	DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"`
	WithdrawAddress  string `protobuf:"bytes,2,opt,name=withdraw_address,json=withdrawAddress,proto3" json:"withdraw_address,omitempty" yaml:"withdraw_address"`
}
```

#### Example

Cosmos Transaction Query API:  <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/D4FCC8E1403677157D367A88A0832B9E411BDC4E029954FC133DB60296CF3DE3>

#### Details

TODO

### 2. MsgWithdrawDelegatorReward

* **Descriptions:** Withdraw delegation rewards from a single validator
* Funds movement: Yes

#### Protobuf

```go
type MsgWithdrawDelegatorReward struct {
	DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"`
	ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"`
}
```

#### Example

Cosmos Transaction Query API: <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/3B36AA1AC81ACD58E7A06C21353DB0FC40A70EDBF6BD2CD23D7BEDC7A0F56318>

#### Details

| Detail                  | Accessor                                                                                                                                                                                                                                                                                                                              | Type                          |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| Transaction Type        | `tx.body.messages[message_index]["@type"] === "/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"`                                                                                                                                                                                                                              | String                        |
| Delegator               | `tx.body.messages[message_index].delegator_address`                                                                                                                                                                                                                                                                                   | String                        |
| Withdraw From Validator | `tx.body.messages[message_index].validator_address`                                                                                                                                                                                                                                                                                   | String                        |
| Withdraw To Address     | <p><code>tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "recipient"</code>.</p> | String                        |
| Withdraw Reward Amount  | <p><code>tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "amount"</code>.</p>    | [Asset String](#asset-string) |

### 3. MsgWithdrawValidatorCommission

* **Descriptions:** : Withdraws the full commission of a validator to the validator creator (initial delegator) address.
* Funds movement: Yes

#### Protofbuf

```json
type MsgWithdrawValidatorCommission struct {
	ValidatorAddress string `protobuf:"bytes,1,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"`
}
```

#### Example

* Cosmos Transaction Query API: \
  &#x20;[https://](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/3739F76EF67A61D6F0163A5B177EA64ED80B67D9AEF8435C525913E69026D320)[rest.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[/cosmos/tx/v1beta1/txs/3739F76EF67A61D6F0163A5B177EA64ED80B67D9AEF8435C525913E69026D320](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/3739F76EF67A61D6F0163A5B177EA64ED80B67D9AEF8435C525913E69026D320)
* Message Index: `1`

#### Details

This transaction will trigger an internal transfer from the "Distribution" module account to the withdraw to address. Note that the "Distribution" module account is an internal account in Cronos POS Chain to hold the rewards, commissions and community pool funds before they are being distributed.

The "Distribution" module account is different on different chain. In Cronos POS Chain Mainnet, it is [cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w).

| Detail                     | Accessor                                                                                                                                                                                                                                                                                                                              | Type                       |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
| Transaction Type           | `tx.body.messages[message_index]["@type"] === "/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission"`                                                                                                                                                                                                                          | String                     |
| Validator                  | `tx.body.messages[message_index].validator_address`                                                                                                                                                                                                                                                                                   | String                     |
| Withdraw From Validator    | `tx.body.messages[message_index].validator_address`                                                                                                                                                                                                                                                                                   | String                     |
| Withdraw To Address        | <p><code>tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "recipient"</code>.</p> | String                     |
| Withdraw Commission Amount | <p><code>tx\_response.logs\[message\_index].events\[event\_index].attributes\[m].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "amount"</code>.</p>                   | [Asset String](#_3-string) |

### 4. MsgFundCommunityPool

* **Descriptions:** : Fund from an account to the community pool. The community pool can later be sent to another by submitting a MsgSubmitEcProposal
* Funds movement: Yes

#### Protobuf

```go
type MsgFundCommunityPool struct {
	Amount    github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"`
	Depositor string                                   `protobuf:"bytes,2,opt,name=depositor,proto3" json:"depositor,omitempty"`
}
```

#### Example: A transaction funding the community pool

[https://](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/7C1747E0189DCA88BBA55A1720809C8DF6075799C11ECBE4C4E1F89C91D4F55F)[rest.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[/cosmos/tx/v1beta1/txs/7C1747E0189DCA88BBA55A1720809C8DF6075799C11ECBE4C4E1F89C91D4F55F](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/7C1747E0189DCA88BBA55A1720809C8DF6075799C11ECBE4C4E1F89C91D4F55F)

#### Details

This transaction will initiate a transfer from an account to the "Distribution" module account. Note that the "Distribution" module account is an internal account in Cronos POS Chain to hold the rewards, commissions and community pool funds before they are being distributed.

This "Distribution" module account is different on different chain. In Cronos POS Chain Mainnet, it is [cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w).

| Detail                                              | Accessor                                                                                                                                                                                                                                                                                                                              | Type                     |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| Transaction Type                                    | `tx.body.messages[message_index]["@type"] === "/cosmos.distribution.v1beta1.MsgFundCommunityPool"`                                                                                                                                                                                                                                    | String                   |
| Deposit From Account                                | `tx.body.messages[message_index].depositor`                                                                                                                                                                                                                                                                                           | String                   |
| Deposit Amount                                      | `tx.body.messages[message_index].amount`                                                                                                                                                                                                                                                                                              | [Asset Array](#_2-array) |
| Delegate To Address ("Distribution" module account) | <p><code>tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "recipient"</code>.</p> | String                   |

[Top](#table-of-content)

## Staking

### 1. MsgCreateValidator

* **Descriptions:** : Create a new validator
* Funds movement: Yes

#### Protobuf

```go
type MsgCreateValidator struct {
	Description       Description                            `protobuf:"bytes,1,opt,name=description,proto3" json:"description"`
	Commission        CommissionRates                        `protobuf:"bytes,2,opt,name=commission,proto3" json:"commission"`
	MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"`
	DelegatorAddress  string                                 `protobuf:"bytes,4,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"`
	ValidatorAddress  string                                 `protobuf:"bytes,5,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"`
	Pubkey            *types.Any                             `protobuf:"bytes,6,opt,name=pubkey,proto3" json:"pubkey,omitempty"`
	Value             types1.Coin                            `protobuf:"bytes,7,opt,name=value,proto3" json:"value"`
}

type Description struct {
	// moniker defines a human-readable name for the validator.
	Moniker string `protobuf:"bytes,1,opt,name=moniker,proto3" json:"moniker,omitempty"`
	// identity defines an optional identity signature (ex. UPort or Keybase).
	Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"`
	// website defines an optional website link.
	Website string `protobuf:"bytes,3,opt,name=website,proto3" json:"website,omitempty"`
	// security_contact defines an optional email for security contact.
	SecurityContact string `protobuf:"bytes,4,opt,name=security_contact,json=securityContact,proto3" json:"security_contact,omitempty" yaml:"security_contact"`
	// details define other optional details.
	Details string `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"`
}

type CommissionRates struct {
	// rate is the commission rate charged to delegators, as a fraction.
	Rate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=rate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"rate"`
	// max_rate defines the maximum commission rate which validator can ever charge, as a fraction.
	MaxRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=max_rate,json=maxRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_rate" yaml:"max_rate"`
	// max_change_rate defines the maximum daily increase of the validator commission, as a fraction.
	MaxChangeRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=max_change_rate,json=maxChangeRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_change_rate" yaml:"max_change_rate"`
}
```

#### Example

Cosmos Transaction Query API: <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/7B3C19A3674C9EF856C43FFF50B021085AC4DA693AA47F82882FFAC78F21DE05>

#### Details

| Detail                                        | Accessor                                                                                    | Type                              |
| --------------------------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------- |
| Transaction Type                              | `tx.body.messages[message_index]["@type"] === "/cosmos.staking.v1beta1.MsgCreateValidator"` | String                            |
| Initial Delegator Address (Validator Creator) | `tx.body.messages[message_index].delegator_address`                                         | String                            |
| Delegated Amount                              | \`tx.body.messages\[message\_index].value                                                   | [Asset Object](#_1-single-object) |

[Top](#table-of-content)

### 2. MsgEditValidator

* **Descriptions**: Edit and existing validator
* Funds Movement: No (Pay for fee only)

#### Protobuf

```go
type MsgEditValidator struct {
	Description      Description `protobuf:"bytes,1,opt,name=description,proto3" json:"description"`
	ValidatorAddress string      `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"address"`
	// We pass a reference to the new commission rate and min self delegation as
	// it's not mandatory to update. If not updated, the deserialized rate will be
	// zero with no way to distinguish if an update was intended.
	// REF: #2373
	CommissionRate    *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=commission_rate,json=commissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"commission_rate,omitempty" yaml:"commission_rate"`
	MinSelfDelegation *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation,omitempty" yaml:"min_self_delegation"`
}

type Description struct {
	// moniker defines a human-readable name for the validator.
	Moniker string `protobuf:"bytes,1,opt,name=moniker,proto3" json:"moniker,omitempty"`
	// identity defines an optional identity signature (ex. UPort or Keybase).
	Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"`
	// website defines an optional website link.
	Website string `protobuf:"bytes,3,opt,name=website,proto3" json:"website,omitempty"`
	// security_contact defines an optional email for security contact.
	SecurityContact string `protobuf:"bytes,4,opt,name=security_contact,json=securityContact,proto3" json:"security_contact,omitempty" yaml:"security_contact"`
	// details define other optional details.
	Details string `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"`
}
```

#### Example

Cosmos Transaction Query API: <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/F4A1D7757AD20979D540C0CD29DD335D17E121F15AA447990B87E0EE94531BD7>

### Details

TODO

[Top](#table-of-content)

### 3. MsgDelegate

* **Descriptions**: Perform a delegation of coins from a delegator to a validator
* Funds movement: Yes

#### Protobuf

```go
type MsgDelegate struct {
	DelegatorAddress string      `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"`
	ValidatorAddress string      `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"`
	Amount           types1.Coin `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount"`
}
```

#### Example

Cosmos Transaction Query API: [https://](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/CCB45B0C6EC18A327ADFC8C36478A163D8C2A8BD9EB13687F73ED3D4559318A3)[rest.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[/cosmos/tx/v1beta1/txs/CCB45B0C6EC18A327ADFC8C36478A163D8C2A8BD9EB13687F73ED3D4559318A3](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/CCB45B0C6EC18A327ADFC8C36478A163D8C2A8BD9EB13687F73ED3D4559318A3)

#### Details

| Detail                | Accessor                                                                             | Type                              |
| --------------------- | ------------------------------------------------------------------------------------ | --------------------------------- |
| Transaction Type      | `tx.body.messages[message_index]["@type"] === "/cosmos.staking.v1beta1.MsgDelegate"` | String                            |
| Delegate From Address | `tx.body.messages[message_index].delegator_address`                                  | String                            |
| Delegate To Validator | `tx.body.messages[message_index].validator_address`                                  | String                            |
| Delegate Amount       | `tx.body.messages[message_index].amount`                                             | [Asset Object](#_1-single-object) |

[Top](#table-of-content)

### 4. MsgBeginRedelegate

* **Descriptions**: Perform a redelegation of coins from a delegator and source validator to a destination validator.

  Note that the redelegation is just a record update of the internal state of a delegator's staked funds. The delegator account won't have any funds movement based on the redelegation except.

  There is a side effect of `MsgBeginRedelegate`, upon successful execution of this message, all the rewards of the delegator from the previous (source) validator will be withdrawn automatically to the delegator account.
* Funds movement: Yes

#### Protobuf

```go
type MsgBeginRedelegate struct {
	DelegatorAddress    string      `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"`
	ValidatorSrcAddress string      `protobuf:"bytes,2,opt,name=validator_src_address,json=validatorSrcAddress,proto3" json:"validator_src_address,omitempty" yaml:"validator_src_address"`
	ValidatorDstAddress string      `protobuf:"bytes,3,opt,name=validator_dst_address,json=validatorDstAddress,proto3" json:"validator_dst_address,omitempty" yaml:"validator_dst_address"`
	Amount              types1.Coin `protobuf:"bytes,4,opt,name=amount,proto3" json:"amount"`
}
```

#### Example

Cosmos Transaction Query API: <https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/5D43A55463C8FB30A89306C26C5E3318826AD075D36E9B5E72F7019C00F14549>

#### Details

| Detail                                                                          | Accessor                                                                                                                                                                                                                                                                                                | Type                              |
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
| Transaction Type                                                                | `tx.body.messages[message_index]["@type"] === "/cosmos.staking.v1beta1.MsgBeginRedelegate"`                                                                                                                                                                                                             | String                            |
| Redelegate From Address                                                         | `tx.body.messages[message_index].delegator_address`                                                                                                                                                                                                                                                     | String                            |
| Redelegate From Validator                                                       | `tx.body.messages[message_index].validator_src_address`                                                                                                                                                                                                                                                 | String                            |
| Redelegate To Validator                                                         | `tx.body.messages[message_index].validator_dst_address`                                                                                                                                                                                                                                                 | String                            |
| Redelegate Amount                                                               | `tx.body.messages[message_index].amount`                                                                                                                                                                                                                                                                | [Asset Object](#_1-single-object) |
| Auto Withdraw Rewards To Address #                                              | <p><code>tx\_response.logs\[message\_index].events\[event\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "recipient"</code>.</p> | String                            |
| Auto Withdraw Rewards From Address (Always the "distribution" module account) # | <p><code>tx\_response.logs\[message\_index].events\[event\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "sender"</code>.</p>    | String                            |
| Auto Withdraw Rewards Amount #                                                  | <p><code>tx\_response.logs\[message\_index].events\[event\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "amount"</code>.</p>    | String                            |

{% hint style="info" %}
**Note**: There may be multiple auto reward withdrawals that happen. In such a case, the `transfer` event will have multiple `{"recipient":"","sender":"","amount":""}`. An example is

```
{
  "type": "transfer",
  "attributes": [
    {
      "key": "recipient",
      "value": "cro1hr6wx9mm6ycjr4x2p4ek4c9fl2prkxsx79y5qu"
    },
    {
      "key": "sender",
      "value": "cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w"
    },
    {
      "key": "amount",
      "value": "30763basecro"
    },
    {
      "key": "recipient",
      "value": "cro1hr6wx9mm6ycjr4x2p4ek4c9fl2prkxsx79y5qu"
    },
    {
      "key": "sender",
      "value": "cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w"
    },
    {
      "key": "amount",
      "value": "6881basecro"
    }
  ]
}
```

{% endhint %}

[Top](#table-of-content)

### 5. MsgUndelegate

* **Descriptions:** Perform an undelegation from a delegate and a validator.

  Note that the funds are moved between module accounts upon a `MsgUndelegate` message execution. The funds movement to the user account happens only when the unbond completes. For details, you can refer to the [next section](#_5a-upon-msgundelegate-completed).
* Funds movement: Yes

#### Protobuf

```go
type MsgUndelegate struct {
	DelegatorAddress string      `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"`
	ValidatorAddress string      `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"`
	Amount           types1.Coin `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount"`
}
```

#### Example

Cosmos Transaction Query API: [https://](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/3B36AA1AC81ACD58E7A06C21353DB0FC40A70EDBF6BD2CD23D7BEDC7A0F56318)[rpc.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[/cosmos/tx/v1beta1/txs/3B36AA1AC81ACD58E7A06C21353DB0FC40A70EDBF6BD2CD23D7BEDC7A0F56318](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/3B36AA1AC81ACD58E7A06C21353DB0FC40A70EDBF6BD2CD23D7BEDC7A0F56318)

#### Details

| Detail                                                                          | Accessor                                                                                                                                                                                                                                                                                                | Type                              |
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
| Transaction Type                                                                | `tx.body.messages[message_index]["@type"] === "/cosmos.distribution.v1beta1.MsgFundCommunityPool"`                                                                                                                                                                                                      | String                            |
| Undelegate From Address                                                         | `tx.body.messages[message_index].delegator_address`                                                                                                                                                                                                                                                     | String                            |
| Undelegate From Validator                                                       | `tx.body.messages[message_index].validator_src_address`                                                                                                                                                                                                                                                 | String                            |
| Undeleate Amount                                                                | `tx.body.messages[message_index].amount`                                                                                                                                                                                                                                                                | [Asset Object](#_1-single-object) |
| Auto Withdraw Rewards To Address #                                              | <p><code>tx\_response.logs\[message\_index].events\[event\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "recipient"</code>.</p> | String                            |
| Auto Withdraw Rewards From Address (Always the "distribution" module account) # | <p><code>tx\_response.logs\[message\_index].events\[event\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "sender"</code>.</p>    | String                            |
| Auto Withdraw Rewards Amount #                                                  | <p><code>tx\_response.logs\[message\_index].events\[event\_index].value</code><br>where<br><code>tx\_response.logs\[message\_index].events\[event\_index].type === "transfer" && tx\_response.logs\[message\_index].events\[event\_index].attributes\[attribute\_index].key === "amount"</code>.</p>    | String                            |

{% hint style="info" %}
**Note**: Similar to MsgBeginRedelegate, there may be multiple auto reward withdrawals happen. In such a case the `transfer` event will have the multiple `{"recipient":"","sender":"","amount":""}`
{% endhint %}

&#x20;

[Top](#table-of-content)

### 5a. Upon MsgUndelegate completed

* **Descriptions**: The undelegation is completed on the first block after the "Unbond Completion Time", in which there will be a special event in the Tendermint Block Results API.
* Funds movement: Yes

#### Example

Tendermint Block Results API: [https://](https://rpc.mainnet.crypto.org/block_results?height=374823)[rpc.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[/block\_results?height=374823](https://rpc.mainnet.crypto.org/block_results?height=374823)

#### Details

| Detail                    | Accessor                                                                                                                                                                                                                                                                                            | Type                          |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| Undelegate From Validator | <p><code>.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "complete\_unbonding" && .result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "validator"</code>.</p> | String                        |
| Undelegate To Address     | <p><code>.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "complete\_unbonding" && .result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "delegator"</code>.</p> | String                        |
| Undeleate Amount          | <p><code>.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "complete\_unbonding" && .result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "amount"</code>.</p>    | [Asset String](#asset-string) |

[Top](#table-of-content)

## Slashing

### 1. MsgUnjail

* **Descriptions:** : Unjail a validator
* Funds movement: No (Pay for fee only)

#### Protobuf

```go
type MsgUnjail struct {
	ValidatorAddr string `protobuf:"bytes,1,opt,name=validator_addr,json=validatorAddr,proto3" json:"address" yaml:"address"`
}
```

#### Example

Cosmos Transaction Query API: [https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/58BF8EBD17FF9500F395E4A9B2AE93EF21306E5706B3EC31CE116654D78B8684](https://rest.mainnet.cronos-pos.org/cosmos/tx/v1beta1/txs/58BF8EBD17FF9500F395E4A9B2AE93EF21306E5706B3EC31CE116654D78B8684)

#### Details

TODO

### 2. Being Jailed and Slashed

A validator can get jailed for two reasons:

1. Liveness
2. Double sign

#### Liveness

Liveness issue occurs when the validator fails to sign 50%\* of the blocks in a 5000# blocks sliding window.

Upon a validator committing a liveness issue, the validator is jailed for 24 hours (85400 seconds#).

\# The liveness metrics and the penalty are subject to the network parameters to be explained in the [details section](#details-params)

#### Double Sign

Double sign occurs when a validator attempts to provide multiple signatures of the same block height.

This is considered as a serious fault and upon committing the validator will get jailed forever and get slashed for 5% of the total staking#.

This slashing is applied to all the delegations (both self delegation and delegation from other accounts).

\# The slashing rate is subject to the network parameters to be explained in the [details section](#details-params)

#### Limitations

There is a limitation in the protocol that the slashing amount cannot be easily extracted right now. Theoretically one could calculate the slashed amount of each delegator by applying the slash rate and delegation proportion but in practice small precision issues may be introduced in the calculation process and introduce discrepancies with the chain, so it is not recommended to do so.

On the other hand, the slashed amount, similar to the block rewards and commission, is **not** deducted from delegator account directly. There are events to signal the jail and slashing occurs but it serve more of the purpose of describing such as event occurs only.

#### Details - Params

Cosmos Slashing Params API: <https://rest.mainnet.crypto.org/cosmos/slashing/v1beta1/params>

| Detail                                    | Category    | Accessor                             | Type              |
| ----------------------------------------- | ----------- | ------------------------------------ | ----------------- |
| Signing window size (in Blocks)           | Liveness    | `.params.signed_blocks_window`       | String            |
| Minimum # of blocks to sign in the window | Liveness    | `.params.min_signed_per_window`      | String            |
| How long to jail                          | Liveness    | `.params.downtime_jail_duration`     | String (Duration) |
| Slashing ratio                            | Liveness    | `.params.slash_fraction_downtime`    | String            |
| Slashing ratio                            | Double Sign | `.params.slash_fraction_double_sign` | String            |

#### Details - Jail and Slash events

Tendermint Block Results API: <https://rpc.mainnet.crypto.org/block?height>=\[height]

You can use the [Cosmos API tools](#common-block-details) to decode the event details for readability during integration.

| Detail                    | Category              | Accessor                                                                                                                                                                                                                                                                                                                                       | Type      |
| ------------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
| Jail                      | Liveness, Double Sign | `.results.begin_block_events[event_index].type === "slash" && Base64Decode(.results.begin_block_events[event_index].attributes[attribute_index].key) === "jailed"`                                                                                                                                                                             | Assertion |
| Jailed Reason             | Liveness              | <p><code>Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].value === "missing\_signature"</code><br>where<br><code>.results.begin\_block\_events\[event\_index].type === "slash" && Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "reason"</code></p> | String    |
| Jailed Reason             | Double Sign           | <p><code>Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].value === "double\_sign"</code><br>where<br><code>.results.begin\_block\_events\[event\_index].type === "slash" && Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "reason"</code></p>       | String    |
| Jailed Validator Address  | Liveness, Double Sign | <p><code>Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>.results.begin\_block\_events\[event\_index].type === "slash" && Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "jailed"</code></p>                         | String    |
| Slashed Validator Address | Liveness, Double Sign | <p><code>Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>.results.begin\_block\_events\[event\_index].type === "slash" && Base64Decode(.results.begin\_block\_events\[event\_index].attributes\[attribute\_index].key) === "address"</code></p>                        | String    |

Liveness Example: <https://rpc.mainnet.crypto.org/block_results?height=210356>&#x20;

Liveness Event Example

```json
{
  "type": "slash",
  "attributes": [
    {
      "key": "address",
      "value": "crocnclcons1hv2qumdxjeekgtmmnjvzx7ukv7uhlh29w8a4tx",
      "index": true
    },
    {
      "key": "power",
      "value": "4284179",
      "index": true
    },
    {
      "key": "reason",
      "value": "missing_signature",
      "index": true
    },
    {
      "key": "jailed",
      "value": "crocnclcons1hv2qumdxjeekgtmmnjvzx7ukv7uhlh29w8a4tx",
      "index": true
    }
  ]
}
```

Double Sign Example: <https://rpc.mainnet.crypto.org/block_results?height=210356>

Double Sign Event Example

```json
{
	"type": "slash",
	"attributes": [
		{
			"key": "address",
			"value": "crocnclcons1kf8994z2h49u7ldh6e96mlhw6wjqx4lr4929sc",
			"index": true
		},
		{
			"key": "power",
			"value": "6524600",
			"index": true
		},
		{
			"key": "reason",
			"value": "double_sign",
			"index": true
		}
	]
},
{
	"type": "slash",
	"attributes": [
		{
			"key": "jailed",
			"value": "crocnclcons1kf8994z2h49u7ldh6e96mlhw6wjqx4lr4929sc",
			"index": true
		}
	]
}
```

[Top](#table-of-content)

## Governance

### 1. MsgSubmitProposal

Submit proposal

Initial deposit will transfer from the proposer account to the "gov" module account.

Funds movement: Yes

#### Protobuf

```go
type MsgSubmitProposal struct {
	Content        *types.Any                               `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
	InitialDeposit github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=initial_deposit,json=initialDeposit,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"initial_deposit" yaml:"initial_deposit"`
	Proposer       string                                   `protobuf:"bytes,3,opt,name=proposer,proto3" json:"proposer,omitempty"`
}
```

#### Example

Cosmos Transaction Query API: [https://rpc.mainnet.crypto.org/cosmos/tx/v1beta1/txs/9CCC988616344C804E8831B6FC6BECD6FD0F815E4E3FF13BDE6B7F8360BF0050](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/9CCC988616344C804E8831B6FC6BECD6FD0F815E4E3FF13BDE6B7F8360BF0050)

#### Details

| Detail               | Accessor                                                                               | Type                     |
| -------------------- | -------------------------------------------------------------------------------------- | ------------------------ |
| Transaction Type     | `tx.body.messages[message_index]["@type"] === "/cosmos.gov.v1beta1.MsgSubmitProposal"` | String                   |
| Deposit From Address | `tx.body.messages[message_index].porposer`                                             | String                   |
| Deposit Amount       | `tx.body.messages[message_index].initial_deposit`                                      | [Asset Array](#_2-array) |

### 1a. Community Pool Spend Proposal

One sub-type of proposal is to spend community pool. The community has to pre-funded using [MsgFundCommunityPool](#4-msgfundcommunitypool).

After a proposal of this kind is passed, it will release the funds to the grants recipient account.

#### Community Pool Spend Proposal Transaction

| Detail                   | Accessor                                                                                                         | Type                     |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------- | ------------------------ |
| Proposal Type            | `tx.body.messages[message_index].content["@type"] === "/cosmos.distribution.v1beta1.CommunityPoolSpendProposal"` | String                   |
| Grants Recipient Address | `tx.body.messages[message_index].conbtent.recipient`                                                             | String                   |
| Spend Amount             | `tx.body.messages[message_index].content.amount`                                                                 | [Asset Array](#_2-array) |

Example of Community Pool Spend Proposal transaction:

```json
{
  "tx": {
    "body": {
      "messages": [
        {
          "@type": "/cosmos.gov.v1beta1.MsgSubmitProposal",
          "content": {
            "@type": "/cosmos.distribution.v1beta1.CommunityPoolSpendProposal",
            "title": "Test Community Pool Spend",
            "description": "Test spending community pool",
            "recipient": "cro1kkqxv3szgh099xezt7y38t5anqzue4s3fhp2tm",
            "amount": [
              {
                "denom": "basecro",
                "amount": "30000"
              }
            ]
          },
          "initial_deposit": [
            {
              "denom": "basecro",
              "amount": "20000"
            }
          ],
          "proposer": "cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd"
        }
      ],
      "memo": "",
      "timeout_height": "0",
      "extension_options": [],
      "non_critical_extension_options": []
    },
    "auth_info": {
      "signer_infos": [
        {
          "public_key": {
            "@type": "/cosmos.crypto.secp256k1.PubKey",
            "key": "AiLBhn2Jb4CLU5dYpKB3LHDpjIFldrsQWD6LWDHyjpWM"
          },
          "mode_info": {
            "single": {
              "mode": "SIGN_MODE_DIRECT"
            }
          },
          "sequence": "3"
        }
      ],
      "fee": {
        "amount": [
          {
            "denom": "basecro",
            "amount": "5000"
          }
        ],
        "gas_limit": "200000",
        "payer": "",
        "granter": ""
      }
    },
    "signatures": [
      "35gnabiH8b8Sqd4XFM9AY1dvN//xsKuzpGO356u/ZEwCBjtaoUKQIL7yNOao6kqJ4Ezc0RCHzgJT6owkW4iXog=="
    ]
  },
  "tx_response": {
    "height": "19278",
    "txhash": "FF822C74B63571B0FDC886A5061D7B8594A113ACD05A10273C36E46CF63871C6",
    "codespace": "",
    "code": 0,
    "data": "0A150A0F7375626D69745F70726F706F73616C12020801",
    "raw_log": "[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"submit_proposal\"},{\"key\":\"sender\",\"value\":\"cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd\"},{\"key\":\"module\",\"value\":\"governance\"},{\"key\":\"sender\",\"value\":\"cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd\"}]},{\"type\":\"proposal_deposit\",\"attributes\":[{\"key\":\"amount\",\"value\":\"20000basecro\"},{\"key\":\"proposal_id\",\"value\":\"1\"}]},{\"type\":\"submit_proposal\",\"attributes\":[{\"key\":\"proposal_id\",\"value\":\"1\"},{\"key\":\"proposal_type\",\"value\":\"CommunityPoolSpend\"},{\"key\":\"voting_period_start\",\"value\":\"1\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z\"},{\"key\":\"sender\",\"value\":\"cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd\"},{\"key\":\"amount\",\"value\":\"20000basecro\"}]}]}]",
    "logs": [
      {
        "msg_index": 0,
        "log": "",
        "events": [
          {
            "type": "message",
            "attributes": [
              {
                "key": "action",
                "value": "submit_proposal"
              },
              {
                "key": "sender",
                "value": "cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd"
              },
              {
                "key": "module",
                "value": "governance"
              },
              {
                "key": "sender",
                "value": "cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd"
              }
            ]
          },
          {
            "type": "proposal_deposit",
            "attributes": [
              {
                "key": "amount",
                "value": "20000basecro"
              },
              {
                "key": "proposal_id",
                "value": "1"
              }
            ]
          },
          {
            "type": "submit_proposal",
            "attributes": [
              {
                "key": "proposal_id",
                "value": "1"
              },
              {
                "key": "proposal_type",
                "value": "CommunityPoolSpend"
              },
              {
                "key": "voting_period_start",
                "value": "1"
              }
            ]
          },
          {
            "type": "transfer",
            "attributes": [
              {
                "key": "recipient",
                "value": "cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z"
              },
              {
                "key": "sender",
                "value": "cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd"
              },
              {
                "key": "amount",
                "value": "20000basecro"
              }
            ]
          }
        ]
      }
    ],
    "info": "",
    "gas_wanted": "200000",
    "gas_used": "126092",
    "tx": {
      "@type": "/cosmos.tx.v1beta1.Tx",
      "body": {
        "messages": [
          {
            "@type": "/cosmos.gov.v1beta1.MsgSubmitProposal",
            "content": {
              "@type": "/cosmos.distribution.v1beta1.CommunityPoolSpendProposal",
              "title": "Test Community Pool Spend",
              "description": "Test spending community pool",
              "recipient": "cro1kkqxv3szgh099xezt7y38t5anqzue4s3fhp2tm",
              "amount": [
                {
                  "denom": "basecro",
                  "amount": "30000"
                }
              ]
            },
            "initial_deposit": [
              {
                "denom": "basecro",
                "amount": "20000"
              }
            ],
            "proposer": "cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd"
          }
        ],
        "memo": "",
        "timeout_height": "0",
        "extension_options": [],
        "non_critical_extension_options": []
      },
      "auth_info": {
        "signer_infos": [
          {
            "public_key": {
              "@type": "/cosmos.crypto.secp256k1.PubKey",
              "key": "AiLBhn2Jb4CLU5dYpKB3LHDpjIFldrsQWD6LWDHyjpWM"
            },
            "mode_info": {
              "single": {
                "mode": "SIGN_MODE_DIRECT"
              }
            },
            "sequence": "3"
          }
        ],
        "fee": {
          "amount": [
            {
              "denom": "basecro",
              "amount": "5000"
            }
          ],
          "gas_limit": "200000",
          "payer": "",
          "granter": ""
        }
      },
      "signatures": [
        "35gnabiH8b8Sqd4XFM9AY1dvN//xsKuzpGO356u/ZEwCBjtaoUKQIL7yNOao6kqJ4Ezc0RCHzgJT6owkW4iXog=="
      ]
    },
    "timestamp": "2021-05-02T15:14:05Z"
  }
}
```

#### Community Pool Spend Proposal Funds Movement

| Detail                                   | Accessor                                                                                                                                                                                                                                                                                                                                                   | Type                          |
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| Proposal Passed                          | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value) === "proposal\_passed"</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "active\_proposal" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key) === "proposal\_result"</code>.</p> | String                        |
| Grant from "distribution" Module Account | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value) === "{distribution module account}"</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "transfer" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key) === "sender"</code>.</p>      | String                        |
| Recipient Account                        | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "transfer" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "recipient")</code>.</p>                                       | String                        |
| Grants Amount                            | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "transfer" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "amount")</code>.</p>                                          | [Asset String](#asset-string) |

Example of Block Results API when Community Pool Spend Proposal Funds is Released:

```json
{
  "jsonrpc": "2.0",
  "id": -1,
  "result": {
    "height": "19337",
    "txs_results": null,
    "begin_block_events": [
	  ...
    ],
    "end_block_events": [
      {
        "type": "transfer",
        "attributes": [
          {
            "key": "recipient",
            "value": "cro1nk4rq3q46ltgjghxz80hy385p9uj0tf58apkcd",
            "index": true
          },
          {
            "key": "sender",
            "value": "cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z",
            "index": true
          },
          {
            "key": "amount",
            "value": "20000basecro",
            "index": true
          }
        ]
      },
      {
        "type": "message",
        "attributes": [
          {
            "key": "sender",
            "value": "cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z",
            "index": true
          }
        ]
      },
      {
        "type": "transfer",
        "attributes": [
          {
            "key": "recipient",
            "value": "cro1kkqxv3szgh099xezt7y38t5anqzue4s3fhp2tm",
            "index": true
          },
          {
            "key": "sender",
            "value": "cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w",
            "index": true
          },
          {
            "key": "amount",
            "value": "30000basecro",
            "index": true
          }
        ]
      },
      {
        "type": "message",
        "attributes": [
          {
            "key": "sender",
            "value": "cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w",
            "index": true
          }
        ]
      },
      {
        "type": "active_proposal",
        "attributes": [
          {
            "key": "proposal_id",
            "value": "1",
            "index": true
          },
          {
            "key": "proposal_result",
            "value": "proposal_passed",
            "index": true
          }
        ]
      }
    ],
    "validator_updates": null,
    "consensus_param_updates": {
	  ...
    }
  }
}
```

### 2. MsgDeposit

* **Descriptions**: Submit a deposit to an existing proposal

  Deposit will transfer from the proposer account to the "gov" module account.

#### Protobuf

```go
type MsgDeposit struct {
	ProposalId uint64                                   `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id" yaml:"proposal_id"`
	Depositor  string                                   `protobuf:"bytes,2,opt,name=depositor,proto3" json:"depositor,omitempty"`
	Amount     github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"`
}
```

#### Example

Cosmos Transaction Query API: [https://rpc.mainnet.crypto.org/cosmos/tx/v1beta1/txs/9CCC988616344C804E8831B6FC6BECD6FD0F815E4E3FF13BDE6B7F8360BF0050](https://rest.mainnet.crypto.org/cosmos/tx/v1beta1/txs/9CCC988616344C804E8831B6FC6BECD6FD0F815E4E3FF13BDE6B7F8360BF0050)

#### Details

| Detail               | Accessor                                                                        | Type                     |
| -------------------- | ------------------------------------------------------------------------------- | ------------------------ |
| Transaction Type     | `tx.body.messages[message_index]["@type"] === "/cosmos.gov.v1beta1.MsgDeposit"` | String                   |
| Deposit From Address | `tx.body.messages[message_index].depositor`                                     | String                   |
| Deposit Amount       | `tx.body.messages[message_index].amount`                                        | [Asset Array](#_2-array) |

[Top](#table-of-content)

### 2a. Burn Proposal's Deposit if Proposal does not Get Enough Deposit

If a proposal does not meet the deposit requirement after the deposit period, the deposit will **NOT** be returned to the depositors. Those deposits **will be burnt** from the "gov" module account as well.

The latest deposit requirement ("min\_deposit") and deposit period ("max\_deposit\_period") can be checked on [https://rpc.mainnet.crypto.org/cosmos/gov/v1beta1/params/deposit](https://rest.mainnet.crypto.org/cosmos/gov/v1beta1/params/deposit). Note that they are network parameters and may change over time after governance proposals.

To monitor a proposal becomes inactive, it can be detected by monitoring the `end_block_events` in Tendermint Block Results API. However, for the amount of deposit burnt, you have to keep track of the deposits made to the proposal before. Note that this operation does not involve any user account as the deposits are burnt.

Tendermint Block Results API: <https://rpc.mainnet.crypto.org/block_results?height=195346>

#### Details

| Detail                     | Accessor                                                                                                                                                                                                                                                                                                                                                      | Type   |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| Proposal Id                | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value) === "{gov module account}"</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "inactive\_proposal" && .result.Base64Decode(end\_block\_events\[event\_index].attributes\[attribute\_index].key) === "proposal\_id"</code>.</p>  | String |
| Assert Proposal is Dropped | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value === "proposal\_dropped")</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "inactive\_proposal" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "proposal\_result"</code>).</p> | String |

### 2b. Return Proposal's Deposit

There are a few cases where a proposal deposit will be returned to the depositors. For details, please refer to [Proposal Result](#4-proposal-result).

The return deposit can be detected by monitoring the `end_block_events` in Tendermint Block Results API.

#### Example

Tendermint Block Results API: [https://](https://rpc.mainnet.crypto.org:443/block_results?height=496620)[rpc.mainnet.crypto.org](http://rpc.mainnet.cronos-pos.org/)[:443/block\_results?height=496620](https://rpc.mainnet.crypto.org:443/block_results?height=496620)

#### Details

| Detail                           | Accessor                                                                                                                                                                                                                                                                                                                                     | Type                          |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| Return From "gov" Module Account | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value) === "{gov module account}"</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "transfer" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key) === "sender"</code>.</p> | String                        |
| Return To Address                | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "transfer" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key) === "recipient"</code>.</p>                         | String                        |
| Returned Deposit Amount          | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value)</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "transfer" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "amount"</code>).</p>                            | [Asset String](#asset-string) |

Note that there may be multiple depositors of a proposal, so the event may appear multiple times.

```json
[
  {
    "type": "transfer",
    "attributes": [
      {
        "key": "recipient",
        "value": "cro15d0esada05wx4lpncp5vmwmzgrcnu3cu5xfy9w",
        "index": true
      },
      {
        "key": "sender",
        "value": "cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z",
        "index": true
      },
      {
        "key": "amount",
        "value": "1000000000basecro",
        "index": true
      }
    ]
  },
  {
    "type": "transfer",
    "attributes": [
      {
        "key": "recipient",
        "value": "cro1meq5gd2fwjcav8n0nynwelusm9hrngwglvp426",
        "index": true
      },
      {
        "key": "sender",
        "value": "cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z",
        "index": true
      },
      {
        "key": "amount",
        "value": "2000000000000basecro",
        "index": true
      }
    ]
  }
]
```

[Top](#table-of-content)

### 2c. Burn Proposal's Deposit

There are a few cases where proposal deposits will be burnt. For details, please refer to [Proposal Result](#4-proposal-result) for more details.

If a proposal does not get enough votes that exceed the "quorum" or has the "No with Veto" votes exceed the "veto\_threshold", the deposit will **NOT** be returned to the depositors. Those deposits **will be burnt** from the "gov" module account as well.

To monitor a proposal that got rejected and deposits got burned, it can be detected by monitoring the `end_block_events` Tendermint Block Results API. There will be a "proposal\_result" event marking the proposal as rejected, and different from [Return Proposal's Deposit](#2b-return-proposals-depsoit), there will be **NO** transfer event in the `end_block_results`, which means the deposit is **NOT** returned and is burnt.

However, for the amount of deposit burnt, you have to keep track of the deposits made to the proposal before. Note that this operation does not involve any user account as the deposits are burnt.

#### Details and Example

| Detail                      | Accessor                                                                                                                                                                                                                                                                                                                                                     | Type   |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------ |
| Proposal Id                 | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value) === "{gov module account}"</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "active\_proposal" && .result.Base64Decode(end\_block\_events\[event\_index].attributes\[attribute\_index].key) === "proposal\_id"</code>.</p>   | String |
| Assert Proposal is Rejected | <p><code>Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].value === "proposal\_rejected")</code><br>where<br><code>.result.end\_block\_events\[event\_index].type === "active\_proposal" && Base64Decode(.result.end\_block\_events\[event\_index].attributes\[attribute\_index].key === "proposal\_result"</code>).</p> | String |

Tendermint Block Results API JSON Example (Base64 Decoded):

```json
{
  "jsonrpc": "2.0",
  "id": -1,
  "result": {
    "height": "285",
    "txs_results": null,
    "begin_block_events": [
      ...
    ],
    "end_block_events": [
      {
        "type": "active_proposal",
        "attributes": [
          {
            "key": "proposal_id",
            "value": "3",
            "index": true
          },
          {
            "key": "proposal_result",
            "value": "proposal_rejected",
            "index": true
          }
        ]
      }
    ],
    "validator_updates": null,
    "consensus_param_updates": {
      ...
    }
  }
}
```

[Top](#table-of-content)

### 3. MsgVote

* **Descriptions:** : Submit a vote to an existing proposal
* Funds movement: No (Pay for fee only)

### 4. Proposal Result

Latest tally params can be retrieved from: <https://rest.mainnet.crypto.org/cosmos/gov/v1beta1/params/tallying>. The params may change from time to time after the governance proposal.

| Scenario                                                                                                                                             | Result  | Burn Deposit |
| ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------ |
| All voter has no staked coins                                                                                                                        | Rejects | No           |
| Not enough `tally_params.quorum` of votes                                                                                                            | Rejects | **Yes**      |
| No one votes (Everyone abstain)                                                                                                                      | Rejects | No           |
| More than `tally_params.veto_threshold` voter veto                                                                                                   | Rejects | **Yes**      |
| More than `tally_params.threshold` non-abstaining votes No                                                                                           | Rejects | No           |
| More than `tally_params.threshold` non-abstaining votes Yes                                                                                          | Passes  | No           |
| More than `tally_params.threshold` non-abstaining votes Yes but the proposal cannot be executed (e.g. Insufficient funds in community pool to spend) | Failed  | No           |

[Top](#table-of-content)

## Appendix: Module Accounts on Mainnet

| Module                    | Address                                                                                                                                               |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| mint                      | [cro1m3h30wlvsf8llruxtpukdvsy0km2kum8s20pm3](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro1m3h30wlvsf8llruxtpukdvsy0km2kum8s20pm3) |
| fee\_collector            | [cro17xpfvakm2amg962yls6f84z3kell8c5lgztehv](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro17xpfvakm2amg962yls6f84z3kell8c5lgztehv) |
| distribution              | [cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro1jv65s3grqf6v6jl3dp4t6c9t9rk99cd8lyv94w) |
| bonded\_tokens\_pool      | [cro1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3dqpk9x](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3dqpk9x) |
| not\_bonded\_tokens\_pool | [cro1tygms3xhhs3yv487phx3dw4a95jn7t7leqa8nj](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro1tygms3xhhs3yv487phx3dw4a95jn7t7leqa8nj) |
| gov                       | [cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z](https://rest.mainnet.crypto.org/cosmos/auth/v1beta1/accounts/cro10d07y265gmmuvt4z0w9aw880jnsr700jzemu2z) |

[Top](#table-of-content)


# Croeseid 5 Testnet: Running Nodes

Croeseid 5 Testnet is Cronos PoS Chain Testnet. It is a new chain based on Croeseid Testnet and runs in parallel with Croeseid 4. It serves as an alpha testnet for exploring new features, instead of the upgraded version of Croeseid 4 testnet.

This is detailed documentation for setting up a Validator or a full node on Cronos PoS Croeseid 5 testnet `testnet-croeseid-5`.

## Pre-requisites

### Supported OS

We officially support macOS, Windows, and Linux only. Other platforms may work but there is no guarantee. We will extend our support to other platforms after we have stabilized our current architecture.

### Prepare your machine

* To run Cronos PoS Chain nodes in the testnet, you will need a machine with the following minimum requirements:

Archive Node:

* RAM: 16GB (goleveldb)
* Disk: 281GB
* CPU: 4 cores

Default pruned node

* RAM 16GB (goleveldb)
* Disk: 83GB (Depends on how long the node is running for)
* CPU: 4 cores

## Step 1. Get the Cronos PoS Chain testnet binary

{% hint style="info" %}
**Remarks**: The following is the minimal setup for a **validator node**.&#x20;
{% endhint %}

{% hint style="info" %}
**Reminder**: The binary for *testnet* and the binary for *mainnet* are two **different** binaries. Please make sure you are using the correct binary.
{% endhint %}

To simplify the following step, we will be using **Linux** (Intel x86) for illustration. Binary for **Mac** ([Intel x86](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2-croeseid/chain-main_4.2.2-croeseid_Darwin_x86_64.tar.gz) / [M1](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2-croeseid/chain-main_4.2.2-croeseid_Darwin_arm64.tar.gz) and [Windows](https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2-croeseid/chain-main_4.2.2-croeseid_Windows_x86_64.zip) are also available.

* To install Cronos PoS Chain released **testnet binaries** from GitHub:

  ```bash
  $ curl -LOJ https://github.com/crypto-org-chain/chain-main/releases/download/v4.2.2-croeseid/chain-main_4.2.2-croeseid_Linux_x86_64.tar.gz
  $ tar -zxvf chain-main_4.2.2-croeseid_Linux_x86_64.tar.gz
  ```
* You can verify the installation by checking the version of the chain-maind, the current version is `4.2.2-croeseid`.

{% hint style="info" %}
**Reminder**: For macOS users: the binary is not signed, you have to follow the steps [here](https://support.apple.com/en-hk/guide/mac-help/mh40616/mac) to make the binary runnable.&#x20;
{% endhint %}

```bash
$./chain-maind version
4.2.2-croeseid
```

## Step 2. Configure `chain-maind`

Before kick-starting your node, we will have to configure your node so that it connects to the Croeseid testnet:

### Step 2-0 (Optional) Clean up the old blockchain data

* If you would like to clean up the old blockchain data for Croeseid Testnet and start over again, it can be done by running:

  ```bash
  $ ./chain-maind unsafe-reset-all
  ```

  and remove the old Genesis file by

  ```
  $ rm ~/.chain-maind/config/genesis.json
  ```
* You can not override the previous validator through `chain-maind init`. If you want to have a new validator, you need to manually remove the `priv_validator_key.json`:

  ```bash
  rm ~/.chain-maind/config/priv_validator_key.json
  ```

  Then, in Step 2-1, `chain-maind init` should help you to generate a new validator key file.

### Step 2-1 Initialize `chain-maind`

* First of all, you can initialize chain-maind by:

  ```bash
    $ ./chain-maind init [moniker] --chain-id testnet-croeseid-5
  ```

  This `moniker` will be the displayed ID of your node when connected to the Cronos PoS Chain network. When providing the moniker value, make sure you drop the square brackets since they are not needed. The example below shows how to initialize a node named `pegasus-node` :

  ```bash
    $ ./chain-maind init pegasus-node --chain-id testnet-croeseid-5
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong>:  </p><ul><li>Depending on your chain-maind home setting, the chain-maind configuration will be initialized to that home directory. To simplify the following steps, we will use the default chain-maind home directory <code>~/.chain-maind/</code> for illustration.</li><li>You can also put the <code>chain-maind</code> to your binary path and run it by <code>chain-maind</code> </li></ul></div>

### Step 2-2 Configure chain-maind

* Download and replace the Croeseid Testnet `genesis.json` by:

  ```bash
  $ curl https://raw.githubusercontent.com/crypto-com/testnets/main/testnet-croeseid-5/genesis.json > ~/.chain-maind/config/genesis.json
  ```
* Verify sha256sum checksum of the downloaded `genesis.json`. You should see `OK!` if the sha256sum checksum matches.

  ```bash
  $ if [[ $(sha256sum ~/.chain-maind/config/genesis.json | awk '{print $1}') = "cf20fb923be3bc565e49a57e81a47ca969e8a973be7b3ed44e2734e369118b6c" ]]; then echo "OK"; else echo "MISMATCHED"; fi;

  OK!
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong>:  </p><ul><li><p>For Mac environment, <code>sha256sum</code> was not installed by default. In this case, you may setup <code>sha256sum</code> with this command:</p><pre class="language-bash"><code class="lang-bash">function sha256sum() { shasum -a 256 "$@" ; } &#x26;&#x26; export -f sha256sum
  </code></pre></li></ul></div>

  ###
* In `~/.chain-maind/config/app.toml`, update minimum gas price to avoid [transaction spamming](https://github.com/cosmos/cosmos-sdk/issues/4527)

  ```bash
  $ sed -i.bak -E 's#^(minimum-gas-prices[[:space:]]+=[[:space:]]+)""$#\1"0.025basetcro"#' ~/.chain-maind/config/app.toml
  ```
* For network configuration, in `~/.chain-maind/config/config.toml`, please modify the configurations of `persistent_peers`, `create_empty_blocks_interval` and `timeout_commit` by:

  ```bash
  $ sed -i.bak -E 's#^(persistent_peers[[:space:]]+=[[:space:]]+).*$#\1"71d2a4727bf574d5d368c343e37edff00cd556b1@seed-0.testnet-croeseid-4.cronos-pos.org:26656,8af7c92277f3edce58aa828cf1026cfa74fd6569@seed-1.testnet-croeseid-4.cronos-pos.org:26656"#' ~/.chain-maind/config/config.toml
  $ sed -i.bak -E 's#^(create_empty_blocks_interval[[:space:]]+=[[:space:]]+).*$#\1"5s"#' ~/.chain-maind/config/config.toml
  $ sed -i.bak -E 's#^(timeout_commit[[:space:]]+=[[:space:]]+).*$#\1"2s"#' ~/.chain-main
  ```

**Note**: We suggest using `persistent_peers` instead of `seeds` to provide a stable state-sync experience.

### Step 2-3 Enable STATE-SYNC

[STATE-SYNC](https://docs.tendermint.com/v0.34/tendermint-core/state-sync.html#state-sync) is supported in our testnet.

With state sync, your node will download data related to the head or near the head of the chain and verify the data. This leads to drastically shorter times for joining a network for validator.

However, you should keep in mind that the block before state-sync `trust height` will not be queryable. So if you want to run a full node, better not use state-sync feature to ensure your node has every data on the blockchain network.

For **validator**, it will be fast to sync the near head of the chain and join the network.

Follow the below optional steps to enable state-sync.

* For state-sync configuration, in `~/.chain-maind/config/config.toml`, please modify the configurations of \[statesync] `enable`, `rpc_servers`, `trust_height` and `trust_hash` by:

  ```bash

  $ LATEST_HEIGHT=$(curl -s https://testnet-croeseid-5.crypto.org:26657/block | jq -r .result.block.header.height); \
  BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
  TRUST_HASH=$(curl -s "https://testnet-croeseid-5.crypto.org:26657/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

  $ sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
  s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"https://testnet-croeseid-5.crypto.org:26657,https://testnet-croeseid-5.crypto.org:26657\"| ; \
  s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
  s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \
  s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" ~/.chain-maind/config/config.toml
  ```

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>NOTE</strong>:</p><ul><li>For Mac environment, if <code>jq</code> is missing, you may install it by: <code>brew install jq</code></li></ul></div>

## Step 3. Run everything

{% hint style="warning" %}
**CAUTION**&#x20;

This page only shows the minimal setup for a validator node.

Furthermore, you may want to run full nodes as sentries (see [Tendermint](https://docs.tendermint.com/v0.34/tendermint-core/validators.html#sentry-node-configuration)), restrict your validator connections to only connect to your full nodes, test secure storage of validator keys, etc.
{% endhint %}

### Step 3-1. Create a new key and address

Run the following to create a new key. For example, you can create a key with the name `Default` by:

```bash
  $ ./chain-maind keys add Default
```

You should obtain an address with `tcro` prefix, e.g. `tcro1quw5r22pxy8znjtdkgqc65atrm3x5hg6vycm5n`. This will be the address for performing transactions.

### Step 3-2. Obtain test token

Croeseid 5 faucet is on the way. If you need testing tokens, you can send a message on [Discord](https://discord.gg/pahqHz26q4) #request-tcro-croeseid channel, stating who you are and your `tcro.....` address for Croeseid 5.

### Step 3-3. Obtain the validator public key

You can obtain your validator public key by:

```bash
  $ ./chain-maind tendermint show-validator
```

The public key should be in a json format, for example:

```bash
{
  "@type": "/cosmos.crypto.ed25519.PubKey",
  "key": "[The_validator_key]"
}
```

### Step 3-4. Run everything

Once the `chain-maind` has been configured, we are ready to start the node and sync the blockchain data:

* Start chain-maind, e.g.:

```bash
  $ ./chain-maind start
```

{% hint style="info" %}
**Remarks**: If you see errors saying `too many files opened...`, then you need to set a higher number for maximum open file descriptors in your OS.

If you are on OSX or Linux, then the following could be useful:

```bash
# Check current max fd
$ ulimit -n
# Set a new max fd
$ ulimit -Sn [NEW_MAX_FILE_DESCRIPTOR]
# Example
$ ulimit -Sn 4096 
```

{% endhint %}

* *(Optional for Linux)* Start chain-maind with systemd service, e.g.:

```bash
  $ git clone https://github.com/crypto-org-chain/chain-main.git && cd chain-main
  $ ./networks/create-service.sh
  $ sudo systemctl start chain-maind
  # view log
  $ journalctl -u chain-maind -f
```

{% hint style="info" %}
**Example**: /etc/systemd/system/chain-maind.service created by script

```bash
# /etc/systemd/system/chain-maind.service
[Unit]
Description=Chain-maind
ConditionPathExists=/usr/local/bin/chain-maind
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/chain-maind start --home /home/ubuntu/.chain-maind
Restart=on-failure
RestartSec=10
LimitNOFILE=50000

[Install]
WantedBy=multi-user.target
```

{% endhint %}

It should begin fetching blocks from the other peers. Please wait until it is fully synced before moving onto the next step.

* You can query the node syncing status by

  ```bash
  $ ./chain-maind status 2>&1 | jq '.SyncInfo.catching_up'
  ```

  If the above command returns `false`, It means that your node **is fully synced**; otherwise, it returns `true` and implies your node is still catching up.
* One can check the current block height by querying the public full node by:

  ```bash
  curl -s https://testnet-croeseid-5.crypto.org:26657/commit | jq "{height: .result.signed_header.header.height}"
  ```

  and you can check your node's progress (in terms of block height) by

  ```bash
  $ ./chain-maind status 2>&1 | jq '.SyncInfo.latest_block_height'
  ```

### Step 3-5. Send a `create-validator` transaction

Once the node is fully synced, we are now ready to send a `create-validator` transaction and join the network, for example:

```
$ ./chain-maind tx staking create-validator \
--from=[name_of_your_key] \
--amount=500000tcro \
--pubkey='{"@type":"/cosmos.crypto.ed25519.PubKey","key":"PUBLIC_KEY"}'  \
--security-contact="[security contact email/contact method]" \
--chain-id="testnet-croeseid-5" \
--commission-rate="0.10" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.01" \
--min-self-delegation="1" \
--gas 80000000 \
--gas-prices 0.1basetcro

{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator"...}
confirm transaction before signing and broadcasting [y/N]: y
```

You will be required to insert the following:

* `--from`: The `trco...` address that holds your funds;
* `--pubkey`: The validator public key( See Step [3-3](#step-3-3-obtain-the-validator-public-key) above );
* `--moniker`: A moniker (name) for your validator node;
* `--security-contact`: Security contact email/contact method.

### Step 3-6. Check your validator status

Once the `create-validator` transaction completes, you can check if your validator has been added to the validator set:

```bash
$ ./chain-maind tendermint show-address
## [tcrocnclcons... address] ##
$ ./chain-maind query tendermint-validator-set | grep -c [tcrocnclcons...]
## 1 = Yes; 0 = Not yet added ##
```

To further check if the validator is signing blocks, kindly run this [script](https://github.com/crypto-com/chain-docs/blob/master/docs/getting-started/assets/signature_checking/check-validator-up.sh), for example:

```bash
$ curl -sSL https://raw.githubusercontent.com/crypto-com/chain-docs/master/docs/getting-started/assets/signature_checking/check-validator-up.sh | bash -s -- \
--tendermint-url https://testnet-croeseid-5.crypto.org:26657 \
--pubkey $(cat ~/.chain-maind/config/priv_validator_key.json | jq -r '.pub_key.value')

The validator is in the active validator set under the address  <YOUR_VALIDATOR_ADDRESS>
The validator is signing @ Block#<BLOCK_HEIGHT> 👍
```

```bash
$ curl -sSL https://raw.githubusercontent.com/crypto-com/chain-docs/master/docs/getting-started/assets/signature_checking/check-validator-up.sh | bash -s -- \
--tendermint-url https://testnet-croeseid-5.crypto.org:26657 \
--bechpubkey [tcrocnclconspub1....]

The validator is in the active validator set under the address  <YOUR_VALIDATOR_ADDRESS>
The validator is signing @ Block#<BLOCK_HEIGHT> 👍
```

Alternatively, you can run it on this [browser based IDE](https://repl.it/@allthatjazzleo/cryptocomcheckNodeJoinStatus#main.go), by specifying your validator public key in the `"YOUR_PUBKEY"` field, where this key can be obtained by running

```bash
$ cat ~/.chain-maind/config/priv_validator_key.json | jq -r '.pub_key.value'
```

## Step 4. Perform Transactions

### Step 4-1. `query bank balances` - Check your transferable balance

You can check your *transferable* balance with the `balances` command under the bank module.&#x20;

{% hint style="info" %}
**Example**: Check your address balance

```bash
$ ./chain-maind query bank balances tcro1quw5r22pxy8znjtdkgqc65atrm3x5hg6vycm5n

balances:
- amount: "10005471622381693"
  denom: basetcro
pagination:
  next_key: null
  total: "0"
```

{% endhint %}

### Step 4-2. `tx bank send` - Transfer operation

Transfer operation involves the transfer of tokens between two addresses.

#### **Send Funds** \[`tx bank send <from_key_or_address> <to_address> <amount> <network_id>`]

{% hint style="info" %}
**Example**: Send 10tcro from one address to another.

```
$ ./chain-maind tx bank send Default tcro1j7pej8kplem4wt50p4hfvndhuw5jprxxn5625q 10tcro --chain-id "testnet-croeseid-5" --gas-prices 0.1basetcro
  ## Transaction payload##
  {"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address"....}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

### Step 4-3. `tx staking` - Staking operations

{% hint style="info" %}
To get the 'validator-addr' with bech32 prefix, you can run this command:

```bash
./chain-maind keys show Default --bech val
```

{% endhint %}

Staking operations involve the interaction between an address and a validator. It allows you to create a validator and lock/unlock funds for staking purposes.

#### **Delegate your funds to a validator** \[`tx staking delegate <validator-addr> <amount>`]

To bond funds for staking, you can delegate funds to a validator by the `delegate` command

{% hint style="info" %}
**Example**: Delegate funds from `Default` to a validator under the address `tcrocncl16k...edcer`

```bash
$ ./chain-maind tx staking delegate tcrocncl16kqr009ptgken6qsxnzfnyjfsq6q97g3uedcer 100tcro --from Default --chain-id "testnet-croeseid-5" --gas-prices 0.1basetcro
## Transactions payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgDelegate"....}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

#### **Unbond your delegated funds** \[`tx staking unbond <validator-addr> <amount>`]

On the other hand, we can create a `Unbond` transaction to unbond the delegated funds

{% hint style="info" %}
**Example**: Unbond funds from a validator under the address `tcrocncl16k...edcer`

```bash
$ ./chain-maind tx staking unbond tcrocncl16kqr009ptgken6qsxnzfnyjfsq6q97g3uedcer 100tcro --from Default --chain-id "testnet-croeseid-5" --gas-prices 0.1basetcro
## Transaction payload##
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgUndelegate"...}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

{% hint style="info" %}
Once your funds are unbonded, they will be locked until the `unbonding_time` has passed.
{% endhint %}

### Reward related transactions and queries

After you have delegated or created a validator, the reward will be accumulated, you can check/ withdraw it by:

#### `query distribution validator-outstanding-rewards` - Query un-withdrawn rewards for a validator

We can check the distribution outstanding (un-withdrawn) rewards for a validator and all of their delegations by operator address.

{% hint style="info" %}
&#x20;**Example**: Check all outstanding rewards under the operator address `tcrocncl1...zrf8`

```bash
$ ./chain-maind q distribution validator-outstanding-rewards tcrocncl1kkqxv3szgh099xezt7y38t5anqzue4s326zrf8
  rewards:
  - amount: "1920761912.927067330419141688"
    denom: basetcro
```

{% endhint %}

#### `tx distribution validator-outstanding-rewards` - Query un-withdrawn rewards for a validator

the We can check distribution outstanding (un-withdrawn) rewards for a validator and all of their delegations by operator address.

{% hint style="info" %}
**Example**: Withdraw all outstanding under a delegation address:

```bash
$ ./chain-maind tx distribution withdraw-all-rewards --from [key_name] --chain-id "testnet-croeseid-5" --gas-prices 0.1basetcro

{"body":{"messages":[{"@type":"/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward"...}]}
confirm transaction before signing and broadcasting [y/N]: y
```

{% endhint %}

### Slashing related transaction

### `tx slashing unjail` - Unjail a validator

Validator could be punished and jailed due to network misbehaviour, we can check the jailing status of a validator, for example:

```bash
$ ./chain-maind query staking validators -o json | jq
................................
      "operator_address": "tcrocncl1hct8ye56gk80qjxvrx299yu9v98aqaxe0y5kvg",
      "consensus_pubkey": {
        "@type": "/cosmos.crypto.ed25519.PubKey",
        "key": "P1/aHuScW5myVs+xH10R8yFT2u0wwaCKXfDKSuVTl60="
      },
      "jailed": true,
................................
```

Where `"jailed": true` implies that the validator has been jailed. After the jailing period has passed, one can broadcast a `unjail` transaction to unjail the validator and resume its normal operations by

```bash
$ ./chain-maind tx slashing unjail --from [key_name] --chain-id "testnet-croeseid-5" --gas-prices 0.1basetcro

  {"body":{"messages":[{"@type":"/cosmos.slashing.v1beta1.MsgUnjail"...}]}
  confirm transaction before signing and broadcasting [y/N]: y
```

Congratulations! You've successfully set up a Croeseid 5 Testnet node and performed some basic transactions! You may refer to [Wallet Management](https://crypto.org/docs/wallets/cli.html#chain-maind) for more advanced operations and transactions.

## Croeseid 5 testnet explorer and endpoint

* You can lookup data within the `testnet-croeseid-5` network by the [explorer](https://crypto.org/explorer/croeseid5/);
* Tendermint: `https://rpc-c5.crypto.org/`;
* REST: `https://rest-c5.crypto.org`.


# Quicksync

Syncing Cronos POS Chain could be a time-consuming process, our team has partnered with Chainlayer to provide the “QuickSync” service to make the process more efficient for our users.

Users can visit [Chainlayer QuickSync page](https://quicksync.io/cronos-pos) and download the snapshots for Cronos POS Chain with different pruning settings (*currently only levelDB downloads are available*). \
Refer to the following guide to implement QuickSync.

#### There are three versions:

**Crypto-org-chain-mainnet-1-pruned**

* Pruned snapshot is the quickest way to get a node running. If you only want to give it a shot, use it for a validator or sentry node, the pruned snapshot will be a good choice. Pruned snapshots have transaction index disabled to save disk/download size, which also will make API queries not work backward in time. If you still want to use a pruned snapshot to start an API node, then you can enable transaction index on your end to start indexing blocks from when you startup your node. But you will not be able to query anything earlier than that.

**Crypto-org-chain-mainnet-1-default**

* Default is a good middle choice between everything. It will work in most use cases, validator, sentry node, API nodes. It has tx index enabled, so you can query block back in time. The only thing that default nodes do not have is the full history from the start of the chain or chain upgrade.

**Crypto-org-chain-mainnet-1-archive**

* For the users who would like to query the old block, you may pick the archive one for complete blockchain data. The archive node will have all the blocks from the chain start or chain upgrade with full indexing. So this is a good option for API nodes if you need to have access to the whole chain history. Archives grow fast in size and might be more sluggish to run, so if you need something simpler default or a pruned kickstarted API node might solve most of the needs out there.

## Step 1. QuickSync Download

To start with QuickSync, you need to run `brew install lz4` to install lz4 in a new terminal. Then download the file with preferred pruning settings directly from [https://quicksync.io/cronos-chain](https://quicksync.io/cronos-pos).

## Step 2. QuickSync Setup

In the following steps, we will take the version `crypto-org-chain-mainnet-1-pruned.20220323.2110.tar.lz4` as an example.

(Optional) you can download an address book from [Quicksync](https://quicksync.io/cronos-pos) to get connected to peers faster. After downloading it, place the new `addrbook.json` under `.chain-maind/config` folder and restart your node to take effect.

Now add the `crypto-org-chain-mainnet-1-pruned.20220323.2110.tar.lz4` inside `.chain-maind`.

Then perform the following steps:

* Change the path under `.chain-maind` with `cd .chain-maind`
* Decompress with `lz4` first then decompress with `tar` by `lz4 -d /Users/<username>/.chain-maind/crypto-org-chain-mainnet-1-pruned.20220323.2110.tar.lz4 | tar -xv`.

{% hint style="info" %}
**Example:**  \
Decompress the QuickSync pack with `lz4`

```bash
x data/
x data/state.db/
x data/state.db/161915.ldb
x data/state.db/035015.ldb
...
x data/evidence.db/MANIFEST-000143
x data/evidence.db/000142.log
x data/priv_validator_state.json
```

{% endhint %}

The original data folder under `.chain-maind` is overwritten with the step above. It takes around a few mins to decompress the pruned version of 47GB(at the date of writing).

## Step 3. Sync with QuickSync

Now direct back to the original directory and re-sync the chain again with `./chain-maind start`. It starts the node and syncs the blockchain data from the height of `5055406`.

{% hint style="info" %}
**Example:**  \
Restart `chain-maind start` with QuickSync

```bash
  $ ./chain-maind start                                                                   
  12:28PM INF starting ABCI with Tendermint
  12:28PM INF Starting multiAppConn service impl=multiAppConn module=proxy
  12:28PM INF Starting localClient service connection=query impl=localClient module=abci-client
  12:28PM INF Starting localClient service connection=snapshot impl=localClient module=abci-client
  ...
  12:28PM INF ABCI Handshake App Info hash="Pٖ}\x03G[5\x1aQi*#y-s:" height=5055406 module=consensus protocol-version=0 software-version=
  12:28PM INF ABCI Replay Blocks appHeight=5055406 module=consensus stateHeight=5055406 storeHeight=5055406
```

{% endhint %}


# Public Node Sync

## Introduction

[Public Node](https://www.publicnode.com/snapshots#cronos) Snapshots, provided by blockchain infrastructure company [Allnodes](https://www.allnodes.com/), offer a streamlined solution for Cronos node operators looking to quickly sync with the Cronos EVM network.

Available as one-time bulk downloads, the snapshots significantly reduce initial setup time and bandwidth requirements for new nodes. It provides pruned snapshots for both Cronos EVM and **Cronos POS** mainnet blockchains.

This guide walks you through the step-by-step process of performing a `Chain-maid` synchronization using [Public Node](https://www.publicnode.com/snapshots#cronos) Snapshots. The snapshots provided are pruned for optimize file size and download speed.

If a complete blockchain history to operate a full archive node is needed, [Native Snapshots](https://snapshot.cronos.org/?network=mainnet\&db=rocksdb\&pruning=archive\&chain=cronos-pos) or [Quicksync](https://quicksync.io/cronos-pos) archive snapshot are the recommended alternatives.

## Step 1: Download Public Node Snapshot

Users can visit [Public Node Page](https://www.publicnode.com/snapshots#cronos) and download the snapshots for Cronos POS Chain. Make sure to select “Cronos POS Chain” and download the `lz4` file.

## Step 2: Extract Public Node Snapshot

To start with Public Node Sync, run `brew install lz4` in a new terminal.&#x20;

## Step 3: Chain-maind Setup

Download the latest version of Chain-maind binary from [Cronos POS Chain Github](https://github.com/crypto-org-chain/chain-main/releases/latest) based on your preferred operating system.

Extract the downloaded file (`chain-main_4.2.9_Darwin_arm64.tar.gz` is used as an example). After you download and unzip the `chain-maind` to the location you desire. In terminal, change directory to the `bin` folder, where `chain-maind` is located.&#x20;

Follow the step from [Step 2-1 Initialize and Step 2-2 Configure Chain-maind](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet#step-2-1.-initialize-chain-maind) to initialize and setup `chain-maind`. \
\
The list of the seed is subject to change, you can also find the latest seed to connect [here](https://github.com/crypto-org-chain/mainnet#seed-nodes). Make sure edit the `config.toml` under `/Users/<username>/.chain-maind/config/config.toml`.&#x20;

Perform [Step 3.1 Run Everything](https://docs.cronos-pos.org/for-node-hosts/getting-started/mainnet_validator#step-3-1.-run-everything), terminate the terminal once `chainmaind` is able to sync for couple of blocks.

## Step 4: Extract Data from the Public Node Sync Snapshot

After you successfully start `chain-maind`, you should find a new folder named `.chain-maind` under `/Users/<username>.` Now add the `cronos-pos-pruned-18968897-18968907.tar.lz4`  inside `.chain-maind`. \
Change the path under `.chain-maind`and decompress with `lz4` and `tar` by:

```bash
lz4 -d /Users/<username>/.chain-maind/ cronos-pos-pruned-18968897-18968907.tar.lz4.tar.lz4 | tar -xv
```

{% hint style="info" %}
Note

All of the above files should be extracted to `/Users/.chain-maind/data`
{% endhint %}

## Step 5: Run `chain-maind`&#x20;

Now your `chain-maind` should be updated to the latest height as the Public Node Sync file, you can run the node now with `./chain-maind start`.&#x20;

That's it! You are now running a synced node on Cronos POS mainnet.&#x20;


