Skip to content

TypeScript SDK#

The Marinade TypeScript SDK provides a complete interface for integrating liquid and native staking into your Solana applications.

Package Purpose
@marinade.finance/marinade-ts-sdk Liquid staking (mSOL)
@marinade.finance/native-staking-sdk Native staking

Installation#

Bash
npm install @marinade.finance/marinade-ts-sdk @solana/web3.js

Configuration#

TypeScript
import { Marinade, MarinadeConfig } from '@marinade.finance/marinade-ts-sdk';
import { Connection, PublicKey } from '@solana/web3.js';

const config = new MarinadeConfig({
  connection: new Connection('https://api.mainnet-beta.solana.com'),
  publicKey: new PublicKey('YOUR_WALLET_ADDRESS'),
});

const marinade = new Marinade(config);
TypeScript
import { Marinade, MarinadeConfig } from '@marinade.finance/marinade-ts-sdk';
import { Connection, PublicKey } from '@solana/web3.js';

const config = new MarinadeConfig({
  connection: new Connection('https://api.devnet.solana.com'),
  publicKey: new PublicKey('YOUR_WALLET_ADDRESS'),
});

const marinade = new Marinade(config);

Liquid Staking Operations#

Deposit SOL (Get mSOL)#

TypeScript
// Deposit 1 SOL and receive mSOL
const { transaction } = await marinade.deposit(1_000_000_000); // lamports

// Sign and send transaction
const signature = await sendAndConfirmTransaction(connection, transaction, [wallet]);

Unstake (mSOL → SOL)#

The SDK provides liquidUnstake for converting mSOL back to SOL:

TypeScript
// Liquid unstake - swaps mSOL for SOL via liquidity pool
const { transaction } = await marinade.liquidUnstake(1_000_000_000); // mSOL in lamports

// Sign and send
const signature = await sendAndConfirmTransaction(connection, transaction, [wallet]);

Unstake Options

  • Instant: Use liquidUnstake() - small fee (~0.1-0.3%), immediate SOL
  • Delayed: Use the web interface for fee-free unstaking (~1-2 epochs wait)

Liquidity Pool Operations#

The SDK also supports liquidity pool interactions:

TypeScript
// Add liquidity to the mSOL/SOL pool
const { transaction } = await marinade.addLiquidity(1_000_000_000); // SOL in lamports

// Remove liquidity (receive SOL and mSOL)
const { transaction } = await marinade.removeLiquidity(lpTokenAmount);

Native Staking SDK#

For native staking operations, use the dedicated @marinade.finance/native-staking-sdk:

Bash
npm install @marinade.finance/native-staking-sdk

Configuration#

TypeScript
import { NativeStakingConfig, NativeStakingSDK } from '@marinade.finance/native-staking-sdk';
import { Connection, PublicKey } from '@solana/web3.js';

// Max Yield configuration
const config = new NativeStakingConfig({
  connection: new Connection('https://api.mainnet-beta.solana.com'),
  stakeAuthority: new PublicKey('stWirqFCf2Uts1JBL1Jsd3r6VBWhgnpdPxCTe1MFjrq'),
  exitAuthority: new PublicKey('ex9CfkBZZd6Nv9XdnoDmmB45ymbu4arXVk7g5pWnt3N'),
  nativeStakingApiUrl: 'https://native-staking.marinade.finance',
});

// Select configuration
const selectConfig = new NativeStakingConfig({
  connection: new Connection('https://api.mainnet-beta.solana.com'),
  stakeAuthority: new PublicKey('STNi1NHDUi6Hvibvonawgze8fM83PFLeJhuGMEXyGps'),
  exitAuthority: new PublicKey('EX1Fs34ajye3BTMSjTkMdZ8P4hb99vQFWzmueqhKGpH6'),
  nativeStakingApiUrl: 'https://ns-prime.marinade.finance',
});

// Recipes configuration
const recipesConfig = new NativeStakingConfig({
  connection: new Connection('https://api.mainnet-beta.solana.com'),
  stakeAuthority: new PublicKey('stRcP4kVnCNubspkcP3BXEthPfZFEriQBqSczDDwmYH'),
  exitAuthority: new PublicKey('exRcSuzu5XLZYZ4GgeWYDn9qYwQnBycmyG8zBDJhEgY'),
  nativeStakingApiUrl: 'https://ns-recipes.marinade.finance',
});

const sdk = new NativeStakingSDK(config);

Get Stake Accounts#

TypeScript
// Fetch user's stake accounts managed by Marinade
const accounts = await sdk.getStakeAccounts(walletPublicKey);
// Returns: ready to revoke, being prepared, and actively managed accounts

Fetch Rewards#

TypeScript
// Get rewards data for user's native staked accounts
const rewards = await sdk.fetchRewards(walletPublicKey);
console.log(`APY: ${rewards.apy}`); // Note: null if no active stakes yet

Create Authorized Stake#

TypeScript
import BN from 'bn.js';

const amount = new BN('2000000000'); // 2 SOL
const { createAuthorizedStake, stakeKeypair } = sdk.buildCreateAuthorizedStakeInstructions(
  walletPublicKey,
  amount
);

// Build and send transaction...

Native Staking SDK Types

The SDK provides two configurations:

  • NativeStakingConfig - Default native staking via SAM
  • NativeStakingSelectConfig - For Marinade Select program

Querying Data#

Get mSOL/SOL Exchange Rate#

TypeScript
const state = await marinade.getMarinadeState();
const rate = state.mSolPrice; // mSOL per SOL
console.log(`1 mSOL = ${rate} SOL`);

Get User Stakes#

TypeScript
const stakes = await marinade.getUserStakes(walletPublicKey);
for (const stake of stakes) {
  console.log(`Stake: ${stake.balance} lamports`);
}

Error Handling#

TypeScript
import { MarinadeError } from '@marinade.finance/marinade-ts-sdk';

try {
  const { transaction } = await marinade.deposit(amount);
} catch (error) {
  if (error instanceof MarinadeError) {
    console.error(`Marinade error: ${error.code} - ${error.message}`);
  }
  throw error;
}

Full Example#

full-example.ts
import { Marinade, MarinadeConfig } from '@marinade.finance/marinade-ts-sdk';
import { Connection, Keypair, PublicKey } from '@solana/web3.js';

async function main() {
  // Setup
  const connection = new Connection('https://api.mainnet-beta.solana.com');
  const wallet = Keypair.fromSecretKey(/* your key */);

  const config = new MarinadeConfig({
    connection,
    publicKey: wallet.publicKey,
  });
  const marinade = new Marinade(config);

  // Check current state
  const state = await marinade.getMarinadeState();
  console.log(`mSOL price: ${state.mSolPrice}`);
  console.log(`Total staked: ${state.totalStaked}`);

  // Deposit 1 SOL
  const { transaction } = await marinade.deposit(1_000_000_000);

  // Sign and send
  transaction.sign(wallet);
  const sig = await connection.sendRawTransaction(transaction.serialize());
  await connection.confirmTransaction(sig);

  console.log(`Deposited! Tx: ${sig}`);
}

main().catch(console.error);

Resources#

Next Steps#

Action Link
View contract addresses Contracts
Use REST APIs API Reference
Earn referral rewards Referral Program
Native staking details Native Staking