Deposit

Deposit into Keystone Core by choosing a risk profile. Capital is automatically routed across the three underlying funds (Alpha, Neutral, Defense) and you receive ksCORE share tokens.

New here? Read Keystone Core first.


Supported Tokens

Token
Instruction
How it routes

USDC

deposit

Direct — no swap

USDT

deposit_with_swap

Jupiter: USDT → USDC

SOL / wSOL

deposit_with_swap

Jupiter: SOL → USDC

JupSOL

deposit_jupsol

Jupiter: JupSOL → USDC, then routed to all three funds

jitoSOL

deposit_with_swap

Jupiter: jitoSOL → USDC

hSOL

deposit_with_swap

Jupiter: hSOL → USDC

mSOL

deposit_with_swap

Jupiter: mSOL → USDC

bSOL

deposit_with_swap

Jupiter: bSOL → USDC

All non-USDC tokens are converted to USDC at the Core level before being routed to the underlying funds.


Quick Start

# Conservative — 10% Alpha / 60% Neutral / 30% Defense
npx tsx scripts/deposit.ts conservative 1000

# Balanced — 20% Alpha / 55% Neutral / 25% Defense  (default)
npx tsx scripts/deposit.ts balanced 5000

# Growth — 35% Alpha / 40% Neutral / 25% Defense
npx tsx scripts/deposit.ts growth 500

# JupSOL deposit (swapped to USDC via Jupiter, then routed)
npx tsx scripts/deposit.ts balanced --input JupSOL 10

# SOL or LST deposit
npx tsx scripts/deposit.ts balanced --input SOL 5

Risk Profiles

Profile
Alpha
Neutral
Defense
Best For

Conservative

10%

60%

30%

Capital preservation, low drawdown mandates

Balanced (default)

20%

55%

25%

Full-cycle exposure, most depositors

Growth

35%

40%

25%

Long time horizon, meaningful SOL upside with Sharpe > 1.0

Not sure which to pick? See the Historical Simulation.

Each Core portfolio has a fixed on-chain risk_profile set at initialize_portfolio. Your deposit instruction must pass the same profile ID (0/1/2).

One risk profile at a time. Your wallet can only hold a position in one Core portfolio at a time. The contract records which portfolio you're in on your first deposit, and rejects any attempt to enter a different one. To switch, fully withdraw (your balance must reach zero), then deposit into the profile you want. This is enforced on-chain across all deposit and withdrawal paths.


How a Deposit Routes

USDC — Balanced (20 / 55 / 25)

JupSOL — Balanced (20 / 55 / 25)

SOL or other LST


Code Example

See scripts/deposit.tsarrow-up-right for full account derivation.


Errors

Error
Cause

PortfolioPaused

Portfolio is paused

DepositCapExceeded

Deposit would push TVL above the cap

ZeroAmount

Amount is zero

InvalidRiskProfile

Profile does not match this portfolio's config

PortfolioMismatch

Wallet is already active in a different portfolio — withdraw first

DirectDepositsDisabled

CoreGate is enabled; fund cannot be accessed directly


Next: Withdraw → · Check Your Position → · Keystone Core Overview →

Last updated