Source Code

;; Stacks Runner - Score Contract
;; Records user high scores and interfaces with the Vault for fees

;; Constants
(define-constant err-not-authorized (err u100))
(define-constant err-score-too-low (err u103))
(define-constant err-fee-failed (err u104))

;; Data Maps
;; Maps a principal (player) to their highest score
(define-map high-scores principal uint)

;; Admin Variables
(define-data-var score-admin principal tx-sender)
(define-data-var vault-address principal tx-sender)

;; Read-only functions
(define-read-only (get-high-score (player principal))
    (default-to u0 (map-get? high-scores player))
)

;; Private function: Verify if new score is higher than recorded
(define-private (is-new-high-score (player principal) (new-score uint))
    (> new-score (get-high-score player))
)

;; Admin Functions
(define-public (set-vault-address (new-vault principal))
    (begin
        (asserts! (is-eq tx-sender (var-get score-admin)) err-not-authorized)
        (ok (var-set vault-address new-vault))
    )
)

;; Public Functions
;; @desc Submit a new score. Requires a transaction fee to be sent to the Vault.
;; Emits an event implicitly upon successful state change.
;; @param score: the points earned in the game
(define-public (submit-score (score uint))
    (let
        (
            (current-high-score (get-high-score tx-sender))
            ;; This should ideally pull the fee dynamically from `governance`, 
            ;; but for simplicity and decoupling, we assume 5000 uSTX fixed or pass via params.
            ;; Contract trait calls to governance can be added.
            (fee u5000) 
        )
        
        ;; Check if new score is higher
        (asserts! (> score current-high-score) err-score-too-low)
        
        ;; Transfer fee to vault
        ;; Using contract-call to the local vault. In production, use traits to pass the vault contract dynamically.
        ;; For now, we perform a simple stx-transfer to the registered vault address.
        (unwrap! (stx-transfer? fee tx-sender (var-get vault-address)) err-fee-failed)
        
        ;; Update score map
        (map-set high-scores tx-sender score)
        
        ;; Print event
        (print { event: "new-high-score", player: tx-sender, score: score })
        
        (ok true)
    )
)

Functions (4)

FunctionAccessArgs
get-high-scoreread-onlyplayer: principal
is-new-high-scoreprivateplayer: principal, new-score: uint
set-vault-addresspublicnew-vault: principal
submit-scorepublicscore: uint