Stress-Testing Spout's 0% APR: Where the Money Actually Comes From

A teardown of Spout Finance's tokenized-equity borrowing model — economics, protocol design, and UX

Justin · September 2026 · Prepared for the Spout Finance Beta Intelligence Challenge


0. TL;DR

Spout is a three-sided machine: borrowers lock tokenized US equities and draw stablecoins at 0% APR / 50% LTV; a rules-based engine writes weekly covered calls against the pooled collateral; lenders' stablecoins fund the loans and get paid 80% of the premium. The design is cleaner than most "RWA DeFi" attempts — pool-level options execution, an explicit loss waterfall, earnings-week cycle skips, and conservative oracle handling are all genuinely good engineering.

But "0% APR" is a pricing decision, not a free lunch. The borrower pays in capped convexity on a roster deliberately loaded with high-beta names (NVDA, MSTR, SMCI), plus a 4–12.5% liquidation fee and 20 bps of transfer friction. On this roster, in this market regime, the expected cost of giving up call-side upside can plausibly exceed a conventional 6% margin rate. And three structural risks deserve more attention than the docs give them: utilization dependency of the Senior 7% priority, the weekend gap on BTC/SOL-beta collateral, and one collateral asset (BSOL, the Bitwise Solana staking ETF) whose embedded staking-yield attribution and thin young-ETF options book the docs don't address.

Verdict scores (their rubric): Product insight — see §4–§6. DeFi/tokenization analysis — §2–§3. UX feedback — §7 (testnet walkthrough; see caveat). Content — you're reading it. New in this revision: §11 — a docs-vs-Terms-of-Service cross-check that finds six numbers where the two documents disagree (including a 1%-vs-20bps withdrawal fee gap and a loss waterfall with an extra layer in the ToS).


1. What Spout actually is, in one diagram

BORROWER OPTIONS ENGINE LENDER lock spAssets (Token-2022, ──► pool collateral per asset ──► write weekly OTM KYC-gated transfer hook) (100-share contracts, covered calls at a │ pool-level, pro-rata) regulated US venue ▼ │ │ borrow ≤50% LTV in stables ▼ ▼ at 0% interest premium collected 20% protocol fee │ │ (Insurance Fund + ▼ ▼ ops + treasury) repay anytime; Friday expiry → 80% to lenders: assignment → shares sold Monday 9am ET settle Senior 7% priority + at strike; Auto-Roll rebuys 25% of excess; by default Junior gets rest (~9% / ~32% APY)

The 11-asset launch roster: AAPL, NVDA, GOOG, SMCI, IBIT, MSTR, BSOL, PFE, GS, XOM, GLD. Flat 50% max LTV across all assets; liquidation thresholds per asset (buffers 4%–12.5% above 50%).

2. The core question: what does "0% APR" really cost?

Spout's framing: the collateral is productive, the calls fund the lenders, so the borrower pays no coupon. True as far as it goes. But the borrower pays four other things:

  1. Capped convexity. Strikes are set "meaningfully OTM" (their worked MSTR example: strike ~8% above spot on a weekly). If the underlying rips past the strike, your shares are sold at the strike. Docs state the historical assignment drag is ~0.5% annualized — plausible for a diversified book in calm regimes. But the roster is concentrated in exactly the names where weekly >8% moves are common: NVDA, SMCI, MSTR, IBIT. Conditional on a strong-bull regime (the last 24 months), assignment frequency on this roster is much higher than on an index book. Expected cost of the cap is not 0.5%/yr in a momentum regime; it's regime-dependent and can be multiples of that. A 6% margin loan with full upside can be cheaper than a 0% loan with weekly-capped upside on MSTR. This is the single most important thing a borrower must understand, and the app's "0%" headline works against it.
  2. Liquidation fee = the asset's buffer (4%–12.5%) charged on the collateral sold at liquidation. In their own NVDA worked example, ~$992 of an ~$2,184 partial liquidation — a ~45% take of the liquidation event (8.8% buffer × the sold slice, but effectively nearly half the event's proceeds in fees in that example's arithmetic). Docs don't specify the split between Insurance Fund and protocol revenue. That should be disclosed.
  3. 20 bps round-trip on spAsset mint/redeem per the docs' fee page. (The Terms of Service say 25 bps, plus a 1% fee on "borrowing and lending withdrawals" the docs' table doesn't carry — see §11; that clause, if it applies to drawing loan proceeds, is effectively an origination fee.)
  4. KYC-gated transferability (Token-2022 transfer hook): spAssets cannot move to non-verified wallets, so secondary liquidity is ~zero and exit routes run through Spout redemption. You pay in optionality of exit.

Recommendation A: show borrowers a "true cost of borrowing" estimate per asset — implied coupon = expected assignment drag + fee drag under 2–3 vol regimes — next to the 0% headline. The tool that tells users when a margin loan is cheaper builds more trust than any marketing.

3. Is the Senior 7% priority actually fundable? (The utilization dependency)

The settlement math: Senior's 7% annualized priority (~$11.5k/week per $8.5m of Senior) is payable only from premium actually collected — and premium scales with collateral locked by borrowers, not with deposits. The docs' own $30k/week gross example implicitly assumes a healthy borrowed-against collateral pool.

Sanity check with listed-market numbers: 1-week ~8% OTM calls on liquid large caps yield roughly 0.2–0.6% of notional per week; on high-vol names 1–2%. For a $10m lending pool where Senior alone needs ~$11.5k/week, the engine needs roughly $2–6m of actively cycled collateral at listed-market premium rates (more if strikes are as distant as claimed). That's achievable — but only at high lock utilization.

The failure mode is quiet: if borrow demand lags deposits, premium per lender-week thins out, Senior shortfalls get "noted and topped up from Insurance Fund surplus," and the fund meant for tail losses becomes a yield-smoothing account. The docs are honest that this is possible; the product implication is that Senior APY marketing (a stable "7% priority") should be displayed as variable, premium-funded — because it structurally is.

Recommendation B: publish a live "engine dashboard": collateral locked vs. deposits (utilization), rolling 4-week premium collected, current strikes per asset, Insurance Fund balance vs. 2% target, drawdown history. The docs promise this in-app; making it public-web would pre-answer the skeptics (including this one).

4. Weekend gap: the protocol's structural blind spot

The engine runs weekly cycles entered Friday open, expiring Friday close, against equities that trade 5×8 — but three of eleven collateral types (MSTR, IBIT, and bSOL) are effectively BTC/SOL beta that reprices 24/7:

Scenario: Saturday BTC −15%. MSTR/IBIT collateral values gap down hard; nothing can be liquidated or hedged until Sunday-night/Monday; the market open then concentrates assignment + liquidation + rebuy flows into one session, on the exact assets with the widest buffers. The loss waterfall (Insurance Fund → Junior → Senior) is well-designed for this, but the trigger frequency is systematically underestimated by looking at equity-market history alone.

Recommendation C: for BTC/SOL-beta collateral, either (a) cut max LTV below 50% (e.g. 40%), (b) hold a slice of premium for weekend protection (listed BTC options trade 24/7 on some venues; SOL proxies via CME/ETF options don't), or (c) mark those assets continuously with crypto-market oracles on weekends. The flat-50% "simplicity" argument is inconsistent with the engine's own per-asset strike tuning — the protocol already treats assets individually everywhere else.

5. BSOL: the classification is right — the open questions are yield attribution and options depth

The supported-collateral table lists BSOL as "Solana Exposure — ETF, newer listing, shorter history." An early draft of this teardown read that as a misclassification — bSOL is also the ticker of the BlazeStake liquid staking token, and I could not place a US ETF under that ticker. That reading was wrong, and it's corrected here: BSOL is the Bitwise Solana Staking ETF (NYSE Arca, listed Oct 28, 2025 — the first US spot-Solana ETP). Spout's row is accurate, including the honest "newer listing, shorter history" caveat; a protocol that lists a young ETF and labels it as such is doing disclosure right.

Two real questions remain for this asset:

  1. Whose staking yield? BSOL is a staking ETF: its NAV accrues SOL staking rewards net of its expense ratio, continuously. The docs' "productive collateral" story credits borrowers through the options cycle only. But when BSOL shares sit as locked collateral, the embedded staking yield keeps accruing inside the position — and the fee/docs pages never say whether that accrual is credited to the borrower's position, shared with lenders through the engine's economics, or simply stays in the share price (mechanically it's the borrower's asset, but one explicit sentence would settle it). Disclosure here is cheap and would pre-empt the question from every DeFi-native reviewer.
  2. Options depth on an 11-month-old ETF. The engine's edge depends on execution quality: weekly covered calls at "meaningfully OTM" strikes need tight spreads and a dense strike grid. Options books on young ETFs — even fast-scaling ones — are thinner than the AAPL/NVDA/GLD books on this roster; wider spreads mean the engine's realized premium on BSOL cycles will lag clean "listed-market norms" backtest numbers. The per-asset cycle cadence is published in-app; publishing per-asset realized spread and fill quality would be the trust move — starting with the asset whose history is shortest.

§4's weekend-gap point survives unchanged for this asset: SOL reprices 24/7 while BSOL marks update at reduced frequency off-hours and the hedging venue is closed.

Recommendation D: state explicitly whose account BSOL's embedded staking yield accrues to while shares are locked, and publish per-asset realized spread/fill quality (BSOL first). The honest labeling is already done; these two disclosures would finish the job.

6. What the design gets right (worth saying)

7. UX friction log (testnet walkthrough)

⚠️ Caveat: my hands-on section is pending testnet credentials (requested via the earn listing and X on Sep 21). The items below are from the public funnel and docs; the published version will add full testnet flows with screenshots if access is granted before the bounty closes.

  1. The gate itself: beta requires an emailed email+passcode pair, obtainable only via Telegram (@SpoutHelp). For a Solana-native product, gating testnet (where funds are worthless) behind a Telegram Vettable channel is heavy friction; a wallet-based gate (sign a message, get a code) would be one-click for the exact audience.
  2. app.spout.finance returned Cloudflare 522 (origin timeout) during my testing window (Sep 21 ~06:51 UTC) — reliability signal worth noting pre-launch.
  3. Auto-Roll defaults ON. Assignment → auto-rebuy at the higher price + re-enroll. For a borrower who doesn't read docs, the first experience of "my NVDA got sold and rebought slightly smaller" will be a support ticket. At minimum, surface the Auto-Roll state on the position card, not in settings.
  4. Health Factor is the right primitive — but "no cost to being close to the line" (docs) is only true until the liquidation fee = buffer design kicks in; the two framings sit awkwardly together. The UI should show the dollar liquidation fee the current buffer implies, live.
  5. KYC forks the funnel: Path A (buy inside app, KYC) vs Path B (deposit existing xStocks/Ondo tokens, no KYC). Fine — but the fee table's "0.20% applies when you buy or sell spAssets through the app" doesn't clarify whether Path B deposits ever pay it (docs suggest not). One sentence would fix it.

8. Feature recommendations (prioritized)

# Recommendation Why it matters
A "True cost of borrowing" estimator next to the 0% headline The product's core claim hides its real price; transparency converts skeptics
B Public engine dashboard (utilization, premium history, strikes, insurance fund) Trust for lenders; pre-answers the §3 question
C Sub-50% LTV or weekend marks for BTC/SOL-beta collateral Closes the §4 structural gap
D State whose account BSOL's embedded staking yield accrues to; publish per-asset realized spread/fill quality §5 — yield attribution + young-ETF options depth are the open questions
E Liquidation-fee split disclosure (Insurance Fund vs. protocol revenue) Fee goes to "a slice" of the fund — how big is the slice?
F Name the custodian broker + options venue Counterparty risk is named but not identified; disclosure is cheap trust
G Auto-Roll state on the position card; first-assignment consent moment Prevents the most predictable support/regret pattern
H Consider allowlisted secondary pool for KYC'd wallets Gives spAssets exit liquidity without the 20 bps redemption funnel
I One canonical numbers source rendered into both docs and ToS (fees, buffers, waterfall, tranche targets) §11 — six numbers currently diverge between the two documents

9. Competitive position

Nearest neighbors: (a) brokerage margin (IBKR ~5.5–7% with full upside, but offchain and custody-with-broker), (b) covered-call ETFs (JEPI/QYLD-style: VRP harvest, no borrowing attached), (c) tokenized-equity venues (xStocks/Backpack: transferability, no native borrowing). Spout's actual moat is the options desk operations + broker integration, not the chain — Solana gives settlement and the Token-2022 KYC hook, but the hard part (running weekly disciplined calls through a regulated venue, reconciling broker state onchain) is an ops capability competitors can't fork from GitHub. That's also the right frame for the token: value accrual is protocol-fee-on-premium, which scales with real flow, not with emissions.

10. Verdict

Spout is the most internally-consistent tokenized-equity borrowing design I've seen ship to a public testnet: the flywheel is real, the risk stack is explicit, and the docs mostly resist the urge to hide the load-bearing numbers. Its three weakest points are (1) a headline price ("0%") that hides a regime-dependent convexity cost on a deliberately high-beta roster, (2) a Senior yield that is structurally utilization-dependent but marketed as a fixed priority, and (3) one collateral asset (BSOL) whose embedded staking-yield attribution and young-ETF options depth the docs don't address. Fix A–D before mainnet and the story holds together; ship without them and the first MSTR-assignment wave or thin-premium month will write the teardown for you.

11. Addendum (Sep 21, evening): the Terms of Service disagree with the docs on six numbers

After publishing, I cross-checked the Terms of Service (spout.finance/terms — the legally binding document) against the docs (the marketing-adjacent one). Six load-bearing numbers diverge:

# Item Docs say ToS says
1 spAsset mint/redeem 0.20% (20 bps) 0.25% (§8.1b)
2 Withdrawal fee 0.20%, stablecoins leaving the pool (lender side only) 1% on borrowing and lending withdrawals (§8.1c)
3 Liquidation buffers 4%–12.5% 7.5%–20% (§9.3)
4 Loss waterfall Insurance → Junior → Senior ("no loss reaches Senior unless the first two layers are exhausted") Insurance → Junior → Protocol Treasury → Senior (§9.4)
5 Tranche targets Senior ~9% net, Junior ~32% APY Senior target ~8.67%; Junior ~24–27% net (§7.3)
6 Cycle cadence weekly (Friday open → Friday close) "weekly or biweekly depending on the asset" (§7.2)

Plus a fee the docs' fee page omits entirely: an Idle Routing Fee of ~7% on yield from idle pool capital deployed to onchain money markets (§8.1e).

Recommendation I: render fees, buffers, waterfall, and tranche targets in both docs and ToS from a single canonical numbers source. The cost of a 20-bps fee table sitting next to a 1% fee clause isn't a typo — it's the trust of exactly the users Spout's disclosure-forward design is trying to win.


Method note: analysis is based on Spout's public docs (spout.finance/docs), Terms of Service (spout.finance/terms), site, and onchain-public information as of Sep 21, 2026; premium-rate sanity checks use listed-options market norms. Not investment advice. Testnet walkthrough pending credentials; will be appended. §5 was corrected on Sep 21 after fact-checking — an early draft misread BSOL as the BlazeStake LST; it is the Bitwise Solana Staking ETF (correction posted in the X thread). §11 was added the same evening after a docs-vs-ToS cross-check surfaced six divergent numbers; the addendum is also posted in the X thread.