Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.hubra.app/llms.txt

Use this file to discover all available pages before exploring further.

USDC Earn is Hubra’s stablecoin route. You deposit USDC; the vault routes it across audited Solana lending venues for blended yield. You can withdraw any amount at any time, no cooldown, no fee. This page is the feature reference: how the vault is wired, what the on-chain accounts look like, and what the deposit / withdraw transactions actually do.

Architecture

                    ┌──────────────────────────────┐
                    │     Hubra Earn (UI / API)    │
                    └──────────────┬───────────────┘

                       Builds unsigned tx via


                    ┌──────────────────────────────┐
                    │   Voltr API (api.voltr.xyz)  │
                    │   /vault/{vault}/deposit     │
                    │   /vault/{vault}/direct-     │
                    │     withdraw                 │
                    └──────────────┬───────────────┘

                            On-chain call


                    ┌──────────────────────────────┐
                    │      Voltr Vault Program      │
                    │   3maCu...6gNQ (vault PDA)    │
                    └──────────────┬───────────────┘

                  Whitelisted adapters route to

                ┌──────────────────┼──────────────────┐
                ▼                  ▼                  ▼
            Kamino             Jupiter            (other)
           lending             lending           whitelisted
Hubra never holds USDC. The vault is a Solana program account governed by audited contracts; deposits and withdraws happen by the user’s wallet calling the vault program directly.

Vault metadata

The full machine-readable metadata for the Hubra Earn USDC vault:
{
  "name":              "Hubra Earn USDC",
  "vaultAddress":      "3maCuTJVPteZ2dFA8dADxz2EbpJHfoAG5txYhXDs6gNQ",
  "underlyingName":    "USD coin",
  "assetSymbol":       "USDC",
  "assetMint":         "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "assetTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
  "assetIcon":         "/images/tokens/usdc.png",
  "receiptSymbol":     "raUSDC",
  "receiptMint":       "53fZaJGDMHcfku8pzZak5obVFUUjVxwqRTF63M3SQiSS",
  "icon":              "https://7tjb2jhu6znbujvdbauzmsyhqtp42yedjgncsnsdphwtje7ukszq.arweave.net/_NIdJPT2WhomowgplksHhN_NYINJmik2Q3ntNJP0VLM",
  "decimals":          9
}
FieldValueNotes
nameHubra Earn USDCDisplay name.
vaultAddress3maCu...6gNQThe Voltr vault PDA. The on-chain account that holds USDC and routes it to whitelisted adapters.
underlyingNameUSD coinLong-form asset name.
assetSymbolUSDCThe asset deposited and ultimately withdrawn.
assetMintEPjFW...Dt1vCircle’s USDC SPL mint on Solana mainnet.
assetTokenProgramTokenk...5DAStandard SPL Token program. The vault uses the classic SPL Token interface, not Token-2022.
assetIcon/images/tokens/usdc.pngIcon for the underlying asset.
receiptSymbolraUSDCSymbol of the share token minted on deposit.
receiptMint53fZa...QiSSThe raUSDC SPL mint. Owned by the vault program.
iconArweave URLIcon for the receipt token. Hosted on Arweave for permanence.
decimals9raUSDC decimals. Voltr vaults mint shares at 9 decimals regardless of the underlying asset’s decimals (USDC is 6). The vault handles the unit conversion internally.
USDC has 6 decimals on-chain (1.50 USDC = 1_500_000 base units). raUSDC has 9 decimals. When reading raUSDC balances directly from the chain, scale by 10^9, not 10^6. The Hubra app and API surface USDC-denominated values to hide this asymmetry.
All four addresses are verifiable on Solscan. The vault is built on the Voltr vault program. The receipt token (raUSDC) is minted by the vault when you deposit, and burned by the vault when you withdraw. Hubra does not control the mint; the vault program does.

Deposit flow (technical)

What happens

  1. Hubra’s API calls POST https://api.voltr.xyz/vault/3maCu...6gNQ/deposit.
  2. Voltr returns an unsigned base64 transaction. Hubra normalizes it to standard base64 and forwards.
  3. The transaction includes:
    • SPL Token transfer instruction: USDC from your associated token account to the vault.
    • Voltr vault deposit instruction: mints raUSDC at the current share price.
    • (If needed) Associated token account creation for raUSDC.
  4. Your wallet signs.
  5. The transaction is broadcast. On confirmation, USDC is in the vault, raUSDC is in your wallet.

Request shape (Voltr API, called server-side)

{
  "userPubkey":        "<wallet>",
  "lamportAmount":     "<USDC base units>",
  "assetMint":         "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "assetTokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}
lamportAmount is the USDC amount in base units. With USDC decimals = 6, 1.50 USDC = 1_500_000 base units. Hubra’s API takes a decimal string from the caller and converts to base units server-side.

Share-price math

raUSDC is minted at the current share price:
raUSDC_minted = USDC_deposited / share_price
Share price climbs over time as the vault’s underlying allocations earn yield. Read it via Voltr’s /vault/{vault}/share-price endpoint, surfaced through Hubra’s GET /api/v1/strategies/usdc-earn.

Programmatic deposit

curl -X POST https://hubra.app/api/v1/stake \
  -H 'Content-Type: application/json' \
  -d '{
    "strategy": "usdc-earn",
    "wallet":   "<your-wallet>",
    "amount":   "100"
  }'
Response:
{
  "strategy":    "usdc-earn",
  "transaction": "<base64 unsigned tx>",
  "hubra_token": "<HMAC token>",
  "route":       "voltr",
  "signers":     ["<your-wallet>"]
}
Sign the transaction locally and broadcast via POST /api/v1/broadcast with route: "rpc". There is no Sanctum involvement; plain RPC handles the broadcast.

Withdraw flow (technical)

USDC Earn supports direct withdraw only. Other Voltr vaults can have queued withdraws with a withdrawalWaitingPeriod; this one does not.

Direct withdraw

POST https://api.voltr.xyz/vault/3maCu...6gNQ/direct-withdraw returns an unsigned transaction that:
  1. Burns your raUSDC.
  2. Transfers USDC from the vault to your associated USDC token account.
  3. Settles in a single transaction. No cooldown.

isWithdrawAll semantics

Two withdraw modes:
ModeWhat it does
Specific amountBurns the exact raUSDC needed to redeem amount USDC at the current share price.
Withdraw allBurns your entire raUSDC balance. The amount field is ignored when isWithdrawAll: true.
Use isWithdrawAll: true when you want to drain the position fully without computing the exact raUSDC count. The vault handles the math.

Programmatic withdraw

# Specific amount
curl -X POST https://hubra.app/api/v1/unstake \
  -H 'Content-Type: application/json' \
  -d '{
    "strategy": "usdc-earn",
    "wallet":   "<your-wallet>",
    "amount":   "500",
    "kind":     "instant"
  }'

# Full withdraw
curl -X POST https://hubra.app/api/v1/unstake \
  -H 'Content-Type: application/json' \
  -d '{
    "strategy":      "usdc-earn",
    "wallet":        "<your-wallet>",
    "kind":          "instant",
    "isWithdrawAll": true
  }'
Both return route: "voltr". Broadcast via route: "rpc".

Whitelisted adapters

The Voltr vault program is configured with a whitelist of adapters: the only contracts the vault is allowed to deposit USDC into. Each adapter is independently audited. The current adapter set includes lending markets on:
  • Kamino — automated lending
  • Jupiter — lend infrastructure
The full integration list is on-chain and exposed via Voltr’s vault snapshot endpoint:
curl https://api.voltr.xyz/vault/3maCuTJVPteZ2dFA8dADxz2EbpJHfoAG5txYhXDs6gNQ
The integrations array in the response shows each adaptorPk (the adapter program account) and its whitelisted flag. The autonomous rebalancer decides where USDC moves between adapters based on relative yield. The rebalancer source code is public:

vaults-rebalancer

Read the allocation logic on GitHub.

Fee structure

Voltr’s vault fee config has four slots; for the Hubra Earn vault, each is set as follows:
FeeDescriptionHubra Earn value
performanceFeeCut of yield earned0%
managementFeeAnnualized AUM fee0%
issuanceFeeCharged on deposit0%
redemptionFeeCharged on withdraw0%
The displayed APY is the venue-blended yield net of any underlying market spreads (e.g., Kamino’s reserve fee on its lending markets). Those are not Hubra fees; they are baked into the upstream’s quoted APY. Verify the fee config on-chain via fetchUsdcVaultStats() (/vault/{vault}/feeConfiguration).

raUSDC: do not touch outside Hubra

raUSDC is not designed for cross-protocol composability. Do not transfer, swap, or burn raUSDC outside the Hubra app.
Unlike raSOL (which is a Sanctum preferred-partner LST with deep liquidity across Solana DeFi), raUSDC is a vault-specific receipt. Withdraws happen by burning raUSDC inside the vault; trading raUSDC on a DEX is not supported and will result in loss of access to the position. If you connect an external wallet (Phantom, Backpack, Solflare) and deposit into Earn, raUSDC will appear in that wallet. Treat it as “do not touch.” For the full token reference, see raUSDC.

Reading vault state

Three useful Voltr endpoints (called server-side by Hubra; surfaced through the agent API):
Voltr endpointHubra surface
GET /vault/{vault}GET /api/v1/strategies/usdc-earn
GET /vault/{vault}/share-priceEmbedded in live.exchangeRate
GET /vaults/user/{wallet}/interest-earnedSurfaced in the Hubra app’s portfolio view
The vault snapshot returns the full state: totalValue, apy.{oneDay,sevenDays,thirtyDays,allTime}, dailyStats.apyData[], allocations[], integrations[], feeConfiguration. Hubra surfaces the headline numbers; the full snapshot is one HTTP call away if you need the rest.

Risks

USDC Earn is distinct from validator staking risk. You are exposed to:
  • Vault smart-contract risk. Voltr’s vault program. Audited (Sec3 X-RAY, FYEO) but no contract is risk-free.
  • Adapter risk. Each whitelisted adapter is its own contract surface.
  • Underlying venue risk. Kamino, Jupiter, etc. — each has its own audit and operational history.
  • Stablecoin risk. USDC is a Circle-issued stablecoin and carries the issuer risk associated with that.
ComponentAuditorStatus
Vault programSec3 X-RAYPassed
Adapter programsSec3 X-RAYPassed
Vault programFYEOPassed
Only deposit what you can afford to expose to Solana DeFi risk. No yield product is fully risk-free.

Common questions

The transaction may include an associated token account (ATA) creation for raUSDC if your wallet has not held it before. ATA creation costs ~0.002 SOL of rent (covered by Hubra in the app, paid by the wallet for direct API callers).
The current vault is USDC-only. Deposits in other tokens would need to be swapped to USDC first.
Voltr’s vault program supports both. The Hubra Earn vault is configured for direct (instant) withdraws — withdrawalWaitingPeriod is 0. A queued withdraw would require waiting withdrawalWaitingPeriod seconds before the funds settle. Not used here.
The raUSDC redemption rate climbs continuously as the underlying allocations earn yield. Your raUSDC balance stays fixed; each unit becomes worth more USDC over time.
No. Like any DeFi yield product, USDC Earn’s principal carries smart-contract, protocol, and stablecoin risk.
Call Voltr’s vault snapshot endpoint and read the allocations[] array. Each entry shows the org name, strategy description, and positionValue of vault-deployed USDC at that venue.

Get started

Deposit USDC

Open the app and choose Earn.

POST /api/v1/stake

Build a deposit transaction programmatically.