Source Code

(define-constant ERR-NOT-AUTHORIZED (err u401))
(define-constant ERR-VERSION-NOT-FOUND (err u404))
(define-constant ERR-INVALID-VERSION (err u400))

(define-data-var owner principal tx-sender)
(define-data-var current-version uint u0)

(define-map implementations
    uint
    principal
)

(define-map version-metadata
    uint
    {
        contract: principal,
        timestamp: uint,
        enabled: bool
    }
)

(define-read-only (get-owner)
    (ok (var-get owner))
)

(define-read-only (get-current-version)
    (ok (var-get current-version))
)

(define-read-only (get-implementation (version uint))
    (ok (map-get? implementations version))
)

(define-read-only (get-version-metadata (version uint))
    (ok (map-get? version-metadata version))
)

(define-read-only (is-version-enabled (version uint))
    (match (map-get? version-metadata version)
        metadata (ok (get enabled metadata))
        (ok false)
    )
)

(define-public (set-owner (new-owner principal))
    (begin
        (asserts! (is-eq tx-sender (var-get owner)) ERR-NOT-AUTHORIZED)
        (ok (var-set owner new-owner))
    )
)

(define-public (add-version (implementation principal))
    (let
        (
            (new-version (+ (var-get current-version) u1))
        )
        (asserts! (is-eq tx-sender (var-get owner)) ERR-NOT-AUTHORIZED)
        (map-set implementations new-version implementation)
        (map-set version-metadata new-version {
            contract: implementation,
            timestamp: stacks-block-time,
            enabled: true
        })
        (var-set current-version new-version)
        (ok new-version)
    )
)

(define-public (toggle-version (version uint))
    (begin
        (asserts! (is-eq tx-sender (var-get owner)) ERR-NOT-AUTHORIZED)
        (match (map-get? version-metadata version)
            metadata (ok (map-set version-metadata version (merge metadata {enabled: (not (get enabled metadata))})))
            ERR-VERSION-NOT-FOUND
        )
    )
)

(define-public (set-current-version (version uint))
    (begin
        (asserts! (is-eq tx-sender (var-get owner)) ERR-NOT-AUTHORIZED)
        (asserts! (is-some (map-get? implementations version)) ERR-VERSION-NOT-FOUND)
        (match (map-get? version-metadata version)
            metadata (begin
                (asserts! (get enabled metadata) ERR-INVALID-VERSION)
                (ok (var-set current-version version))
            )
            ERR-VERSION-NOT-FOUND
        )
    )
)

(define-read-only (get-contract-hash)
    (contract-hash? .multi-version-proxy)
)

Functions (10)

FunctionAccessArgs
get-ownerread-only
get-current-versionread-only
get-implementationread-onlyversion: uint
get-version-metadataread-onlyversion: uint
is-version-enabledread-onlyversion: uint
set-ownerpublicnew-owner: principal
add-versionpublicimplementation: principal
toggle-versionpublicversion: uint
set-current-versionpublicversion: uint
get-contract-hashread-only