CVCT is a confidential, vault-backed token system for Solana.
It combines:
- public SPL asset custody on-chain
- confidential balances and supply accounting via Arcium MPC
- staged commit settlement so user-facing accounting only commits when custody commits
- manual treasury deployment into Kamino without putting Kamino CPI in the user hot path
CVCT lets you issue a confidential claim on a backing SPL asset while keeping per-user balances private.
The system is built around four ideas:
Vault-backed: real SPL assets sit in a Solana token account controlled by the protocol vault PDAConfidential accounting: balances, total supply, and total locked assets are stored as encrypted stateStaged commit: deposit and redeem computations stage results first, then commit canonical state only during settlementOptimistic concurrency: stale operations invalidate instead of overwriting newer pricing or balance state
request_deposit_intentrecords a deposit intent and queues Arcium computation.deposit_and_mint_callbackwrites a staged result only.settle_deposit_committransfers backing assets into the vault and commits the staged confidential state.
request_redeem_intentrecords a redeem intent and queues Arcium computation.burn_and_withdraw_callbackwrites a staged result only.settle_redeem_commitpays assets out of the vault and commits the staged confidential burn state.
transfer_cvctqueues confidential transfer computation.transfer_cvct_callbackcommits sender and recipient balance updates only if both account versions still match.
Kamino is intentionally outside the deposit and redeem hot paths.
The protocol uses explicit treasury instructions:
configure_kamino_adapterkamino_deposit_idlekamino_withdraw_to_vaultsync_total_assets_from_adapter
That keeps user-critical settlement logic smaller, easier to reason about, and safer to retry.
- Deposit and redeem do not mutate canonical confidential state in callbacks.
- Settlement is blocked until callback-visible staged state exists.
- Stale staged operations invalidate if pricing state changed.
- Stale staged operations invalidate if the user's balance changed.
- Failed transfers do not mutate canonical balances or versions.
- No-op syncs do not invalidate staged operations.
- Operation-purpose PDAs can be explicitly cleaned up after terminal completion.
CvctMint: encrypted total supply and backing mint metadataVault: encrypted total locked assets and backing token vault authorityPricingState: monotonic pricing version for stale-op invalidationCvctAccount: per-user encrypted balance and balance versionPendingOperation: request lifecycle state for deposit and redeemPendingDepositResult: staged deposit resultPendingRedeemResult: staged redeem resultPendingTransferResult: staged transfer resultKaminoAdapterState: manual treasury adapter configuration
programs/cvct/: Anchor programencrypted-ixs/: Arcium encrypted instruction circuitstests/: split integration suitedocs/: human-readable architecture and testing docstests/fixtures/kamino/: local Kamino artifacts used by integration tests
arcium buildyarn testRuns the smoke suite only.
yarn test:cvctRuns smoke + lifecycle + races.
CVCT_RUN_KAMINO_LOCAL=1 yarn test:kaminoRuns Kamino integration only.
CVCT_RUN_KAMINO_LOCAL=1 arcium testRuns the full gate used for end-to-end local validation.
docs/architecture.md: protocol architecture and state modeldocs/flows.md: deposit, redeem, transfer, sync, and cleanup flowsdocs/kamino-adapter.md: treasury adapter design and local Kamino notesdocs/testing.md: suite layout, commands, and debugging guidance
The codebase is currently in a strong state:
- staged-commit deposit and redeem are implemented
- pricing-version and balance-version invalidation are in place
- manual Kamino treasury integration is working
- the split local integration suite is green