Source Code

(define-constant ERR-NOT-AUTHORIZED (err u401))
(define-constant ERR-NOT-FOUND (err u404))
(define-constant ERR-ACCOUNT-RESERVED (err u409))

(define-map reserved-accounts
    principal
    {
        owner: principal,
        reserved-at: uint,
        release-time: uint,
        metadata: (string-utf8 256)
    }
)

(define-map account-reservations
    principal
    (list 10 principal)
)

(define-map reservation-registry
    (string-ascii 64)
    principal
)

(define-read-only (is-reserved (account principal))
    (ok (is-some (map-get? reserved-accounts account)))
)

(define-read-only (get-reservation (account principal))
    (ok (map-get? reserved-accounts account))
)

(define-read-only (get-owner-reservations (owner principal))
    (ok (default-to (list) (map-get? account-reservations owner)))
)

(define-read-only (get-account-by-name (name (string-ascii 64)))
    (ok (map-get? reservation-registry name))
)

(define-public (reserve-account
    (account principal)
    (release-time uint)
    (metadata (string-utf8 256))
)
    (let
        (
            (owner-accounts (default-to (list) (map-get? account-reservations tx-sender)))
        )
        (asserts! (is-none (map-get? reserved-accounts account)) ERR-ACCOUNT-RESERVED)
        (map-set reserved-accounts account {
            owner: tx-sender,
            reserved-at: stacks-block-time,
            release-time: release-time,
            metadata: metadata
        })
        (map-set account-reservations tx-sender 
            (unwrap-panic (as-max-len? (append owner-accounts account) u10))
        )
        (ok true)
    )
)

(define-public (release-reservation (account principal))
    (let
        (
            (reservation (unwrap! (map-get? reserved-accounts account) ERR-NOT-FOUND))
        )
        (asserts! (or 
            (is-eq tx-sender (get owner reservation))
            (>= stacks-block-time (get release-time reservation))
        ) ERR-NOT-AUTHORIZED)
        (map-delete reserved-accounts account)
        (ok true)
    )
)

(define-public (transfer-reservation (account principal) (new-owner principal))
    (let
        (
            (reservation (unwrap! (map-get? reserved-accounts account) ERR-NOT-FOUND))
        )
        (asserts! (is-eq tx-sender (get owner reservation)) ERR-NOT-AUTHORIZED)
        (ok (map-set reserved-accounts account (merge reservation {owner: new-owner})))
    )
)

(define-public (extend-reservation (account principal) (new-release-time uint))
    (let
        (
            (reservation (unwrap! (map-get? reserved-accounts account) ERR-NOT-FOUND))
        )
        (asserts! (is-eq tx-sender (get owner reservation)) ERR-NOT-AUTHORIZED)
        (ok (map-set reserved-accounts account (merge reservation {release-time: new-release-time})))
    )
)

(define-public (register-name (name (string-ascii 64)) (account principal))
    (let
        (
            (reservation (unwrap! (map-get? reserved-accounts account) ERR-NOT-FOUND))
        )
        (asserts! (is-eq tx-sender (get owner reservation)) ERR-NOT-AUTHORIZED)
        (ok (map-set reservation-registry name account))
    )
)

(define-read-only (get-contract-hash)
    (contract-hash? .reserved-account)
)

Functions (10)

FunctionAccessArgs
is-reservedread-onlyaccount: principal
get-reservationread-onlyaccount: principal
get-owner-reservationsread-onlyowner: principal
get-account-by-nameread-onlyname: (string-ascii 64
reserve-accountpublicaccount: principal, release-time: uint, metadata: (string-utf8 256
release-reservationpublicaccount: principal
transfer-reservationpublicaccount: principal, new-owner: principal
extend-reservationpublicaccount: principal, new-release-time: uint
register-namepublicname: (string-ascii 64
get-contract-hashread-only