How Vaultonaut calculates your earnings
Vaultonaut does not take a protocol's number and dress it up. What your position earned is worked out again from your own transaction history. This page describes how — closely enough that you could check a figure on screen yourself, and openly enough that you can see where the data does not stretch.
What gets calculated
For a public wallet address, Vaultonaut reconstructs, per vault:
- the open position — shares held, and what they are worth in the vault's own units,
- what that position has earned so far, in the vault's units and in your currency,
- return on the amount deposited, and realised APY over time,
- the history: value, net deposits and earnings for each day,
- Merkl campaign rewards, per token and per vault, kept separate.
A vault's net APY is not calculated here; it is the protocol's own figure, passed through. There is a section on that below.
Data sources
Three vault protocols are analysed, plus one rewards source. Vaultonaut is not affiliated with any of them, and is neither commissioned nor endorsed by them.
- Morpho — Vault V1 and V2, through Morpho's GraphQL API: the vault list, vault metrics, share-price history and an address's transaction log.
- Accountable — credit and RWA vaults, through their own API. Positions, movements and share prices for these vaults come from that API alone.
- Yuzu — leveraged ERC-4626 vaults. The vault list and daily APY come from Yuzu's API; the transaction log is additionally read straight off the chain, scanning the vault contract's events in block windows.
- Merkl — campaign rewards: earned, claimed, claimable and pending, per token.
- An Ethereum RPC endpoint — for holdings that can be checked on-chain directly (see below), and for the Yuzu log scan.
- Exchange rates: a current daily rate for displaying amounts in euro, and the ECB reference rate of the relevant date for the tax report, because an amount received in March has to be converted at March's rate rather than this morning's.
One distinction the pages themselves also make: Morpho and Yuzu vaults are ERC-4626, so a holding can be recomputed at the contract independently of the API. Accountable's contracts are not — there the figures rest on that API alone, and the pages showing them say so rather than implying a cross-check that never happened.
If one protocol is unreachable, the rest is still shown and the gap is named. Only when no source answers at all does the page show an error instead of a total that is quietly short.
Deposits and withdrawals
Everything starts from the address's transaction log, sorted by time and by position within the block. A deposit adds to what went in, a withdrawal to what came out — both in the vault's own units, as whole integers at the token's precision. No exchange rate is applied at this stage, so no rounding error can accumulate across the history.
Shares that arrive or leave by transfer are the exception. A transfer names shares, not an amount in the vault's units, so its value has to come from the share price at that moment: incoming shares count as a deposit at what they were worth on arrival, outgoing ones as a withdrawal at what they were worth on the way out. That position is marked — the figure is usable, but it rests on an inferred price rather than a price anyone paid.
The earnings figure
Because earnings are never recorded anywhere, they are reconstructed from what went in and what came out:
earnings = current holding
+ everything ever withdrawn
− everything ever depositedAll of it in the vault's own units. The identity is exact and price-independent — it holds for 100 USDC exactly as it holds for 100 WBTC. A price is applied afterwards, for display only.
Return is measured against everything ever deposited, not against the current holding. For a position that was drawn down along the way those are very different numbers; the pages use the first throughout, so that a single vault's return and the portfolio's mean the same ratio.
The history runs the same calculation per day: shares replayed from the log, valued at that day's share price, net deposits subtracted. A day's earnings are the difference from the day before. Days are aligned to midnight UTC.
Net APY and realised APY
These are two different numbers, and telling them apart is the reason this tool exists.
Net APY is the protocol's own statement about the vault, not about you, and Vaultonaut passes it through unchanged. “Net” there means after the vault's fees and including the incentives the protocol itself reports — the same rate excluding those incentives sits beside it as the base APY. It is forward-looking and describes what the vault is paying now. It says nothing about your position.
Realised APY is Vaultonaut's own, computed backwards from your history:
realised APY = earnings over the window
─────────────────────────── × 365 / days
avg. value over that windowAnnualised simply, not compounded: the windows are short (7 or 30 days), and compounding a noisy sample inflates the headline more than it informs anyone. While a window is not yet full, no figure is shown at all — otherwise two days of earnings would be divided across a whole year.
For the overall figure, only days with capital actually at work count, so a period spent half empty is not averaged in as “earned nothing”. Below a cent of average value no rate is reported at all: on the dust left by a closed position, any percentage is arithmetically flawless and meaningless.
Why rewards are kept apart
Merkl campaign rewards are never folded into vault earnings. They are a different thing in every way that matters:
- They pay out in a different token from the vault's.
- They follow the campaign's schedule, not the share price.
- They have to be claimed. Until they are, they sit outside the holding the vault reports — and claiming happens at Merkl, not here.
So they are tracked per token and per vault, split into earned, claimed, claimable and pending. Adding them into an earnings total would mean summing a claimed amount with a promised one and reporting the result in a unit neither of them is denominated in.
One overlap worth knowing about: the vault's net APY described above already includes the incentives the protocol reports. That rate is the protocol's projection; the reward figures in Vaultonaut are measured amounts from Merkl. They answer different questions, which is why they are never netted against each other.
When the history does not reach
The calculation above stands or falls with a complete transaction log. Where it is incomplete there are two possible answers, and showing a number anyway is the wrong one. With the deposits missing, the identity reports the entire holding as gain.
Earnings are withheld entirely when:
- the wallet holds shares for which the log contains no transaction at all — the position was entered outside the window that was read;
- the log was truncated, so earlier deposits exist but were not fetched;
- a transfer could not be valued, because no share price is known for that vault at that moment.
They are marked but still computed where shares moved by transfer and could be valued. A withholding applies to exactly the vaults affected; the same wallet's other positions are reported normally. Where a total is partial for this reason, the interface says so instead of summing around the hole.
The charts work the same way: a vault with no price series does not enter the curve. An invented flat line would be a shape in a chart that never existed.
That is the rule behind everything on this page: better an empty field with a reason than a number that looks plausible and is wrong.
How often data refreshes
Each kind of data has its own lifetime. Within it, an answer already fetched is reused rather than asked for again:
- Positions — 60 seconds.
- Transactions — 2 minutes.
- Vault list and vault detail, and so APY and vault size — 5 minutes.
- Share-price history — 15 minutes.
- The figures on the landing page — 10 minutes.
How current the protocols' own data is depends on their indexers, which Vaultonaut has no influence over.
Limits
- Coverage is vaults on Morpho, Accountable and Yuzu, plus Merkl rewards. Other DeFi positions — other protocols, LP positions, staking, tokens simply held — do not appear, including in the totals.
- Not every protocol is on every chain, and not every feature is available for every vault; share-price history in particular depends on what the source serves.
- Historical data is only as complete as the sources make it. When the history does not reach describes what happens then.
- An EVM address is expected: 0x followed by 40 hex characters. ENS names are not resolved.
- A reconstructed past is not a statement about the future. Projections on the analytics pages are labelled as such and are not a promise.
- Vaultonaut is an analytics tool and reads only. It holds nothing, signs nothing and can move nothing.
- Not financial, tax or legal advice. The tax report prepares figures under Austrian law; whether and how they belong in your return is for your tax adviser to judge. The terms of use apply in addition.
Last updated: August 15, 2026