mSOL Token

mSOL is the liquid staking token representing a stake position in the Marinade stake pool. The supply of this token is controlled by Marinade using burning and minting operations in accordance with the overall state of the program.

This token constantly increases in price after each epoch, as long as there are staking rewards distributed. The rewards are accumulated on total_staked.

Price of mSOL = total_staked / tokens_minted

mSOL token address: mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So

mSOL price: https://www.coingecko.com/en/coins/marinade-staked-sol

mSOL stats: https://stats.marinade.finance/

mSOL price

It is important to note that mSOL has a true price, guaranteed in our protocol, but can have a different price on DEXs and exchanges when the mSOL/XXX pair becomes unbalanced.

This situation is often quickly fixed by arbitrage. Nonetheless, we invite our users to compare the price of mSOL on Marinade to the one on DEXs in your trades and choose the most profitable for you.

Oracles

Our mSOL price is powered by Pyth and Switchboard. We also recently announced our partnership with Chainlink to bring even more security and trust to our protocol.

APY calculation

Marinade is using a 30-day simple moving average of the 14-day APY to display its final APY.

This means that every day, Marinade looks at the mSOL price and compares it to the price mSOL had 14 days before. A 30-day average of those measurements is then used to display a final APY, projected over a year.

How to use Marinade state to get mSOL data

Calculate the true mSOL/SOL price

First, you need to read Marinade state, an example is available at this link.

  • After reading Marinade state, you'll have marinade_state.msol_price: u64, and that is mSOL price in SOL multiplied by 0x1_0000_0000 (shifted), so to obtain mSOL/SOL as f64 you should do: let msol_price_f64: f64 = marinade_state.msol_price as f64 / 0x1_0000_0000 as f64, and then you get the true mSOL/SOL price.

How much SOL an amount of mSOL represents

You start with the previous example and some amount of mSOL-lamports, then:

let SOL_lamports = (mSOL_lamports as u128 * marinade_state.msol_price as u128 / 0x1_0000_0000 as u128) as u64

mSOL uses 9 decimals, as SOL.

How much mSOL an amount of SOL represents

let mSOL_lamports = (mSOL_lamports as u128 * 0x1_0000_0000 as u128 / marinade_state.msol_price as u128) as u64

Derive mSOL/USDC price

If you have access to SOL/USDC price from an oracle, the best way to avoid losses due to price inaccuracies is to derive mSOL/USDC from SOL/USDC and Marinade true price

let mSOL_usdc = (SOL_usdc as u128 * marinade_state.msol_price as u128 / 0x1_0000_0000 as u128) as u64

Notes

msol_price is computed and stored at this link (https://github.com/marinade-finance/liquid-staking-program/blob/main/programs/marinade-finance/src/state/update.rs#L247) after each epoch ends, when SOL staking rewards are added to the pool.

You can also use the fns marinade_state.calc_lamports_from_msol_amount() and marinade_state.calc_msol_from_lamports() for better precision when computing mSOL from SOL and vice versa.

Last updated