Branch data Line data Source code
1 : : ;; Title: BME08 Resolution Coordinator (label-based)
2 : : ;; Resolvers signal a label; once any label's count reaches the threshold
3 : : ;; we call the market contract with that label.
4 : :
5 : : (impl-trait 'SP3JP0N1ZXGASRJ0F7QAHWFPGTVK9T2XNXDB908Z.extension-trait.extension-trait)
6 : :
7 : : ;; --- Errors
8 : : (define-constant err-unauthorised (err u6100))
9 : : (define-constant err-not-resolution-team-member (err u6101))
10 : : (define-constant err-already-executed (err u6102))
11 : :
12 : : ;; --- State
13 : : (define-map resolution-team principal bool)
14 : :
15 : : ;; Per-market: has this resolver already signalled (regardless of label)?
16 : : (define-map resolution-action-signals {market-id: uint, team-member: principal} bool)
17 : :
18 : : ;; Per (market,label): how many signals?
19 : : (define-map resolution-label-counts {market-id: uint, label: (string-ascii 64)} uint)
20 : :
21 : : ;; Per (market,resolver): metadata hash (e.g., prompt/model/evidence hash)
22 : : (define-map resolution-metadata {market-id: uint, resolver: principal} (buff 32))
23 : :
24 : : ;; Threshold
25 : : (define-data-var resolution-signals-required uint u1)
26 : :
27 : : ;; --- Auth
28 : 14 : (define-public (is-dao-or-extension)
29 [ + ][ + + ]: 44 : (ok (asserts! (or (is-eq tx-sender .bigmarket-dao) (contract-call? .bigmarket-dao is-extension contract-caller)) err-unauthorised))
30 : : )
31 : :
32 : : ;; --- Admin
33 : 14 : (define-public (set-resolution-team-member (who principal) (member bool))
34 : 26 : (begin
35 : 26 : (try! (is-dao-or-extension))
36 : 25 : (ok (map-set resolution-team who member))
37 : : )
38 : : )
39 : :
40 : 14 : (define-public (set-signals-required (new-requirement uint))
41 : 18 : (begin
42 : 18 : (try! (is-dao-or-extension))
43 : 17 : (ok (var-set resolution-signals-required new-requirement))
44 : : )
45 : : )
46 : :
47 : : ;; --- Views
48 : 11 : (define-read-only (is-resolution-team-member (who principal))
49 : 18 : (default-to false (map-get? resolution-team who))
50 : : )
51 : :
52 : 9 : (define-read-only (has-signalled (market-id uint) (who principal))
53 : 16 : (default-to false (map-get? resolution-action-signals {market-id: market-id, team-member: who}))
54 : : )
55 : :
56 : 9 : (define-read-only (get-label-count (market-id uint) (label (string-ascii 64)))
57 : 13 : (default-to u0 (map-get? resolution-label-counts {market-id: market-id, label: label}))
58 : : )
59 : :
60 : 1 : (define-read-only (get-signals-required)
61 : 1 : (var-get resolution-signals-required)
62 : : )
63 : :
64 : 1 : (define-read-only (get-resolution-metadata (market-id uint) (resolver principal))
65 : 1 : (map-get? resolution-metadata {market-id: market-id, resolver: resolver})
66 : : )
67 : :
68 : : ;; --- Private helpers
69 : 9 : (define-private (increment-label-count (market-id uint) (label (string-ascii 64)))
70 : 12 : (let
71 : : (
72 : 12 : (current (get-label-count market-id label))
73 : 12 : (next (+ current u1))
74 : : )
75 : 12 : (map-set resolution-label-counts {market-id: market-id, label: label} next)
76 : 12 : next
77 : : )
78 : : )
79 : :
80 : : ;; --- Main
81 : 10 : (define-public (signal-resolution (market-id uint) (label (string-ascii 64)) (metadata (buff 32)))
82 : 16 : (let
83 : : (
84 : 16 : (required (var-get resolution-signals-required))
85 : : )
86 : : ;; must be an approved resolver
87 [ + ]: 16 : (asserts! (is-resolution-team-member tx-sender) err-not-resolution-team-member)
88 : : ;; prevent double-voting for this market (regardless of label)
89 [ + ]: 15 : (asserts! (not (has-signalled market-id tx-sender)) err-already-executed)
90 : :
91 : : ;; record resolver metadata & signal
92 : 12 : (map-set resolution-metadata {market-id: market-id, resolver: tx-sender} metadata)
93 : 12 : (map-set resolution-action-signals {market-id: market-id, team-member: tx-sender} true)
94 : :
95 : : ;; bump this label's count and check threshold
96 : 12 : (let ((count (increment-label-count market-id label)))
97 : 12 : (if (>= count required)
98 : : ;; quorum for this label reached resolve with the LABEL (string)
99 [ + ]: 6 : (begin
100 : 6 : (try! (as-contract (contract-call? .bme024-0-market-predicting resolve-market market-id label)))
101 : 5 : (ok {status: "resolved", label: label, count: count})
102 : : )
103 : : ;; not yet at threshold
104 [ + ]: 6 : (ok {status: "pending", label: label, count: count})
105 : : )
106 : : )
107 : : )
108 : : )
109 : :
110 : : ;; Trait
111 : 1 : (define-public (callback (sender principal) (memo (buff 34)))
112 : 1 : (ok true)
113 : : )
|