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.
A loan defaults purely because a deadline passed, never because a price moved. There is no oracle anywhere in the contract.
The borrower's whole cost is one fixed repaymentFee, not a time-accruing rate (friendlier to faith-based finance that avoids riba).
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.
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.
Where we already align
| Lorrow principle | FlashBank P2P |
|---|---|
| Bilateral agreement, no pools, no protocol-set rate | ✓creator ↔ taker; the contract is pure escrow |
| Immutable terms once created | ✓no 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 expire | ✓cancel() refunds escrow; offerExpiry times out open offers |
| Optional protocol fee, bounded, disclosed up front | ✓protocolFeeBps capped at 100 bps — exactly Lorrow’s "Optional Fee Hook ≤ 100 bps" |
| Frontend independence | ✓the contract is usable directly; the website is just one interface |
| Transparent commitment signal | ◐a paid boost ranks offers rather than an on-chain Commitment Score (same goal, different mechanism) |
Where we deliberately differ (and why)
| Lorrow Core requirement | FlashBank P2P | Why |
|---|---|---|
| breach_threshold ≥ 110%, oracle-priced, with reportBreach / checkRecovery and a breach window | None. 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% APR | Flat repaymentFee | Core 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 fields | Adds allowedTaker, listed, boost, serviceFee | Private 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
| Lorrow | FlashBank | Note |
|---|---|---|
| loan_asset / loan_amount | principalToken / principal | same |
| collateral_asset / collateral_amount | collateralToken / collateral | same |
| breach_threshold | — | no oracle |
| loan_term | duration (seconds) | not the fixed enum |
| interest_rate | repaymentFee (flat) | not an APR |
| repayment_structure | (implicit LUMP) | |
| early_repayment_allowed | effectively always true | repay any time before the deadline |
| early_repayment_penalty | 0 | within Lorrow’s 0–5% (we charge none) |
| capital_locked / collateral_locked | always true | escrowed at posting |
| Lorrow | FlashBank | Note |
|---|---|---|
| POSTED | Open | |
| ACTIVE | Active | |
| BREACHED | — | no oracle / breach |
| DEFAULTED | Defaulted | surplus returned when settlementValue set; full forfeit when 0 |
| COMPLETED | Repaid | |
| EXPIRED | Cancelled (+ offerExpiry) |
| Lorrow | FlashBank | Note |
|---|---|---|
| postOffer / postRequest | createLoan(creatorIsLender) | one entry point, both sides |
| acceptOffer / acceptRequest | take(id) | |
| repay | repay(id) | full repayment (LUMP) |
| reportBreach / checkRecovery | — | no oracle |
| executeDefault | claimDefault(id) | time-based only (Lorrow’s maturity path, not the breach path) |
| cancelPost | cancel(id) |
Implementation Profile
Published so the claim is verifiable. Rows tagged variant sit outside Core's accommodation.
| Protocol name / version | FlashBank P2P Term Loans v1 |
| Chain / VM | EVM (Ethereum, L2s); playground on Sepolia |
| Supported loan assets | Any ERC-20 (no fee-on-transfer / rebasing); WETH/USDC etc. on mainnet, faucet tokens on testnet |
| Supported collateral assets | Any ERC-20 (must differ from, or may equal, the loan asset) |
| Collateral ratio rangevariant | Not enforced — set by the parties; no on-chain ratio check |
| Interest rate rangevariant | None — a flat repaymentFee instead of an APR |
| Oracle providervariant | None — settlement is time-only |
| Default settlement methodvariant | Time-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 method | None — no liquidations, only deadline-based default |
| Maturity grace periodvariant | Configurable gracePeriod (≤ 90 days; no Core 3-day minimum enforced) |
| Commitment signalvariant | Paid boost ranking (not Lorrow’s Commitment Score) |
| Fee model | Optional protocolFeeBps ≤ 100 bps (Core-compatible hook); optional serviceFee; optional boost. All default-off and disclosed before acceptance. |
| Upgradeability / admin | Ownable; admin sets only fee recipient/bps; cannot alter live loans |
| Compliance / KYC | None |
| Keeper model | Permissionless: claimDefault callable by the lender once the deadline passes |
| Frontend / operator | flashbank.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.