Source Code

;; $MOJO (https://xnft.fan/#/x/tokens)
;; Total: 1,000,000,000,000,000
;; Distribution:
;; Aidrop to current 20 XNFT members: 2% (Each get 1,000,000,000,000)
;; All 10000 XNFT members: 60% (Each can claim 60,000,000,000)
;; BNS users: 15% (first 50000 names, each get 3,000,000,000. Only available for .btc, .id(length<=2), .stx(length<=2), .app(length<=2), .stacks(length<=2))
;; Users: 20% (Count froward from block 147800, first 10000 users who made contract-call txs and nonce >= 50, each gets 40,000,000,000)

(impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)

(define-constant ERR_NOT_MEMBER u101)
(define-constant ERR_CLAIM_HAD_CLAIMED u102)
(define-constant ERR_CLAIM_NO_REMAIN u103)
(define-constant ERR_BNS_RESOLVE_FAIL u104)
(define-constant ERR_BNS_NAME_NOT_SATISFY u105)
(define-constant ERR_SEND_MANY u106)

(define-fungible-token ddk)

(define-constant DECIMAL u0)
(define-constant ONE_COIN (pow u10 DECIMAL))
(define-constant MAX_SUPPLY (* u1000000000000000 ONE_COIN))
(define-constant AIRDROP_COUNT_PER_MEMBER (* u1000000000000 ONE_COIN))
(define-constant CLAIM_COUNT_PER_MEMBER (* u60000000000 ONE_COIN))
(define-constant CLAIM_COUNT_PER_BNS (* u3000000000 ONE_COIN))
(define-constant MAX_CLAIM_BNS_COUNT u50000)

(define-data-var m_claimed_member_count uint u0)
(define-map map_claimed_member_note
  uint ;; tid
  bool ;; whether has claimed
)

(define-data-var m_claimed_bns_count uint u0)
(define-map map_claimed_bns_note
  { name: (buff 48), namespace: (buff 20) }
  bool ;; whether has claimed
)

(define-read-only (get-balance (user principal))
  (ok (ft-get-balance ddk user))
)

(define-read-only (get-total-supply)
  (ok (ft-get-supply ddk))
)

(define-read-only (get-name)
  (ok "DDK")
)

(define-read-only (get-symbol)
  (ok "ddk")
)

(define-read-only (get-decimals)
  (ok DECIMAL)
)

(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
  (if (is-eq tx-sender sender)
    (begin
      (try! (ft-transfer? ddk amount sender recipient))
      (print memo)
      (ok true)
    )
    (err u4)
  )
)

(define-public (burn (count uint))
  (ft-burn? ddk count tx-sender)
)

(define-public (get-token-uri)
  (ok (some u"https://ipfs.io/ipfs/QmcQ7dmDsJWCGs9ZSkFakZebG1ncmwqZFDhbjuhvRF2ktB"))
)

(define-public (member_claim)
  (let
    (
      (tid (unwrap! (contract-call? 'SP3XYJ8XFZYF7MD86QQ5EF8HBVHHZFFQ9HM6SPJNQ.laser-eyes-v5 get_id_by_player tx-sender) (err ERR_NOT_MEMBER)))
      (new_claimed_count (+ (var-get m_claimed_member_count) u1))
    )
    (asserts! (is-none (map-get? map_claimed_member_note tid)) (err ERR_CLAIM_HAD_CLAIMED))
    (var-set m_claimed_member_count new_claimed_count)
    (map-set map_claimed_member_note tid true)
    (ft-mint? ddk CLAIM_COUNT_PER_MEMBER tx-sender)
  )
)

(define-public (bns_claim)
  (let
    (
      (resolve_info (unwrap! (contract-call? 'SP000000000000000000002Q6VF78.bns resolve-principal tx-sender) (err ERR_BNS_RESOLVE_FAIL)))
      (namespace (get namespace resolve_info))
      (name (get name resolve_info))
      (new_claimed_count (+ (var-get m_claimed_bns_count) u1))
    )
    (asserts! (is-none (map-get? map_claimed_bns_note { name: name, namespace: namespace })) (err ERR_CLAIM_HAD_CLAIMED))
    (asserts! (<= new_claimed_count MAX_CLAIM_BNS_COUNT) (err ERR_CLAIM_NO_REMAIN))
    (asserts! (name_satisfied name namespace) (err ERR_BNS_NAME_NOT_SATISFY))
    (var-set m_claimed_bns_count new_claimed_count)
    (map-set map_claimed_bns_note { name: name, namespace: namespace } true)
    (ft-mint? ddk CLAIM_COUNT_PER_BNS tx-sender)
  )
)

(define-private (s (receiver { to: principal, amount: uint }))
  (is-err (ft-transfer? ddk (get amount receiver) tx-sender (get to receiver)))
)

(define-public (send_many (recipients (list 5000 { to: principal, amount: uint })))
  (ok (asserts! (is-eq (len (filter s recipients)) u0) (err ERR_SEND_MANY)))
)

(define-read-only (get_base_summary)
    {
      claimed_member_count: (var-get m_claimed_member_count),
      claimed_bns_count: (var-get m_claimed_bns_count),
    }
)

(define-read-only (get_player_summary (player principal))
  (let ((tid (default-to u0 (contract-call? 'SP3XYJ8XFZYF7MD86QQ5EF8HBVHHZFFQ9HM6SPJNQ.laser-eyes-v5 get_id_by_player player))))
    (merge
      { tid: tid, t: (is-none (map-get? map_claimed_member_note tid)), m: (var-get m_claimed_member_count), b: (var-get m_claimed_bns_count) }
      (match (contract-call? 'SP000000000000000000002Q6VF78.bns resolve-principal player)
        ri { n: (is-none (map-get? map_claimed_bns_note { name: (get name ri), namespace: (get namespace ri) })) }
        e { n: false }))))

(define-private (name_satisfied (name (buff 48)) (namespace (buff 20)))
  (if (is-eq namespace 0x627463)
    true
    (if (or (is-eq namespace 0x6964) (is-eq namespace 0x737478) (is-eq namespace 0x617070) (is-eq namespace 0x737461636b73))
      (<= (len name) u2)
      false
    )
  )
)

(define-private (airdrop (tid uint))
  (match (contract-call? 'SP3XYJ8XFZYF7MD86QQ5EF8HBVHHZFFQ9HM6SPJNQ.laser-eyes-v5 get_player_by_id tid) user
    (is-ok (ft-mint? ddk AIRDROP_COUNT_PER_MEMBER user))
    false
  )
)

;; Airdrop to early 20 members
(map airdrop (list u1 u2 u3 u4 u5 u6 u7 u8 u9 u10 u11 u12 u13 u14 u15 u16 u17 u18 u19 u20))

(ft-mint? ddk u230000000000000 tx-sender)

Functions (16)

FunctionAccessArgs
member_claimpublic
get-balanceread-onlyuser: principal
get-total-supplyread-only
get-nameread-only
get-symbolread-only
get-decimalsread-only
transferpublicamount: uint, sender: principal, recipient: principal, memo: (optional (buff 34
burnpubliccount: uint
get-token-uripublic
sprivatereceiver: { to: principal, amount: uint }
send_manypublicrecipients: (list 5000 { to: principal, amount: uint }
get_base_summaryread-only
get_player_summaryread-onlyplayer: principal
name_satisfiedprivatename: (buff 48
airdropprivatetid: uint
bns_claimpublic