Source Code

;; Lending Pool - P2P lending with collateral
;; Built for Stacks Builder Challenge by Marcus David

(define-constant err-insufficient-collateral (err u101))
(define-constant err-not-found (err u102))

(define-data-var total-deposits uint u0)
(define-data-var total-borrowed uint u0)
(define-data-var collateral-ratio uint u150)

(define-map deposits principal uint)
(define-map loans principal { borrowed: uint, collateral: uint, start-block: uint })

(define-read-only (get-deposit (user principal))
  (default-to u0 (map-get? deposits user))
)

(define-read-only (get-loan (user principal))
  (map-get? loans user)
)

(define-public (deposit (amount uint))
  (begin
    (try! (stx-transfer-memo? amount tx-sender (as-contract tx-sender) 0x6c656e64696e67206465706f736974))
    (map-set deposits tx-sender (+ (get-deposit tx-sender) amount))
    (var-set total-deposits (+ (var-get total-deposits) amount))
    (ok true)
  )
)

(define-public (borrow (amount uint) (collateral uint))
  (let ((required-collateral (/ (* amount (var-get collateral-ratio)) u100)))
    (asserts! (>= collateral required-collateral) err-insufficient-collateral)
    (try! (stx-transfer-memo? collateral tx-sender (as-contract tx-sender) 0x636f6c6c61746572616c206465706f736974))
    (try! (as-contract (stx-transfer-memo? amount tx-sender tx-sender 0x6c6f616e20646973627572736d656e74)))
    (map-set loans tx-sender {
      borrowed: amount,
      collateral: collateral,
      start-block: stacks-block-height
    })
    (var-set total-borrowed (+ (var-get total-borrowed) amount))
    (ok true)
  )
)

(define-public (repay)
  (match (map-get? loans tx-sender)
    loan
      (let ((repay-amount (+ (get borrowed loan) (/ (get borrowed loan) u100))))
        (try! (stx-transfer-memo? repay-amount tx-sender (as-contract tx-sender) 0x6c6f616e207265706179))
        (try! (as-contract (stx-transfer-memo? (get collateral loan) tx-sender tx-sender 0x636f6c6c61746572616c2072657475726e)))
        (map-delete loans tx-sender)
        (var-set total-borrowed (- (var-get total-borrowed) (get borrowed loan)))
        (ok true)
      )
    err-not-found
  )
)

(define-public (withdraw (amount uint))
  (let ((balance (get-deposit tx-sender)))
    (asserts! (>= balance amount) err-not-found)
    (try! (as-contract (stx-transfer-memo? amount tx-sender tx-sender 0x6465706f73697420776974686472617761)))
    (map-set deposits tx-sender (- balance amount))
    (var-set total-deposits (- (var-get total-deposits) amount))
    (ok true)
  )
)

Functions (6)

FunctionAccessArgs
get-depositread-onlyuser: principal
get-loanread-onlyuser: principal
depositpublicamount: uint
borrowpublicamount: uint, collateral: uint
repaypublic
withdrawpublicamount: uint