(define-constant O tx-sender)
(define-constant E1 (err u1000))
(define-map versions (string-ascii 32) {version: uint, address: principal, block: uint})
(define-map version-history {name: (string-ascii 32), ver: uint} principal)
(define-public (register-upgrade (name (string-ascii 32)) (addr principal))
(begin (asserts! (is-eq tx-sender O) E1)
(let ((cur (default-to {version: u0, address: O, block: u0}
(map-get? versions name)))
(nv (+ (get version cur) u1)))
(map-set versions name {version: nv, address: addr, block: stacks-block-height})
(map-set version-history {name: name, ver: nv} addr)
(ok nv))))
(define-read-only (get-current (name (string-ascii 32)))
(map-get? versions name))
(define-read-only (get-version (name (string-ascii 32)) (ver uint))
(map-get? version-history {name: name, ver: ver}))