The Solana Write Capability
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: 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
- Payload encoding: Your workflow Borsh-encodes the data to deliver and wraps it in a
ForwarderReportstruct containing an account hash. - Report generation:
runtime.report()signs the encoded payload using thesolanaencoder (ecdsa+keccak256). - DON consensus: Multiple DON nodes independently validate the report before any onchain submission.
- Forwarder submission: A DON node calls the Keystone Forwarder program with the signed report and the required accounts.
- Delivery to your program: The forwarder verifies the signatures and CPIs into your receiver program's
on_reportinstruction.
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.
Learn more
- Solana Chain Interactions Guide: Learn how to write data to Solana programs using the
SolanaClient - Solana Client SDK Reference: Detailed API reference for
SolanaClientand helper functions - Supported Networks: Chain selector values and minimum SDK versions for Solana networks