Bezalt
Menu

Whitepaper · v1.0

Bezalt: fixed-fee private credit for tokenized assets.

A protocol that lets holders of tokenized stocks and real-world assets draw a USD stablecoin against what they own, without selling it, without interest, and without disclosing the portfolio behind the proof, backed by a stability pool that earns from outcomes instead of time.

Version 1.0 · September 2026 Network Robinhood Chain (Arbitrum Orbit) Contracts Solidity 0.8.28 · non-upgradeable

Abstract

Tokenized securities put real-world value on-chain, but the holder who needs liquidity still faces a bad choice: sell the position, or reveal it wholesale to a lender. Bezalt separates what must be true from what must be seen. An attester verifies ownership, valuation, eligibility and liabilities off-chain and signs a collateral passport: an EIP-712 attestation carrying only an eligibility outcome, a capacity bound and an expiry. The borrower pledges collateral into the protocol and draws USDG from a stability pool for a single origination fee; nothing accrues while the line is open. Positions that fall to the maintenance loan-to-value are liquidated into the pool at a bonus, which, together with fee income and partner revenue, is the pool's entire return. The design is implemented in six immutable contracts governed through a timelock, with bounded parameters that make the pool whole by construction on every sufficiently collateralised liquidation.

1. Introduction

Robinhood Chain brings tokenized equities and other real-world assets (RWAs) to an EVM-equivalent L2. These tokens are transfer-restricted, issuer-controlled ERC-20s whose holders are, by construction, verified. What they lack is credit: a way to convert a position into working capital without exiting it.

Existing DeFi money markets assume permissionless, fungible, continuously traded collateral and price it with an interest-rate curve. Neither assumption fits RWAs. Positions are often illiquid, valued periodically rather than tick by tick, and their holders are accountable parties who care about what a lending venue learns about them. A borrower who must reveal an entire brokerage-style portfolio to draw against one line of it will not draw at all.

Bezalt is built for this setting. It makes three commitments: the borrower keeps ownership of the asset for the life of the position; the borrower pays once, a fixed origination fee, and never an accruing rate; and the borrower proves privately, the chain and the venue see an eligibility outcome and a capacity bound, never holdings.

2. Design principles

Minimal disclosure

Every on-chain artefact carries the least information that makes the loan safe: a signed outcome, a capacity, a time window. Holdings stay with the borrower and the attester's transient check.

Bounded by construction

Risk parameters are validated on-chain against hard bounds. A misconfiguration cannot create a liquidation that under-compensates the pool.

Outcome-based returns

Pool participants earn when something happens (a draw, a liquidation, a partner payment) not while time passes. There is no interest anywhere in the system.

Never trap the user

Pausing halts new exposure only. Repayment, adding collateral, closing, pool withdrawals and collateral sales stay open in every state.

Fresh prices or nothing

Borrowing, withdrawing and liquidating all require a price younger than the asset's maximum age. Stale data blocks action rather than misprices it.

Immutable logic

No proxies, no upgrade paths. Change happens by parameter within bounds, or by a new deployment after a timelock.

3. Protocol overview

Six contracts implement the protocol. Borrowers interact with CreditLine; liquidity providers with StabilityPool; everything else is infrastructure the two consult.

Architecture: attester and oracles feed the registries; the credit line moves principal in and out of the stability pool ATTESTER PRICE FEEDS RISK ADMIN BORROWER KEEPER LP BUYER PassportRegistryEIP-712 verify · revocation Chainlink / Attested oraclegetPrice(asset) → 1e18, updatedAt CollateralRegistrybounded params · valueOf · staleness CreditLineopen · draw · repay · withdrawclose · liquidate StabilityPoolERC-4626 USDG vaultfund · collect · absorb · sell getPrice verify(passport) valueOf / priceOf fund / collect collateral · absorb
Figure 1. Contract topology. Only CreditLine holds CREDIT_LINE_ROLE on the pool; the registries are read-only from the credit line's point of view.

Actors: the borrower pledges collateral and draws USDG; the liquidity provider deposits USDG into the pool for shares; the keeper triggers liquidations for a fee; the attester signs passports after private verification; the valuation signer posts prices for assets without a public feed; governance (a timelock with a multisig proposer) sets bounded parameters and holds the pause switches.

4. Collateral passports

A passport is a typed, signed statement that a borrower's position in a given asset passed verification and may carry up to a stated amount of debt until a stated time.

// EIP-712 domain: name "Bezalt Passport", version "1", chainId, PassportRegistry struct Passport { address borrower; // bound to msg.sender of open/draw address asset; // the collateral the checks covered uint256 capacityUsd18; // max outstanding debt attributed to this passport uint64 issuedAt; uint64 expiry; // expiry - issuedAt <= maxValidity (30 d default) bytes32 checksHash; // opaque commitment to the checks; carries no holdings uint256 nonce; }

Verification on-chain is deliberately shallow: signature recovery, attester role membership, time window, a global minIssuedAt cut-off for mass invalidation after a key rotation, and a per-passport revocation flag. What the attester checked (ownership records, valuation sources, liabilities elsewhere) never appears on-chain; the checksHash lets the attester prove later which procedure produced the outcome without revealing its inputs.

Capacity binding. The credit line attributes every unit of debt to the passport that authorised it. Draws under a passport are cumulative: passportDebt[id] + amount ≤ capacity. Repayment frees capacity; presenting a newer passport re-attributes existing debt to it. A passport can therefore back several draws over its window without a fresh verification each time, and its revocation stops new draws immediately without touching existing debt, maintenance still applies.

Disclosure model. "Check only" means the attester sees the input during verification and discards it once the passport is signed.
FactBorrowerAttesterChain / venues
Which assets are heldYesCheck onlyNo
Quantities and walletsYesCheck onlyNo
Liabilities elsewhereYesCheck onlyPass/fail, implicitly
Eligibility outcomeYesYesYes (signed)
Capacity boundYesYesYes (bounded)
Pledged amount and debtYes-Yes, per position
The pledged collateral amount and the debt of an open position are public; they must be, for liquidation to be permissionless. What Bezalt keeps private is everything the passport was derived from: the rest of the portfolio, and the sources that valued it.

5. Credit lines

A position holds one collateral asset in escrow inside CreditLine and a USDG debt. Its life cycle is open → draw / repay / add / withdraw → close, or → liquidate.

On every draw the loan-to-value must not exceed the class maximum, checked by cross-multiplication so no precision is lost:

debt18 × 10 000 ≤ value18 × maxLtvBps
value18 = collateral × price18 / 10decimals

The only cost is the origination fee, deducted from the draw:

fee = amount × originationFeeBps / 10 000
net to borrower = amount − fee
poolFee = fee × poolFeeShareBps / 10 000
treasuryFee = fee − poolFee
Money flow on a draw of 10,000 USDG at a 1.5 percent fee with a 70 percent pool share Stability pool lends principal 10,000 loansOutstanding += 10,000 keeps poolFee 105 10,000 CreditLine debt += 10,000 fee = 150 LTV check passport capacity check minDebt check Borrower receives 9,850 Treasury receives 45
Figure 2. A 10,000 USDG draw at a 1.5 % fee with a 70 % pool share. The pool's net outflow is 9,895 while it books 10,000 receivable; the 105 difference is its income, recognised immediately in share value.

Repayment is permissionless (anyone may repay any position) and transfers USDG directly to the pool. A dust floor (minDebt, 100 USDG by default) prevents positions too small to liquidate economically. Collateral withdrawals re-check the maximum LTV; closing requires zero debt and returns the full escrow.

6. Valuation

The CollateralRegistry is the single valuation surface. It returns valueOf(asset, amount) in USD with 18 decimals and reverts if the underlying price is older than the asset's maxPriceAge, is zero, or is dated in the future. Two price sources are provided:

  • ChainlinkPriceOracle adapts standard USD feeds, normalising any feed decimals to 1e18. On an L2 it can be bound to the chain's sequencer-uptime feed: when the sequencer is down, or has been back for less than a grace period, prices are refused, which prevents liquidations on prices the market could not react to.
  • AttestedPriceOracle serves assets with periodic marks (fund units, receivables, real estate). Valuations are EIP-712 attestations from a VALUATION_ROLE key; anyone may relay them. Posts must be newer than the last one, carry a fresh nonce, and, when a deviation band is configured, stay within it. The risk admin can force a legitimate re-mark through.

Because every borrowing path reads the registry, an asset can be moved from one source to another, or disabled for new exposure, without touching positions.

7. Liquidation

A position becomes liquidatable when its LTV reaches the class maintenance threshold under a fresh price. Anyone may call liquidate. The pool absorbs the whole debt and receives collateral worth the debt plus a bonus; the caller earns a keeper fee out of the seized amount; whatever remains returns to the owner.

seize = min( collateral, ⌈ debt18 × (1 + bonus) / price ⌉ )
toKeeper = seize × keeperFeeBps / 10 000
toPool = seize − toKeeper
returned = collateral − seize
Liquidation waterfall for a 100-share position with 6,000 USDG of debt after the price falls to 80 dollars 100 shares · $80 each · debt 6,000 · bonus 8 % · keeper 0.5 % to pool 80.595 shares (= $6,447.6 ≥ debt $6,000) returned 19 keeper 0.405 shares ↑ seized = ⌈6,000 × 1.08 / 80⌉ = 81 shares pool exchanges a 6,000 receivable for collateral it values at 6,447.6 → +447.6 unrealised gain owner keeps 19 shares; a buyer later purchases the pool's shares at oracle value − 2 % Bad-debt case: if seize would exceed collateral, the pool takes everything and realises the shortfall in share value.
Figure 3. The same example the test suite asserts (test_liquidate_partialSeizure).

The registry refuses parameter sets where (1 + bonus)(1 − keeper) < 1, so whenever the collateral is sufficient the pool receives at least the debt's worth after the keeper's cut; the pool is made whole by construction. Liquidations have their own switch (liquidationsPaused) independent of the protocol pause, so a guardian can halt them during an oracle incident without freezing repayments.

8. Stability pool

The pool is an ERC-4626 vault denominated in USDG. It is the protocol's only source of principal and its liquidation backstop. Share value is the sum of three components:

totalAssets = idle USDG + loansOutstanding + Σ oracleValue(seized collateral)

Loans are carried at face value; with a fixed fee there is nothing else to accrue. Seized collateral is marked at oracle value; if a seized asset's price goes stale, that asset counts as zero rather than blocking the vault, and unpricedSeizedAssets() exposes the list for the risk admin.

Liquidity. Withdrawals can only be served from idle USDG; maxWithdraw and maxRedeem report the binding limit so integrators never see a surprise revert. A reserve (reserveBps, 10 % by default, ≤ 50 %) keeps part of total assets unlent so ordinary withdrawals clear. Seized collateral is converted back to USDG by open sale: anyone may buy it at oracle value minus saleDiscountBps (2 % by default, ≤ 10 %).

Return sources. Origination-fee share on every draw; liquidation gains (collateral received above the debt replaced, less the later sale discount); partner revenue or any voluntary contribution via donate. Losses arrive the same way, through share value, when a liquidation is short of collateral.

Inflation resistance. The vault uses a virtual-share offset of six decimals. A first-depositor attack costs the attacker more than a thousand times what it can extract from a victim; the test suite asserts this.

9. Risk parameters

Each listed asset carries the following parameters, validated on-chain against fixed bounds whenever they are set.

Bounds are constants in CollateralRegistry. Example values are those used in the tests and the terminal simulator.
ParameterMeaningBoundExample
maxLtvBpsMax debt / value on open, draw, withdraw> 0 and < maintenance60 %
maintenanceBpsLTV at which liquidation opens≤ 98 %75 %
originationFeeBpsOne-time fee on each draw≤ 10 %1.5 %
liquidationBonusBpsExtra collateral value the pool receives≤ 20 %8 %
keeperFeeBpsShare of seized collateral paid to the liquidator≤ 5 % and (1+bonus)(1−keeper) ≥ 10.5 %
maxPriceAgeOldest acceptable price60 s – 7 d24 h
supplyCapMax collateral of this asset in escrowanyper listing
minDebt (global)Dust floor for open positionsany100 USDG
poolFeeShareBps (global)Fee share retained by the pool≤ 100 %70 %
reserveBps (pool)Unlent fraction of total assets≤ 50 %10 %
saleDiscountBps (pool)Discount on seized-collateral sales≤ 10 %2 %

10. Governance & security

Administration is split into narrow roles held by different keys. The default admin of every contract is a TimelockController (48-hour minimum delay on mainnet) whose proposer is the governor multisig; the deployer renounces its admin role at the end of deployment, and the deployment script asserts that it did.

RoleHolderCan
Default adminTimelockGrant roles, unpause, set treasury, invalidate passports en masse, sweep untracked tokens
Risk adminGovernor multisigList assets, set bounded parameters, feeds, reserve, discounts, fee share, dust floor
GuardianGuardian key / multisigPause new exposure; pause liquidations
AttesterVerification serviceSign and revoke passports
ValuationValuation serviceSign valuations
Credit lineThe contractMove principal in and out of the pool

Pause semantics. A pause stops opens, draws, collateral withdrawals, pool deposits and pool funding. It never stops repayment, adding collateral, closing a debt-free position, pool withdrawals, collateral sales, or, unless separately halted, liquidations. Unpausing goes through the timelock.

Assurance. The implementation ships with 87 tests (unit, fuzz at 4,096 runs per property, and nine system invariants exercised over 24,576 randomised calls), 100 % line coverage of the protocol sources, a Slither pass with no high-severity findings, and a scripted end-to-end dry run on a local chain configured with Robinhood Chain's chain id. It has not yet been audited by a third party; that is a hard prerequisite for mainnet in the roadmap below.

11. Robinhood Chain

Bezalt targets Robinhood Chain, an Arbitrum Orbit L2 that settles to Ethereum, pays gas in ETH and posts data as EIP-4844 blobs. Its native asset class (issuer-controlled, transfer-restricted stock tokens) is exactly the collateral the passport model was designed for.

MainnetTestnet
Chain ID466346630
Gas tokenETHETH
Explorerrobinhoodchain.blockscout.comexplorer.testnet.chain.robinhood.com
StackArbitrum Nitro (Orbit), EVM-equivalent, Cancun opcodes

Three integration dependencies are external to the protocol and must be settled before mainnet: the USDG contract address on the chain (or an alternative USD stablecoin, since the pool reads the asset's decimals), allow-listing of the CreditLine and StabilityPool addresses by each stock-token issuer so escrow transfers succeed, and the availability of Chainlink feeds and a sequencer-uptime feed for the chain. Assets without feeds launch on the attested oracle.

12. Economics

Bezalt's revenue is fee volume, not balance. A borrower who holds a line for a day pays the same as one who holds it for a year, which makes the protocol attractive for short, opportunistic liquidity and neutral about duration. The pool's economics therefore depend on three flows the team must size: draw volume × fee share; liquidation frequency × (bonus − sale discount); and partner revenue from venues that route credit through the protocol.

Worked example

Collateral pledged
100 tokenized shares @ $100 = $10,000
Draw (60 % LTV)
6,000 USDG
Origination fee (1.5 %)
90 USDG: 63 to the pool, 27 to the treasury
Net proceeds
5,910 USDG
Liquidation eligible below
$80 per share (LTV 75 %)
Amount to repay, any time
6,000 USDG

Against an 8 % APR facility, the fixed fee is more expensive for the first ~2.3 months and cheaper thereafter; the terminal computes this comparison for any inputs.

12.1 Fee routing

The fee is split atomically in CreditLine.draw: poolFee = fee × poolFeeShareBps / 10 000 stays in the stability pool and is recognised immediately in share value; treasuryFee = fee − poolFee is transferred to the treasury. Both parameters are bounded and timelocked. Because the split happens in the same transaction as the draw, there is no accrued-fee balance to claim, distribute or misreport.

12.2 Treasury share → BEZALT buyback

The treasury share is committed to a programmatic buyback of BEZALT (ticker $BEZALT), the protocol token, executed by BuybackRouter. The router is designed so that its behaviour is fully determined by on-chain state and a small set of bounded parameters:

  • Permissionless, rate-limited execution. execute() may be called by anyone at most once per epochLength (initially 24 h) and pays the caller keeperTipBps of the spend, so no privileged operator is required.
  • Spend cap tied to pool depth. spend = min(balance, totalAssets × maxSpendBps / 10 000), with maxSpendBps ≤ 200. Accumulated USDG is worked down over several epochs rather than in one block.
  • Price bound. The execution price must lie within maxDeviationBps of the venue's 30-minute TWAP; otherwise the call reverts. This removes the incentive to move the market ahead of a known buy.
  • Deterministic settlement. Purchased BEZALT is split by burnBps between address(0) and a staking reserve in the same transaction. The router holds no BEZALT between executions and has no sell path.
  • Single, allow-listed venue. The swap route is one BEZALT/USDG pool on Robinhood Chain; changing it, like every other parameter, is a timelocked governance action.
spende = min( balance, totalAssets × maxSpendBps / 10 000 )
require | pexec − TWAP30m | / TWAP30m ≤ maxDeviationBps / 10 000
burned = bought × burnBps / 10 000; reserved = bought − burned

The buyback is a use of treasury revenue, not a promise about token price, and it never draws on the stability pool's share of fees or on pool principal. Pool depositors' return is unchanged whether or not a buyback executes.

Status. Fee routing is implemented in v1. BuybackRouter and the BEZALT token are specified for v1.1 (§14) and are not part of the audited v1 contract set.

13. Risks

  • Borrowers: liquidation. Tokenized equities move with their underlying; a position at the maximum LTV has a 20-percentage-point buffer to maintenance in the example class. Add collateral or repay to widen it.
  • Pool participants: bad debt and liquidity. A gap move can leave collateral worth less than the debt it secures; the pool realises that loss. Withdrawals are limited to idle liquidity and seized collateral must be sold before it becomes withdrawable.
  • Oracle risk. Attested valuations depend on the signer's integrity; deviation bands, staleness limits and the liquidation pause bound the damage of a bad mark but do not eliminate it.
  • Attester risk. A compromised attester key can issue passports for ineligible positions until rotated; capacity bounds, supply caps and LTV limits cap the exposure of any single passport. setMinIssuedAt invalidates all passports from before a rotation in one transaction.
  • Issuer risk. Stock tokens are issuer-controlled; freezes or forced transfers by the issuer are outside the protocol's control.
  • Smart-contract risk. The code is tested and analysed but unaudited; see §10.

14. Roadmap

  1. Testnet (chain id 46630)

    Deploy with mock USDG and a mock feed, run at least one full passport cycle and one forced liquidation, exercise the timelock.

  2. External audit

    Independent review of the six contracts and deployment scripts; findings closed and re-tested.

  3. Integration prerequisites

    USDG address, issuer allow-listing of protocol addresses, Chainlink feeds and sequencer-uptime feed on Robinhood Chain.

  4. Mainnet (chain id 4663)

    Conservative supply caps and reserve, guardian rota, public keeper documentation.

  5. v1.1. BEZALT and the buyback

    Token contract, BuybackRouter with the bounds in §12.2, the BEZALT/USDG venue on Robinhood Chain, and a staking reserve; audited together before the treasury share is routed to the router.

  6. After launch

    ERC-1271 attesters, cross-venue passport verification library, additional collateral classes on the attested oracle.

This document describes protocol mechanics and is not an offer, solicitation or financial advice. Numeric examples are illustrative.