Source Code

(define-fungible-token physical-backed-token)

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

(define-data-var token-name (string-ascii 32) "PhysicalBackedToken")
(define-data-var token-symbol (string-ascii 10) "PBT")
(define-data-var token-decimals uint u0)

(define-map physical-assets
    (buff 32)
    {
        token-amount: uint,
        owner: principal,
        verified: bool,
        metadata-uri: (string-utf8 256)
    }
)

(define-map asset-to-chip
    (buff 32)
    (buff 65)
)

(define-read-only (get-name)
    (ok (var-get token-name))
)

(define-read-only (get-symbol)
    (ok (var-get token-symbol))
)

(define-read-only (get-decimals)
    (ok (var-get token-decimals))
)

(define-read-only (get-balance (account principal))
    (ok (ft-get-balance physical-backed-token account))
)

(define-read-only (get-total-supply)
    (ok (ft-get-supply physical-backed-token))
)

(define-read-only (get-physical-asset (asset-id (buff 32)))
    (ok (map-get? physical-assets asset-id))
)

(define-read-only (is-asset-verified (asset-id (buff 32)))
    (match (map-get? physical-assets asset-id)
        asset (ok (get verified asset))
        (ok false)
    )
)

(define-public (mint-with-physical-asset
    (asset-id (buff 32))
    (chip-signature (buff 65))
    (amount uint)
    (metadata-uri (string-utf8 256))
)
    (begin
        (asserts! (is-none (map-get? physical-assets asset-id)) ERR-NOT-FOUND)
        (map-set physical-assets asset-id {
            token-amount: amount,
            owner: tx-sender,
            verified: true,
            metadata-uri: metadata-uri
        })
        (map-set asset-to-chip asset-id chip-signature)
        (try! (ft-mint? physical-backed-token amount tx-sender))
        (ok asset-id)
    )
)

(define-public (verify-asset-ownership
    (asset-id (buff 32))
    (chip-signature (buff 65))
    (message (buff 256))
)
    (let
        (
            (asset (unwrap! (map-get? physical-assets asset-id) ERR-NOT-FOUND))
            (stored-chip (unwrap! (map-get? asset-to-chip asset-id) ERR-NOT-FOUND))
        )
        (ok (is-eq stored-chip chip-signature))
    )
)

(define-public (transfer (amount uint) (sender principal) (recipient principal))
    (begin
        (asserts! (is-eq tx-sender sender) ERR-NOT-AUTHORIZED)
        (ft-transfer? physical-backed-token amount sender recipient)
    )
)

(define-public (burn-and-redeem (asset-id (buff 32)))
    (let
        (
            (asset (unwrap! (map-get? physical-assets asset-id) ERR-NOT-FOUND))
        )
        (asserts! (is-eq tx-sender (get owner asset)) ERR-NOT-AUTHORIZED)
        (try! (ft-burn? physical-backed-token (get token-amount asset) tx-sender))
        (map-delete physical-assets asset-id)
        (map-delete asset-to-chip asset-id)
        (ok true)
    )
)

(define-read-only (get-contract-hash)
    (contract-hash? .physical-item-backed-token)
)

Functions (12)

FunctionAccessArgs
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-balanceread-onlyaccount: principal
get-total-supplyread-only
get-physical-assetread-onlyasset-id: (buff 32
is-asset-verifiedread-onlyasset-id: (buff 32
mint-with-physical-assetpublicasset-id: (buff 32
verify-asset-ownershippublicasset-id: (buff 32
transferpublicamount: uint, sender: principal, recipient: principal
burn-and-redeempublicasset-id: (buff 32
get-contract-hashread-only