Source Code

;; $BNS (https://xnft.fan/#/x/tokens)
;; Total: 20,917,968.75
;; Only .btc users can claim
;; First 21000 holders, each claim 500 $BNS
;; Next 21000 holders, each claim 250 $BNS
;; Next 21000 holders, each claim 125 $BNS
;; Next 21000 holders, each claim 62.5 $BNS
;; Next 21000 holders, each claim 31.25 $BNS
;; Next 21000 holders, each claim 15.625 $BNS
;; Next 21000 holders, each claim 7.8125 $BNS
;; Next 21000 holders, each claim 3.90625 $BNS

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

(define-constant ERR_NOT_MEMBER u10001)
(define-constant ERR_CLAIM_HAD_CLAIMED u10002)
(define-constant ERR_CLAIM_NO_REMAIN u10003)
(define-constant ERR_BNS_RESOLVE_FAIL u10004)
(define-constant ERR_BNS_NAME_NOT_SATISFY u10005)

(define-fungible-token BNS)

(define-constant DECIMAL u8)
(define-constant ONE_COIN (pow u10 DECIMAL))
(define-constant MAX_CLAIM_HOLDER_COUNT u168000)

(define-data-var m_claim_count_per_holder uint (* u500 ONE_COIN))

(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 BNS user))
)

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

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

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

(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? BNS amount sender recipient))
      (print memo)
      (ok true)
    )
    (err u4)
  )
)

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

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

(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_holder_count (+ (var-get m_claimed_bns_count) u1))
      (claim_count (var-get m_claim_count_per_holder))
    )
    (asserts! (is-none (map-get? map_claimed_bns_note { name: name, namespace: namespace })) (err ERR_CLAIM_HAD_CLAIMED))
    (asserts! (<= new_claimed_holder_count MAX_CLAIM_HOLDER_COUNT) (err ERR_CLAIM_NO_REMAIN))
    (asserts! (is-eq namespace 0x627463) (err ERR_BNS_NAME_NOT_SATISFY))
    (var-set m_claimed_bns_count new_claimed_holder_count)
    (map-set map_claimed_bns_note { name: name, namespace: namespace } true)
    (and
      (is-eq (mod new_claimed_holder_count u21000) u0)
      (var-set m_claim_count_per_holder (/ claim_count u2))
    )
    (ft-mint? BNS claim_count tx-sender)
  )
)

(define-read-only (get_base_summary)
    {
      claimed_bns_count: (var-get m_claimed_bns_count),
      claim_count_per_holder: (var-get m_claim_count_per_holder),
    }
)

(define-read-only (get_player_summary (player principal))
  (merge
    {
      b: (var-get m_claimed_bns_count),
      c: (var-get m_claim_count_per_holder)
    }
    (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 })
  )
)

Functions (11)

FunctionAccessArgs
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
bns_claimpublic
get_base_summaryread-only
get_player_summaryread-onlyplayer: principal