> ## Documentation Index
> Fetch the complete documentation index at: https://sava.software/llms.txt
> Use this file to discover all available pages before exploring further.

# Anchor IDL Source Generator

> Generates utilities for interacting with onchain programs and accounts.

<Card title="GitHub Repository" icon="github" horizontal={true} href="https://github.com/sava-software/anchor-src-gen" />

## [Dependencies](https://github.com/sava-software/anchor-src-gen/blob/main/anchor-src-gen/src/main/java/module-info.java)

* java.net.http
* software.sava.json.iterator
* software.sava.core
* software.sava.rpc

## Features With Examples

### Instructions

* (De)Serialization:
  * [Drift Program Instructions](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/drift/anchor/DriftProgram.java)
* Discriminators
* Convenient auto-wiring
  of [common accounts](https://github.com/sava-software/sava/blob/main/sava-core/src/main/java/software/sava/core/accounts/SolanaAccounts.java)
  and optional account defaults.
  * [GLAM Jupiter Swap](https://github.com/sava-software/anchor-programs/blob/dea67bfe3a53a51db73edc842ef14400b0ae0030/anchor-programs/src/main/java/software/sava/anchor/programs/glam/anchor/GlamProtocolProgram.java#L1870)

### Defined Types

* (De)Serialization
* Structs:
  * [Drift Order](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/Order.java)
* Accounts:
  * Discriminators with corresponding RPC memory compare filters:
    * [GLAM State Account](https://github.com/sava-software/anchor-programs/blob/dea67bfe3a53a51db73edc842ef14400b0ae0030/anchor-programs/src/main/java/software/sava/anchor/programs/glam/anchor/types/StateAccount.java#L37)
  * PDA helpers:
    * [GLAM PDAs](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/glam/anchor/GlamProtocolPDAs.java)
* Enums:
  * Simple:
    * [Drift ExchangeStatus](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/ExchangeStatus.java)
  * With arbitrary associated data structures:
    * [Jupiter Swap](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/jupiter/swap/anchor/types/Swap.java)
* Constants:
  * [Meteora CLMM](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/meteora/dlmm/anchor/LbClmmConstants.java)
* Events:
  * [Drift NewUserRecord](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/NewUserRecord.java)
* Errors:
  * [Jupiter Swap Program Errors](https://github.com/sava-software/anchor-programs/blob/main/anchor-programs/src/main/java/software/sava/anchor/programs/jupiter/swap/anchor/JupiterError.java)
* [RPC Filters](https://solana.com/docs/rpc#filter-criteria):
  * Memory compare filters:
    * [Filter by Drift User authority or delegate](https://github.com/sava-software/anchor-programs/blob/dea67bfe3a53a51db73edc842ef14400b0ae0030/anchor-programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/User.java#L124)
  * Data size filters
    * [Filter by Drift User account size](https://github.com/sava-software/anchor-programs/blob/dea67bfe3a53a51db73edc842ef14400b0ae0030/anchor-programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/User.java#L90)

## Generate Source

### Build Configuration

<Info>
  **GitHub Access Token**: [Generate a classic token](https://github.com/settings/tokens) with the `read:packages` scope to access
  dependencies hosted on GitHub Package Repository.
</Info>

```properties .gradle/gradle.properties theme={null}
savaGithubPackagesUsername=GITHUB_USERNAME
savaGithubPackagesPassword=GITHUB_TOKEN
```

### Compile & Run

Generated code will be placed under the `basePackageName` in the `sourceDirectory`.

Onchain IDL's configured in the `programs` JSON file will be fetched in a single request. Other remote IDL's for
programs will be fetched concurrently in `numThreads` with a `baseDelayMillis` between requests.

#### Program Configuration

```json theme={null}
[
  {
    "name": "Jupiter Swap",
    "program": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
    "package": "jupiter.swap"
  }
]
```

* `name` (required)
  * Human-readable program name. Also used to derive defaults for other fields.
* `package` (optional)
  * Java package suffix for this specific program. If omitted, it defaults to the lower-case form of `name`.
  * Final Java package for generated code: `<basePackageName>.<package>.anchor`
  * Example: with `--basePackageName=software.sava.anchor.gen` and `"package": "pyth.receiver"`, classes go under
    `software.sava.anchor.gen.pyth.receiver.anchor`.
* `program` (required unless `idlURL` or `idlFile` is provided)
  * Base58-encoded Solana program address. Used to compute the onchain IDL address and to fetch the IDL
    when not using `idlURL` or `idlFile`.
* `idlURL` (optional)
  * HTTP(S) URL to fetch the program's IDL JSON. When provided, the generator fetches the IDL from this URL instead of
    the chain or file.
* `idlFile` (optional)
  * Path to a local IDL JSON file on disk. When provided (and `idlURL` is absent), the generator reads the IDL from this
    file.
* `exportPackages` (boolean, optional)
  * Whether to export this program's packages in the generated `module-info.java`. Overrides the global
    `--exportPackages` for this entry only. If omitted, the global value applies.

#### Compile

```shell theme={null}
./compile.sh
```

#### Run

```shell theme={null}
./genSrc.sh --help
```

```bash theme={null}
./genSrc.sh \
 --tabLength=2 \
 --sourceDirectory="src/main/java" \
 --moduleName="org.your.module" \
 --basePackageName="org.your.package.anchor.gen" \
 --programs="./main_net_programs.json" \
 --rpc="https://rpc.com" \
 --baseDelayMillis=200 \
 --numThreads=5
```
