From a82e7e2e6d4984396a2703f202e08b1368b78f09 Mon Sep 17 00:00:00 2001 From: fiftyeightandeight Date: Tue, 14 May 2024 11:32:30 +0800 Subject: [PATCH] runes-games (#807) --- clarity/Clarinet.toml | 6 +- clarity/contracts/token/runes-games.clar | 229 +++++++++++++++++++++++ 2 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 clarity/contracts/token/runes-games.clar diff --git a/clarity/Clarinet.toml b/clarity/Clarinet.toml index ebe1deb0..5c1b9d71 100644 --- a/clarity/Clarinet.toml +++ b/clarity/Clarinet.toml @@ -1722,4 +1722,8 @@ epoch = 2.4 path = "contracts/wrapped-token/token-ssl-hashiko-16Z1P.clar" depends_on = [ "trait-ownable", "trait-sip-010" ] clarity_version = 2 -epoch = 2.4 \ No newline at end of file +epoch = 2.4 + +[contracts.runes-games] +path = "contracts/token/runes-games.clar" +depends_on = [] \ No newline at end of file diff --git a/clarity/contracts/token/runes-games.clar b/clarity/contracts/token/runes-games.clar new file mode 100644 index 00000000..7a220093 --- /dev/null +++ b/clarity/contracts/token/runes-games.clar @@ -0,0 +1,229 @@ +(define-constant ERR-NOT-AUTHORIZED (err u1000)) + +(define-constant ONE_8 u100000000) + +;; -- token implementation + +(define-fungible-token runes-games) + +(define-data-var contract-owner principal tx-sender) +(define-data-var token-name (string-ascii 32) "GAME OF BITCOIN (RUNES)") +(define-data-var token-symbol (string-ascii 32) "GAMES") +(define-data-var token-uri (optional (string-utf8 256)) (some u"https://cdn.alexlab.co/metadata/runes-games.json")) + +(define-data-var token-decimals uint u8) + +(define-map approved-contracts principal bool) + +;; read-only calls + +(define-read-only (get-contract-owner) + (ok (var-get contract-owner)) +) + +(define-read-only (get-name) + (ok (var-get token-name)) +) + +(define-read-only (get-symbol) + (ok (var-get token-symbol)) +) + +(define-read-only (get-decimals) + (ok (var-get token-decimals)) +) + +(define-read-only (get-balance (who principal)) + (ok (ft-get-balance runes-games who)) +) + +(define-read-only (get-total-supply) + (ok (ft-get-supply runes-games)) +) + +(define-read-only (get-token-uri) + (ok (var-get token-uri)) +) + +;; @desc fixed-to-decimals +;; @params amount +;; @returns uint +(define-read-only (fixed-to-decimals (amount uint)) + (/ (* amount (pow-decimals)) ONE_8) +) + +;; @desc get-total-supply-fixed +;; @params token-id +;; @returns (response uint) +(define-read-only (get-total-supply-fixed) + (ok (decimals-to-fixed (unwrap-panic (get-total-supply)))) +) + +;; @desc get-balance-fixed +;; @params token-id +;; @params who +;; @returns (response uint) +(define-read-only (get-balance-fixed (account principal)) + (ok (decimals-to-fixed (unwrap-panic (get-balance account)))) +) + +;; governance calls + +(define-public (set-contract-owner (owner principal)) + (begin + (try! (check-is-owner)) + (ok (var-set contract-owner owner)) + ) +) + +(define-public (set-name (new-name (string-ascii 32))) + (begin + (try! (check-is-owner)) + (ok (var-set token-name new-name)) + ) +) + +(define-public (set-symbol (new-symbol (string-ascii 10))) + (begin + (try! (check-is-owner)) + (ok (var-set token-symbol new-symbol)) + ) +) + +(define-public (set-decimals (new-decimals uint)) + (begin + (try! (check-is-owner)) + (ok (var-set token-decimals new-decimals)) + ) +) + +(define-public (set-token-uri (new-uri (optional (string-utf8 256)))) + (begin + (try! (check-is-owner)) + (ok (var-set token-uri new-uri)) + ) +) + +(define-public (add-approved-contract (new-approved-contract principal)) + (begin + (try! (check-is-owner)) + (ok (map-set approved-contracts new-approved-contract true)) + ) +) + +(define-public (set-approved-contract (owner principal) (approved bool)) + (begin + (try! (check-is-owner)) + (ok (map-set approved-contracts owner approved)) + ) +) + +;; priviliged calls + +;; @desc mint +;; @restricted ContractOwner/Approved Contract +;; @params token-id +;; @params amount +;; @params recipient +;; @returns (response bool) +(define-public (mint (amount uint) (recipient principal)) + (begin + (asserts! (or (is-ok (check-is-approved)) (is-ok (check-is-owner))) ERR-NOT-AUTHORIZED) + (ft-mint? runes-games amount recipient) + ) +) + +;; @desc burn +;; @restricted ContractOwner/Approved Contract +;; @params token-id +;; @params amount +;; @params sender +;; @returns (response bool) +(define-public (burn (amount uint) (sender principal)) + (begin + (asserts! (or (is-ok (check-is-approved)) (is-ok (check-is-owner))) ERR-NOT-AUTHORIZED) + (ft-burn? runes-games amount sender) + ) +) + +;; @desc mint-fixed +;; @params token-id +;; @params amount +;; @params recipient +;; @returns (response bool) +(define-public (mint-fixed (amount uint) (recipient principal)) + (mint (fixed-to-decimals amount) recipient) +) + +;; @desc burn-fixed +;; @params token-id +;; @params amount +;; @params sender +;; @returns (response bool) +(define-public (burn-fixed (amount uint) (sender principal)) + (burn (fixed-to-decimals amount) sender) +) + +(define-public (mint-fixed-many (recipients (list 200 { amount: uint, to: principal}))) + (fold mint-many-iter recipients (ok true)) +) + +;; public calls + +(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34)))) + (begin + (asserts! (is-eq sender tx-sender) ERR-NOT-AUTHORIZED) + (try! (ft-transfer? runes-games amount sender recipient)) + (match memo to-print (print to-print) 0x) + (ok true) + ) +) + +;; @desc transfer-fixed +;; @params token-id +;; @params amount +;; @params sender +;; @params recipient +;; @returns (response bool) +(define-public (transfer-fixed (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34)))) + (transfer (fixed-to-decimals amount) sender recipient memo) +) + +(define-public (transfer-fixed-many (recipients (list 200 { amount: uint, to: principal}))) + (fold transfer-many-iter recipients (ok true)) +) + +;; private calls + +(define-private (check-is-owner) + (ok (asserts! (is-eq tx-sender (var-get contract-owner)) ERR-NOT-AUTHORIZED)) +) + +(define-private (check-is-approved) + (ok (asserts! (default-to false (map-get? approved-contracts tx-sender)) ERR-NOT-AUTHORIZED)) +) + +;; @desc decimals-to-fixed +;; @params amount +;; @returns uint +(define-private (decimals-to-fixed (amount uint)) + (/ (* amount ONE_8) (pow-decimals)) +) + +;; @desc pow-decimals +;; @returns uint +(define-private (pow-decimals) + (pow u10 (unwrap-panic (get-decimals))) +) + +(define-private (mint-many-iter (recipient { amount: uint, to: principal }) (previous-response (response bool uint))) + (match previous-response prev-ok (mint-fixed (get amount recipient) (get to recipient)) prev-err previous-response) +) + +(define-private (transfer-many-iter (recipient { amount: uint, to: principal }) (previous-response (response bool uint))) + (match previous-response prev-ok (transfer-fixed (get amount recipient) tx-sender (get to recipient) none) prev-err previous-response) +) + +;; contract initialisation +(contract-call? .alex-vault-v1-1 set-approved-token .runes-games true) +;; (set-contract-owner .executor-dao)