How Sirius.fi works
Sirius.fi is an independent, read-only tracker for your Raydium liquidity positions. It is not affiliated with, endorsed by, or operated by Raydium. This page explains what it reads from your wallet, what it will never touch, and how every number on the dashboard is computed, straight from the on-chain math, so you can check our work.
Wallet access & promises
Two promises are absolute, and they hold no matter how Sirius.fi is funded.
Sirius.fi reads your positions and never manages them. Non-custodial: your private keys stay with you, and your wallet signs every transaction itself. The only transactions Sirius proposes are payments you start and approve yourself — more on that below.
What Sirius reads
When you connect, Sirius reads public, on-chain data tied to your wallet address, and nothing else:
- Your public wallet address (the one you connect with).
- Your Raydium CLMM positions and the pools they belong to.
- Your on-chain transaction history, to reconstruct deposits, withdrawals, harvested fees and rewards.
All of this is already public on the Solana blockchain. Connecting your wallet just tells Sirius which address to look up. It grants no spending or signing power.
What Sirius never touches
Sirius never accesses, requests, stores, or handles a private key or seed phrase. It never moves funds without a payment you explicitly start and approve, and it never opens, closes, rebalances, adds to, or withdraws from a position.
That includes harvesting. When you click “Harvest on Raydium”, Sirius simply links you to Raydium. The actual claim happens there, in your own wallet, on their site. Sirius shows you that there's something to harvest; it never performs the harvest for you.
Dashboard blockchain reads from your browser go through a server route that allows only read methods: fetching accounts, balances, signatures and parsed transactions. Methods that would send a transaction are not on the allowlist and are rejected. There is no code path that submits a position transaction.
The numbers aren't pulled from a private Sirius database. Positions, fees and history are reconstructed directly from raw Solana accounts and transaction logs, the same source of truth anyone can verify on a block explorer.
The read pipeline has no signing step at all. Your wallet never signs anything for Sirius to display your dashboard. The only time your wallet signs is a payment you start and approve yourself (the optional tip), to a fixed recipient.
The one exception, in full: the optional Support Sirius.fi tip
The only payment Sirius proposes today is the optional USDC tip. Its panel appears only if you click Support Sirius.fi yourself. Nothing is ever proposed automatically, and nothing happens in the background (no prompt, no transaction) unless you open the tip and choose an amount.
When you do, Sirius builds a single, ordinary payment. Adapters that broadcast via Sirius use a separate endpoint that accepts only a signed USDC tip to the fixed recipient; the dashboard endpoint cannot send transactions:
- It's a plain USDC transfer to one fixed, hardcoded recipient address, the same address every time, written into the code:
C7C3G9PckvgSkzkpGHicmq8KJfVx89QPdUJPwFQzRTyv - You pick the amount ($1, $3, $5, or a custom value); that is the only thing you control, within 0.50–10,000 USDC and at most six decimal places.
- Your wallet shows you the full transaction and you approve and sign it yourself. Sirius never sees a key and has no way to move your funds on its own, the same guarantee as everywhere else on this page.
(One technical footnote: the transaction always contains a standard Solana instruction that creates the recipient's USDC token account only if it is missing. That account already exists, so today the instruction does nothing and adds no rent. If it ever had to be created, you would fund that account's rent in SOL in addition to the network fee. Costs vary and are separate from the USDC amount; review them in your wallet. Some wallets add a compute-budget setting (priority fee) to a payment. Only that is accepted, with a small cap; any other change is refused and nothing is sent.)
That's the whole of it. The read-only promise above isn't “read-only, with an asterisk” we'd rather you not read — this is the asterisk, spelled out. Telling you exactly where the one exception lives is what makes the rest of the promise worth trusting.
What Sirius stores on its servers
Sirius has no user database. The application does not intentionally log wallet addresses or dashboard data. The hosting and RPC providers may process request metadata under their own retention policies. The application caches public prices and public shared-position data.
Two honest footnotes. First, to read the chain at all, your address passes through our proxy to our RPC provider (Helius); it's transmitted, not stored. Second, if someone opens a public share link (/p/…), that position's public on-chain data (including the owner's public address as a block-explorer link) is briefly cached (about 60 seconds), keyed by the public position id, so the page loads fast. Vercel Web Analytics is enabled for page-view analytics. Before an event is sent, the application removes every query parameter except a short list of marketing labels (utm_source, utm_medium, utm_campaign, utm_term, utm_content), drops the URL fragment, and redacts position and wallet addresses in the path. Your browser also stores wallet preferences and data caches locally. External RPC, price and token-logo providers receive requests needed to display their data. See our Privacy page for details.
Formulas & calculations
Plain language first, then the actual formula. Each metric gets its own block.
When a price is unknown, we say so — we never invent a $0
Every price lookup returns one of three things: a real price, “unavailable,” or a retry, but never a silent $0. If a token can't be priced for a given moment, Sirius marks that figure partial or unavailable and shows you what was excluded, instead of quietly treating it as worthless and skewing your totals. This is the rule that makes the rest of the numbers trustworthy.
Actual APR
Your actual APR is what this position has really earned, annualized, not the pool's advertised estimate. We take everything the position has earned (pending fees, harvested fees, and harvested rewards), divide by its current value, then scale that up to a yearly rate by how long it's been open.
APR % = (totalEarned / valueUsd) × (365 / daysOpen) × 100 totalEarned = pending fees + harvested fees + harvested rewards (USD) valueUsd = current position value (Raydium spot price) daysOpen = (now − position open time) in days
Be honest about what this is: a lifetime-realized, simply-annualized figure. It does not compound, and it divides earnings by the position's current value rather than a time-weighted average of the capital you actually had deployed. That makes it a fair backward-looking summary, not a forward guarantee of future yield. We hold it back entirely for the first 24 hours (too little data), flag it as provisional for the first week, and suppress implausible readings (above 999%, or when nothing has been earned yet) rather than show a misleading number.
ROI vs Holding
ROI vs Holding answers one question: has actively providing liquidity actually paid off? We compare your position today (its value plus everything it earned) against the cash you put in, net of what you took out. We also show a second comparison: how you'd have done simply holding the tokens you deposited, at today's prices.
netInvested = Σ deposits − Σ withdrawals (USD, each priced at its tx time) realizedGains = harvested fees + harvested rewards (USD) netResult = currentValue + realizedGains − netInvested ROI vs Holding = netResult / netInvested vs Holding tokens: hodlValueNow = (net deposited token amounts) × today's prices delta = currentValue + realizedGains − hodlValueNow
Each deposit and withdrawal is valued in USD at the price at that transaction's exact time, so the cash-flow figure is exact. A reinvested harvest (compound) contributes only its genuinely new capital. The re-deposited fee portion is stripped so it never double-counts.
A deliberate boundary, not a bug. If you've withdrawn most of what you put in, your net invested shrinks toward zero, and dividing by a tiny number makes the ROI percentage balloon even when the dollars are modest. Sirius handles this honestly rather than printing a dramatic but meaningless percentage:
- When net invested falls to about a dollar or less, we withhold the percentage entirely and show only the dollar figures.
- When withdrawals exceed half of deposits, we show a warning that the % is measured against the small remaining net investment, and tell you to trust the dollars first.
- If a pool holds a token we can't price historically, or the earliest transactions fall outside the synced history, we say the ROI isn't available rather than show an understated one.
We lead with dollars and treat the percentage as secondary on purpose: the dollar figures are always exact; the ratio can mislead.
Net invested & capital changes
Everything above depends on knowing exactly what you put in and took out. Sirius reconstructs that from your transaction history, classifying each liquidity change for a position as a deposit, a withdrawal, or a compound (a single transaction that harvests fees and reinvests them).
- Opening deposit: a position's very first liquidity comes from an
open_positioninstruction (in any of its three variants). We read the deposited amounts from the position-creation event and the position identity from the instruction itself. - Later adds: subsequent
increase_liquidityevents are deposits. - Withdrawals: a
decrease_liquiditythat actually removes liquidity is a withdrawal (a decrease that removes no liquidity is just a fee claim, handled by the fees pipeline instead). - Compounds: net new capital only, with the reinvested fee portion subtracted out.
netInvested = Σ deposits − Σ withdrawals
(each amount × its token's USD price at the transaction's time)We use a pure cash-flow model on purpose: when liquidity is partially withdrawn, any first-in-first-out or pro-rata assumption about which tokens left would be unverifiable. The cash-flow figure, by contrast, is exact.
Pending & harvested fees and rewards
Sirius distinguishes pending earnings (sitting in the position, not yet claimed) from harvested ones (already claimed in past transactions), and prices them differently, because they happened at different times.
- Pending fees are computed from on-chain fee-growth math, then valued at the current Raydium spot price.
- Harvested fees are valued at the historical price on the day you claimed them, so past earnings reflect what they were actually worth then, not today.
- Rewards (RAY and other pool emissions) are valued the same way, at the historical price on the harvest date.
pending fee USD = fee0 × spotPrice0 + fee1 × spotPrice1 (Raydium spot, now) harvested USD = amount × historical price on the harvest date (stablecoins = $1)
Where a token has no usable price source, or a historical price simply isn't available for that day, that amount is excluded and disclosed, never counted as $0 (see the rule above). For ROI, any reward tokens we couldn't price are listed as excluded, so you know precisely what the figure does and doesn't include.
Data sources
Every number traces back to a public source. Which number comes from where:
- Solana RPC (via Helius) — your positions, pool and account state, transaction history, and the on-chain fee math. All read-only.
- Raydium API — current spot prices for live position value and pending fees, plus pool metadata (fee rate, the pool's own APR estimate).
- CoinGecko — historical prices, used to value harvested fees, rewards, and ROI capital changes at the time they happened.
- Jupiter — the live SOL price in the header (Price API v3), and token names and logos. Jupiter never prices your positions.