Source Code

;; proposal-tags-v2.clar
;; Governance tags for proposal categorization.

(define-constant ERR-UNAUTHORIZED (err u12400))
(define-constant ERR-PROPOSAL-NOT-FOUND (err u12401))

(define-map proposal-tags uint (list 20 (string-ascii 32)))

(define-read-only (get-tags (proposal-id uint))
  (default-to (list) (map-get? proposal-tags proposal-id))
)

(define-private (is-dao-or-extension)
  (contract-call? .dao-core-v2 is-dao-or-extension)
)

(define-private (check-uint (n uint))
  (ok (asserts! (>= n u0) ERR-UNAUTHORIZED))
)

(define-private (check-tags (tags (list 20 (string-ascii 32))))
  (ok (asserts! (is-eq tags tags) ERR-UNAUTHORIZED))
)

(define-private (proposal-exists (proposal-id uint))
  (begin
    (unwrap-panic (check-uint proposal-id))
    (is-some (contract-call? .proposal-submission-v2 get-proposal proposal-id))
  )
)

(define-private (is-proposer (proposal-id uint) (who principal))
  (begin
    (unwrap-panic (check-uint proposal-id))
    (match (contract-call? .proposal-submission-v2 get-proposal proposal-id)
      proposal (is-eq (get proposer proposal) who)
      false
    )
  )
)

(define-private (is-authorized-writer (proposal-id uint))
  (begin
    (unwrap-panic (check-uint proposal-id))
    (or
      (is-proposer proposal-id tx-sender)
      (is-ok (is-dao-or-extension))
    )
  )
)

(define-public (set-tags (proposal-id uint) (tags (list 20 (string-ascii 32))))
  (begin
    (try! (check-uint proposal-id))
    (try! (check-tags tags))
    (asserts! (proposal-exists proposal-id) ERR-PROPOSAL-NOT-FOUND)
    (asserts! (is-authorized-writer proposal-id) ERR-UNAUTHORIZED)
    (map-set proposal-tags proposal-id tags)
    (print {event: "proposal-tags-updated", proposal-id: proposal-id})
    (ok true)
  )
)

(define-public (callback (sender principal) (memo (buff 34)))
  (begin
    sender
    memo
    (ok true)
  )
)

Functions (9)

FunctionAccessArgs
get-tagsread-onlyproposal-id: uint
is-dao-or-extensionprivate
check-uintprivaten: uint
check-tagsprivatetags: (list 20 (string-ascii 32
proposal-existsprivateproposal-id: uint
is-proposerprivateproposal-id: uint, who: principal
is-authorized-writerprivateproposal-id: uint
set-tagspublicproposal-id: uint, tags: (list 20 (string-ascii 32
callbackpublicsender: principal, memo: (buff 34