Source Code

(define-fungible-token bindable-token)

(define-constant ERR-NOT-AUTHORIZED (err u401))
(define-constant ERR-ALREADY-BOUND (err u409))
(define-constant ERR-NOT-BOUND (err u404))

(define-data-var token-name (string-ascii 32) "BindableToken")
(define-data-var token-symbol (string-ascii 10) "BIND")
(define-data-var token-decimals uint u6)

(define-map bindings
    principal
    {
        bound-to: principal,
        binding-time: uint
    }
)

(define-map bound-balances
    principal
    uint
)

(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 bindable-token account))
)

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

(define-read-only (get-binding (account principal))
    (ok (map-get? bindings account))
)

(define-read-only (is-bound (account principal))
    (ok (is-some (map-get? bindings account)))
)

(define-read-only (get-bound-balance (account principal))
    (ok (default-to u0 (map-get? bound-balances account)))
)

(define-public (mint (amount uint) (recipient principal))
    (ft-mint? bindable-token amount recipient)
)

(define-public (transfer (amount uint) (sender principal) (recipient principal))
    (begin
        (asserts! (is-eq tx-sender sender) ERR-NOT-AUTHORIZED)
        (asserts! (is-none (map-get? bindings sender)) ERR-ALREADY-BOUND)
        (ft-transfer? bindable-token amount sender recipient)
    )
)

(define-public (bind-to (target principal) (amount uint))
    (begin
        (asserts! (is-none (map-get? bindings tx-sender)) ERR-ALREADY-BOUND)
        (asserts! (>= (ft-get-balance bindable-token tx-sender) amount) ERR-NOT-AUTHORIZED)
        (map-set bindings tx-sender {
            bound-to: target,
            binding-time: stacks-block-time
        })
        (map-set bound-balances tx-sender amount)
        (ok true)
    )
)

(define-public (unbind)
    (let
        (
            (binding (unwrap! (map-get? bindings tx-sender) ERR-NOT-BOUND))
        )
        (map-delete bindings tx-sender)
        (map-delete bound-balances tx-sender)
        (ok true)
    )
)

(define-public (transfer-bound (amount uint) (recipient principal))
    (let
        (
            (binding (unwrap! (map-get? bindings tx-sender) ERR-NOT-BOUND))
            (bound-amount (default-to u0 (map-get? bound-balances tx-sender)))
        )
        (asserts! (>= bound-amount amount) ERR-NOT-AUTHORIZED)
        (map-set bound-balances tx-sender (- bound-amount amount))
        (map-set bound-balances recipient (+ (default-to u0 (map-get? bound-balances recipient)) amount))
        (ok true)
    )
)

(define-read-only (get-contract-hash)
    (contract-hash? .binding-token)
)

Functions (14)

FunctionAccessArgs
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-balanceread-onlyaccount: principal
get-total-supplyread-only
get-bindingread-onlyaccount: principal
is-boundread-onlyaccount: principal
get-bound-balanceread-onlyaccount: principal
mintpublicamount: uint, recipient: principal
transferpublicamount: uint, sender: principal, recipient: principal
bind-topublictarget: principal, amount: uint
unbindpublic
transfer-boundpublicamount: uint, recipient: principal
get-contract-hashread-only