LCOV - code coverage report
Current view: top level - contracts/extensions - bme008-0-resolution-coordinator.clar (source / functions) Coverage Total Hit
Test: lcov.info Lines: 85.4 % 41 35
Test Date: 2025-11-05 10:54:00 Functions: 72.7 % 11 8
Branches: 57.1 % 7 4

             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                 :           9 : (define-public (is-dao-or-extension)
      29    [ - ][ +  - ]:          34 :         (ok (asserts! (or (is-eq tx-sender .bigmarket-dao) (contract-call? .bigmarket-dao is-extension contract-caller)) err-unauthorised))
      30                 :             : )
      31                 :             : 
      32                 :             : ;; --- Admin
      33                 :           9 : (define-public (set-resolution-team-member (who principal) (member bool))
      34                 :          21 :   (begin
      35                 :          21 :     (try! (is-dao-or-extension))
      36                 :          21 :     (ok (map-set resolution-team who member))
      37                 :             :   )
      38                 :             : )
      39                 :             : 
      40                 :           9 : (define-public (set-signals-required (new-requirement uint))
      41                 :          13 :   (begin
      42                 :          13 :     (try! (is-dao-or-extension))
      43                 :          13 :     (ok (var-set resolution-signals-required new-requirement))
      44                 :             :   )
      45                 :             : )
      46                 :             : 
      47                 :             : ;; --- Views
      48                 :           7 : (define-read-only (is-resolution-team-member (who principal))
      49                 :          12 :   (default-to false (map-get? resolution-team who))
      50                 :             : )
      51                 :             : 
      52                 :           7 : (define-read-only (has-signalled (market-id uint) (who principal))
      53                 :          12 :   (default-to false (map-get? resolution-action-signals {market-id: market-id, team-member: who}))
      54                 :             : )
      55                 :             : 
      56                 :           7 : (define-read-only (get-label-count (market-id uint) (label (string-ascii 64)))
      57                 :          10 :   (default-to u0 (map-get? resolution-label-counts {market-id: market-id, label: label}))
      58                 :             : )
      59                 :             : 
      60                 :           0 : (define-read-only (get-signals-required)
      61                 :           0 :   (var-get resolution-signals-required)
      62                 :             : )
      63                 :             : 
      64                 :           0 : (define-read-only (get-resolution-metadata (market-id uint) (resolver principal))
      65                 :           0 :   (map-get? resolution-metadata {market-id: market-id, resolver: resolver})
      66                 :             : )
      67                 :             : 
      68                 :             : ;; --- Private helpers
      69                 :           7 : (define-private (increment-label-count (market-id uint) (label (string-ascii 64)))
      70                 :          10 :   (let
      71                 :             :     (
      72                 :          10 :       (current (get-label-count market-id label))
      73                 :          10 :       (next    (+ current u1))
      74                 :             :     )
      75                 :          10 :     (map-set resolution-label-counts {market-id: market-id, label: label} next)
      76                 :          10 :     next
      77                 :             :   )
      78                 :             : )
      79                 :             : 
      80                 :             : ;; --- Main
      81                 :           7 : (define-public (signal-resolution (market-id uint) (label (string-ascii 64)) (metadata (buff 32)))
      82                 :          12 :   (let
      83                 :             :     (
      84                 :          12 :       (required (var-get resolution-signals-required))
      85                 :             :     )
      86                 :             :     ;; must be an approved resolver
      87            [ - ]:          12 :     (asserts! (is-resolution-team-member tx-sender) err-not-resolution-team-member)
      88                 :             :     ;; prevent double-voting for this market (regardless of label)
      89            [ + ]:          12 :     (asserts! (not (has-signalled market-id tx-sender)) err-already-executed)
      90                 :             : 
      91                 :             :     ;; record resolver metadata & signal
      92                 :          10 :     (map-set resolution-metadata       {market-id: market-id, resolver: tx-sender} metadata)
      93                 :          10 :     (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                 :          10 :     (let ((count (increment-label-count market-id label)))
      97                 :          10 :       (if (>= count required)
      98                 :             :         ;; quorum for this label reached resolve with the LABEL (string)
      99            [ + ]:           4 :         (begin
     100                 :           4 :           (try! (as-contract (contract-call? .bme024-0-market-predicting resolve-market market-id label)))
     101                 :           4 :           (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                 :           0 : (define-public (callback (sender principal) (memo (buff 34)))
     112                 :           0 :   (ok true)
     113                 :             : )
        

Generated by: LCOV version 2.3.2-1