{ "strategy": "sol-native-stake", "kind": "deactivate", "transaction": "<base64 unsigned tx>", "hubra_token": "<token>", "signers": ["<your-wallet>"], "notes": "Stake becomes withdrawable after the deactivation epoch (~2.5 days). Then call /api/v1/withdraw."}
No Sanctum or Voltr involvement. Broadcast via route: "rpc". After the deactivation epoch passes, call POST /api/v1/withdraw to close the stake account and pull SOL back.
Burns raSOL Max LP (amount) and pays out raSOL. Routes through the rasol-max SDK’s dual path — path tells you which ran:
vault-idle — one instruction, when the vault holds enough idle raSOL.
flash-bracket — 8–10 instructions + an address-lookup-table, deleveraging your slice through a MarginFi flashloan. The first redemption per wallet lazily initialises a MarginFi account (~0.005 SOL one-shot rent), flagged by initializedMarginfiAccount.
The leveraged exit pays out raSOL, not SOL. Pass outputAsset: "SOL" to get the same single LP → raSOL transaction plus a ready-to-run next step for the raSOL → SOL conversion:
{ "strategy": "sol-leveraged-stake", "outputAsset": "SOL", "transaction": "<base64 unsigned tx>", "hubra_token": "<token>", "path": "flash-bracket", "expectedPayoutRasol": "0.019414075", "next": { "description": "Broadcast THIS tx first, read the raSOL you actually received, then POST that amount here.", "endpoint": "/api/v1/unstake", "method": "POST", "body": { "strategy": "sol-liquid-stake", "wallet": "<your-wallet>", "amount": "0.019414075", "kind": "instant" } }}
The SOL leg is a second signed transaction, not atomic. Sanctum won’t quote raSOL → SOL until the burned raSOL actually lands in your wallet. So: broadcast the withdraw, read the raSOL your wallet actually received, then fire the next call sized by that real balance — next.body.amount is only the build-time estimate.
Missing fields, invalid kind for the strategy, stakeAccount missing for sol-native-stake, missing amount for sol-leveraged-stake, or an invalid outputAsset.