Source Code

;; revenue-settlement.clar
;; Complete revenue settlement system with advanced security and validation
;; Version: 1.0.0

;; ============================================
;; Error Codes
;; ============================================
(define-constant ERR-not-authorized (err u401))
(define-constant ERR-invalid-params (err u400))
(define-constant ERR-not-found (err u404))
(define-constant ERR-insufficient-funds (err u405))
(define-constant ERR-claim-expired (err u406))
(define-constant ERR-already-claimed (err u407))
(define-constant ERR-pool-expired (err u408))
(define-constant ERR-invalid-amount (err u409))
(define-constant ERR-pool-inactive (err u410))
(define-constant ERR-daily-limit-exceeded (err u411))
(define-constant ERR-blacklisted (err u412))
(define-constant ERR-rate-limit-exceeded (err u413))
(define-constant ERR-invalid-status (err u414))
(define-constant ERR-zero-amount (err u415))

;; ============================================
;; Constants
;; ============================================
(define-constant contract-owner tx-sender)
(define-constant platform-fee u2)
(define-constant min-pool-amount u1000000)    ;; 1 STX
(define-constant claim-duration u144)         ;; ~1 day in blocks
(define-constant max-daily-claims u5)
(define-constant max-amount-per-tx u1000000000)  ;; 1000 STX
(define-constant min-amount-per-tx u1000000)     ;; 1 STX
(define-constant max-daily-amount u100000000000) ;; 100,000 STX

;; ============================================
;; Data Variables
;; ============================================
(define-data-var treasury-balance uint u0)
(define-data-var payment-counter uint u0)
(define-data-var pool-counter uint u0)
(define-data-var contract-paused bool false)
(define-data-var total-volume uint u0)
(define-data-var total-fees-collected uint u0)

;; ============================================
;; Data Maps
;; ============================================

;; Security Maps
(define-map blacklisted-addresses
    { address: principal }
    { 
        blacklisted: bool, 
        reason: (string-ascii 50),
        blacklisted-at: uint
    }
)

(define-map daily-limits
    { address: principal, day: uint }
    { 
        tx-count: uint, 
        total-amount: uint,
        last-tx-height: uint
    }
)

;; Core Payment Maps
(define-map publisher-accounts
    { publisher: principal }
    {
        balance: uint,
        total-earned: uint,
        reward-points: uint,
        tier: (string-ascii 10),
        last-activity: uint,
        total-claims: uint,
        pending-claims: uint,
        status: (string-ascii 10)
    }
)

(define-map payments
    { payment-id: uint }
    {
        sender: principal,
        recipient: principal,
        amount: uint,
        fee: uint,
        net-amount: uint,
        timestamp: uint,
        status: (string-ascii 20),
        memo: (optional (string-ascii 100))
    }
)

(define-map revenue-pools
    { pool-id: uint }
    {
        total-amount: uint,
        remaining-amount: uint,
        start-height: uint,
        end-height: uint,
        participants: uint,
        min-claim: uint,
        max-claim: uint,
        creator: principal,
        status: (string-ascii 10),
        pool-type: (string-ascii 20)
    }
)

(define-map pool-participants
    { pool-id: uint, participant: principal }
    {
        total-claimed: uint,
        last-claim: uint,
        claims-count: uint
    }
)

(define-map payment-claims
    { claim-id: uint }
    {
        publisher: principal,
        pool-id: uint,
        amount: uint,
        created-at: uint,
        expires-at: uint,
        status: (string-ascii 10),
        processed-at: (optional uint)
    }
)

;; ============================================
;; Private Functions
;; ============================================

;; Basic Checks
(define-private (is-owner)
    (is-eq tx-sender contract-owner)
)

(define-private (is-contract-active)
    (not (var-get contract-paused))
)

;; Calculations
(define-private (calculate-fee (amount uint))
    (/ (* amount platform-fee) u100)
)

;; Validation Functions
(define-private (validate-amount (amount uint))
    (and 
        (> amount u0)
        (>= amount min-amount-per-tx)
        (<= amount max-amount-per-tx)
    )
)

(define-private (check-blacklist (address principal))
    (match (map-get? blacklisted-addresses { address: address })
        blacklist-data (not (get blacklisted blacklist-data))
        true
    )
)

(define-private (check-daily-limit (address principal) (amount uint))
    (let
        ((current-day (/ stacks-block-time u86400))
         (limit-data (default-to 
            { tx-count: u0, total-amount: u0, last-tx-height: u0 } 
            (map-get? daily-limits { address: address, day: current-day }))))
        
        (and
            (<= (+ (get total-amount limit-data) amount) max-daily-amount)
            (<= (get tx-count limit-data) max-daily-claims)
        )
    )
)

(define-private (update-daily-limit (address principal) (amount uint))
    (let
        ((current-day (/ stacks-block-time u86400))
         (limit-data (default-to 
            { tx-count: u0, total-amount: u0, last-tx-height: u0 } 
            (map-get? daily-limits { address: address, day: current-day }))))
        
        (map-set daily-limits
            { address: address, day: current-day }
            {
                tx-count: (+ (get tx-count limit-data) u1),
                total-amount: (+ (get total-amount limit-data) amount),
                last-tx-height: stacks-block-time
            }
        )
    )
)

(define-private (validate-pool (pool-id uint))
    (match (map-get? revenue-pools { pool-id: pool-id })
        pool (and
            (is-eq (get status pool) "active")
            (< stacks-block-time (get end-height pool))
            (> (get remaining-amount pool) u0)
        )
        false
    )
)

;; Publisher Account Management
(define-private (initialize-publisher-account (publisher principal))
    (map-set publisher-accounts
        { publisher: publisher }
        {
            balance: u0,
            total-earned: u0,
            reward-points: u0,
            tier: "bronze",
            last-activity: stacks-block-time,
            total-claims: u0,
            pending-claims: u0,
            status: "active"
        }
    )
)

(define-private (update-publisher-stats 
    (publisher principal) 
    (amount uint) 
    (points uint))
    
    (match (map-get? publisher-accounts { publisher: publisher })
        existing-data
        (map-set publisher-accounts
            { publisher: publisher }
            (merge existing-data {
                balance: (+ (get balance existing-data) amount),
                total-earned: (+ (get total-earned existing-data) amount),
                reward-points: (+ (get reward-points existing-data) points),
                last-activity: stacks-block-time
            })
        )
        (initialize-publisher-account publisher)
    )
)

Functions (10)

FunctionAccessArgs
is-contract-activeprivate
calculate-feeprivateamount: uint
is-ownerprivate
validate-amountprivateamount: uint
check-blacklistprivateaddress: principal
check-daily-limitprivateaddress: principal, amount: uint
update-daily-limitprivateaddress: principal, amount: uint
validate-poolprivatepool-id: uint
initialize-publisher-accountprivatepublisher: principal
update-publisher-statsprivatepublisher: principal, amount: uint, points: uint