Skip to main content

Pawn

Peer-to-peer NFT-collateralized lending on QOM. Live. Any wallet can borrow QOM by pledging an NFT, or earn interest by funding loans against NFTs they want to underwrite. No oracle. No auction-style liquidation.

Open the app: defi.zaphod.one/pawn Live activity: defi.zaphod.one/pawn/stats

Heads-up before you borrow

If you don't repay by the deadline (plus the grace window), you lose your NFT permanently to the lender. There's no second chance and no partial unwind. Borrow only against an NFT you're prepared to lose if something goes wrong.

What it is in one sentence​

A bilateral, fixed-term loan. The borrower pledges a specific NFT, a lender funds the loan with WQOM, and at maturity the borrower either repays principal + interest (and gets the NFT back) or defaults — after which the lender claims the NFT directly, with no auction step. No oracle, no shared-pool risk to other users.

A worked example​

Alice owns alice.qom and wants 800 WQOM for a month without selling it.

  1. Alice lists alice.qom at 1,000 WQOM principal, 12% APR, 30 days. Free — just signs a message in her wallet, costs no gas. The listing appears in the feed.
  2. Bob browses the feed, sees alice.qom, decides he's only comfortable lending 800 at 10% APR for 30 days. He sends a counter-offer with those numbers. Free for him too — just a signed message.
  3. Alice sees Bob's offer in her listing's offer list, decides 800 @ 10% is fine, clicks accept. This is the first on-chain transaction. The contract:
    • Pulls alice.qom into escrow.
    • Pulls 800 WQOM from Bob's wallet.
    • Sends ~800 WQOM to Alice's wallet (minus the protocol's small origination-fee slice).
    • Records the loan: principal 800, repayment 800 × (1 + 0.10 × 30/365) ≈ 806.58 WQOM, due in 30 days.
  4. Day 30: Alice repays 806.58 WQOM in one transaction. The contract:
    • Sends most of the 6.58 interest to Bob (minus a small protocol interest-fee slice).
    • Sends alice.qom back to Alice's wallet.
  5. Or — Day 30+48h grace elapses with no repay: Bob (the lender, and only Bob) calls liquidate(). alice.qom transfers to Bob's wallet permanently. Alice loses the .qom; Bob keeps the 800 WQOM he never got back, plus he now owns the NFT. Note: if Bob never calls liquidate(), the NFT stays in escrow indefinitely — Alice still loses the ability to repay (the contract refuses repays past the grace window) but the NFT doesn't move until Bob acts.

Two signed messages, two on-chain transactions, no oracle, no auction.

Loan lifecycle — every possible outcome​

The two on-chain transactions are accept and repay (or liquidate). Everything before accept is free signed messages; the listing and any offers can be revoked at any time without a fee. After repay or liquidate, the loan is terminal — no further state changes are possible for that loan.

The "Stuck in escrow" branch is the rare case: a lender who lets the grace window pass without calling liquidate(). The NFT stays in the contract until they decide to act; the borrower can no longer repay (the contract refuses repays past grace). Borrowers should set durations conservatively — once you're past grace, you depend on the lender's attention to resolve either way.

How a borrower uses it​

  1. Open defi.zaphod.one/pawn and connect a wallet holding the NFT you want to use as collateral.
  2. List the NFT with the loan terms you want — principal in WQOM, duration in days, APR. Listings are off-chain (signed message), free; you only pay gas if a lender funds them.
  3. Lenders may either fund at your asked terms in one click, or send a counter-offer with different principal/APR/duration. You can accept any counter-offer; until you do, you owe nothing.
  4. Once funded:
    • The NFT moves to the contract escrow.
    • The principal lands in your wallet immediately, minus a small protocol origination fee (the live value is set by admin and capped at 2% in the contract bytecode — admin cannot exceed that without a public upgrade).
    • You owe principal + interest at maturity.
  5. Repay any time before maturity to release the NFT back to your wallet. Repayment is one transaction for the full balance — no partial repay in v1.
  6. Grace period: the contract has a 48-hour grace window after maturity (admin-configurable, max 7 days). During that window, the lender cannot yet claim — you can still repay. After grace expires, the lender (and only the lender) can call liquidate() to claim the NFT. If they don't, the NFT just sits in escrow — but you also can't repay anymore (repay() reverts past the grace deadline). It stays stuck until the lender acts.

How a lender uses it​

  1. Open the dapp via one of three entry points (see Where to find offers below): the top-level browse feed, a specific listing page, or the standalone /pawn/lend form where you can create a lend offer without first browsing listings.
  2. Decide what each listing is worth to you. There is no oracle and no auto-liquidation auction — your judgement of the NFT's resale value is the only price discovery.
  3. Either lend at the borrower's terms in one click, or send a counter-offer with the principal/APR/duration you'd actually do. Offers are signed off-chain; you only spend gas if the borrower accepts. You can also send a collection-wide offer (see below) that any owner of a token in that collection can accept.
  4. Fund (or have your offer accepted). Your WQOM moves to the contract; the borrower's NFT moves to escrow.
  5. At maturity:
    • Repaid on time → you receive principal + interest in WQOM, minus the protocol's interest-fee slice (the live value is set by admin and capped at 10% in the contract bytecode).
    • Not repaid + grace expired → you call liquidate() (lender-only) and the NFT transfers to your wallet. The contract enforces lender-only liquidation; if you don't call it, no one else can — the NFT just stays in escrow.

Collection-wide offers — when to use them​

A regular offer targets one specific tokenId. A collection-wide offer makes the same loan terms available to any holder of any token in that collection.

When to use:

  • Generative art series where every token has similar floor value — low adverse-selection risk.
  • Bootstrapping liquidity for a collection where no specific listings exist yet.
  • Index-style underwriting — you want exposure to "this collection" not "this specific token".

Adverse selection risk: holders of the lowest-value tokens in a collection are the most likely to take a collection-wide offer (because they have the least to lose if they default). Price the offer for the floor, not the average.

Avoid collection-wide for:

  • PFP / trait-based collections with wide value spread between rares and floors.
  • Identity-bound NFTs (e.g. .qom domains where one specific name matters).

Where to find offers​

Three entry points, all show the same underlying offers:

  • /pawn (browse) — top-level feed with filters for collection, type (specific or collection-wide), APR range, and principal range. Accept any offer directly from the card.
  • /pawn/listing/[id] (listing detail) — offers attached to a specific borrower's listing, including collection-wide offers that happen to match the listing's NFT.
  • /pawn/lend — for creating a new lend offer without browsing listings first. Useful if you want to underwrite a collection generally rather than respond to specific demand.

Collection-wide offers float across all three views — wherever a borrower with a matching NFT lands, they can accept.

Why peer-to-peer for NFTs​

NFTs do not have reliable on-chain price oracles, especially for long-tail collections. Pool-based lending requires oracles to safely trigger liquidations — without them you cannot run a pool.

Peer-to-peer sidesteps the oracle requirement entirely. Every loan is its own bilateral price-discovery event, with the lender deciding what the NFT is worth at the moment of underwriting. If a lender is wrong, the loss is bounded to that single loan; there is no shared risk to other users.

Terms summary​

AspectHow it works in Pawn
CollateralA specific ERC-721 NFT on QOM L1. Standard implementations only (see Compatibility below).
Loan assetWQOM (the ERC-20 wrapper of native QOM). Native QOM doesn't work in smart contracts the way a token does, so the dapp wraps automatically when needed and unwraps on the way back to your wallet. 1 WQOM = 1 QOM, no slippage.
PricingLender judgement, per loan
Listings & offersOff-chain (signed messages). Free to list, free to bid; gas only when a counterparty accepts.
Counter-offersBorrower or lender can propose alternate principal/APR/duration. Either side can accept.
Collection-wide offersA lender offer can target a whole collection — any holder can take it.
Default handlingAfter maturity + 48h grace, anyone can call liquidate() to transfer the NFT to the lender. No auction.
Loan termFixed at origination. No auto-rollover, no partial repay.
CounterpartyA specific lender, not a pool
Origination feeSmall protocol fee deducted from principal at funding. Live value is admin-configurable; capped at 2% in the contract bytecode (admin cannot exceed that without a public upgrade).
Interest feeSmall slice of the lender's interest, taken at repay and routed to the protocol treasury. Live value is admin-configurable; capped at 10% in the bytecode.
Interest (to lender)Paid by the borrower to the lender at repayment, fixed APR set at origination.
Per-loan snapshotFee values are snapshotted onto each loan at acceptance — fee changes never retro-apply to in-flight loans.

Common questions​

Can the loan be partially repaid? No — repayment is a single transaction for the full principal + interest.

What happens if the borrower repays seconds before maturity? Repayment is allowed any time before startTime + duration + gracePeriod (default grace is 48h). Even past the original maturity timestamp, the borrower can still repay during the grace window before any liquidation call lands.

Can a lender sell the position before the loan ends? Not in v1. Once funded, the lender holds the position to maturity.

Is there a price oracle? No. That's the design — no oracle means no oracle-manipulation attack surface and no dependency on an external price feed.

What if I default and the NFT was worth more than the loan? You lose the surplus value. This asymmetry is what makes lender pricing rational — they price the loan well below the NFT's value to themselves, and you accept the discount in exchange for liquidity now.

Can someone other than the listing's borrower accept a lender's offer?

For specific-NFT offers (tokenId=X): only the wallet that currently owns NFT #X. The contract enforces this with an ownerOf check at acceptance.

For collection-wide offers (tokenId=0, collectionWide=true): anyone who owns any token in the collection. They specify their own tokenId when accepting; the contract checks ownership of that token at acceptance time.

Withdrawing or cancelling​

Borrowers — withdraw an open listing. As long as nobody has accepted yet, you can withdraw your listing at any time. Costs gas only if the listing was already on chain (most aren't — listings are off-chain signed messages and only become on-chain state if a lender accepts).

Lenders — cancel an unaccepted offer. Off-chain offers can be revoked locally just by ignoring them — borrowers see them disappear from the feed when the indexer drops them. To make a revocation enforceable on chain (so a borrower can't surprise-accept later), call cancelNonce(nonce) from the originating wallet. The contract permanently invalidates that nonce, so any future accept attempt reverts. Costs gas, but is the only way to be sure.

Once a loan is funded, neither side can cancel. The loan runs to maturity (or to liquidation after grace). The borrower can repay early; the lender just waits.

Who controls this?​

The Pawn contract is non-custodial. Once you list, fund, repay, or accept — the rules in the bytecode decide what happens, not the team.

What's protected, in the contract itself:

  • Your funds and your NFTs only ever move via the documented flows. No admin function exists to drain WQOM or seize NFTs. We've checked this against the source: there is no withdrawERC20, no withdrawNFT, no forceResolve. There's nothing to misuse because the function isn't there.
  • Loan terms cannot be retroactively modified. Once a loan is on chain, its principal, repayment, duration, and fee snapshot are fixed for that specific loan. Changes to the protocol's default fees never apply backwards.
  • Fee caps are baked into the bytecode. Origination fee is mathematically capped at 2%; interest fee is capped at 10%. These aren't admin-settable values — they're constants that would only change if the team published a new version of the contract on chain (which is publicly visible to anyone watching, with no way to do it silently).

That's the safety story in three lines: no one can take your stuff, no one can rewrite your terms, no one can charge you more than the cap.

NFT compatibility​

Pawn supports any standard ERC-721 on QOM L1. A few NFT contracts have non-standard transferFrom behavior that won't work cleanly with the escrow flow:

  • Royalty-enforcing transfers that revert on non-marketplace recipients — would block escrow.
  • Paused / pausable collections — if the issuer pauses transfers while your loan is active, neither repay nor liquidate can complete the NFT transfer until they unpause.
  • Soulbound or non-transferable tokens — can't be escrowed.
  • NFTs with on-transfer fees — the contract may receive less than expected; behavior is undefined.

If you list one of these and a lender funds it, both sides are stuck until the underlying NFT contract cooperates. List standard ERC-721s only, or test with a small amount first.

Want pool-based NFT lending?​

Pawn is bilateral, optimized for the long tail of NFTs without oracles. Coming soon: the Loaded NFT Pool — pool-based NFT lending against staked, reward-bearing .qom domains, with collateral pricing read directly from on-chain emission schedules. Different design, different risk profile, different user experience.

For ZAP-collateral pool lending, see Forge.