;; DeFi Liquidity Pool Tracker
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u1))
(define-data-var pool-count uint u0)
(define-map pools uint {token-a: (string-ascii 10), token-b: (string-ascii 10), reserve-a: uint, reserve-b: uint, lp-supply: uint})
(define-map lp-balances {pool: uint, owner: principal} uint)
(define-public (create-pool (token-a (string-ascii 10)) (token-b (string-ascii 10)) (amount-a uint) (amount-b uint))
(let ((id (var-get pool-count)))
(map-set pools id {token-a: token-a, token-b: token-b, reserve-a: amount-a, reserve-b: amount-b, lp-supply: amount-a})
(map-set lp-balances {pool: id, owner: tx-sender} amount-a)
(var-set pool-count (+ id u1))
(ok id)))
(define-public (add-liquidity (pool-id uint) (amount-a uint) (amount-b uint))
(let ((p (unwrap! (map-get? pools pool-id) ERR-NOT-AUTHORIZED))
(lp-amount (/ (* amount-a (get lp-supply p)) (get reserve-a p))))
(map-set pools pool-id (merge p {
reserve-a: (+ (get reserve-a p) amount-a),
reserve-b: (+ (get reserve-b p) amount-b),
lp-supply: (+ (get lp-supply p) lp-amount)}))
(map-set lp-balances {pool: pool-id, owner: tx-sender}
(+ (default-to u0 (map-get? lp-balances {pool: pool-id, owner: tx-sender})) lp-amount))
(ok lp-amount)))
(define-read-only (get-pool (id uint))
(map-get? pools id))
(define-read-only (get-lp-balance (pool-id uint) (owner principal))
(default-to u0 (map-get? lp-balances {pool: pool-id, owner: owner})))
(define-read-only (get-pool-count)
(var-get pool-count))