# The Solana Write Capability
Source: https://docs.chain.link/cre/capabilities/solana-write
Last Updated: 2026-07-06

> For the complete documentation index, see [llms.txt](/llms.txt).

The **Solana Write** capability lets your CRE workflow submit cryptographically signed reports to Solana programs. Your workflow calls a single method while the underlying Decentralized Oracle Network (DON) handles consensus, report signing, and onchain submission through the Keystone Forwarder program.

## How it works

The Solana Write capability shares the same conceptual model as [EVM Write](/cre/capabilities/evm-read-write): your workflow generates a signed report, and the DON submits it to a Keystone Forwarder program onchain. The forwarder verifies the oracle signatures, then cross-program invokes (CPI) your receiver program's `on_report` instruction.

### The secure write flow

1. **Payload encoding**: Your workflow Borsh-encodes the data to deliver and wraps it in a `ForwarderReport` struct containing an account hash.
2. **Report generation**: `runtime.report()` signs the encoded payload using the `solana` encoder (`ecdsa` + `keccak256`).
3. **DON consensus**: Multiple DON nodes independently validate the report before any onchain submission.
4. **Forwarder submission**: A DON node calls the Keystone Forwarder program with the signed report and the required accounts.
5. **Delivery to your program**: The forwarder verifies the signatures and CPIs into your receiver program's `on_report` instruction.

### Account layout

Every Solana write request includes a `remainingAccounts` list. The Keystone Forwarder expects accounts in the following order:

| Index | Account              | Writable  | Description                                                                                      |
| ----- | -------------------- | --------- | ------------------------------------------------------------------------------------------------ |
| 0     | `forwarderState`     | No        | The Keystone Forwarder's onchain state account                                                   |
| 1     | `forwarderAuthority` | No        | PDA derived from `["forwarder", forwarderState, receiverProgram]` under the forwarder program ID |
| 2+    | Receiver accounts    | As needed | Accounts your program's `on_report` instruction requires                                         |

The public keys of all accounts in this list are concatenated and SHA-256 hashed to produce the `accountHash` field in the report. The forwarder strips indices 0–1 before CPIing into your receiver, so they must be present and in the correct positions.

## Key features

- **DON consensus**: Reports are signed by multiple oracle nodes before submission.
- **Borsh encoding**: Payloads use Borsh, the standard serialization format for Solana programs.
- **Type-safe bindings**: The CLI binding generator creates typed `writeReportFrom<StructName>()` helpers from your Anchor IDL.
- **Configurable compute budget**: Override the default 290,000 compute unit limit via `ComputeConfig`.
- **Chain selector support**: Target Solana Mainnet or Devnet using Chainlink's chain selector system.

> **NOTE: Simulation support**
>
> Write simulation (`--broadcast` flag) is available in the CLI. Simulation without broadcast performs a dry run and
> validates the payload encoding. Full simulation with `--broadcast` submits a real transaction.

## Learn more

- **[Solana Chain Interactions Guide](/cre/guides/workflow/using-solana-client/overview)**: Learn how to write data to Solana programs using the `SolanaClient`
- **[Solana Client SDK Reference](/cre/reference/sdk/solana-client)**: Detailed API reference for `SolanaClient` and helper functions
- **[Supported Networks](/cre/supported-networks)**: Chain selector values and minimum SDK versions for Solana networks