Source Code

;; proposal-metadata-v2.clar
;; Optional metadata pointers for proposal IDs.

(define-constant ERR-UNAUTHORIZED (err u12300))
(define-constant ERR-PROPOSAL-NOT-FOUND (err u12301))
(define-constant ERR-INVALID-CID (err u12302))

(define-map proposal-metadata
  uint
  {
    cid: (string-ascii 80),
    checksum: (optional (buff 32)),
    updated-at: uint,
    updated-by: principal
  }
)

(define-read-only (get-metadata (proposal-id uint))
  (map-get? proposal-metadata 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-cid (cid (string-ascii 80)))
  (ok (asserts! (> (len cid) u0) ERR-INVALID-CID))
)

(define-private (check-checksum (checksum (optional (buff 32))))
  (ok (asserts! (is-eq checksum checksum) 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-metadata (proposal-id uint) (cid (string-ascii 80)) (checksum (optional (buff 32))))
  (begin
    (try! (check-uint proposal-id))
    (try! (check-cid cid))
    (try! (check-checksum checksum))
    (asserts! (proposal-exists proposal-id) ERR-PROPOSAL-NOT-FOUND)
    (asserts! (is-authorized-writer proposal-id) ERR-UNAUTHORIZED)
    (map-set proposal-metadata proposal-id {
      cid: cid,
      checksum: checksum,
      updated-at: stacks-block-height,
      updated-by: tx-sender
    })
    (print {event: "proposal-metadata-updated", proposal-id: proposal-id, cid: cid})
    (ok true)
  )
)

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

Functions (10)

FunctionAccessArgs
get-metadataread-onlyproposal-id: uint
is-dao-or-extensionprivate
check-uintprivaten: uint
check-cidprivatecid: (string-ascii 80
check-checksumprivatechecksum: (optional (buff 32
proposal-existsprivateproposal-id: uint
is-proposerprivateproposal-id: uint, who: principal
is-authorized-writerprivateproposal-id: uint
set-metadatapublicproposal-id: uint, cid: (string-ascii 80
callbackpublicsender: principal, memo: (buff 34