Source Code

;; xtrata-small-mint-v1.0
;;
;; Small-file helper for xtrata-v2.1.0.
;; - Exposes a one-call write path for <= 30 chunks.
;; - Internally runs begin-or-get -> add-chunk-batch -> seal in one transaction.
;; - Returns existing canonical id for duplicate hashes (dedupe short-circuit).
;; - Keeps core xtrata as the canonical inscription contract.

(define-constant ERR-NOT-AUTHORIZED (err u100))
(define-constant ERR-PAUSED (err u101))
(define-constant ERR-INVALID-BATCH (err u102))
(define-constant ERR-INVALID-CORE-CONTRACT (err u103))

(define-constant CHUNK-SIZE u16384)
(define-constant MAX-SMALL-CHUNKS u30)

;; Default core target. Owner can update this for local/testnet/mainnet as needed.
(define-constant DEFAULT-XTRATA-CONTRACT 'SP3JNSEXAZP4BDSHV0DN3M8R3P0MY0EEBQQZX743X.xtrata-v2-1-0)

(define-trait xtrata-trait
  (
    (begin-or-get ((buff 32) (string-ascii 64) uint uint) (response (optional uint) uint))
    (add-chunk-batch ((buff 32) (list 50 (buff 16384))) (response bool uint))
    (seal-inscription ((buff 32) (string-ascii 256)) (response uint uint))
    (seal-recursive ((buff 32) (string-ascii 256) (list 50 uint)) (response uint uint))
  )
)

(define-data-var contract-owner principal tx-sender)
(define-data-var paused bool true)
(define-data-var core-contract principal DEFAULT-XTRATA-CONTRACT)

(define-private (assert-core-contract (xtrata-contract <xtrata-trait>))
  (begin
    (asserts!
      (is-eq (contract-of xtrata-contract) (var-get core-contract))
      ERR-INVALID-CORE-CONTRACT
    )
    (ok true)
  )
)

(define-private (assert-not-paused)
  (begin
    (asserts! (not (var-get paused)) ERR-PAUSED)
    (ok true)
  )
)

(define-private (assert-small-upload-shape (total-size uint) (chunk-count uint))
  (begin
    (asserts! (> chunk-count u0) ERR-INVALID-BATCH)
    (asserts! (<= chunk-count MAX-SMALL-CHUNKS) ERR-INVALID-BATCH)
    (asserts! (<= total-size (* chunk-count CHUNK-SIZE)) ERR-INVALID-BATCH)
    (ok true)
  )
)

(define-private (mint-small-single-tx-internal
  (xtrata-contract <xtrata-trait>)
  (expected-hash (buff 32))
  (mime (string-ascii 64))
  (total-size uint)
  (chunks (list 50 (buff 16384)))
  (token-uri-string (string-ascii 256))
  (dependencies (optional (list 50 uint)))
)
  (let ((chunk-count (len chunks)))
    (begin
      (try! (assert-core-contract xtrata-contract))
      (try! (assert-not-paused))
      (try! (assert-small-upload-shape total-size chunk-count))
      (match (try! (contract-call? xtrata-contract begin-or-get expected-hash mime total-size chunk-count))
        existing-id (ok { token-id: existing-id, existed: true })
        (begin
          (try! (contract-call? xtrata-contract add-chunk-batch expected-hash chunks))
          (match dependencies
            deps
              (let ((new-id (try! (contract-call? xtrata-contract seal-recursive expected-hash token-uri-string deps))))
                (ok { token-id: new-id, existed: false })
              )
            (let ((new-id (try! (contract-call? xtrata-contract seal-inscription expected-hash token-uri-string))))
              (ok { token-id: new-id, existed: false })
            )
          )
        )
      )
    )
  )
)

(define-public (mint-small-single-tx
  (xtrata-contract <xtrata-trait>)
  (expected-hash (buff 32))
  (mime (string-ascii 64))
  (total-size uint)
  (chunks (list 50 (buff 16384)))
  (token-uri-string (string-ascii 256))
)
  (mint-small-single-tx-internal
    xtrata-contract
    expected-hash
    mime
    total-size
    chunks
    token-uri-string
    none
  )
)

(define-public (mint-small-single-tx-recursive
  (xtrata-contract <xtrata-trait>)
  (expected-hash (buff 32))
  (mime (string-ascii 64))
  (total-size uint)
  (chunks (list 50 (buff 16384)))
  (token-uri-string (string-ascii 256))
  (dependencies (list 50 uint))
)
  (mint-small-single-tx-internal
    xtrata-contract
    expected-hash
    mime
    total-size
    chunks
    token-uri-string
    (some dependencies)
  )
)

(define-public (set-paused (value bool))
  (begin
    (asserts! (is-eq tx-sender (var-get contract-owner)) ERR-NOT-AUTHORIZED)
    (var-set paused value)
    (ok true)
  )
)

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

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

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

(define-read-only (is-paused)
  (ok (var-get paused))
)

(define-read-only (get-core-contract)
  (ok (var-get core-contract))
)

(define-read-only (get-max-small-chunks)
  (ok MAX-SMALL-CHUNKS)
)

Functions (13)

FunctionAccessArgs
assert-core-contractprivatextrata-contract: <xtrata-trait>
assert-not-pausedprivate
assert-small-upload-shapeprivatetotal-size: uint, chunk-count: uint
mint-small-single-tx-internalprivatextrata-contract: <xtrata-trait>, expected-hash: (buff 32
mint-small-single-txpublicxtrata-contract: <xtrata-trait>, expected-hash: (buff 32
mint-small-single-tx-recursivepublicxtrata-contract: <xtrata-trait>, expected-hash: (buff 32
set-pausedpublicvalue: bool
set-core-contractpublicnew-core: principal
transfer-contract-ownershippublicnew-owner: principal
get-ownerread-only
is-pausedread-only
get-core-contractread-only
get-max-small-chunksread-only