Source Code

(define-constant ERR_UNAUTHORIZED (err u4000))
(define-constant ERR_TRANSFER (err u1100))
(define-constant ERR_NOT_OWNED_BY_REGISTRY (err u1101))
(define-constant ERR_INVALID_NAME (err u1102))
(define-constant ERR_DUPLICATE_INSCRIPTION (err u1103))
(define-constant ERR_INSCRIPTION_NOT_REGISTERED (err u1104))

(define-map inscriptions-name-map (buff 35) uint)
(define-map name-inscriptions-map uint (buff 35))

(define-data-var extension-var principal .l1-bridge-v1)

(define-private (is-extension)
  (ok (asserts! (is-eq (var-get extension-var) contract-caller) ERR_UNAUTHORIZED))
)

;; Validation of caller
;; Move name into self
;; save inscription ID
(define-public (wrap (name-id uint) (owner principal) (inscription-id (buff 35)))
  (let
    (
      (self (as-contract tx-sender))
      (name-details (try! (validate-name-owned-by-registry name-id)))
    )
    ;; #[filter(inscription-id, name-id)]
    (try! (is-extension))
    (asserts! (map-insert name-inscriptions-map name-id inscription-id) ERR_DUPLICATE_INSCRIPTION)
    (asserts! (map-insert inscriptions-name-map inscription-id name-id) ERR_DUPLICATE_INSCRIPTION)
    (log-bridge-action "wrap" inscription-id owner name-details)
    (ok name-details)
  )
)

(define-public (unwrap (inscription-id (buff 35)) (recipient principal))
  (let
    (
      (name-id (unwrap! (map-get? inscriptions-name-map inscription-id) ERR_INSCRIPTION_NOT_REGISTERED))
      (name-details (try! (get-name-properties name-id)))
    )
    ;; #[filter(name-id, recipient, inscription-id)]
    (try! (is-extension))
    (map-delete name-inscriptions-map name-id)
    (map-delete inscriptions-name-map inscription-id)
    (unwrap-panic (as-contract (contract-call? .bnsx-registry transfer name-id tx-sender recipient)))
    (log-bridge-action "unwrap" inscription-id recipient name-details)
    (ok name-details)
  )
)

;; Getters

(define-read-only (get-inscription-id (name-id uint))
  (map-get? name-inscriptions-map name-id)
)

(define-read-only (get-name-id (inscription-id (buff 35)))
  (map-get? inscriptions-name-map inscription-id)
)

(define-read-only (get-inscription-name-properties (inscription-id (buff 35)))
  (get-name-properties (unwrap! (map-get? inscriptions-name-map inscription-id) ERR_INSCRIPTION_NOT_REGISTERED))
)

;; Validation

(define-read-only (validate-name-owned-by-registry (name-id uint))
  (let
    (
      (self (as-contract tx-sender))
      (name-details (try! (get-name-properties name-id)))
    )
    (asserts! (is-eq self (get owner name-details)) ERR_NOT_OWNED_BY_REGISTRY)
    (ok name-details)
  )
)

(define-read-only (get-name-properties (name-id uint))
  (ok (unwrap! (contract-call? .bnsx-registry get-name-properties-by-id name-id) ERR_INVALID_NAME)))

;; Logging

;; #[allow(unchecked_data)]
(define-private (log-bridge-action 
    (topic (string-ascii 10))
    (inscription-id (buff 35))
    (account principal)
    (name-details {
      id: uint,
      owner: principal,
      name: (buff 48),
      namespace: (buff 20),
    })
  )
  (print (merge { topic: topic, inscription-id: inscription-id, account: account } name-details))
)

;; Extension management

(define-public (update-extension (new-extension principal))
  (begin
    ;; #[filter(new-extension)]
    (try! (is-extension))
    (var-set extension-var new-extension)
    (ok new-extension)
  )
)

(define-read-only (get-extension) (var-get extension-var))

Functions (11)

FunctionAccessArgs
is-extensionprivate
wrappublicname-id: uint, owner: principal, inscription-id: (buff 35
unwrappublicinscription-id: (buff 35
get-inscription-idread-onlyname-id: uint
get-name-idread-onlyinscription-id: (buff 35
get-inscription-name-propertiesread-onlyinscription-id: (buff 35
validate-name-owned-by-registryread-onlyname-id: uint
get-name-propertiesread-onlyname-id: uint
log-bridge-actionprivatetopic: (string-ascii 10
update-extensionpublicnew-extension: principal
get-extensionread-only