Documentation
# `ash_sdk` Crate

`ash-rs` is a Rust SDK for [Avalanche](https://avax.network) and [Ash](https://ash.center) tools.

It provides a higher level of abstraction than [avalanche-types-rs](https://github.com/ava-labs/avalanche-types-rs) and comes with a CLI that simplifies the interaction with Avalanche networks.

## Opinionated structs layout

The library provides an opinionated layout to represent Avalanche networks, Subnets and blockchains. The layout could be represented as follows:

```
AvalancheNetwork
└── subnets
    ├── AvalancheSubnet 1
    │   ├── blockchains
    │   │   ├── AvalancheBlockchain 1
    │   │   └── AvalancheBlockchain 2
    │   └── validators
    │       ├── AvalancheSubnetValidator 1
    │       └── AvalancheSubnetValidator 2
    └── AvalancheSubnet 2
        ├── blockchains
        │   ├── AvalancheBlockchain 3
        │   └── AvalancheBlockchain 4
        └── validators
            ├── AvalancheSubnetValidator 1
            └── AvalancheSubnetValidator 2
```

### Avalanche networks

An `AvalancheNetwork` is a top level struct that represents an Avalanche network. It contains the list of its `AvalancheSubnet`s. Most of the updating methods are implemented on this struct (e.g. `update_subnet`, `update_blockchains`, etc.).

### Avalanche Subnets and validators

An `AvalancheSubnet` is a struct that represents an Avalanche Subnet. It contains all the Subnet metadata, the list of its `AvalancheBlockchain`s and the list of its validators (as `AvalancheSubnetsValidator`s).

### Avalanche blockchains

An `AvalancheBlockchain` is a struct that represents an Avalanche blockchain. It contains all the blockchain metadata.

### Avalanche nodes

An `AvalancheNode` is a struct that represents an Avalanche node. An `AvalancheNode` is not directly linked to an `AvalancheNetwork` as its metadata are retrieved directly from its endpoint.

## Configuration

The library relies on YAML configuration files that contains the list of known Avalanche networks. For each network, at least the P-Chain configuration has to be provided (in the Primary Network) with its ID and RPC endpoint. All the other Subnets/blockchains will be retrieved/enriched from the P-Chain.

A default configuration is embedded in the library (see [conf/default.yaml](https://github.com/AshAvalanche/ash-rs/blob/main/crates/ash_sdk/conf/default.yml)) and contains the following networks:

- `mainnet` and `fuji` use the default Avalanche public endpoints
- `mainnet-ankr` and `fuji-ankr` use the Ankr Avalanche public endpoints
- `mainnet-blast` and `fuji-blast` use the Blast Avalanche public endpoints

Configuration example:

```yaml
# Default configuration of the mainnet network
avalancheNetworks:
  - name: mainnet
    subnets:
      - id: 11111111111111111111111111111111LpoYY
        controlKeys: []
        threshold: 0
        blockchains:
          - id: 11111111111111111111111111111111LpoYY
            name: P-Chain
            vmType: PlatformVM
            rpcUrl: https://api.avax.network/ext/bc/P
          - id: 2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5
            name: C-Chain
            vmID: mgj786NP7uDwBCcq6YwThhaN8FLyybkCa4zBWTQbNgmK6k9A6
            vmType: Coreth
            rpcUrl: https://api.avax.network/ext/bc/C/rpc
          - id: 2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM
            name: X-Chain
            vmID: jvYyfQTxGMJLuGWa55kdP2p2zSUYsQ5Raupu4TW34ZAUBAbtq
            vmType: AvalancheVM
            rpcUrl: https://api.avax.network/ext/bc/X
```

**Note:** You can generate a configuration file with the CLI using the `ash conf init` command.

## Usage

One can check out the [CLI code](https://github.com/AshAvalanche/ash-rs/tree/main/crates/ash_cli) to see examples of how to use the library.

## Modules

See the [docs.rs documentation](https://docs.rs/ash_sdk) for more details.