basecoin-store 0.2.0

A simple implementation of an AVL store tailored for the basecoin application.
Documentation
# basecoin-rs
At a high level, basecoin implements the application logic that sits between the Tendermint consensus layer and ibc-rs.
It is a rudimentary Tendermint ABCI application that implements the following functionality in the form of modules -
* `bank` - keeps track of different accounts' balances and facilitates transactions between those accounts.
* `ibc` - enables support for IBC (clients, connections & channels)

Its main use-cases are serving as a testing ground and mock implementation for verifying the correctness and behaviour
of the ibc-rs modules.

## Requirements
So far this app has been tested with:
* Rust > v1.64
* CometBFT v0.37

## How to integrate ibc-rs changes into basecoin
Since basecoin serves as a suite of integration tests against ibc-rs's functionality, each ibc-rs
PR also requires an accompanying basecoin PR. The steps to do this are:
1. In a new branch in basecoin, update ibc [revisions][revs] with the latest commit of the ibc-rs PR.
2. Implement the necessary changes in basecoin in order to get it working with the latest commit revision of ibc-rs.
3. Run `cargo clippy --all-features` and `cargo clippy --no-default-features` and fix any issues that clippy raises.
4. Open a PR in the basecoin-rs repository, making sure to the link to the associated ibc-rs PR.
5. Check to see if the [integration tests][integration-tests] pass.

## Starting up an instance of basecoin
### Step 1: Reset your local CometBFT node
```shell
$ cometbft init
$ cometbft unsafe-reset-all
```

### Step 2: Modify CometBFT config
Edit the CometBFT `config.toml` file (default location `~/.cometbft/config/config.toml`) to update the `proxy_app` and P2P `laddr` as follows.
```toml
proxy_app = "tcp://127.0.0.1:26358"
# ...
[p2p]
laddr = "tcp://0.0.0.0:26356"
```

### Step 3: Module specific setup
See the module documentation for more details -
* [Bank module]docs/modules/bank.md
* [Ibc module]docs/modules/ibc.md

### Step 4: Run the basecoin app and CometBFT
```console
# See all supported CLI options
$ cargo run -- --help
basecoin 0.1.0

USAGE:
    basecoin [FLAGS] [OPTIONS]

Commands:
    start
    query   Query a state of Basecoin application from the store
    help    Prints this message or the help of the given subcommand(s)

OPTIONS:
        --config <FILE>  The path to the configuration file [default: config.toml]
        --verbose        Increase output logging verbosity to DEBUG level
        --quiet          Suppress all output logging (overrides --verbose)
    -h  --help           Prints help information
    -V, --version        Prints version information

# Run the ABCI application (from this repo)
# The -v is to enable trace-level logging
$ cargo run -- -v

# In another terminal
$ cometbft node
```

## UML diagrams
![system diagram](docs/images/system-diagram.png)
---
![class diagram](docs/images/class-diagram.png)
---
![activity diagram - DeliverTx](docs/images/activity-diagram-deliverTx.png)

[revs]: https://github.com/informalsystems/basecoin-rs/blob/9610b29067ba122808d1d14354a32e2005b54517/Cargo.toml#L15-L16
[integration-tests]: https://github.com/informalsystems/basecoin-rs/blob/8f744c8356569d5f87a546f46d1ade247ebe5256/.github/workflows/integration.yml#L1