Back to P2P Loans

FlashBank P2P × Lorrow

How our peer-to-peer term loans relate to the Lorrow Framework Specification v1.0 — a standard for bilateral collateralized lending originated by WHYSIDEAS — without losing our two core intents.

Time-only settlement

A loan defaults purely because a deadline passed, never because a price moved. There is no oracle anywhere in the contract.

A flat fee, not interest

The borrower's whole cost is one fixed repaymentFee, not a time-accruing rate (friendlier to faith-based finance that avoids riba).

Surplus-return guardrail — now honoured, with no oracle

Lorrow Core flags seizing a defaulter's surplus collateral as “the single most predatory move in collateralized lending.” Each offer can now carry an optional agreed rate — loan-token per 1 collateral-token (e.g. 1 fpETH = 500 fpUSD), stored on-chain as settlementValue and frozen at origination. On default the lender keeps only the collateral that covers principal + repaymentFee at that rate; the over-pledged surplus returns to the borrower. Left at 0, the original full-forfeit pledge still applies. No live price is ever read.

What the split looks like

Because the agreed rate is frozen at origination, the default outcome is fully determined on day one — no price discovery, no keepers. The lender takes just enough collateral to cover principal + repaymentFee at that rate, and the over-pledged remainder returns to the borrower.

Locked when the loan is created — nothing is priced live
You borrow
500 fpUSD
+ flat fee
18 fpUSD
You pledge
3 fpETH
Agreed rate
1 fpETH = 500 fpUSD
On default, the pledged 3 fpETH splits like this
Lender keeps 1.04 fpETH
Surplus → borrower 1.96 fpETH

The lender takes just enough to cover the 518 fpUSD debt at the agreed rate: 518 ÷ 500 = 1.04 fpETH. The other 1.96 fpETH was pledged on top of what you borrowed, so it goes back.

Lender (made whole — principal + fee, at the agreed rate) Borrower (the over-pledged surplus)

Where we already align

Lorrow principleFlashBank P2P
Bilateral agreement, no pools, no protocol-set ratecreator ↔ taker; the contract is pure escrow
Immutable terms once createdno function mutates an active loan; admin cannot touch live loans
Escrow model (locked posts)principal/collateral is always escrowed on createLoan — the strongest "locked post"
Cancel returns escrow; posts can expirecancel() refunds escrow; offerExpiry times out open offers
Optional protocol fee, bounded, disclosed up frontprotocolFeeBps capped at 100 bps — exactly Lorrow’s "Optional Fee Hook ≤ 100 bps"
Frontend independencethe contract is usable directly; the website is just one interface
Transparent commitment signala paid boost ranks offers rather than an on-chain Commitment Score (same goal, different mechanism)

Where we deliberately differ (and why)

Lorrow Core requirementFlashBank P2PWhy
breach_threshold ≥ 110%, oracle-priced, with reportBreach / checkRecovery and a breach windowNone. No oracle, no breach state.Core intent #1. Oracles are the main attack surface in collateralized lending; time-only settlement removes them entirely.
interest_rate, 0–36% APRFlat repaymentFeeCore intent #2. A fixed fee, not a rate. (A small flat fee on a short term can annualise well above 36%.)
Surplus Return at default (mandatory guardrail)Now honoured via an opt-in agreed rate (Option B). Set a rate (loan-token per collateral-token, stored as settlementValue) and claimDefault returns the over-pledged surplus to the borrower; leave it 0 and the lender takes the whole collateral (the original pledge/pawn).Surplus only needs the rate the two parties already agree on. Rather than a live oracle we freeze that rate at origination — satisfying the guardrail while keeping intent #1 (no oracle).
loan_term from a fixed set (14d/30d/60d/90d/12m/18m)Arbitrary duration (seconds, ≤ 365d)We let the two parties pick any term.
repayment_structure ∈ {LUMP, INSTALLMENT, BALLOON}LUMP only (principal + fee at maturity)Simplicity; matches the flat-fee model.
Standardized variable set, no custom fieldsAdds allowedTaker, listed, boost, serviceFeePrivate offers and an opt-in marketplace / fee model.

Note on the interest ceiling: a repaymentFee of 5 on a principal of 100 over 7 days annualises to roughly 260% APR — far above Lorrow's 36% cap. A flat fee that feels reasonable is simply not expressible as a compliant rate on short terms.

Variable, lifecycle & function mapping

Loan variables
LorrowFlashBankNote
loan_asset / loan_amountprincipalToken / principalsame
collateral_asset / collateral_amountcollateralToken / collateralsame
breach_thresholdno oracle
loan_termduration (seconds)not the fixed enum
interest_raterepaymentFee (flat)not an APR
repayment_structure(implicit LUMP)
early_repayment_allowedeffectively always truerepay any time before the deadline
early_repayment_penalty0within Lorrow’s 0–5% (we charge none)
capital_locked / collateral_lockedalways trueescrowed at posting
Lifecycle
LorrowFlashBankNote
POSTEDOpen
ACTIVEActive
BREACHEDno oracle / breach
DEFAULTEDDefaultedsurplus returned when settlementValue set; full forfeit when 0
COMPLETEDRepaid
EXPIREDCancelled (+ offerExpiry)
Functions / events
LorrowFlashBankNote
postOffer / postRequestcreateLoan(creatorIsLender)one entry point, both sides
acceptOffer / acceptRequesttake(id)
repayrepay(id)full repayment (LUMP)
reportBreach / checkRecoveryno oracle
executeDefaultclaimDefault(id)time-based only (Lorrow’s maturity path, not the breach path)
cancelPostcancel(id)

Implementation Profile

Published so the claim is verifiable. Rows tagged variant sit outside Core's accommodation.

Protocol name / versionFlashBank P2P Term Loans v1
Chain / VMEVM (Ethereum, L2s); playground on Sepolia
Supported loan assetsAny ERC-20 (no fee-on-transfer / rebasing); WETH/USDC etc. on mainnet, faucet tokens on testnet
Supported collateral assetsAny ERC-20 (must differ from, or may equal, the loan asset)
Collateral ratio rangevariantNot enforced — set by the parties; no on-chain ratio check
Interest rate rangevariantNone — a flat repaymentFee instead of an APR
Oracle providervariantNone — settlement is time-only
Default settlement methodvariantTime-based: after maturity + grace the lender calls claimDefault. With a per-offer settlementValue set, surplus is returned to the borrower (guardrail honoured, no oracle); with 0, the lender claims the full collateral
Liquidation methodNone — no liquidations, only deadline-based default
Maturity grace periodvariantConfigurable gracePeriod (≤ 90 days; no Core 3-day minimum enforced)
Commitment signalvariantPaid boost ranking (not Lorrow’s Commitment Score)
Fee modelOptional protocolFeeBps ≤ 100 bps (Core-compatible hook); optional serviceFee; optional boost. All default-off and disclosed before acceptance.
Upgradeability / adminOwnable; admin sets only fee recipient/bps; cannot alter live loans
Compliance / KYCNone
Keeper modelPermissionless: claimDefault callable by the lender once the deadline passes
Frontend / operatorflashbank.net is one interface; the contract is usable directly

Full write-up (options A/B/C, the maths and the recommendation) lives in the repo.