Source Code

(define-constant CONTRACT_OWNER tx-sender)
(define-constant ERR_NOT_AUTHORIZED (err u1800))
(define-constant ERR_INSUFFICIENT_BALANCE (err u1801))
(define-constant ERR_NOT_MEMBER (err u1802))

(define-fungible-token mvt-token)

(define-data-var organization-name (string-ascii 128) "")

(define-map member-status
  principal
  {
    is-member: bool,
    role: (string-ascii 64),
    joined-at: uint,
    attribute-value: uint
  }
)

(define-map attribute-requirements
  (string-ascii 64)
  uint
)

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

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

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

(define-read-only (is-member (account principal))
  (let
    (
      (status (default-to {is-member: false, role: "", joined-at: u0, attribute-value: u0} (map-get? member-status account)))
    )
    (ok (get is-member status))
  )
)

(define-read-only (get-member-info (account principal))
  (ok (map-get? member-status account))
)

(define-public (assign-to (account principal) (role (string-ascii 64)) (attribute-value uint))
  (begin
    (asserts! (is-eq tx-sender CONTRACT_OWNER) ERR_NOT_AUTHORIZED)
    (map-set member-status account {
      is-member: true,
      role: role,
      joined-at: stacks-block-time,
      attribute-value: attribute-value
    })
    (try! (ft-mint? mvt-token u1 account))
    (ok true)
  )
)

(define-public (revoke-from (account principal))
  (let
    (
      (status (unwrap! (map-get? member-status account) ERR_NOT_MEMBER))
    )
    (asserts! (is-eq tx-sender CONTRACT_OWNER) ERR_NOT_AUTHORIZED)
    (map-set member-status account (merge status {is-member: false}))
    (try! (ft-burn? mvt-token u1 account))
    (ok true)
  )
)

(define-public (modify-attribute (account principal) (new-value uint))
  (let
    (
      (status (unwrap! (map-get? member-status account) ERR_NOT_MEMBER))
    )
    (asserts! (is-eq tx-sender CONTRACT_OWNER) ERR_NOT_AUTHORIZED)
    (map-set member-status account (merge status {attribute-value: new-value}))
    (ok true)
  )
)

(define-public (request-role (role (string-ascii 64)))
  (let
    (
      (status (default-to {is-member: false, role: "", joined-at: u0, attribute-value: u0} (map-get? member-status tx-sender)))
      (requirement (default-to u0 (map-get? attribute-requirements role)))
    )
    (asserts! (get is-member status) ERR_NOT_MEMBER)
    (asserts! (>= (get attribute-value status) requirement) ERR_NOT_AUTHORIZED)
    (map-set member-status tx-sender (merge status {role: role}))
    (ok true)
  )
)

(define-public (set-requirement (role (string-ascii 64)) (min-attribute uint))
  (begin
    (asserts! (is-eq tx-sender CONTRACT_OWNER) ERR_NOT_AUTHORIZED)
    (map-set attribute-requirements role min-attribute)
    (ok true)
  )
)

(define-public (transfer (amount uint) (sender principal) (recipient principal))
  (err ERR_NOT_AUTHORIZED)
)

(define-read-only (verify-secp256r1-sig (message (buff 32)) (signature (buff 64)) (public-key (buff 33)))
  (ok (secp256r1-verify message signature public-key))
)

(define-read-only (get-timestamp)
  stacks-block-time
)

(define-read-only (asset-restrictions)
  (ok (is-ok (contract-hash? .mvt-token)))
)

Functions (14)

FunctionAccessArgs
get-contract-hashread-only
get-balanceread-onlyaccount: principal
get-total-supplyread-only
is-memberread-onlyaccount: principal
get-member-inforead-onlyaccount: principal
assign-topublicaccount: principal, role: (string-ascii 64
revoke-frompublicaccount: principal
modify-attributepublicaccount: principal, new-value: uint
request-rolepublicrole: (string-ascii 64
set-requirementpublicrole: (string-ascii 64
transferpublicamount: uint, sender: principal, recipient: principal
verify-secp256r1-sigread-onlymessage: (buff 32
get-timestampread-only
asset-restrictionsread-only