;; citypacks-001

(impl-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)

(define-non-fungible-token citypacks-001 uint)

;; Constants
(define-constant DEPLOYER tx-sender)
(define-constant COMM u200)
(define-constant COMM-ADDR 'SPNWZ5V2TPWGQGVDR6T7B6RQ4XMGZ4PXTEE0VQ0S)

(define-constant ERR-NO-MORE-NFTS u100)
(define-constant ERR-NOT-ENOUGH-PASSES u101)
(define-constant ERR-PUBLIC-SALE-DISABLED u102)
(define-constant ERR-CONTRACT-INITIALIZED u103)
(define-constant ERR-NOT-AUTHORIZED u104)
(define-constant ERR-INVALID-USER u105)
(define-constant ERR-LISTING u106)
(define-constant ERR-WRONG-COMMISSION u107)
(define-constant ERR-NOT-FOUND u108)
(define-constant ERR-PAUSED u109)
(define-constant ERR-MINT-LIMIT u1500)
(define-constant ERR-METADATA-FROZEN u111)
(define-constant ERR-AIRDROP-CALLED u112)
(define-constant ERR-NO-MORE-MINTS u113)

;; Internal variables
(define-data-var mint-limit uint u1500)
(define-data-var last-id uint u1)
(define-data-var total-price uint u167000000)
(define-data-var donation-address principal 'SP1SN78YDPHJ4CN1NNKZPYYVMGBGVPJ3RM1VA6Y3F)
(define-data-var dao-address principal 'SP25N0E6TW998ZAX7WKJCQEN0FGJ7EV0BR14N56FT)
(define-data-var citypacks-address principal 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT)
(define-data-var artist-address principal 'SP272ACVTPCFYG9GW3CQH49TZ555Z6VVGA46ZF159)
(define-data-var ipfs-root (string-ascii 80) "ipfs://ipfs/QmWpgbekUM2d2EzSfefR8Nb9JiQNFfFXvRxck5jP3WnDKZ/")
(define-data-var mint-paused bool false)
(define-data-var premint-enabled bool false)
(define-data-var sale-enabled bool false)
(define-data-var metadata-frozen bool false)
(define-data-var airdrop-called bool false)
(define-data-var mint-cap uint u0)

(define-map mints-per-user principal uint)
(define-map mint-passes principal uint)

(define-public (claim) 
  (mint (list true)))

(define-public (claim-three) (mint (list true true true)))

(define-public (claim-five) (mint (list true true true true true)))

;; Mintpass Minting
(define-private (mint (orders (list 25 bool)))
  (let 
    (
      (passes (get-passes tx-sender))
    )
    (if (var-get premint-enabled)
      (begin
        (asserts! (>= passes (len orders)) (err ERR-NOT-ENOUGH-PASSES))
        (map-set mint-passes tx-sender (- passes (len orders)))
        (mint-many orders)
      )
      (begin
        (asserts! (var-get sale-enabled) (err ERR-PUBLIC-SALE-DISABLED))
        (mint-many orders)
      )
    )))

(define-private (mint-many (orders (list 25 bool )))  
  (let 
    (
      (last-nft-id (var-get last-id))
      (enabled (asserts! (<= last-nft-id (var-get mint-limit)) (err ERR-NO-MORE-NFTS)))
      (art-addr (var-get artist-address))
      (id-reached (fold mint-many-iter orders last-nft-id))
      (price (* (var-get total-price) (- id-reached last-nft-id)))
      (total-commission (/ (* price COMM) u10000))
      (current-balance (get-balance tx-sender))
      (total-artist (- price total-commission))
      (capped (> (var-get mint-cap) u0))
      (user-mints (get-mints tx-sender))
    )
    (asserts! (or (is-eq false (var-get mint-paused)) (is-eq tx-sender DEPLOYER)) (err ERR-PAUSED))
    (asserts! (or (not capped) (is-eq tx-sender DEPLOYER) (is-eq tx-sender art-addr) (>= (var-get mint-cap) (+ (len orders) user-mints))) (err ERR-NO-MORE-MINTS))
    (map-set mints-per-user tx-sender (+ (len orders) user-mints))
    (if (or (is-eq tx-sender art-addr) (is-eq tx-sender DEPLOYER) (is-eq (var-get total-price) u0000000))
      (begin
        (var-set last-id id-reached)
        (map-set token-count tx-sender (+ current-balance (- id-reached last-nft-id)))
      )
      (begin
        (var-set last-id id-reached)
        (map-set token-count tx-sender (+ current-balance (- id-reached last-nft-id)))
        (try! (stx-transfer? (/ (* price u7500) u10000) tx-sender (var-get donation-address)))
        (try! (stx-transfer? (/ (* price u500) u10000) tx-sender (var-get dao-address)))
        (try! (stx-transfer? (/ (* price u750) u10000) tx-sender (var-get artist-address)))
        (try! (stx-transfer? (/ (* price u1050) u10000) tx-sender (var-get citypacks-address)))
        (try! (stx-transfer? total-commission tx-sender COMM-ADDR))
      )    
    )
    (ok id-reached)))

(define-private (mint-many-iter (ignore bool) (next-id uint))
  (if (<= next-id (var-get mint-limit))
    (begin
      (unwrap! (nft-mint? citypacks-001 next-id tx-sender) next-id)
      (+ next-id u1)    
    )
    next-id))

(define-public (set-artist-address (address principal))
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-INVALID-USER))
    (ok (var-set artist-address address))))

(define-public (set-price (price uint))
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-INVALID-USER))
    (ok (var-set total-price price))))

(define-public (set-price-mia (price uint))
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-INVALID-USER))
    (ok (var-set total-price-mia price))))

(define-public (toggle-pause)
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-INVALID-USER))
    (ok (var-set mint-paused (not (var-get mint-paused))))))

(define-public (set-mint-limit (limit uint))
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-INVALID-USER))
    (ok (var-set mint-limit limit))))

(define-public (burn (token-id uint))
  (begin 
    (asserts! (is-owner token-id tx-sender) (err ERR-NOT-AUTHORIZED))
    (nft-burn? citypacks-001 token-id tx-sender)))

(define-private (is-owner (token-id uint) (user principal))
    (is-eq user (unwrap! (nft-get-owner? citypacks-001 token-id) false)))

(define-public (set-base-uri (new-base-uri (string-ascii 80)))
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-NOT-AUTHORIZED))
    (asserts! (not (var-get metadata-frozen)) (err ERR-METADATA-FROZEN))
    (var-set ipfs-root new-base-uri)
    (ok true)))

(define-public (freeze-metadata)
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-NOT-AUTHORIZED))
    (var-set metadata-frozen true)
    (ok true)))

;; Non-custodial SIP-009 transfer function
(define-public (transfer (id uint) (sender principal) (recipient principal))
  (begin
    (asserts! (is-eq tx-sender sender) (err ERR-NOT-AUTHORIZED))
    (asserts! (is-none (map-get? market id)) (err ERR-LISTING))
    (trnsfr id sender recipient)))

;; read-only functions
(define-read-only (get-owner (token-id uint))
  (ok (nft-get-owner? citypacks-001 token-id)))

(define-read-only (get-last-token-id)
  (ok (- (var-get last-id) u1)))

(define-read-only (get-token-uri (token-id uint))
  (ok (some (concat (concat (var-get ipfs-root) "{id}") ".json"))))

(define-read-only (get-paused)
  (ok (var-get mint-paused)))

(define-read-only (get-price)
  (ok (var-get total-price)))

(define-read-only (get-mints (caller principal))
  (default-to u0 (map-get? mints-per-user caller)))

(define-read-only (get-mint-limit)
  (ok (var-get mint-limit)))

;; Non-custodial marketplace extras
(define-trait commission-trait
  ((pay (uint uint) (response bool uint))))

(define-map token-count principal uint)
(define-map market uint {price: uint, commission: principal})

(define-read-only (get-balance (account principal))
  (default-to u0
    (map-get? token-count account)))

(define-private (trnsfr (id uint) (sender principal) (recipient principal))
  (match (nft-transfer? citypacks-001 id sender recipient)
    success
      (let
        ((sender-balance (get-balance sender))
        (recipient-balance (get-balance recipient)))
          (map-set token-count
            sender
            (- sender-balance u1))
          (map-set token-count
            recipient
            (+ recipient-balance u1))
          (ok success))
    error (err error)))

(define-private (is-sender-owner (id uint))
  (let ((owner (unwrap! (nft-get-owner? citypacks-001 id) false)))
    (or (is-eq tx-sender owner) (is-eq contract-caller owner))))

(define-read-only (get-listing-in-ustx (id uint))
  (map-get? market id))

(define-public (list-in-ustx (id uint) (price uint) (comm-trait <commission-trait>))
  (let ((listing  {price: price, commission: (contract-of comm-trait)}))
    (asserts! (is-sender-owner id) (err ERR-NOT-AUTHORIZED))
    (map-set market id listing)
    (print (merge listing {a: "list-in-ustx", id: id}))
    (ok true)))

(define-public (unlist-in-ustx (id uint))
  (begin
    (asserts! (is-sender-owner id) (err ERR-NOT-AUTHORIZED))
    (map-delete market id)
    (print {a: "unlist-in-ustx", id: id})
    (ok true)))

(define-public (buy-in-ustx (id uint) (comm-trait <commission-trait>))
  (let ((owner (unwrap! (nft-get-owner? citypacks-001 id) (err ERR-NOT-FOUND)))
      (listing (unwrap! (map-get? market id) (err ERR-LISTING)))
      (price (get price listing)))
    (asserts! (is-eq (contract-of comm-trait) (get commission listing)) (err ERR-WRONG-COMMISSION))
    (try! (stx-transfer? price tx-sender owner))
    (try! (contract-call? comm-trait pay id price))
    (try! (trnsfr id owner tx-sender))
    (map-delete market id)
    (print {a: "buy-in-ustx", id: id})
    (ok true)))

;; Extra functionality required for mintpass
(define-public (toggle-sale-state)
  (let 
    (
      ;; (premint (not (var-get premint-enabled)))
      (sale (not (var-get sale-enabled)))
    )
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-NOT-AUTHORIZED))
    (var-set premint-enabled false)
    (var-set sale-enabled sale)
    (print { sale: sale })
    (ok true)))

(define-public (enable-premint)
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-NOT-AUTHORIZED))
    (ok (var-set premint-enabled true))))

(define-public (disable-premint)
  (begin
    (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-NOT-AUTHORIZED))
    (ok (var-set premint-enabled false))))

(define-read-only (get-passes (caller principal))
  (default-to u0 (map-get? mint-passes caller)))

(define-read-only (get-premint-enabled)
  (ok (var-get premint-enabled)))

(define-read-only (get-sale-enabled)
  (ok (var-get sale-enabled)))  

;; Alt Minting Mintpass
(define-data-var total-price-mia uint u65000)

(define-read-only (get-price-mia)
  (ok (var-get total-price-mia)))

(define-public (claim-mia)
  (mint-mia (list true)))

(define-public (claim-three-mia) (mint-mia (list true true true)))

(define-public (claim-five-mia) (mint-mia (list true true true true true)))

(define-private (mint-mia (orders (list 25 bool)))
  (let 
    (
      (passes (get-passes tx-sender))
    )
    (if (var-get premint-enabled)
      (begin
        (asserts! (>= passes (len orders)) (err ERR-NOT-ENOUGH-PASSES))
        (map-set mint-passes tx-sender (- passes (len orders)))
        (mint-many-mia orders)
      )
      (begin
        (asserts! (var-get sale-enabled) (err ERR-PUBLIC-SALE-DISABLED))
        (mint-many-mia orders)
      )
    )))

(define-private (mint-many-mia (orders (list 25 bool )))  
  (let 
    (
      (last-nft-id (var-get last-id))
      (enabled (asserts! (<= last-nft-id (var-get mint-limit)) (err ERR-NO-MORE-NFTS)))
      (art-addr (var-get artist-address))
      (id-reached (fold mint-many-iter orders last-nft-id))
      (price (* (var-get total-price-mia) (- id-reached last-nft-id)))
      (total-commission (/ (* price COMM) u10000))
      (current-balance (get-balance tx-sender))
      (total-artist (- price total-commission))
    )
    (if (or (is-eq tx-sender art-addr) (is-eq tx-sender DEPLOYER))
      (begin
        (var-set last-id id-reached)
        (map-set token-count tx-sender (+ current-balance (- id-reached last-nft-id)))
      )
      (begin
        (var-set last-id id-reached)
        (map-set token-count tx-sender (+ current-balance (- id-reached last-nft-id)))
        (try! (contract-call? 
                'SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-token 
                transfer (/ (* price u7500) u10000) tx-sender (var-get donation-address) (some 0x00)))
        (try! (contract-call? 
                'SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-token 
                transfer (/ (* price u500) u10000) tx-sender (var-get dao-address) (some 0x00)))
        (try! (contract-call? 
                'SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-token 
                transfer (/ (* price u750) u10000) tx-sender (var-get artist-address) (some 0x00)))
        (try! (contract-call? 
                'SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-token 
                transfer (/ (* price u1050) u10000) tx-sender (var-get citypacks-address) (some 0x00)))
        (try! (contract-call? 'SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-token transfer total-commission tx-sender COMM-ADDR (some 0x00)))
      )    
    )
    (ok id-reached)))

(map-set mint-passes 'SP12BEEDG31J0AH68DFDJJYZ36D002PKDZCP1DZQE u5)
(map-set mint-passes 'SP12VBET3KMFJN4KMGX76C8MR3QXDH0Z4WWMSZT6H u5)
(map-set mint-passes 'SP13473ZZ772R27F6MK7B8MZ92P3G1PP239RTPA4K u5)
(map-set mint-passes 'SP142BS3DJK11EZMV1TG47MK9MG3KBY0405A3QD7R u5)
(map-set mint-passes 'SP14DXQ7A1PVVGPBQCJQVP0T4CH6FTZZ312FSE724 u5)
(map-set mint-passes 'SP14PKX1QAX3ZG6S2902HC8D0MGDNNGKG030H439E u5)
(map-set mint-passes 'SP14V9BXQR5A6M32REYYFDBQQE7FA0Q2R41GD90NK u5)
(map-set mint-passes 'SP14ZVJSGEC4P7WGYCYC5P67WNGBVZ1K71DA75J13 u5)
(map-set mint-passes 'SP15TF0R1GCEFA84WSSRFPWM8XDQSQAJN7QAB31BE u5)
(map-set mint-passes 'SP161R81QEFM9S4DMY8X7NN8WA3T80M0PGCGTX507 u5)
(map-set mint-passes 'SP17Q8MQJNAZEQHNM00VFM3KGYBN9KPWZ7WDF0EFS u5)
(map-set mint-passes 'SP18P831TBGKSGMJEMJM0V29CMKJP650ZT21YJ3XX u5)
(map-set mint-passes 'SP18ZWQMEX1K741ZXQ6FZ1J6RMZ4NWNR08YTH8HK4 u5)
(map-set mint-passes 'SP19BW6H5C0XYAFHG188K2Z9RGZ2ZQNNR25CRCDQQ u5)
(map-set mint-passes 'SP19Z1SDK7E1S54041NV70165TP1GD1YTHVYC3YQW u5)
(map-set mint-passes 'SP1AQ23J61HERQ2MFN1FXTPF6BZ2QBG9BTPQVTPRW u5)
(map-set mint-passes 'SP1CPT00K0E3FNCQTTCYBAQRB5QYXHQCCWZTAHY33 u5)
(map-set mint-passes 'SP1CQZXAGG25WND2E83RQ13QT8PF9Q7JEDA6QRFTX u5)
(map-set mint-passes 'SP1DJD4TJGJF2X3KNMAKYVYQ8RBX9T4CABNQKM10M u5)
(map-set mint-passes 'SP1DRW8GY74R0SAZ82HGFJJMT4CX0ZX6P309AR8ND u5)
(map-set mint-passes 'SP1FEJ73MSQH7GE5H748979SY7CF8FQ6P4WTWQ0CZ u5)
(map-set mint-passes 'SP1FN26891E7B4HS9E3ZDF9DCPSPJTPXD13WW8MEM u5)
(map-set mint-passes 'SP1FR2M102H4DE4DH96R4D29RC8AGQZG5D5Y4S7CH u5)
(map-set mint-passes 'SP1FZA5VDBRTDDKF4P70W55TJE5HSDYCWEP8E29B7 u5)
(map-set mint-passes 'SP1G5YJTM2DT6S3V54334PPDBRXE0QDT7B619C900 u5)
(map-set mint-passes 'SP1HN3TYFGVH2VG8S9H1PJ4WWH9TBV8G42SFJ70R u5)
(map-set mint-passes 'SP1J5W1FN3P80XV1YK14BKC6A912WWFGJSW9M92HA u5)
(map-set mint-passes 'SP1J7VMKDJPVSC1GGM14KJ67K7PNRS3Q8FHRZ1TY u5)
(map-set mint-passes 'SP1QRFVDS76WFV5XCDHAR7FQYTSNM4M1P4TGFZRK1 u5)
(map-set mint-passes 'SP1RC7R3ZRTG721XVM02VXGX4898G12W59FGMS6ZE u5)
(map-set mint-passes 'SP1SGWYFVJGHJDVHP90MM89W563DBQGK5N1QJ52T u5)
(map-set mint-passes 'SP1SWA3BRTE5Y30HVFZTRGMZ2Z52SSMV4VXPBD5BT u5)
(map-set mint-passes 'SP1TRFX25N32GE9T3TGD5PW3E2HGC5P913ZH11PF9 u5)
(map-set mint-passes 'SP1WYHPJJVN3P0PS32BMF33P6WVVK1SNRRS28ZF0G u5)
(map-set mint-passes 'SP1X23TH8W14F8CPZKFCN497G4EEPKW0NMN32KJ3F u5)
(map-set mint-passes 'SP1XPG9QFX5M95G36SGN9R8YJ4KJ0JB7ZXNH892N6 u5)
(map-set mint-passes 'SP2069715QFEA9GK8Q2E7QREFABGKRP78C08NTDTK u5)
(map-set mint-passes 'SP21728T40XTN7EV3PZXXZDHVT8GJH1JPKDEC8WGX u5)
(map-set mint-passes 'SP22DFQYJNG13CT3GBA2X3M4N6BP9FTE5EESM3TN u5)
(map-set mint-passes 'SP23FRD2Y6X2ABFDRJ8V23XS8E08QWZX4WCV9MHN u5)
(map-set mint-passes 'SP2662ZC5WETZSWGXPZVHE1ZS1TZHCGSQYMBNHQZJ u5)
(map-set mint-passes 'SP26BTF63M76N22KS6BY70CB39KESAM7H75GE8ZGB u5)
(map-set mint-passes 'SP26SB34D9THJ8BMSPT6EJHW9JDGBHWMX74PVDFEN u5)
(map-set mint-passes 'SP26T0FNVFNEMXRY47Q4A2DQBQR13H4FA85Y0WNN0 u5)
(map-set mint-passes 'SP274C9SKTRQV06W86GVVC0MGSNJ1EMXYK8E46PXT u5)
(map-set mint-passes 'SP27JJS3774KPR0MMB5FH77VWBD8KD0SVNZ4QNX5X u5)
(map-set mint-passes 'SP28AZ8FPQPF1QYX6EAD9C6QZK92NZ8VC6B9A1D4E u5)
(map-set mint-passes 'SP2DFX28F1S3CB46B5XH9M5JQ7N4SMCE7CQY1TNYS u5)
(map-set mint-passes 'SP2F9BGMH0TQ95C38GABBN4P8X61S2JH5ZY5F3REY u5)
(map-set mint-passes 'SP2FKKNNMJH1J50VN6ZRSWRES8EKXCDA9JXQKV35P u5)
(map-set mint-passes 'SP2GP6R0JZJ846506J5Z0XDM8YAXAZ7RQMR17SMK6 u5)
(map-set mint-passes 'SP2HVP68NY5BD2RDFX0JNXSYRS8AA6R7S30N08NJZ u5)
(map-set mint-passes 'SP2JV4DA4HDMAY6Q64B4TYB1ZJK2ETEMFSG1ZK9ST u5)
(map-set mint-passes 'SP2Q1SZSETS27AZ9FE0BH6C6B7MVC25E4N6C2VE7D u5)
(map-set mint-passes 'SP2QP8258WH32PK7HH1DNNEYXMKVFXNR7W1409R4N u5)
(map-set mint-passes 'SP2QSEFTCYJCEQ3K6H3DEVAT7Q86GDMWCBNKC8ACB u5)
(map-set mint-passes 'SP2SFZX1WJSKT1GA2STDT6E5NWDX44GW4BB8DW4DJ u5)
(map-set mint-passes 'SP2T2Y14V4PZ92SRZXPZ3X4RG6XWN81MK44PX1KJ6 u5)
(map-set mint-passes 'SP2VT38EC8AKQ9YB4F7M9MV3Y6JK610PVFE991SC0 u5)
(map-set mint-passes 'SP2WPTFTP17PGJM8328QWG3SNV9EZ9W1C7EGTD5BQ u5)
(map-set mint-passes 'SP2WV899TMEV43XPQVHX82GXYWTZKN1CRQE166T9N u5)
(map-set mint-passes 'SP2YVCK6H9G0EQ195577PQ01B3V6TSNHDGKFE4GMR u5)
(map-set mint-passes 'SP2ZR3MD6VBM689M1ZHQT495ZNX4EZ36P4WT8JANY u5)
(map-set mint-passes 'SP307BQHCHH036TZ2SYQG0C01AR5YMYJ9J1XHNNR4 u5)
(map-set mint-passes 'SP3273BKQVKBZRTZQMEDHGGXVCWM1VVGM9DAPKYJ3 u5)
(map-set mint-passes 'SP334WZ0PF1XYZEBK6GTXW3J80GJJ1D92M4JNN0H u5)
(map-set mint-passes 'SP33G7CYV2ACDVKEK3HV5Q2M1EPJ4T2111HBVMD1T u5)
(map-set mint-passes 'SP340MZNAAV5Z50YGKRJ6FWJ839CE6WYRY84P21VM u5)
(map-set mint-passes 'SP355N7XZRWPV0AT7Y0ZY3VBHQK1W5Z8337JMZY7Z u5)
(map-set mint-passes 'SP356400A5XM1ZKNXCQ7BJRE8PXXG1EJHV3954Z27 u5)
(map-set mint-passes 'SP36KZRX2ET7W215D568EDTA4A392EWN14FT12TAN u5)
(map-set mint-passes 'SP36MCQHXPP0DZ2KPC1KEY6ERC8GKB6QVCAK0PQYG u5)
(map-set mint-passes 'SP3781YHBNM2J7YSDEY192BDF9PAFGC1NTCAAC5K1 u5)
(map-set mint-passes 'SP37VRP79A64XFHC2XX4X24TJTAA4W9C9SKX45VSE u5)
(map-set mint-passes 'SP381022Q6SK26ZBFXN4KE1GW9HY7HXJE8CFNXWQ8 u5)
(map-set mint-passes 'SP3E3FWG7HCZ0ZQANBY0EB5PV2RXMQG18NG08MGW9 u5)
(map-set mint-passes 'SP3E3HK7RF7WMSHA9B8Z7Z6TVHECQS7JGDEVFPDNA u5)
(map-set mint-passes 'SP3GT6YMNTGNZ50RBFAPR5WWJMQ2XKJCJAY6KQTFD u5)
(map-set mint-passes 'SP3GWCHF9X2NFDARVA8F755BE8WGXNJW79PBQ5TX9 u5)
(map-set mint-passes 'SP3H1ZB2J5JJ4Y5FA1VMQTYENHJH15AR30KF8R3AN u5)
(map-set mint-passes 'SP3H60ZDQ67QFYRDCJ2GR5BRSZM7WTJ7987KK7K5M u5)
(map-set mint-passes 'SP3K5V40D4YFENXYFT9HHW4G5064PC9QC79050V82 u5)
(map-set mint-passes 'SP3M5HQJH19J6AKFME7N5BN3NWBXQGBVXKXS5WPRF u5)
(map-set mint-passes 'SP3MMG05H6T48W5NJEEST0RR3FTPGKPM7C19X5M16 u5)
(map-set mint-passes 'SP3MR0WGR46ZJEFH0YKKY55Q6X9EA1RPET57XF7VV u5)
(map-set mint-passes 'SP3RDZB1593J4FP0YW394V839CHW2SSE2SQXDSMPG u5)
(map-set mint-passes 'SP3SKH6YB515J76KVDHDHBTE2GQ4CV6QJHC5GJKRF u5)
(map-set mint-passes 'SP3TWS2QDFJWP0W2KEW8PQNK3D93RBH6E1P56WSE4 u5)
(map-set mint-passes 'SP3VYCKS11684SPB5M73AVS692B1GR35XBQPSYS2Z u5)
(map-set mint-passes 'SP3W94VR7P3AS3CJM42DKZ5TB183PWF8MTRQVPWXD u5)
(map-set mint-passes 'SP3WBYAEWN0JER1VPBW8TRT1329BGP9RGC5S2519W u5)
(map-set mint-passes 'SP3XQZJQ87Q6G70PSM0PPVE9MCFP29EJ5CVP3568K u5)
(map-set mint-passes 'SP3YQ6YDBG7YC2FM4RKA4A5GMZSKZWYSWYZSH9K0P u5)
(map-set mint-passes 'SP3ZTYBN9PYVVFKBEFVSZ2BEGK3HXRNVP6FDG79WV u5)
(map-set mint-passes 'SP4R9HV1BSQPJ4B1K3RY5KW5XGPMFBB039A3PE0K u5)
(map-set mint-passes 'SP55QY9B9MV3SRZYNKC06R32R740SFQPHSPCNR3E u5)
(map-set mint-passes 'SP60KV6KBTVFJ90PFB4KJZ5GV3FMKG661D1NQ6GG u5)
(map-set mint-passes 'SP8TWPQZGG5EZ2J6XG1MS58HECJG8XTTHK48DBPP u5)
(map-set mint-passes 'SP8ZYMY9KR1CHDAGVFTFB8026RGP6E2VS1JGNVP9 u5)
(map-set mint-passes 'SPAC3TNGP12G4WT820FBF2V5VY39Y24JARC17F19 u5)
(map-set mint-passes 'SPB9FDAPAFH8NM7AEAQ2FH6WK9ZJYGZ0FJKM5SSG u5)
(map-set mint-passes 'SPBM9BTEYFTC50HTEGWHG39D7S7JHHBRYQ3Q159V u5)
(map-set mint-passes 'SPC0PBD7VF18GS0EZN13519BM9DW961RFDGMYBGN u5)
(map-set mint-passes 'SPDP5H6Y2N159JXJMMF912SR2SYG78T16G6M9ABA u5)
(map-set mint-passes 'SPE9CQ6VBE2DER8MG4DJVZ9123CZM0QSVGWXSKWD u5)
(map-set mint-passes 'SPH6AN5QPE31W5X44KZKNY3NZZJ52QRP250CKMXD u5)
(map-set mint-passes 'SPP96RTM53XTT2W2WBJESDQFM9BGDHG39RD8WQ4G u5)
(map-set mint-passes 'SPQ2HN9TYF8ZYY9D3G45NGYA9GHA6QZHQ8AXF5QM u5)
(map-set mint-passes 'SPQCAMFRAXV93WNZHWXSDHSZGZ72G9RJPHXQ8CXN u5)
(map-set mint-passes 'SPRA6FK6C5N1Z7G61N77YWTN2C13GEX9NXQ23MX9 u5)
(map-set mint-passes 'SPSGP0XHF7VFJQ5193N2SV9MY87EWGVJXAZK35K2 u5)
(map-set mint-passes 'SPSHJE4F0D0ZKJZ1DVXEDFFD6AKHHKF31H3M77B8 u5)
(map-set mint-passes 'SPTSJ2EVHV0QB1JF7CQCAJKP41D3FK1ENJ668HDR u5)
(map-set mint-passes 'SPV00QHST52GD7D0SEWV3R5N04RD4Q1PMA3TE2MP u5)
(map-set mint-passes 'SPXY5H2JMC78JTQQAPCFWYN5APPC3V6HFGPD6MA2 u5)
(map-set mint-passes 'SPYAW5Q3KTH68RENCRC85GNHV89S3J006ETQ4JJ9 u5)
(map-set mint-passes 'SPZ245ZBKG60RNA0AVX1T7HK4C1B8FZS7PK3VXDE u5)
(map-set mint-passes 'SPZGN4KG2AKNNPEWVXXB6EWN1W9WV1JWMGBVVNK3 u5)
(map-set mint-passes 'SPZNABG4GB3Z62R66V08WDWSQ4KPYRQ6EENKCYP2 u5)
(map-set mint-passes 'SP1SBTRXDJP4N825PY69B1MKTQ4MSPB0DW9JCQHKE u5)
(map-set mint-passes 'SPS46Q8P75FGWDX11JNVER71R90VD5MV45XA5X1B u5)
(map-set mint-passes 'SPHK8A7P61C6ASWKYDX1PCDX9YA54DKVJN49EXGJ u5)
(map-set mint-passes 'SP13PNDHGPZF6JB3DRKMYRSYA55Q0X6RQSTT4QEKN u5)
(map-set mint-passes 'SP2H667JRMBHX0NRJ3ZMPPDR4R9TH6NM1ZFYW07S6 u5)
(map-set mint-passes 'SP2FZ154ESZ8NB34RZ3RS147GD6DSEYNE8DQD0XDM u5)
(map-set mint-passes 'SP1GYWMYK320ASBBAERSC40TA3PA99ZHV3GF256T8 u5)
(map-set mint-passes 'SP3X4PH6ZSHJ2T3E360AD5K91QJX6CJS2QM8ZF0XA u5)
(map-set mint-passes 'SP3YPMD71E1Q0WRW0949AT5MQ4M72GMP915CX1XTW u5)
(map-set mint-passes 'SP2RWS7D7RW6DDZCTXJC0VTK86CKD0TF445116V8A u5)
(map-set mint-passes 'SP35X9VF3QJNKDV7RQMTWM1GZ0TA6H17XP66J0TRA u5)
(map-set mint-passes 'SP2FHRXHTZBFGPFKSNWFGYPNBQXKSXC2JFJZ7BY7D u5)
(map-set mint-passes 'SP2ACNJC5JM6XP4J93NSZJW1QJVTBS9RCTTTAPR51 u5)
(map-set mint-passes 'SP349J1ZTEE71M1J5D4YS0BPQCCFJ3YSNM1P8BJY4 u5)
(map-set mint-passes 'SP1B8CHAEDJH87WCC78K8BZ1DF4DJG0DTG3FCMSQB u5)
(map-set mint-passes 'SP14E544B2FY8BSKTV5V7W8NCRYX2B7NXRQ7B7NJ9 u5)
(map-set mint-passes 'SP1VCQTDNX12RS7590XC11JDRW05TYQR01M9PBSWR u5)
(map-set mint-passes 'SP3JE4MY4Z91VRE9DWPH98Y6BRRA1YS5RDK9BA6Y7 u5)
(map-set mint-passes 'SPM3GE47QTMMVBT6DH0XFBXYS1AJHSSAQMYSB4J8 u5)
(map-set mint-passes 'SP2PD7DBZWDC0YSTHF9B7WD510SY2AS40YXK97CY1 u5)
(map-set mint-passes 'SPHD4XDKT644J5ZQ9C96A4741752GTQ5184MT5HJ u5)
(map-set mint-passes 'SP3RYDKM1K785D2133JCSK0NE69Z6Y9B32KD314YF u5)
(map-set mint-passes 'SP2AEY9QJD5MGDEEYYTNYBVVS7S97W2S0302HQ7S1 u5)
(map-set mint-passes 'SP37XVGVDMC85DBMZSBVHDASS37FAW2QDYSH144VM u5)
(map-set mint-passes 'SP197GMEG6WGBRDTCTGGWMRA1G77E65TRXWYKGCT7 u5)
(map-set mint-passes 'SPSS7WAYA17Y8Z5Q6GJTMH4FH4MRJ7HZZ6JPGAGR u5)
(map-set mint-passes 'SP1E7DEJG95E0EBZFFGEFGE0QX6Y0CR5V79615FB2 u5)
(map-set mint-passes 'SP2DW9RTN82J2MR2FHQXY5EE0Y616JJ076RYG8PTY u5)
(map-set mint-passes 'SP1H45JS07GWQWMT57JE20X17AQCNVYAS7NHW2HVR u5)
(map-set mint-passes 'SP30A5KWFY7JW4Z7SV9V6N6WQMGX5180GJD0THN0S u5)
(map-set mint-passes 'SP3323PE9C9B452CVW5HMQF3JYRKF9N4RG96JN61F u5)
(map-set mint-passes 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5 u5)
(map-set mint-passes 'SP272ACVTPCFYG9GW3CQH49TZ555Z6VVGA46ZF159 u5)
(map-set mint-passes 'SP1Q6XKFC339Z3KY8EFKWEJQAM5AFF5R2XAWTX89W u5)
(map-set mint-passes 'SP3F0KB3SEBMRHWMSHYWFP2PKDX7NEK6405VP4MQA u5)
(map-set mint-passes 'SP1EHKTKWAXPGHER59K358XZ6VS4CW22MWGHV88QE u5)
(map-set mint-passes 'SP37539DGVYCDS9GP9BQT7F9SBP8SK0E4WJ0XSPW2 u5)
(map-set mint-passes 'SP1QACZ7EE3Z1AA6R9KS50GBZSZSD9JER7SEPWTEJ u5)
(map-set mint-passes 'SP3DW5P0EPZX7KB4N381QTWGDYTJN98M80PFR0X62 u5)
(map-set mint-passes 'SP2Z0DE9N41R5C5YEXVF6JV5Z13DFKVYWDMJ5PH46 u5)
(map-set mint-passes 'SP3WMP9VYCA8E0PCYFA7CBPAXD3HRAMJ96BHR6GH7 u5)
(map-set mint-passes 'SP2DSF801CPT803HT3NQRW15BCQ104WK4MYF0XNDG u5)
(map-set mint-passes 'SPXQS1T1T2BKGSHH8H75PVFEY0R1X39F0B3MQWTJ u5)
(map-set mint-passes 'SP1SBTRXDJP4N825PY69B1MKTQ4MSPB0DW9JCQHKE u5)
(map-set mint-passes 'SP2ACNJC5JM6XP4J93NSZJW1QJVTBS9RCTTTAPR51 u5)
(map-set mint-passes 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5 u5)
(map-set mint-passes 'SP2TW1D8YF5CE0NDP5VCR5NMTPHQ4PQR1KBB4NQ5Q u5)
(map-set mint-passes 'SP247RS63PWW7ZQZ9EYYA9CXKKPWEP71M14W8N294 u5)
(map-set mint-passes 'SP1EH2MQAT4VAKRWP28CGE6PDB00CY1STTPA6FJXH u5)
(map-set mint-passes 'SP1ZQSWQ9QNNW388VFG45HYX1H592147V2FZZJY8V u5)
(map-set mint-passes 'SP3SF0PSD7KYVJQPKKRBYJFF7NENGFHZSBVHM3B27 u5)
(map-set mint-passes 'SP38T316JNMXGX58CVSAG6N9VP9FSH2PS90A861JE u5)
(map-set mint-passes 'SP33SCE1F3J9N6D4ZFY9AA3GR05GS3112GS1VZDFC u5)
(map-set mint-passes 'SP2ZCER0Z8VVMCDA3817SDFVES833XD9ACYDAFH1T u5)
(map-set mint-passes 'SP1FFJGTYFVH0YY7Q659MFD6WJRGE9MNZ2N06V2EK u5)
(map-set mint-passes 'SP3Z7511VWR5WG9J3MAKER3NRZYKWT83K2XTP36EV u5)
(map-set mint-passes 'SP18WRH4SF7F1M5QZZ2BQDZZYBCJWT9VWQMDSTFY5 u5)
(map-set mint-passes 'SP1XHX4584AM7KARG7MTVBW6CN8JQ8Q97DMFZJ8W u5)
(map-set mint-passes 'SP1BC30N1WX8ND2P1F4GTDWG4A5XVV1JPXNC0QM6F u5)
(map-set mint-passes 'SP381XXK5KTSRD1WCJJ351MV4ETXNPEMTVWQMPTW4 u5)
(map-set mint-passes 'SP247RS63PWW7ZQZ9EYYA9CXKKPWEP71M14W8N294 u5)
(map-set mint-passes 'SP3975YCT3J9F8QQDKARF5472G0M773R285DSTBMJ u5)
(map-set mint-passes 'SP2C9368BFA359AXTYMGXBWP34Z12Q4SCYJ1FGGZA u5)
;; Airdrop
(define-public (admin-airdrop)
  (let
    (
      (last-nft-id (var-get last-id))
    )
    (begin
      (asserts! (or (is-eq tx-sender (var-get artist-address)) (is-eq tx-sender DEPLOYER)) (err ERR-NOT-AUTHORIZED))
      (asserts! (is-eq false (var-get airdrop-called)) (err ERR-AIRDROP-CALLED))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u0) 'SP1XPG9QFX5M95G36SGN9R8YJ4KJ0JB7ZXNH892N6))
      (map-set token-count 'SP1XPG9QFX5M95G36SGN9R8YJ4KJ0JB7ZXNH892N6 (+ (get-balance 'SP1XPG9QFX5M95G36SGN9R8YJ4KJ0JB7ZXNH892N6) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u1) 'SP1HJZKZ4GBJS8PFEQD969QPNS2W1GMJ9PAGA4P2D))
      (map-set token-count 'SP1HJZKZ4GBJS8PFEQD969QPNS2W1GMJ9PAGA4P2D (+ (get-balance 'SP1HJZKZ4GBJS8PFEQD969QPNS2W1GMJ9PAGA4P2D) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u2) 'SP3GK0DJYBGTAFXV6B92YQ96FV8GT5AT5RWBBE3XY))
      (map-set token-count 'SP3GK0DJYBGTAFXV6B92YQ96FV8GT5AT5RWBBE3XY (+ (get-balance 'SP3GK0DJYBGTAFXV6B92YQ96FV8GT5AT5RWBBE3XY) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u3) 'SPPJ6YQD4H56Q5DCKTRAH1DGB1968T8TQG7YHHNV))
      (map-set token-count 'SPPJ6YQD4H56Q5DCKTRAH1DGB1968T8TQG7YHHNV (+ (get-balance 'SPPJ6YQD4H56Q5DCKTRAH1DGB1968T8TQG7YHHNV) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u4) 'SP143YHR805B8S834BWJTMZVFR1WP5FFC03WZE4BF))
      (map-set token-count 'SP143YHR805B8S834BWJTMZVFR1WP5FFC03WZE4BF (+ (get-balance 'SP143YHR805B8S834BWJTMZVFR1WP5FFC03WZE4BF) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u5) 'SP38GBVK5HEJ0MBH4CRJ9HQEW86HX0H9AP1HZ3SVZ))
      (map-set token-count 'SP38GBVK5HEJ0MBH4CRJ9HQEW86HX0H9AP1HZ3SVZ (+ (get-balance 'SP38GBVK5HEJ0MBH4CRJ9HQEW86HX0H9AP1HZ3SVZ) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u6) 'SP3KXDMECY28HBB6P6MXCBGNJZEW8RG2SCE2M24BX))
      (map-set token-count 'SP3KXDMECY28HBB6P6MXCBGNJZEW8RG2SCE2M24BX (+ (get-balance 'SP3KXDMECY28HBB6P6MXCBGNJZEW8RG2SCE2M24BX) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u7) 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5))
      (map-set token-count 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5 (+ (get-balance 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u8) 'SP2D5TTA7A49MY95TJWDZZKA24HWDDFYCWX3MQB09))
      (map-set token-count 'SP2D5TTA7A49MY95TJWDZZKA24HWDDFYCWX3MQB09 (+ (get-balance 'SP2D5TTA7A49MY95TJWDZZKA24HWDDFYCWX3MQB09) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u9) 'SP197GMEG6WGBRDTCTGGWMRA1G77E65TRXWYKGCT7))
      (map-set token-count 'SP197GMEG6WGBRDTCTGGWMRA1G77E65TRXWYKGCT7 (+ (get-balance 'SP197GMEG6WGBRDTCTGGWMRA1G77E65TRXWYKGCT7) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u10) 'SP1J5W1FN3P80XV1YK14BKC6A912WWFGJSW9M92HA))
      (map-set token-count 'SP1J5W1FN3P80XV1YK14BKC6A912WWFGJSW9M92HA (+ (get-balance 'SP1J5W1FN3P80XV1YK14BKC6A912WWFGJSW9M92HA) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u11) 'SP34X8GK22RRKFZ2D6QC867YYXVKGMBGX6RKB66EM))
      (map-set token-count 'SP34X8GK22RRKFZ2D6QC867YYXVKGMBGX6RKB66EM (+ (get-balance 'SP34X8GK22RRKFZ2D6QC867YYXVKGMBGX6RKB66EM) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u12) 'SP1RW77610RHZ5FHBBCX37PXEG05C5T2BA7657WWM))
      (map-set token-count 'SP1RW77610RHZ5FHBBCX37PXEG05C5T2BA7657WWM (+ (get-balance 'SP1RW77610RHZ5FHBBCX37PXEG05C5T2BA7657WWM) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u13) 'SP1XPG9QFX5M95G36SGN9R8YJ4KJ0JB7ZXNH892N6))
      (map-set token-count 'SP1XPG9QFX5M95G36SGN9R8YJ4KJ0JB7ZXNH892N6 (+ (get-balance 'SP1XPG9QFX5M95G36SGN9R8YJ4KJ0JB7ZXNH892N6) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u14) 'SP1X11HKCJ46PT9GSRS1PRYA53NB1VZ5P2B7KGASE))
      (map-set token-count 'SP1X11HKCJ46PT9GSRS1PRYA53NB1VZ5P2B7KGASE (+ (get-balance 'SP1X11HKCJ46PT9GSRS1PRYA53NB1VZ5P2B7KGASE) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u15) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u16) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u17) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u18) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u19) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u20) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u21) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u22) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u23) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u24) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u25) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u26) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u27) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u28) 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT))
      (map-set token-count 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT (+ (get-balance 'SP3R91G719XMPED4S1ZP37YHF30CAV1KGEKB8YXDT) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u29) 'SP3V8TCVWMY9BP0Z3D2JEMMMASMSBSM317E02X8WY))
      (map-set token-count 'SP3V8TCVWMY9BP0Z3D2JEMMMASMSBSM317E02X8WY (+ (get-balance 'SP3V8TCVWMY9BP0Z3D2JEMMMASMSBSM317E02X8WY) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u30) 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5))
      (map-set token-count 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5 (+ (get-balance 'SP2X1GD24FA3TGGV6T4TRPKT8MVZ8F02RZESYWEH5) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u31) 'SP2ACNJC5JM6XP4J93NSZJW1QJVTBS9RCTTTAPR51))
      (map-set token-count 'SP2ACNJC5JM6XP4J93NSZJW1QJVTBS9RCTTTAPR51 (+ (get-balance 'SP2ACNJC5JM6XP4J93NSZJW1QJVTBS9RCTTTAPR51) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u32) 'SP1SBTRXDJP4N825PY69B1MKTQ4MSPB0DW9JCQHKE))
      (map-set token-count 'SP1SBTRXDJP4N825PY69B1MKTQ4MSPB0DW9JCQHKE (+ (get-balance 'SP1SBTRXDJP4N825PY69B1MKTQ4MSPB0DW9JCQHKE) u1))
      (try! (nft-mint? citypacks-001 (+ last-nft-id u33) 'SP272ACVTPCFYG9GW3CQH49TZ555Z6VVGA46ZF159))
      (map-set token-count 'SP272ACVTPCFYG9GW3CQH49TZ555Z6VVGA46ZF159 (+ (get-balance 'SP272ACVTPCFYG9GW3CQH49TZ555Z6VVGA46ZF159) u1))

      (var-set last-id (+ last-nft-id u34))
      (var-set airdrop-called true)
      (ok true))))
