Hello everyone. I am a Rootcamp Cohort 1 graduate and I would like to turn my capstone into a production product. Before I put a formal proposal on Collective I want to sanity check the idea here. Any pushback is appreciated. I also have a few questions I’m hoping to get answered.
TL;DR
| Field | Value |
|---|---|
| Author | Ivan Ursulovic (NeznaniJunak), solo dev |
| Background | Cohort 1 Builders Rootcamp graduate, capstone April 2026 |
| Project | ERC-4626 multi-protocol yield vault, Sovryn Lend + LayerBank |
| Repo | GitHub - Ursulovic/rootstock-yield-vault · GitHub |
| Demo | https://rootstock-yield-vault.vercel.app |
| Code state | 228 unit + 28 fork + 6 halmos symbolic + 9 invariants × 128K calls; 100% line/statement/function coverage on the three core contracts |
| Testnet | rBTC vault live on chain 31, all three contracts Blockscout-verified |
| Tier | Strategic, target $25K within the $10K-$35K band (sizing rationale below) |
| Structure | M1 audit-anchored and split M1a/M1b (audit money releases on delivery), 30% terminal holdback per V3.2.2 floor, 5 milestones plus 0% Phase 0 gate |
| Trust model (rBTC vault) | No admin, no upgrade path, no pause |
| Trust model (ERC-20 vault) | Guardian can pause deposits only; withdrawals always live |
| Escape hatch | redeemInKind() returns pro-rata adapter receipts; try/catch hardening already merged, audit confirmation in M1 |
| Membership | 1,000 stRIF; not a delegate |
| RFC release | Held until at least one signed integrator LOI is attached |
About me
My name is Ivan Ursulović. Currently I work as backend and web3 engineer at DeGenerous DAO, where I built Solidity governance contracts, shipped an NFT staking system, and run the on-chain/off-chain backend that ties NFT trait evolution to AI-driven storytelling (CoNexus). Before DeGenerous I spent a few months in the Gno.land Student Contributor Program working on smart contracts and developer tooling in Gno (a Go-based language). My web2 background is at LotusFlare on a large-scale telecom MVNE orchestration platform, and C#/.NET microservices at TeleTrader on the financial-data side.
I am also pursuing a Master’s in Computational Finance at the School of Computing, Union University in Belgrade. The coursework has been a real help in understanding the DeFi economics the vault is built on top of.
I built the first version of the vault as my Builders Rootcamp capstone (April 2026) and have been working on it since.
What it is
An ERC-4626 vault that routes a single underlying asset across multiple lending venues through per-protocol adapters. Per-adapter caps are immutable at construction. The rBTC vault has no owner, no upgrade path, no admin-side pause.
What happens if a lending protocol breaks or gets exploited? There’s no admin key to trust. The guarantees are enforced in the contract itself. No single adapter holds more than 60% of TVL, so a blowup at one venue cannot take the whole vault. Once an adapter’s view starts reverting, deposits stop accepting new money, so nothing fresh gets trapped in bad accounting. Anybody can call rebalance() to move funds into the healthy adapter; it isn’t gated to me. And if vault accounting itself gets compromised, redeemInKind() hands users their adapter receipt tokens directly, so they can exit straight to the underlying protocol.
The ERC-20 variant adds a Guardian role limited strictly to pausing deposits; withdrawals always work.
The constructor enforces _adapters.length >= 2, _adapterCapBps * _adapters.length >= 10_000, _callerRewardBps <= 500, _maxSaneRate > 0, and _tvlCap > 0. These are hard rules. You cannot deploy a single-protocol vault from this factory.
Why this matters for Rootstock DeFi
Rootstock has BTC-aligned lending primitives but nothing shared sitting on top of them. A wallet or app that wants to offer a passive rBTC or stablecoin product today has to pick one venue and eat its risk. ERC-4626 is the standard tokenized-yield interface on most EVM chains, and Rootstock doesn’t have a solid one yet.
Two things I watched recently pushed me toward this design. When Tropykus shut down in May 2026, TYKORA pivoted to Sovryn without touching its vault contracts because the adapter sat between them. The Yearn yETH exploit in November 2025 hit complex stableswap strategy logic, but the underlying ERC-4626 primitive was never the problem. A small immutable vault with the protocol layer swappable underneath survives both: a venue shutting down, and a strategy getting exploited. Anything fancier is a bug surface waiting to happen.
Differentiation
| Project | Trust model | Scope | License |
|---|---|---|---|
| TYKORA | Multisig + emergency cancel | Curated prize-vault product (single-protocol per vault) | Proprietary |
| Mellow Core / Tyr | Curator-gated, KYC | Institutional only | Mixed |
| This vault (rBTC) | No admin, no upgrade, no admin-side pause | Multi-venue per asset from day 1 (≥2 adapters enforced at construction) | MIT |
| This vault (ERC-20) | Guardian for deposit-pause only; withdrawals always live | Multi-venue per asset from day 1 | MIT |
A few neighbors worth flagging. The Foundation BTC Vault Sandbox is curator-managed and scoped as a pilot. RootstockLabs Vaulted rBTC was announced for H2 2026, still not deployed. Solv sits a layer up and could plug this vault in as a yield source, and Excellar xlBTC isn’t live yet either. I’m open to adapter-level integrations with any of them.
Adapter universe
I looked hard for a third protocol. There isn’t one today.
Tropykus web UI ends 27 July 2026, contracts wind down 1 September 2026. Avalon Labs on Rootstock is dust ($806 across 9 holders) and would need ~130 LOC of custom code for ReserveData revision differences. Segment is EOA-controlled with pause guardian set to 0x0 and $161 TVL; centralization AVOID. Sovryn Zero and MoneyProtocol stability pools break the monotone-balance invariant. MoC BPro and RIF on Chain are leveraged price exposure, wrong primitive. Steer, Oku, Sovryn AMM break single-asset monotone. Bedrock uniBTC/brBTC have async multi-day exits. SolvBTC variants are reserve wrappers, xSolvBTC is an async SFT, SolvBTC.BBN is points-only. Pell is points-only. BabelFish XUSD: zero audits, no bounty, semi-abandoned.
Both adapters (LayerBank, Sovryn Lend) are Compound V2 cToken forks. Multi-venue gives me protection against one venue going down (the other keeps working), but it does not protect against a bug class that hits both at once. If that ever happens, redeemInKind is what gets users out without a write-off.
What I am tracking for next quarter: RootstockLabs vUSD cap-lift, RootstockLabs Vaulted rBTC mainnet, Excellar xlBTC TGE, Avalon crossing $250K, Sovryn DAO listing iUSDRIF or iRIF, LayerBank live-gen listing for USDT/RIF/USDC.e/WETH.
Mainnet deployability
| Asset | LayerBank | Sovryn | Verdict |
|---|---|---|---|
| rBTC | WRBTC aToken live | iRBTC live | HIGH, zero new code |
| DOC | aDOC live (0x3F04…0CaA2, ~135K DOC supplied at recent snapshot; full block + figure re-pinned in formal RFC evidence pack) |
iDOC live | HIGH, zero new code |
| USDRIF | aUSDRIF live | none | BLOCKED, fails _adapters.length >= 2 |
| DLLR | none | iDLLR live | BLOCKED, no second venue |
| XUSD | none | iXUSD live | BLOCKED, BabelFish underlying = AVOID (security, not adapter count) |
| USDT | live-gen listing unverified | iUSDT live | PENDING verification before any M-stage commitment |
| RIF | live-gen listing unverified | none | BLOCKED |
| USDC.e | live-gen listing unverified | none | BLOCKED |
| WETH | live-gen listing unverified | none | BLOCKED |
| BPRO | n/a | iBPro live (RISKY) | BLOCKED; only would-be second venue (Tropykus kBPRO) sunsetting; underlying MoC BPro is leveraged price exposure |
HIGH means the market is live and has enough liquidity to matter at this vault’s scale. Balances move with usage and the numbers will be refreshed at formal RFC submission.
Phase 0 gate (self-funded, before any tranche)
Precedent: Andromeda Core #876.
- TVL hard-cap is set by an immutable
tvlCapconstructor parameter, 0.5 rBTC equivalent for the Phase 0 deployment. The cap is the hard economic gate; even with a sybil bypass, exposure cannot exceed 0.5 rBTC. Diff and Blockscout link posted with the formal RFC. - Minimum duration: 60 days
- Public dashboard URL committed in the formal RFC, weekly snapshots
redeemInKindtry/catch hardening (closing KNOWN_ISSUES #6) is already merged ahead of the Phase 0 fresh-deploy batch, so the escape hatch is unconditional during the pilot. The asymmetry is intentional:depositandmintstay fail-closed so a broken adapter cannot trap new money in bad accounting;redeem,withdraw, andredeemInKindare fail-open so users can always get out.- Pass/fail gating metrics for M1 release:
- Zero critical incidents. “Critical” here means any of: loss of user principal beyond ERC-4626 rounding tolerance, withdrawal blocked >24h, reproducible invariant break on mainnet state, unauthorized state mutation
- In operational terms, a reproducible invariant break is: the pinned-Foundry invariant suite at the Phase 0 deploy commit fails when run against a mainnet fork at any block within the Phase 0 window. The suite runs as a GitHub Actions workflow on each weekly snapshot date (pinned Foundry version + commit hash, mainnet fork at snapshot block, 128K calls per invariant); the workflow URL goes on the public dashboard. Any community member can re-run it against the same commit at a block of their choosing. A failed run blocks M1 release.
- ≥10 depositors with distinct funding sources (no shared upstream EOA within 7 days of first deposit) AND no single depositor >40% of TVL at any weekly snapshot
- All redemptions honored via
redeem()(subject to documented ERC-4626 sub-grain rounding always in the vault’s favor) orredeemInKind()as unconditional escape
- I am funding this myself. I will not request M1 tranche release if any Phase 0 gate fails; tranche release is the DAO’s call.
Phase 0 is me putting my own money on the line on top of a hardened codebase, so the DAO has on-chain evidence to point at instead of taking my word for it.
Proposed milestones
| # | Deliverable | Tranche |
|---|---|---|
| Phase 0 | Self-funded mainnet pilot under the parameters above | $0 (gate) |
| M1a | Signed audit quote attached + audit kickoff + rBTC mainnet deploy at audited commit | $4,000 (16%) |
| M1b | Audit report PDF + IPFS CID published in evidence pack + Blockscout-verified post-fix redeploy | $8,000 (32%) |
| M2 | DOC mainnet deploy + post-audit fixes merged + integrator docs | $2,500 (10%) |
| M3 | Invariant suite expansion + formal-spec doc + integrator SDK (framework-agnostic; concrete stack chosen with the first signed LOI partner) | $3,000 (12%) |
| M4 | 90-day operational report, TVL/usage metrics, handover docs | $7,500 (30% terminal holdback) |
M1 is split into M1a and M1b so the audit-fee tranche releases when the report lands, not when the quote is signed. I cover any audit overrun personally. Clawback: if the signed Coinspect (or community-recommended firm) quote at M1a release comes in under $13K, the M1a+M1b combined tranche drops to (signed quote + $1K deploy labor) and the delta returns to the Foundation treasury or rolls into M2 at the DAO’s discretion. That way the buffer is locked in by the rule, instead of resting on my word.
M2 and M3 are small on purpose. M1 is audit-heavy and M4 absorbs the 30% terminal holdback, so the middle tranches are tight. I am partly subsidizing the work on M2 and M3. They still gate the tranche if I miss a deliverable.
M3 is invariant suite expansion + formal spec + integrator SDK. I looked at two alternatives (Aori intent-deposit hook, RedStone Credora risk-driven caps) and deferred both to post-grant work because they pull in third-party dependencies I would rather not bake into a Strategic-tier scope.
Sizing rationale
Bottom-up build for the $25K total:
- Audit ($13-15K working assumption for Coinspect at this scope; see audit question below)
- Pre-audit redeemInKind + TVL-cap hardening + new invariant + Phase 0 mainnet deploy + Blockscout verification ($2-3K labor)
- DOC mainnet deploy + post-audit fixes + integrator docs ($2.5K)
- Invariant suite expansion + formal-spec doc + integrator SDK ($3K)
- 90-day operational reporting + handover documentation ($1.5-2K labor; M4 also acts as terminal holdback per V3.2.2 floor)
Precedent for cross-check: TYKORA at $20K (Coinspect, single-protocol prize vault) and BΔLT at $20K (Coinspect, single-trust-model custody). This proposal is about double the scope (dual trust model, dual protocol, full Tier 1 ERC-4626 surface, net-new M3 work outside the audit envelope) on ~1.5x the nSLOC. The $25K is the bottom-up sum above; it lands ~25% over the two-protocol Coinspect baseline. I would rather list each line and let delegates push back on the numbers than ship a multiplier that looks reverse-engineered.
Cross-funding disclosure
This work originated as my Cohort 1 Builders Rootcamp capstone (April 2026). I received the standard program-completion stipend and cohort NFT, same as all Cohort 1 participants. I hold 1,000 stRIF per RootstockCollective membership threshold; not currently a delegate. No other DAO, foundation, protocol, or grant program funds the scope this proposal requests, and I have no parallel grant application open elsewhere. If anything changes between this sanity check and the formal RFC I will disclose it inline.
Current state
Done: testnet rBTC vault and both adapters Blockscout-verified at 0x6a20…0cE2, 0xaF57…B37A, 0x722F…bFd0 (full addresses + URLs in formal RFC). Vercel demo live. 228 unit + 28 fork + 6 halmos symbolic + 9 invariants × 128K test layers. 100% line/statement/function coverage on the three core contracts (95% branches on YieldVault, 2 defensive branches uncovered).SECURITY.md documents the trust model and disclosure path.
Merged ahead of the Phase 0 fresh-deploy batch: (1) immutable tvlCap constructor parameter with maxDeposit/maxMint overrides per ERC-4626, enforcing the 0.5 rBTC Phase 0 ceiling; (2) redeemInKind and totalAssets try/catch hardening closing KNOWN_ISSUES #6 by wrapping every adapter getBalance() and transferPosition() call. Entry paths stay fail-closed, exit paths are fail-open. Both diffs in scope for the M1 audit.
Not yet done: mainnet deploy, signed auditor quote, signed integrator LOIs, KYB approval, video pitch.
Release gate for the formal RFC: at least one signed integrator LOI attached to the proposal. Merge Wallet is the most likely first signature given their 9 June public ask; Beexo and Defiant Wallet are next on the outreach list. LOI format default: countersigned PDF on integrator letterhead, IPFS CID published in the evidence pack. I will post a public status update when either (a) the first LOI is signed and attached, or (b) any named candidate declines (with permission to name them).
Audit question for the community
Before I send outreach I want a sanity check on pricing.
The two Rootstock grant audits I can find that actually shipped were both Coinspect engagements at the $20K Strategic-tier total: TYKORA at ~$11K Coinspect quote (topic 738, M1 completed April 2026) and BΔLT at ~$10K Coinspect (topic 348, completed with public report). For ~1240 nSLOC across one ERC-4626 vault + two Compound-V2-fork adapters + the invariant / Halmos / fork / mutation test layers, with Slither clean and AUDIT_SCOPE.md ready, $13-15K from Coinspect feels about right to me: a bit over the TYKORA and BΔLT quotes, for a job that’s close to twice their size. Sherlock’s 2026 timeline guidance suggests 7-9 researcher-days for this kind of scope.
For anyone who has been through a Rootstock audit recently: has anyone engaged Coinspect on a dual-trust-model multi-protocol vault? Is the $13-15K assumption realistic, or am I pricing it too low? If there is a stronger fit at this size (Hacken, Zealynx, OmniscientLabs, Pashov, Cantina solo), I want to hear it. Coinspect is the working assumption pending this thread; the formal RFC will pin the firm and the signed quote before submission. And if the DAO would rather see a boutique firm in the $20-30K band, I will absorb the delta or rescope M2/M3 line items.
Open questions
A few things I would value pushback on.
First, the Phase 0 parameters (0.5 rBTC cap, 60 days, ≥10 distinct-funded depositors, the critical-incident gate above, ≤40% single-depositor concentration, hardening already merged). Does that match the de-risking pattern the DAO settled on after Andromeda Core #876, and does the M1a/M1b split get audit-money-on-delivery right? @tamlerner, @Tane.
On architecture, I’d like a gut check on the split trust model: rBTC fully trustless, ERC-20 with a deposit-pause-only Guardian, plus the pre-Phase-0 hardening. Right trade-off? And is M3 (invariant suite + formal spec + integrator SDK) the right Strategic-tier scope, or should I have kept one of the alternatives I deferred (Aori intent-deposit hook, RedStone Credora risk-driven caps)? @Curia, @ChronoTrigger.
Last one is operational evidence. Between the Phase 0 pass/fail metrics, the public GitHub Actions invariant suite, and the dashboard, is that enough public mainnet proof before you release a tranche? @Kaf_Anode.
Closing
Thanks in advance for any pushback before I write the formal RFC. The KYB inquiry I sent to compliance@ on 17 May has not been answered yet, if there is a better channel to reach the team, I am open to it.
