Source Code

;; Liquidity Pool Contract
;; Automated Market Maker with fee collection

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-insufficient-balance (err u101))
(define-constant err-invalid-amount (err u102))
(define-constant err-pool-not-found (err u103))

(define-map pools 
	{ token-a: principal, token-b: principal }
	{ 
		reserve-a: uint, 
		reserve-b: uint, 
		total-supply: uint,
		fee-rate: uint
	})

(define-map user-liquidity 
	{ user: principal, token-a: principal, token-b: principal }
	uint)

(define-public (create-pool (token-a principal) (token-b principal) (amount-a uint) (amount-b uint))
	(let ((pool-key { token-a: token-a, token-b: token-b }))
		(asserts! (is-none (map-get? pools pool-key)) err-pool-not-found)
		(map-set pools pool-key {
			reserve-a: amount-a,
			reserve-b: amount-b,
			total-supply: (* amount-a amount-b),
			fee-rate: u30
		})
		(ok true)))

(define-public (add-liquidity (token-a principal) (token-b principal) (amount-a uint) (amount-b uint))
	(let ((pool-key { token-a: token-a, token-b: token-b })
				(pool (unwrap! (map-get? pools pool-key) err-pool-not-found)))
		(map-set user-liquidity 
			{ user: tx-sender, token-a: token-a, token-b: token-b }
			(+ (default-to u0 (map-get? user-liquidity { user: tx-sender, token-a: token-a, token-b: token-b })) amount-a))
		(ok true)))

(define-read-only (get-pool (token-a principal) (token-b principal))
	(map-get? pools { token-a: token-a, token-b: token-b }))

(define-read-only (get-user-liquidity (user principal) (token-a principal) (token-b principal))
	(default-to u0 (map-get? user-liquidity { user: user, token-a: token-a, token-b: token-b })))

Functions (4)

FunctionAccessArgs
create-poolpublictoken-a: principal, token-b: principal, amount-a: uint, amount-b: uint
add-liquiditypublictoken-a: principal, token-b: principal, amount-a: uint, amount-b: uint
get-poolread-onlytoken-a: principal, token-b: principal
get-user-liquidityread-onlyuser: principal, token-a: principal, token-b: principal