Source Code

(define-constant ERR_INSUFFICIENT_BALANCE (err u100))
(define-constant ERR_INVALID_AMOUNT (err u101))
(define-constant ERR_NOT_OWNER (err u102))

(define-data-var contract-owner principal tx-sender)
(define-data-var interest-rate uint u500)
(define-data-var total-deposits uint u0)

(define-map deposits
  principal
  uint
)

(define-map deposit-timestamps
  principal
  uint
)

(define-read-only (get-contract-owner)
  (var-get contract-owner)
)

(define-read-only (get-interest-rate)
  (var-get interest-rate)
)

(define-read-only (get-total-deposits)
  (var-get total-deposits)
)

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

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

(define-public (deposit (amount uint))
  (begin
    (asserts! (> amount u0) ERR_INVALID_AMOUNT)
    ;; Note: Removed balance check for MVP - we're just tracking balances
    
    (let (
      (current-deposit (default-to u0 (map-get? deposits tx-sender)))
      (new-deposit (+ current-deposit amount))
    )
      (map-set deposits tx-sender new-deposit)
      (map-set deposit-timestamps tx-sender u0)
      (var-set total-deposits (+ (var-get total-deposits) amount))
      
      ;; MVP: Just tracking balances, no actual STX transfer
      (ok true)
    )
  )
)

(define-public (withdraw (amount uint))
  (begin
    (asserts! (> amount u0) ERR_INVALID_AMOUNT)
    
    (let (
      (current-deposit (default-to u0 (map-get? deposits tx-sender)))
    )
      (asserts! (>= current-deposit amount) ERR_INSUFFICIENT_BALANCE)
      
      (let (
        (new-deposit (- current-deposit amount))
      )
        (if (is-eq new-deposit u0)
          (begin
            (map-delete deposits tx-sender)
            (map-delete deposit-timestamps tx-sender)
          )
          (map-set deposits tx-sender new-deposit)
        )
        
        (var-set total-deposits (- (var-get total-deposits) amount))
        
        ;; MVP: Just tracking balances, no actual STX transfer
        (ok true)
      )
    )
  )
)

(define-public (set-interest-rate (new-rate uint))
  (begin
    (asserts! (is-eq tx-sender (var-get contract-owner)) ERR_NOT_OWNER)
    (asserts! (and (>= new-rate u0) (<= new-rate u10000)) ERR_INVALID_AMOUNT)
    
    (var-set interest-rate new-rate)
    (ok true)
  )
)

(define-public (transfer-ownership (new-owner principal))
  (begin
    (asserts! (is-eq tx-sender (var-get contract-owner)) ERR_NOT_OWNER)
    (asserts! (not (is-eq new-owner tx-sender)) ERR_NOT_OWNER)
    
    (var-set contract-owner new-owner)
    (ok true)
  )
)

Functions (9)

FunctionAccessArgs
get-contract-ownerread-only
get-interest-rateread-only
get-total-depositsread-only
get-user-depositread-onlyuser: principal
get-user-balanceread-onlyuser: principal
depositpublicamount: uint
withdrawpublicamount: uint
set-interest-ratepublicnew-rate: uint
transfer-ownershippublicnew-owner: principal