Source Code


;; title: Guestbook
;; version: 1.0.0
;; summary: A simple on-chain guestbook
;; description: Allows users to leave messages and tracks recent signers.

;; traits
;;

;; token definitions
;;

;; constants
(define-constant ERR-NOT-FOUND (err u404))

;; data vars
(define-data-var next-id uint u0)
(define-data-var recent-signers (list 20 principal) (list))

;; data maps
(define-map messages uint { sender: principal, content: (string-utf8 500) })

;; public functions

(define-public (write-message (content (string-utf8 500)))
    (let
        (
            (id (var-get next-id))
            (caller tx-sender)
        )
        ;; Store the message
        (map-set messages id { sender: caller, content: content })
        
        ;; Increment ID
        (var-set next-id (+ id u1))
        
        ;; Update recent signers list
        ;; We use unwrap-panic because we know the list size is defined as 20
        ;; But realistically, if it's full, we might want to drop the oldest or just stop adding.
        ;; For this "practice", we will just try to append. If it fails (list full), we ignore the error and keep going.
        ;; Actually, let's keep it simple: just try to append. logic: (as-max-len? (append list item) 20)
        (var-set recent-signers (unwrap! (as-max-len? (append (var-get recent-signers) caller) u20) (ok id)))
        
        (ok id)
    )
)

;; read only functions

(define-read-only (get-message (id uint))
    (map-get? messages id)
)

(define-read-only (get-recent-signers)
    (var-get recent-signers)
)

(define-read-only (get-next-id)
    (var-get next-id)
)

;; private functions
;;

Functions (4)

FunctionAccessArgs
write-messagepubliccontent: (string-utf8 500
get-messageread-onlyid: uint
get-recent-signersread-only
get-next-idread-only