Source Code

;; Royalty Splitter Contract
;; Split payments among multiple recipients

(define-constant err-not-recipient (err u100))
(define-constant err-no-balance (err u101))
(define-constant err-invalid-shares (err u102))

(define-data-var total-shares uint u0)
(define-data-var total-released uint u0)

(define-map shares principal uint)
(define-map released principal uint)

(define-public (initialize-recipients (recipients (list 20 {recipient: principal, shares: uint})))
    (begin
        (asserts! (is-eq (var-get total-shares) u0) err-invalid-shares)
        (fold process-recipient recipients {total: u0})
        (ok true)
    )
)

(define-private (process-recipient 
    (recipient-data {recipient: principal, shares: uint})
    (state {total: uint}))
    (begin
        (map-set shares (get recipient recipient-data) (get shares recipient-data))
        {total: (+ (get total state) (get shares recipient-data))}
    )
)

(define-public (release-payment (recipient principal))
    (let
        (
            (recipient-shares (unwrap! (map-get? shares recipient) err-not-recipient))
            (total-received (stx-get-balance (as-contract tx-sender)))
            (already-released (default-to u0 (map-get? released recipient)))
            (payment (- (/ (* total-received recipient-shares) (var-get total-shares)) already-released))
        )
        (asserts! (> payment u0) err-no-balance)
        
        (try! (as-contract (stx-transfer? payment tx-sender recipient)))
        (map-set released recipient (+ already-released payment))
        (var-set total-released (+ (var-get total-released) payment))
        (ok payment)
    )
)

(define-public (receive-payment)
    (ok true)
)

(define-read-only (get-shares (recipient principal))
    (map-get? shares recipient)
)

(define-read-only (get-released (recipient principal))
    (default-to u0 (map-get? released recipient))
)

(define-read-only (get-pending-payment (recipient principal))
    (match (map-get? shares recipient)
        recipient-shares
        (let
            (
                (total-received (stx-get-balance (as-contract tx-sender)))
                (already-released (default-to u0 (map-get? released recipient)))
            )
            (- (/ (* total-received recipient-shares) (var-get total-shares)) already-released)
        )
        u0
    )
)

Functions (7)

FunctionAccessArgs
initialize-recipientspublicrecipients: (list 20 {recipient: principal, shares: uint}
process-recipientprivaterecipient-data: {recipient: principal, shares: uint}, state: {total: uint}
release-paymentpublicrecipient: principal
receive-paymentpublic
get-sharesread-onlyrecipient: principal
get-releasedread-onlyrecipient: principal
get-pending-paymentread-onlyrecipient: principal