Branch data Line data Source code
1 : : ;; Title: BME010 Reputation-Gated Liquidity Contribution
2 : : ;; Synopsis:
3 : : ;; Accept STX from contributors and reward them with BIGR reputation tokens
4 : : ;; Description:
5 : : ;; Users are rewarded with BIGR by contributing STX to the DAO treasury.
6 : : ;; BIGR is used to claim BIG through the main reputation contract.
7 : : ;; The rate is set by the DAO and can be updated as needed.
8 : :
9 : : (impl-trait 'SP3JP0N1ZXGASRJ0F7QAHWFPGTVK9T2XNXDB908Z.extension-trait.extension-trait)
10 : :
11 : : ;; Constants and Errors
12 : : (define-constant err-unauthorised (err u5000))
13 : : (define-constant err-minimum-stx (err u5002))
14 : :
15 : : (define-constant MICROSTX u1000000)
16 : : (define-constant SCALE u1000000)
17 : :
18 : : ;; 10,10 -- > 1 STX = 1 BIGR, 10 STX = 3 BIGR, 100 STX = 10 BIGR
19 : : (define-data-var stx-to-bigr-rate uint u10)
20 : : (define-data-var stx-to-bigr-dampener uint u10)
21 : :
22 : : (define-map stx-contributions {who: principal} uint)
23 : :
24 : : ;; Authorization check
25 : 3 : (define-public (is-dao-or-extension)
26 [ + ][ + + ]: 3 : (ok (asserts! (or (is-eq tx-sender .bigmarket-dao) (contract-call? .bigmarket-dao is-extension contract-caller)) err-unauthorised))
27 : : )
28 : :
29 : : ;; DAO can update the reward rate
30 : 3 : (define-public (set-liquidity-reward-params (params {rate: uint, dampener: uint}))
31 : 3 : (begin
32 : 3 : (try! (is-dao-or-extension))
33 : 2 : (var-set stx-to-bigr-rate (get rate params))
34 : 2 : (var-set stx-to-bigr-dampener (get dampener params))
35 : 2 : (ok true)
36 : : )
37 : : )
38 : : ;; DAO can update the reward dampener
39 : 2 : (define-read-only (get-liquidity-reward-params)
40 : : {
41 : 2 : rate: (var-get stx-to-bigr-rate),
42 : 2 : dampener: (var-get stx-to-bigr-dampener)
43 : : }
44 : : )
45 : :
46 : 5 : (define-public (contribute-stx (amount uint))
47 : 11 : (let (
48 : 11 : (user tx-sender)
49 : 11 : (rate (var-get stx-to-bigr-rate))
50 : 11 : (dampener (var-get stx-to-bigr-dampener))
51 : 11 : (amount-stx (/ amount MICROSTX))
52 : 11 : (sqrt-amount (sqrti amount-stx))
53 : 11 : (bigr-earned-scaled (/ (* (* sqrt-amount rate) SCALE) dampener))
54 : 11 : (bigr-earned (/ bigr-earned-scaled SCALE))
55 : 11 : (existing (default-to u0 (map-get? stx-contributions {who: user})))
56 : : )
57 : :
58 : : ;; if rate == 0, short-circuit no transfer, no mint
59 : 11 : (if (is-eq rate u0)
60 [ + ]: 1 : (begin
61 : 1 : (print {event: "liquidity_contribution_skipped", from: user, rate: rate})
62 : 1 : (ok u0)
63 : : )
64 [ + ]: 10 : (begin
65 : : ;; must contribute at least 1 STX
66 [ + ]: 10 : (asserts! (>= amount MICROSTX) err-minimum-stx)
67 : :
68 : : ;; transfer STX to treasury
69 : 9 : (try! (stx-transfer? amount user .bme006-0-treasury))
70 : :
71 : : ;; record contribution and mint reputation
72 : 9 : (map-set stx-contributions {who: user} (+ existing amount))
73 : 9 : (try! (contract-call? .bme030-0-reputation-token mint user u4 bigr-earned))
74 : :
75 : 9 : (print {event: "liquidity_contribution", from: user, amount: amount, bigr: bigr-earned, rate: rate, dampener: dampener})
76 : 9 : (ok bigr-earned)
77 : : )
78 : : )
79 : : )
80 : : )
81 : :
82 : : ;; Extension trait callback stub
83 : 1 : (define-public (callback (sender principal) (memo (buff 34)))
84 : 1 : (ok true)
85 : : )
|