Source Code


;; Nova Supply Chain Tracker
;; Tracks application of steps in a supply chain

(define-map supply-items
    { item-id: uint }
    {
        creator: principal,
        current-handler: principal,
        status: (string-ascii 32)
    }
)

(define-map item-history
    { item-id: uint, step-index: uint }
    {
        handler: principal,
        action: (string-ascii 64),
        timestamp: uint,
        location: (string-ascii 64)
    }
)

(define-data-var nonce uint u0)

(define-public (create-item (initial-status (string-ascii 32)))
    (let
        (
            (id (+ (var-get nonce) u1))
        )
        (var-set nonce id)
        (ok (map-set supply-items
            { item-id: id }
            {
                creator: tx-sender,
                current-handler: tx-sender,
                status: initial-status
            }
        ))
    )
)

(define-public (update-status (item-id uint) (new-status (string-ascii 32)) (action (string-ascii 64)) (location (string-ascii 64)))
    (let
        (
            (item (unwrap! (map-get? supply-items { item-id: item-id }) (err u404)))
        )
        (asserts! (is-eq tx-sender (get current-handler item)) (err u100))
        (map-set supply-items
            { item-id: item-id }
            (merge item { status: new-status })
        )
        ;; Note: simplified history tracking, would normally track step index
        (ok true)
    )
)

(define-public (transfer-item (item-id uint) (new-handler principal))
    (let
        (
            (item (unwrap! (map-get? supply-items { item-id: item-id }) (err u404)))
        )
        (asserts! (is-eq tx-sender (get current-handler item)) (err u100))
        (ok (map-set supply-items
            { item-id: item-id }
            (merge item { current-handler: new-handler })
        ))
    )
)

Functions (3)

FunctionAccessArgs
create-itempublicinitial-status: (string-ascii 32
update-statuspublicitem-id: uint, new-status: (string-ascii 32
transfer-itempublicitem-id: uint, new-handler: principal