Source Code

;; RenVault - Clarity 4 Micro-Savings & Reputation Protocol
;; A decentralized vault for STX deposits with commitment points and protocol fees

;; Constants
(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-invalid-amount (err u101))
(define-constant err-insufficient-balance (err u102))
(define-constant err-transfer-failed (err u103))

;; Data Variables
(define-data-var total-fees-collected uint u0)

;; Data Maps (Clarity 4 typed maps)
(define-map user-balances principal uint)
(define-map commitment-points principal uint)

;; Private Functions
(define-private (calculate-fee (amount uint))
  (/ amount u100)) ;; 1% fee

(define-private (calculate-user-amount (amount uint))
  (- amount (calculate-fee amount)))

;; Public Functions

;; Deposit STX into vault with fee collection and commitment points
(define-public (deposit (amount uint))
  (let (
    (sender tx-sender)
    (fee (calculate-fee amount))
    (user-amount (calculate-user-amount amount))
    (current-balance (default-to u0 (map-get? user-balances sender)))
    (current-points (default-to u0 (map-get? commitment-points sender)))
  )
    ;; Validate amount
    (asserts! (> amount u0) err-invalid-amount)
    
    ;; Transfer STX from user to contract
    (try! (stx-transfer? amount sender (as-contract tx-sender)))
    
    ;; Update user balance (99% of deposit)
    (map-set user-balances sender (+ current-balance user-amount))
    
    ;; Increment commitment points (Clarity 4 arithmetic)
    (map-set commitment-points sender (+ current-points u1))
    
    ;; Add fee to total collected
    (var-set total-fees-collected (+ (var-get total-fees-collected) fee))
    
    (ok {
      deposited: user-amount,
      fee: fee,
      new-balance: (+ current-balance user-amount),
      commitment-points: (+ current-points u1)
    })
  )
)

;; Withdraw STX from vault
(define-public (withdraw (amount uint))
  (let (
    (sender tx-sender)
    (current-balance (default-to u0 (map-get? user-balances sender)))
  )
    ;; Validate amount
    (asserts! (> amount u0) err-invalid-amount)
    (asserts! (>= current-balance amount) err-insufficient-balance)
    
    ;; Update user balance
    (map-set user-balances sender (- current-balance amount))
    
    ;; Transfer STX from contract to user
    (as-contract (stx-transfer? amount tx-sender sender))
  )
)

;; Owner withdraws accumulated fees
(define-public (owner-withdraw-fees)
  (let (
    (fees (var-get total-fees-collected))
  )
    ;; Only contract owner can withdraw fees
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (asserts! (> fees u0) err-invalid-amount)
    
    ;; Reset fees to zero
    (var-set total-fees-collected u0)
    
    ;; Transfer fees to owner
    (as-contract (stx-transfer? fees tx-sender contract-owner))
  )
)

;; Read-only Functions (Clarity 4 optional returns)

;; Get user's vault balance
(define-read-only (get-balance (user principal))
  (ok (default-to u0 (map-get? user-balances user)))
)

;; Get user's commitment points
(define-read-only (get-points (user principal))
  (ok (default-to u0 (map-get? commitment-points user)))
)

;; Get total fees collected
(define-read-only (get-fees-collected)
  (ok (var-get total-fees-collected))
)

;; Get contract owner
(define-read-only (get-contract-owner)
  (ok contract-owner)
)

;; Get user stats (balance and points)
(define-read-only (get-user-stats (user principal))
  (ok {
    balance: (default-to u0 (map-get? user-balances user)),
    points: (default-to u0 (map-get? commitment-points user))
  })
)

Functions (10)

FunctionAccessArgs
calculate-feeprivateamount: uint
calculate-user-amountprivateamount: uint
depositpublicamount: uint
withdrawpublicamount: uint
owner-withdraw-feespublic
get-balanceread-onlyuser: principal
get-pointsread-onlyuser: principal
get-fees-collectedread-only
get-contract-ownerread-only
get-user-statsread-onlyuser: principal