Solana Configuration
appsettings.json, the default cluster, and how the node registers itself
appsettings.json
The node reads its cluster connections from a Solana section in application settings:
"Solana": {
"DefaultCluster": "mainnet-beta",
"Clusters": {
"mainnet-beta": { "RpcUrl": "https://api.mainnet-beta.solana.com", "Commitment": "confirmed" },
"devnet": { "RpcUrl": "https://api.devnet.solana.com", "Commitment": "confirmed" }
}
}
| Key | Type | Required | Description |
|---|---|---|---|
DefaultCluster |
text | ✓ Yes | Cluster used when an operation doesn't set its own cluster field. Defaults to mainnet-beta in code if the whole Solana section is absent. |
Clusters |
object | No | Map of cluster name → RPC connection config. See Clusters — well-known names (mainnet-beta, devnet, testnet) resolve to public endpoints even without an explicit entry here. |
Per-Cluster Fields
Each entry under Solana:Clusters is a SolanaClusterConfig:
| Field | Type | Required | Description |
|---|---|---|---|
RpcUrl | text | Exactly one of RpcUrl / RpcUrlCredentialID | Plain JSON-RPC URL, used verbatim with no vault lookup. Use for public or self-hosted endpoints. |
RpcUrlCredentialID | integer | Exactly one of the two | ID of a SERVICE_URL-type vault credential whose Service URL field holds the full RPC URL. Use for paid providers (Helius, QuickNode, Triton) whose endpoint embeds an API key. |
Commitment | text | No — defaults to confirmed | processed | confirmed | finalized. Any unrecognized value also falls back to confirmed. |
Missing cluster: If an operation requests a
cluster value that has no
entry under Solana:Clusters and isn't one of the three well-known names
(mainnet-beta, devnet, testnet), the node throws a
SolanaClusterNotConfiguredException. See Troubleshooting.
Per-Operation cluster Field
Every operation accepts an optional cluster config key. When omitted, it falls back to Solana:DefaultCluster:
| Field | Type | Required | Description |
|---|---|---|---|
cluster |
select | No | Cluster name, e.g. mainnet-beta, devnet, testnet, or any custom name added under Solana:Clusters. Defaults to Solana:DefaultCluster when unset. |
Registration
SolanaDependency.RegisterDefaults(services) registers everything the node needs:
SolanaConnectionProvider— caches anIRpcClientper cluster- Named
HttpClient"SolanaRpc" withSolanaRateLimitHandler(429 retry) attached - All 10 per-resource services (account, block, transaction, token, nft, staking, program, wallet, nonce, utility)
- The executor itself, scoped
- The
ExecutorRegistryentry forsolana
Host apps must also add an explicit registration call: registering
SolanaDependency in DI is not by itself sufficient — the executor assembly must also be
force-loaded via an explicit new SolanaDependency().RegisterDefaults(services); line in
BizFirst.Ai.Platform.Web.Server.Core/DependencyInjection/Ai/ServiceCollectionExtensionsForAI.cs,
alongside the sibling Ethereum/Binance/IPFS/HashiCorp Blockchain-area registrations. Without this line
the node type won't appear in the workflow designer even though the package is referenced.
Project Layout
The node ships as three .NET projects (plus a test project not part of the runtime package):
| Project | Responsibility |
|---|---|
BizFirst.Integration.Solana.Domain |
Sealed result records, cluster options, and the validator-summary type. Zero external dependencies. |
BizFirst.Integration.Solana.Services |
Solnet-backed RPC client, connection caching/vault resolution, rate-limit retry handler, and one service per resource. |
BizFirst.Ai.ExecutionNodes.Blockchain.Solana |
The executor: routing, config parsing, credential resolution, output shaping — one feature partial per operation. |