InterviewDB Question

NFT Borrowing Service - Design a Lending Protocol for Digital Assets

Question Details

Round 1 Coding / OOD

Problem

Design a simplified NFT borrowing service. Users can list their NFTs for lending at a daily fee. Borrowers can rent an NFT for a fixed number of days and return it early. Implement the following interface:

python
class NFTBorrowingService:
    def list_nft(self, nft_id: str, owner: str, daily_fee: float) -> bool:
        pass

    def borrow(self, nft_id: str, borrower: str, days: int, current_day: int) -> bool:
        pass

    def return_nft(self, nft_id: str, borrower: str, current_day: int) -> float:

**Returns** total fee charged (prorated to actual days held)
        pass

    def available_nfts(self) -> list:

**Returns** list of nft_ids currently available to borrow
        pass

Example

service.list_nft("ape_001", "alice", 5.0)     # listed at $5/day
service.borrow("ape_001", "bob", 10, day=0)   # borrow for 10 days
service.available_nfts()                       # -> [] (ape_001 is out)
service.return_nft("ape_001", "bob", day=3)   # returned early -> fee = 3 * 5.0 = 15.0
service.available_nfts()                       # -> ["ape_001"]

Follow-ups

  1. How do you handle an overdue return — should fees accumulate past the agreed days?
  2. What if the owner wants to cancel the listing while it is actively borrowed?
  3. How would you add a collateral system to protect lenders against non-returns?
  4. How would you redesign storage and lookups if the service scales to millions of NFTs?

Full Details

Round 1 Coding / OOD

Problem

Design a simplified NFT borrowing service. Users can list their NFTs for lending at a daily fee. Borrowers can rent an NFT for a fixed number of days and return it early. Implement the following interface:

python
class NFTBorrowingService:
    def list_nft(self, nft_id: str, owner: str, daily_fee: float) -> bool:
        pass

    def borrow(self, nft_id: str, borrower: str, days: int, current_day: int) -> bool:
        pass

    def return_nft(self, nft_id: str, borrower: str, current_day: int) -> float:

**Returns** total fee charged (prorated to actual days held)
        pass

    def available_nfts(self) -> list:

**Returns** list of nft_ids currently available to borrow
        pass

Example

service.list_nft("ape_001", "alice", 5.0)     # listed at $5/day
service.borrow("ape_001", "bob", 10, day=0)   # borrow for 10 days
service.available_nfts()                       # -> [] (ape_001 is out)
service.return_nft("ape_001", "bob", day=3)   # returned early -> fee = 3 * 5.0 = 15.0
service.available_nfts()                       # -> ["ape_001"]

Follow-ups

  1. How do you handle an overdue return — should fees accumulate past the agreed days?
  2. What if the owner wants to cancel the listing while it is actively borrowed?
  3. How would you add a collateral system to protect lenders against non-returns?
  4. How would you redesign storage and lookups if the service scales to millions of NFTs?

About This Question

This is a reported interview question from a uniswap interview during the onsite round.

It covers the following topics: Coding, Onsite .