Source Code

;; constant errors
(define-constant ERR-NOT-AUTHORIZED (err u401))
(define-constant ERR-INSUFFICIENT-FUNDS (err u402))
(define-constant INVALID-GEMS-COUNT (err u403))
(define-constant INVALID-STX-BALANCE (err u404))
(define-constant ERR-TRANSFER-MULTISIG (err u405))
(define-constant ERR-TRANSFER-PROGRESSIVE (err u406))
(define-constant ERR-TRANSFER-KRYPTOMIND (err u407))
(define-constant ERR-TRANSFER-BURN-WALLET (err u408))
(define-constant INVALID-HEART-COUNT (err u409))
(define-constant ERR-ENTER-NEW-WALLET (err u501))
(define-constant ERR-SAME-PERCENTAGE (err u502))
(define-constant ERR-SWAP-FAILED (err u503))
(define-constant ERR-STX-LIMIT-EXCEEDED (err u504))


(define-constant MAX-STX-HEARTS u4000000)
(define-constant MAX-STX-GEMS u1000000)


;; Public variables for the percentages
(define-data-var percentage-progressive uint u10)

(define-constant total-percentage u10000)   ;; Represents 100.00 for remaing stx

(define-data-var percentage-multisig uint u7950) ;; 79.5
(define-data-var percentage-burn uint u50)       ;; 0.5
(define-data-var percentage-kryptomind uint u2000) ;; 20


  
;; Public variables for the wallets
(define-data-var MULTISIG_WALLET principal 'SP20FJQJN06YZY001S5R6P5SS4BYMQX1J3K33Y8ZT)
(define-data-var KRYPTOMIND principal 'SP2RVTWWBB5KYFY2F0G4V054FETC6R5Q12ZCZ6QCC)
(define-data-var BURN_WALLET principal 'SP000000000000000000002Q6VF78)
(define-data-var PROGRESSIVE_WALLET principal 'SP2HYW9F9YXEE8ACZ7PE268VB7QME0JDJJVDPHFS5)


;; Public variables 
(define-data-var total-stx-swapped uint u0) 
(define-data-var total-stone-burned uint u0) 
(define-data-var progressive-pool uint u0)
(define-data-var contract-owner principal tx-sender)

;; Mappings 
(define-map user-gems {user: principal} {gems: uint})
(define-map user-hearts {user: principal} {hearts: uint})
(define-map user-contest-inventory principal {hearts: uint, gems: uint})



;; helper functions
(define-private (check-is-owner)
  (ok (asserts! (is-eq tx-sender (var-get contract-owner)) ERR-NOT-AUTHORIZED))
)

(define-private (swap (stx-amount uint))
  (begin 
    
    (asserts! (> stx-amount u0) ERR-INSUFFICIENT-FUNDS)
    (let ((swap-result
           (contract-call? 
             'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-router
             swap-exact-tokens-for-tokens
             u79
             'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.wstx
             'SPQ5CEHETP8K4Q2FSNNK9ANMPAVBSA9NN86YSN59.stone-bonding-curve
             'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.wstx
             'SPQ5CEHETP8K4Q2FSNNK9ANMPAVBSA9NN86YSN59.stone-bonding-curve
             'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-share-fee-to
             stx-amount
             u1
           )))
      (asserts! (is-ok swap-result) ERR-SWAP-FAILED)
      (let ((swap-event (unwrap! swap-result ERR-SWAP-FAILED)))
        (ok (get amt-out swap-event))
      )
    )
  )
)

;; Setter functions

(define-public (set-contract-owner (owner principal))
  (begin 
  (try! (check-is-owner))
  (asserts! (not (is-eq owner (var-get contract-owner))) ERR-ENTER-NEW-WALLET)
    (var-set contract-owner owner)
    (ok owner)
  )
)

(define-public (set-percentage-progressive (new-percentage uint))
  (begin
    (try! (check-is-owner))
     (asserts! (not (is-eq new-percentage (var-get percentage-progressive))) ERR-SAME-PERCENTAGE)
    (var-set percentage-progressive new-percentage)
    (ok new-percentage)))

(define-public (set-percentage-multisig (new-percentage uint))
  (begin
    (try! (check-is-owner))
     (asserts! (not (is-eq new-percentage (var-get percentage-multisig))) ERR-SAME-PERCENTAGE)
    (var-set percentage-multisig new-percentage)
    (ok new-percentage)))

(define-public (set-percentage-burn (new-percentage uint))
  (begin
   (try! (check-is-owner))
     (asserts! (not (is-eq new-percentage (var-get percentage-burn))) ERR-SAME-PERCENTAGE)
    (var-set percentage-burn new-percentage)
    (ok new-percentage)))

(define-public (set-percentage-kryptomind (new-percentage uint))
  (begin
    (try! (check-is-owner))
     (asserts! (not (is-eq new-percentage (var-get percentage-kryptomind))) ERR-SAME-PERCENTAGE)
    (var-set percentage-kryptomind new-percentage)
    (ok new-percentage)))
    


(define-public (set-multisig-wallet (new-wallet principal))
  (begin
    (try! (check-is-owner))
    (asserts! (not (is-eq new-wallet (var-get MULTISIG_WALLET))) ERR-ENTER-NEW-WALLET)
    (var-set MULTISIG_WALLET new-wallet)
    (ok new-wallet)))

(define-public (set-kryptomind-wallet (new-wallet principal))
  (begin
   (try! (check-is-owner))
    (asserts! (not (is-eq new-wallet (var-get KRYPTOMIND))) ERR-ENTER-NEW-WALLET)
    (var-set KRYPTOMIND new-wallet)
    (ok new-wallet)))

(define-public (set-burn-wallet (new-wallet principal))
  (begin
    (try! (check-is-owner))
    (asserts! (not (is-eq new-wallet (var-get BURN_WALLET)))  ERR-ENTER-NEW-WALLET)
    (var-set BURN_WALLET new-wallet)
    (ok new-wallet))
)
(define-public (set-progressive-wallet (new-wallet principal))
  (begin
    (try! (check-is-owner))
    (asserts! (not (is-eq new-wallet (var-get PROGRESSIVE_WALLET)))  ERR-ENTER-NEW-WALLET)
    (var-set PROGRESSIVE_WALLET new-wallet)
    (ok new-wallet))
)
    




;; Getter functions 
(define-read-only (get-multisig-wallet) (ok (var-get MULTISIG_WALLET)))

(define-read-only (get-kryptomind-wallet) (ok (var-get KRYPTOMIND)))

(define-read-only (get-burn-wallet) (ok (var-get BURN_WALLET)))



(define-read-only (get-progressive-wallet) (ok (var-get PROGRESSIVE_WALLET)))

(define-read-only (get-contract-owner)
  (ok (var-get contract-owner))
)

(define-read-only (get-total-stx-swapped)
  (ok (var-get total-stx-swapped))
)
(define-read-only (get-total-stone-burned)
  (ok (var-get total-stone-burned))
)


(define-read-only (get-percentage-progressive)
  (ok (var-get percentage-progressive)))

(define-read-only (get-percentage-burn)
  (ok (var-get percentage-burn)))

(define-read-only (get-percentage-kryptomind)
  (ok (var-get percentage-kryptomind)))

  (define-read-only (get-percentage-multisig)
  (ok (var-get percentage-multisig))
)

(define-read-only (get-progressive-pool-balance)
  (var-get progressive-pool))  

(define-read-only (get-user-contest-inventory (user principal))
  (map-get? user-contest-inventory user)) 

(define-read-only (get-user-gems (user principal))
  (ok (default-to {gems: u0} (map-get? user-gems {user: user}))))

(define-read-only (get-user-hearts (user principal))
  (ok (default-to {hearts: u0} (map-get? user-hearts {user: user}))))

;; Purchase gems
(define-public (buy-gems (gems-count uint))
  (begin
    (asserts! (or (is-eq gems-count u5) (is-eq gems-count u25) (is-eq gems-count u50) (is-eq gems-count u100))
      INVALID-GEMS-COUNT)

    (let ((required-stx
            (if (is-eq gems-count u5) u200000
              (if (is-eq gems-count u25) u400000
                (if (is-eq gems-count u50) u700000
                  (if (is-eq gems-count u100) u1000000 u0))))))
      (asserts! (>= (stx-get-balance tx-sender) required-stx) INVALID-STX-BALANCE)
      (asserts! (<= required-stx MAX-STX-GEMS) ERR-STX-LIMIT-EXCEEDED)
      (let ((share-to-progressive (/ (* required-stx (var-get percentage-progressive)) u100))
            (remaining-stx (- required-stx (/ (* required-stx (var-get percentage-progressive)) u100))) 
            (share-to-multisig (/ (* remaining-stx (var-get percentage-multisig)) total-percentage))
            (share-to-burn (/ (* remaining-stx (var-get percentage-burn)) total-percentage))
            (share-to-kryptomind (/ (* remaining-stx (var-get percentage-kryptomind)) total-percentage))
            (swapped-stone (try! (swap share-to-burn))) )

        (unwrap! (stx-transfer? share-to-progressive tx-sender (var-get PROGRESSIVE_WALLET)) ERR-TRANSFER-PROGRESSIVE)
        (asserts! (is-ok  (contract-call? 'SPQ5CEHETP8K4Q2FSNNK9ANMPAVBSA9NN86YSN59.stone-bonding-curve
                                    transfer
                                     swapped-stone tx-sender (var-get BURN_WALLET) none)) ERR-TRANSFER-BURN-WALLET)
        (unwrap! (stx-transfer? share-to-multisig tx-sender (var-get MULTISIG_WALLET)) ERR-TRANSFER-MULTISIG)
       
        (unwrap! (stx-transfer? share-to-kryptomind tx-sender (var-get KRYPTOMIND)) ERR-TRANSFER-KRYPTOMIND)
        (var-set total-stx-swapped (+ (var-get total-stx-swapped) share-to-burn))
        (var-set total-stone-burned (+ (var-get total-stone-burned) swapped-stone))
        (map-set user-gems {user: tx-sender}
          {gems: (+ (get gems (default-to {gems: u0} (map-get? user-gems {user: tx-sender}))) gems-count)})
         (let ((event
                    {op  : "buy-gems",
                    user: tx-sender,
                    gems-count: gems-count, 
                    required-stx: required-stx, 
                    progressive-share: share-to-progressive, 
                    multisig-share: share-to-multisig, 
                    burn-share: share-to-burn, 
                    kryptomind-share: share-to-kryptomind, 
                    swapped-stone: swapped-stone
                     }))
         (print event)
         (ok event))
          ))))

;; Purchase hearts
(define-public (buy-hearts (heart-count uint))
  (begin
    (asserts! (or (is-eq heart-count u3) (is-eq heart-count u10) (is-eq heart-count u25) (is-eq heart-count u50)) 
      INVALID-HEART-COUNT)

    (let ((required-stx (if (is-eq heart-count u3) u1000000
                          (if (is-eq heart-count u10) u2000000
                              (if (is-eq heart-count u25) u3000000
                                  (if (is-eq heart-count u50) u4000000 u0))))))
      (asserts! (>= (stx-get-balance tx-sender) required-stx) INVALID-STX-BALANCE)
      (asserts! (<= required-stx MAX-STX-HEARTS) ERR-STX-LIMIT-EXCEEDED)
      (let ((share-to-progressive (/ (* required-stx (var-get percentage-progressive)) u100))
            (remaining-stx (- required-stx (/ (* required-stx (var-get percentage-progressive)) u100))) 
            (share-to-multisig (/ (* remaining-stx (var-get percentage-multisig)) total-percentage))
            (share-to-burn (/ (* remaining-stx (var-get percentage-burn)) total-percentage))
            (share-to-kryptomind (/ (* remaining-stx (var-get percentage-kryptomind)) total-percentage))
            (swapped-stone (try! (swap share-to-burn))) )

        (unwrap! (stx-transfer? share-to-progressive tx-sender (var-get PROGRESSIVE_WALLET)) ERR-TRANSFER-PROGRESSIVE)
        (asserts! (is-ok  (contract-call? 'SPQ5CEHETP8K4Q2FSNNK9ANMPAVBSA9NN86YSN59.stone-bonding-curve
                                    transfer
                                     swapped-stone tx-sender (var-get BURN_WALLET) none)) ERR-TRANSFER-BURN-WALLET)
        (unwrap! (stx-transfer? share-to-multisig tx-sender (var-get MULTISIG_WALLET)) ERR-TRANSFER-MULTISIG) 
        (unwrap! (stx-transfer? share-to-kryptomind tx-sender (var-get KRYPTOMIND)) ERR-TRANSFER-KRYPTOMIND)

        (var-set total-stx-swapped (+ (var-get total-stx-swapped) share-to-burn))
        (var-set total-stone-burned (+ (var-get total-stone-burned) swapped-stone))
        
        (let ((existing-hearts (get hearts (default-to {hearts: u0} (map-get? user-hearts {user: tx-sender})))))
          (map-set user-hearts {user: tx-sender} {hearts: (+ existing-hearts heart-count)}))
          (let ((event
                    {op  : "buy-hearts",
                    user: tx-sender,
                    heart-count: heart-count, 
                    required-stx: required-stx, 
                    progressive-share: share-to-progressive, 
                    multisig-share: share-to-multisig, 
                    burn-share: share-to-burn, 
                    kryptomind-share: share-to-kryptomind, 
                    swapped-stone: swapped-stone
                    }))
          (print event)
          (ok event)) 
          ))))

;; Enter contest

(define-public (enter-contest)
  (begin
    (asserts! (>= (stx-get-balance tx-sender) u200000) INVALID-STX-BALANCE)
    (try! (stx-transfer? u200000 tx-sender (var-get PROGRESSIVE_WALLET)))
    (var-set progressive-pool (+ (var-get progressive-pool) u200000))
    (map-set user-contest-inventory tx-sender {hearts: u3, gems: u10})
    (map-set user-gems {user: tx-sender} {gems: u10})
    (map-set user-hearts {user: tx-sender} {hearts: u3})
     (let ((event
                    {op  : "enter-contest",
                    user: tx-sender,
                    hearts: u3, 
                    gems: u10, 
                    pool: (var-get progressive-pool)
                    
                    }))
          (print event)
          (ok event)) 
  )
)

Functions (29)

FunctionAccessArgs
check-is-ownerprivate
swapprivatestx-amount: uint
set-contract-ownerpublicowner: principal
set-percentage-progressivepublicnew-percentage: uint
set-percentage-multisigpublicnew-percentage: uint
set-percentage-burnpublicnew-percentage: uint
set-percentage-kryptomindpublicnew-percentage: uint
set-multisig-walletpublicnew-wallet: principal
set-kryptomind-walletpublicnew-wallet: principal
set-burn-walletpublicnew-wallet: principal
set-progressive-walletpublicnew-wallet: principal
get-multisig-walletread-only
get-kryptomind-walletread-only
get-burn-walletread-only
get-progressive-walletread-only
get-contract-ownerread-only
get-total-stx-swappedread-only
get-total-stone-burnedread-only
get-percentage-progressiveread-only
get-percentage-burnread-only
get-percentage-kryptomindread-only
get-percentage-multisigread-only
get-progressive-pool-balanceread-only
get-user-contest-inventoryread-onlyuser: principal
get-user-gemsread-onlyuser: principal
get-user-heartsread-onlyuser: principal
buy-gemspublicgems-count: uint
buy-heartspublicheart-count: uint
enter-contestpublic