Source Code

;; Profit Pool Contract
;; Shared revenue pool with proportional distribution
;; Halal - mudarabah/musharakah style
;; Clarity 4 compatible

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u401))
(define-constant ERR-NOT-FOUND (err u404))
(define-constant ERR-INSUFFICIENT (err u405))

(define-data-var pool-balance uint u0)
(define-data-var total-deposits uint u0)
(define-data-var total-distributed uint u0)
(define-data-var member-count uint u0)
(define-data-var distribution-round uint u0)

(define-map pool-members principal { deposit: uint, share-pct: uint, claimed: uint, joined: uint })
(define-map distributions uint { total: uint, per-share: uint, block: uint })

(define-public (join-pool (deposit uint))
  (begin
    (asserts! (is-none (map-get? pool-members tx-sender)) ERR-NOT-AUTHORIZED)
    (try! (stx-transfer? deposit tx-sender CONTRACT-OWNER))
    (map-set pool-members tx-sender { deposit: deposit, share-pct: u0, claimed: u0, joined: stacks-block-height })
    (var-set pool-balance (+ (var-get pool-balance) deposit))
    (var-set total-deposits (+ (var-get total-deposits) deposit))
    (var-set member-count (+ (var-get member-count) u1))
    (ok true)))

(define-public (add-to-pool (amount uint))
  (let ((member (unwrap! (map-get? pool-members tx-sender) ERR-NOT-FOUND)))
    (try! (stx-transfer? amount tx-sender CONTRACT-OWNER))
    (map-set pool-members tx-sender (merge member { deposit: (+ (get deposit member) amount) }))
    (var-set pool-balance (+ (var-get pool-balance) amount))
    (var-set total-deposits (+ (var-get total-deposits) amount))
    (ok amount)))

(define-public (set-share (member principal) (share uint))
  (let ((m (unwrap! (map-get? pool-members member) ERR-NOT-FOUND)))
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-set pool-members member (merge m { share-pct: share })) (ok share)))

(define-public (add-profit (amount uint))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (var-set pool-balance (+ (var-get pool-balance) amount)) (ok amount)))

(define-public (distribute-to (member principal) (amount uint))
  (let ((m (unwrap! (map-get? pool-members member) ERR-NOT-FOUND)))
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (try! (stx-transfer? amount tx-sender member))
    (map-set pool-members member (merge m { claimed: (+ (get claimed m) amount) }))
    (var-set total-distributed (+ (var-get total-distributed) amount))
    (ok amount)))

(define-public (withdraw (amount uint))
  (let ((member (unwrap! (map-get? pool-members tx-sender) ERR-NOT-FOUND)))
    (asserts! (>= (get deposit member) amount) ERR-INSUFFICIENT)
    (try! (stx-transfer? amount CONTRACT-OWNER tx-sender))
    (map-set pool-members tx-sender (merge member { deposit: (- (get deposit member) amount) }))
    (var-set pool-balance (- (var-get pool-balance) amount))
    (ok amount)))

(define-read-only (get-member (who principal)) (map-get? pool-members who))
(define-read-only (get-pool-balance) (ok (var-get pool-balance)))
(define-read-only (get-total-distributed) (ok (var-get total-distributed)))
(define-read-only (get-member-count) (ok (var-get member-count)))

Functions (10)

FunctionAccessArgs
join-poolpublicdeposit: uint
add-to-poolpublicamount: uint
set-sharepublicmember: principal, share: uint
add-profitpublicamount: uint
distribute-topublicmember: principal, amount: uint
withdrawpublicamount: uint
get-memberread-onlywho: principal
get-pool-balanceread-only
get-total-distributedread-only
get-member-countread-only