20Docs

Solana

Build Solana apps with the same Bounded policy and client SDK. Add wallets, store records onchain, and use supported token and DeFi operations. Keep the rest of your app in Bounded.

What you can build

GoalBounded support
Give users a walletEmbedded wallets and external wallet login
Store records on SolanaCollections with onchain: true and wallet-signed writes
Move tokens or hold funds for an appToken plugins, app accounts, and named escrow accounts
Build token launches and liquidity flowsPlugin families for Pump.fun, PumpSwap, Meteora, and other supported protocols
Use NFTs, prices, or randomnessNFT, price-feed, and oracle plugin families
Call another Solana programSupported @CPI calls from policy hooks
Restrict updates to an app policyOnchain upgrade governance and recovery sessions

A plugin family does not mean every operation works on every network. Check the exact function, deployed runtime, and network before you build around it.

Start with a devnet collection

Solana devnet is a test network. Mark each collection that needs onchain storage with onchain: true.

policy.json
{
  "notes/$noteId": {
    "onchain": true,
    "fields": { "owner": "String!", "text": "String" },
    "rules": {
      "read": "true",
      "create": "@user.address != null && @newData.owner == @user.address",
      "update": "@user.address != null && @data.owner == @user.address && @newData.owner == @data.owner",
      "delete": "@user.address != null && @data.owner == @user.address"
    }
  }
}

This example stores public notes. Only the owner's wallet can update or delete its note. Use @user.address for onchain identity.

Check and deploy to devnet
bounded verify --protocol realtime_devnet --json
bounded deploy ./policy.json --create --name solana-notes --protocol realtime_devnet

For CLI writes, set SOLANA_DEVNET_RPC_URL to your RPC endpoint. An RPC endpoint lets the client read the network and submit signed transactions.

For browser writes, configure init() with the app ID, chain: "solana_devnet", and rpcUrl. Connect a wallet before you write. Use the SDK's set() method to submit the change.

What changes when data is onchain

  1. The client requests a write.
  2. Bounded builds a Solana transaction for that write.
  3. The user's wallet signs the transaction.
  4. The Solana program checks the applicable policy and runs the transaction.
  5. Bounded's data mirror catches up with confirmed chain state.

The mirror is a copy for app reads and subscriptions. It can lag behind Solana. An immediate read is not proof that a transaction succeeded or failed.

Find an onchain operation

Inspect the plugin catalog
bounded plugins list --json
bounded plugins describe <plugin.function> --json
bounded verify --protocol realtime_devnet --json

Replace <plugin.function> with an exact name from the catalog. Read its argument types, signer requirements, and supported contexts. Review capabilityReadiness in the verification report.

Hooks attach these operations to collection writes. A hook may transfer tokens, update an escrow account, or call another program. Decide who holds funds and who signs before you write the hook.

Use separate named accounts when different users or orders need separate funds.@contract.address identifies the app's shared custody context in supported plugins.

Which guarantees run on Solana?

The checked deployment registry records runtime v6 on devnet and mainnet-beta as of September 4, 2026. Source-only v7 features are not part of that deployment.

  • conserve supports direct, materialized, and sharded forms.
  • rollingSum uses conservative time buckets onchain, rather than the exact offchain sliding window.
  • tenantTag and full-path tenantEdge have onchain support. Bare-ID targetPathVariable references remain offchain-only.
  • bound is not enforced onchain.flowBound and windowSum remain offchain-only.

The deploy gate checks the target runtime before it accepts newer invariant metadata. See the coverage table for each declaration.

Move to mainnet

Use realtime_mainnet for real assets after you test the complete flow on devnet. Mainnet app creation requires a paid account plan and a wallet you control.

The creating wallet becomes the app's permanent onchain owner. That owner must authorize policy updates. Browser-based wallet accounts approve deployments in the browser.

Set SOLANA_MAINNET_RPC_URL for CLI transaction submission. For SDK submission, use chain: "solana_mainnet" and the matching rpcUrl.

Test signing, failed transactions, retries, and delayed mirror updates before handling user funds.