CVCT is a private yield treasury rail for Solana.
Today, the codebase implements a confidential, vault-backed accounting system that can:
- accept deposits of a backing SPL asset into protocol custody
- maintain private per-user balances and private global accounting via Arcium MPC
- settle deposit and redeem flows with staged commits rather than immediate callback mutation
- deploy idle treasury assets into Kamino inline during deposit settlement
- pull buffered liquidity from Kamino inline during low-idle redeem settlement
The direction is intentional:
private yieldis the productMPCis an enabling layer for private accounting and controlled workflows
CVCT lets a treasury issue a confidential claim on a backing SPL asset while keeping internal balances private.
In practical terms, the current system already fits:
- private treasury balances
- private sub-accounting for teams, desks, or beneficiaries
- private payroll or grant distribution balances
- yield deployment of idle assets through an onchain treasury adapter
The protocol is built around four ideas:
Vault-backed: real SPL assets sit in a Solana token account controlled by the protocol vault PDAConfidential accounting: user balances, total supply, and total 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
The highest-value use case for this codebase is:
- private yield-bearing treasury accounts for DAOs, teams, funds, payroll operators, and on-chain businesses
That means the protocol should be described and evolved as:
- a private treasury rail
- a private payroll / grants rail
- a confidential internal balance system with explicit yield deployment
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, optionally deploys excess idle liquidity into Kamino, and commits the staged confidential state.
Operationally, this is treasury funding into private balances, not just minting a token.
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, auto-pulling buffered liquidity from Kamino when idle liquidity is short, and commits the staged confidential burn state.
Operationally, this is private balance redemption back into spendable assets.
transfer_cvctqueues confidential transfer computation.transfer_cvct_callbackcommits sender and recipient balance updates only if both account versions still match.
This is the internal movement primitive for private allocations, payroll balances, grants, or desk-to-desk transfers.
Kamino is now wired into the settlement instructions that naturally own liquidity transitions:
- deposit settle can deploy excess idle liquidity into Kamino
- redeem settle can pull buffered liquidity back from Kamino when the idle vault is short
The protocol still exposes explicit treasury instructions:
configure_kamino_adapterupdate_kamino_policykamino_deposit_idlekamino_withdraw_to_vaultrebalance_idle_liquiditysync_total_assets_from_adapter
The active policy is:
- keep a configurable idle liquidity threshold in the vault
- deploy only excess idle liquidity into Kamino on deposit settle
- pull
deficit + redeem bufferfrom Kamino on low-idle redeem settle
New adapters default to a 10_000 BPS idle threshold, so enabling Kamino does not auto-deploy funds until policy is explicitly updated.
Manual instructions remain available as operator escape hatches and testing tools.
- 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.
- Deposit settlement reverts atomically if inline Kamino deployment is required and fails.
- Redeem settlement reverts atomically if inline Kamino withdrawal cannot satisfy the payout.
- 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.
These properties matter because CVCT is trying to be a reliable private treasury ledger, not only a private balance gadget.
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: Kamino wiring plus idle-threshold and redeem-buffer policy
programs/cvct/: Anchor programencrypted-ixs/: Arcium encrypted instruction circuitstests/: split integration suitedocs/: architecture, flow, treasury, and testing notestests/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 in a strong implementation state for the current direction:
- 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
The main product gap is not protocol correctness. It is finishing the private treasury and payroll framing around the current primitives, then layering stronger privacy features over time.