Source Code

;; StackHub Service Registry - Gas Optimized
;; Listing fee: 2.5 STX | Transaction fee: 1.5%

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-OWNER (err u100))
(define-constant ERR-NOT-FOUND (err u101))
(define-constant ERR-UNAUTHORIZED (err u102))
(define-constant ERR-ZERO (err u103))
(define-constant LISTING-FEE u2500000) ;; 2.5 STX
(define-constant TX-FEE u150) ;; 1.5% = 150/10000

(define-data-var last-service-id uint u0)
(define-data-var total-fees uint u0)

(define-map services uint {
  provider: principal,
  title: (string-ascii 64),
  price: uint,
  active: bool
})

(define-map provider-earnings principal uint)

;; Read functions
(define-read-only (get-service (id uint))
  (map-get? services id))

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

(define-read-only (get-last-service-id)
  (var-get last-service-id))

(define-read-only (get-earnings (who principal))
  (default-to u0 (map-get? provider-earnings who)))

;; Register service - pays 2.5 STX fee
(define-public (register-service (title (string-ascii 64)) (price uint))
  (let ((id (+ (var-get last-service-id) u1)))
    (asserts! (> price u0) ERR-ZERO)
    (try! (stx-transfer? LISTING-FEE tx-sender CONTRACT-OWNER))
    (map-set services id {
      provider: tx-sender,
      title: title,
      price: price,
      active: true
    })
    (var-set last-service-id id)
    (var-set total-fees (+ (var-get total-fees) LISTING-FEE))
    (ok id)))

;; Update service
(define-public (update-service (id uint) (title (string-ascii 64)) (price uint))
  (let ((service (unwrap! (map-get? services id) ERR-NOT-FOUND)))
    (asserts! (is-eq tx-sender (get provider service)) ERR-UNAUTHORIZED)
    (map-set services id (merge service {title: title, price: price}))
    (ok true)))

;; Toggle service active/inactive
(define-public (toggle-service (id uint))
  (let ((service (unwrap! (map-get? services id) ERR-NOT-FOUND)))
    (asserts! (is-eq tx-sender (get provider service)) ERR-UNAUTHORIZED)
    (map-set services id (merge service {active: (not (get active service))}))
    (ok true)))

;; Pay for service - 1.5% fee to platform
(define-public (pay-service (id uint))
  (let (
    (service (unwrap! (map-get? services id) ERR-NOT-FOUND))
    (price (get price service))
    (provider (get provider service))
    (fee (/ (* price TX-FEE) u10000))
    (provider-amount (- price fee))
  )
    (asserts! (get active service) ERR-NOT-FOUND)
    (try! (stx-transfer? provider-amount tx-sender provider))
    (try! (stx-transfer? fee tx-sender CONTRACT-OWNER))
    (map-set provider-earnings provider (+ (get-earnings provider) provider-amount))
    (var-set total-fees (+ (var-get total-fees) fee))
    (ok {paid: price, fee: fee})))

Functions (8)

FunctionAccessArgs
get-serviceread-onlyid: uint
get-total-feesread-only
get-last-service-idread-only
get-earningsread-onlywho: principal
register-servicepublictitle: (string-ascii 64
update-servicepublicid: uint, title: (string-ascii 64
toggle-servicepublicid: uint
pay-servicepublicid: uint