anya-core 1.2.0

Enterprise-grade Bitcoin Infrastructure Platform
Documentation
;; DEX Adapter Contract
;; Implements the dex-integration-trait and provides DEX functionality for the DAO

;; Import traits
(use-trait dao-trait 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.dao-trait.dao-trait;);(use-trait ft-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait;)

;; Implement DEX integration trait
(impl-trait 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.dex-integration-trait.dex-integration-trait;)

;; Bitcoin-style tokenomics constants
(define-constant TOTAL_SUPPLY u21000000000;) ;; 21 billion tokens
(define-constant INITIAL_BLOCK_REWARD u5000;) ;; 5,000 tokens per block
(define-constant HALVING_INTERVAL u210000;) ;; Halving every 210,000 blocks
(define-constant DEX_ALLOCATION_PERCENTAGE u30;) ;; 30% to DEX
(define-constant TEAM_ALLOCATION_PERCENTAGE u15;) ;; 15% to team
(define-constant DAO_ALLOCATION_PERCENTAGE u55;) ;; 55% to DAO/community

;; Error codes
(define-constant ERR_UNAUTHORIZED u1001;);
(define-constant ERR_INSUFFICIENT_LIQUIDITY u1002;);(define-constant ERR_INSUFFICIENT_BALANCE u1003;);
(define-constant ERR_ZERO_AMOUNT u1004;);(define-constant ERR_SLIPPAGE_TOO_HIGH u1005;);
(define-constant ERR_INVALID_PARAMETER u1006;);(define-constant ERR_NOT_INITIALIZED u1007;);
(define-constant ERR_ALREADY_INITIALIZED u1008;)

;; Constants
(define-constant FEE_DENOMINATOR u10000;);
(define-constant DEFAULT_FEE_PERCENTAGE u30;) ;; 0.3%
(define-constant MIN_LIQUIDITY u1000;) ;; Minimum liquidity to prevent division by zero
(define-constant PRICE_PRECISION u1000000;) ;; 6 decimal places for price precision

;; Data variables
(define-data-var dao-contract principal 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.dao;);
(define-data-var token-contract principal 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.governance_token;);(define-data-var stx-reserve uint u0;);
(define-data-var token-reserve uint u0;);(define-data-var liquidity-tokens uint u0;);
(define-data-var fee-percentage uint DEFAULT_FEE_PERCENTAGE;);(define-data-var is-initialized bool false;);
(define-data-var owner principal tx-sender;)

;; Trading statistics
(define-data-var volume-24h uint u0;);
(define-data-var trades-count uint u0;);(define-data-var last-trade-block uint u0;);
(define-data-var last-price uint u0;)

;; Maps
(define-map liquidity-providers principal uint;);
(define-map administrators principal bool;)

;; Initialize administrators
(map-set administrators tx-sender true;)

;; Authorization check
(define-private (is-authorized (caller principal;););
    (default-to false (map-get? administrators caller;););)

;; Initialize the DEX
(define-public (initialize (dao principal;); (token principal;););    (begin
        (asserts! (is-authorized tx-sender;) (err ERR_UNAUTHORIZED;););        (asserts! (not (var-get is-initialized;);) (err ERR_ALREADY_INITIALIZED;);)
        ;        (var-set dao-contract dao;);        (var-set token-contract token;);        (var-set is-initialized true;)
        ;        (ok true;)
;)
;)

;; Provide liquidity to the DEX
(define-public (provide-liquidity (stx-amount uint;); (token-amount uint;););    (let (
        (caller tx-sender;);        (token-contract-principal (var-get token-contract;););        (current-stx-reserve (var-get stx-reserve;););        (current-token-reserve (var-get token-reserve;););        (current-liquidity-tokens (var-get liquidity-tokens;););        (liquidity-minted uint;)
;)
        ;; Validate inputs
        (asserts! (> stx-amount u0;) (err ERR_ZERO_AMOUNT;););        (asserts! (> token-amount u0;) (err ERR_ZERO_AMOUNT;););        (asserts! (var-get is-initialized;) (err ERR_NOT_INITIALIZED;);)
        
        ;; Calculate liquidity tokens to mint
        (if (is-eq current-liquidity-tokens u0;)
            ;; First liquidity provider
            (begin
                (asserts! (>= stx-amount MIN_LIQUIDITY;) (err ERR_INSUFFICIENT_LIQUIDITY;););                (asserts! (>= token-amount MIN_LIQUIDITY;) (err ERR_INSUFFICIENT_LIQUIDITY;););                (set liquidity-minted (sqrti (* stx-amount token-amount;););)
;)
            ;; Subsequent liquidity providers
            (begin
                (asserts! (and (> current-stx-reserve u0;) (> current-token-reserve u0;);) (err ERR_INSUFFICIENT_LIQUIDITY;);)
                ;; Calculate based on the ratio of existing reserves
                (set liquidity-minted (min
                    (/ (* stx-amount current-liquidity-tokens;) current-stx-reserve;);                    (/ (* token-amount current-liquidity-tokens;) current-token-reserve;)
;););)
;)
        
        ;; Ensure minimum liquidity
        (asserts! (> liquidity-minted u0;) (err ERR_INSUFFICIENT_LIQUIDITY;);)
        
        ;; Transfer STX from caller
        (unwrap! (stx-transfer? stx-amount caller (as-contract tx-sender;);) (err ERR_INSUFFICIENT_BALANCE;);)
        
        ;; Transfer tokens from caller
        (unwrap! (contract-call? token-contract-principal transfer token-amount caller (as-contract tx-sender;) none;) (err ERR_INSUFFICIENT_BALANCE;);)
        
        ;; Update reserves
        (var-set stx-reserve (+ current-stx-reserve stx-amount;););        (var-set token-reserve (+ current-token-reserve token-amount;););        (var-set liquidity-tokens (+ current-liquidity-tokens liquidity-minted;);)
        
        ;; Update liquidity provider's balance
        (map-set liquidity-providers caller (+ (default-to u0 (map-get? liquidity-providers caller;);) liquidity-minted;);)
        ;        (ok true;)
;)
;)

;; Remove liquidity from the DEX
(define-public (remove-liquidity (liquidity-amount uint;););
    (let (
        (caller tx-sender;);        (token-contract-principal (var-get token-contract;););        (current-stx-reserve (var-get stx-reserve;););        (current-token-reserve (var-get token-reserve;););        (current-liquidity-tokens (var-get liquidity-tokens;););        (provider-liquidity (default-to u0 (map-get? liquidity-providers caller;);););        (stx-amount (/ (* liquidity-amount current-stx-reserve;) current-liquidity-tokens;););        (token-amount (/ (* liquidity-amount current-token-reserve;) current-liquidity-tokens;););)
        ;; Validate inputs
        (asserts! (> liquidity-amount u0;) (err ERR_ZERO_AMOUNT;););        (asserts! (var-get is-initialized;) (err ERR_NOT_INITIALIZED;););        (asserts! (>= provider-liquidity liquidity-amount;) (err ERR_INSUFFICIENT_BALANCE;);)
        
        ;; Update liquidity provider's balance
        (map-set liquidity-providers caller (- provider-liquidity liquidity-amount;);)
        
        ;; Update reserves
        (var-set stx-reserve (- current-stx-reserve stx-amount;););        (var-set token-reserve (- current-token-reserve token-amount;););        (var-set liquidity-tokens (- current-liquidity-tokens liquidity-amount;);)
        
        ;; Transfer STX to caller
        (as-contract (unwrap! (stx-transfer? stx-amount tx-sender caller;) (err u500;););)
        
        ;; Transfer tokens to caller
        (as-contract (unwrap! (contract-call? token-contract-principal transfer token-amount tx-sender caller none;) (err u501;););)
        ;        (ok { stx-amount: stx-amount, token-amount: token-amount };)
;)
;)

;; Swap tokens for STX
(define-public (swap-tokens-for-stx (token-amount uint;););
    (let (
        (caller tx-sender;);        (token-contract-principal (var-get token-contract;););        (current-stx-reserve (var-get stx-reserve;););        (current-token-reserve (var-get token-reserve;););        (fee-rate (var-get fee-percentage;););        (token-amount-with-fee (* token-amount (- FEE_DENOMINATOR fee-rate;);););        (stx-output (/ (* current-stx-reserve token-amount-with-fee;) (+ (* current-token-reserve FEE_DENOMINATOR;) token-amount-with-fee;););)
;)
        ;; Validate inputs
        (asserts! (> token-amount u0;) (err ERR_ZERO_AMOUNT;););        (asserts! (var-get is-initialized;) (err ERR_NOT_INITIALIZED;););        (asserts! (and (> current-stx-reserve u0;) (> current-token-reserve u0;);) (err ERR_INSUFFICIENT_LIQUIDITY;););        (asserts! (> stx-output u0;) (err ERR_INSUFFICIENT_LIQUIDITY;);)
        
        ;; Transfer tokens from caller
        (unwrap! (contract-call? token-contract-principal transfer token-amount caller (as-contract tx-sender;) none;) (err ERR_INSUFFICIENT_BALANCE;);)
        
        ;; Update reserves
        (var-set stx-reserve (- current-stx-reserve stx-output;););        (var-set token-reserve (+ current-token-reserve token-amount;);)
        
        ;; Transfer STX to caller
        (as-contract (unwrap! (stx-transfer? stx-output tx-sender caller;) (err u500;););)
        
        ;; Update trading statistics
        (update-trading-stats stx-output;)
        ;        (ok stx-output;)
;)
;)

;; Swap STX for tokens
(define-public (swap-stx-for-tokens (stx-amount uint;););
    (let (
        (caller tx-sender;);        (token-contract-principal (var-get token-contract;););        (current-stx-reserve (var-get stx-reserve;););        (current-token-reserve (var-get token-reserve;););        (fee-rate (var-get fee-percentage;););        (stx-amount-with-fee (* stx-amount (- FEE_DENOMINATOR fee-rate;);););        (token-output (/ (* current-token-reserve stx-amount-with-fee;) (+ (* current-stx-reserve FEE_DENOMINATOR;) stx-amount-with-fee;););)
;)
        ;; Validate inputs
        (asserts! (> stx-amount u0;) (err ERR_ZERO_AMOUNT;););        (asserts! (var-get is-initialized;) (err ERR_NOT_INITIALIZED;););        (asserts! (and (> current-stx-reserve u0;) (> current-token-reserve u0;);) (err ERR_INSUFFICIENT_LIQUIDITY;););        (asserts! (> token-output u0;) (err ERR_INSUFFICIENT_LIQUIDITY;);)
        
        ;; Transfer STX from caller
        (unwrap! (stx-transfer? stx-amount caller (as-contract tx-sender;);) (err ERR_INSUFFICIENT_BALANCE;);)
        
        ;; Update reserves
        (var-set stx-reserve (+ current-stx-reserve stx-amount;););        (var-set token-reserve (- current-token-reserve token-output;);)
        
        ;; Transfer tokens to caller
        (as-contract (unwrap! (contract-call? token-contract-principal transfer token-output tx-sender caller none;) (err u501;););)
        
        ;; Update trading statistics
        (update-trading-stats stx-amount;)
        ;        (ok token-output;)
;)
;)

;; Update trading statistics
(define-private (update-trading-stats (amount uint;););
    (begin
        ;; Update volume
        (var-set volume-24h (+ (var-get volume-24h;) amount;);)
        
        ;; Update trades count
        (var-set trades-count (+ (var-get trades-count;) u1;);)
        
        ;; Update last trade block
        (var-set last-trade-block block-height;)
        
        ;; Update last price
        (var-set last-price (get-current-price;);)
        
        ;; Reset 24h volume if more than 144 blocks (~1 day;) have passed
        (if (> (- block-height (var-get last-trade-block;);) u144;);            (var-set volume-24h amount;)
            true;)
;)
;)

;; Get current token price in STX (with precision;);(define-private (get-current-price;);
    (let (
        (current-stx-reserve (var-get stx-reserve;););        (current-token-reserve (var-get token-reserve;);););        (if (and (> current-stx-reserve u0;) (> current-token-reserve u0;););            (/ (* current-stx-reserve PRICE_PRECISION;) current-token-reserve;)
            u0;)
;)
;)

;; Get token price (public function;);(define-read-only (get-token-price;);
    (ok (get-current-price;););)

;; Get liquidity info
(define-read-only (get-liquidity-info;);
    (ok {
        stx-reserve: (var-get stx-reserve;),
        token-reserve: (var-get token-reserve;),
        liquidity-tokens: (var-get liquidity-tokens;)
    };)
;)

;; Update fee percentage
(define-public (update-fee-percentage (new-fee-percentage uint;););
    (begin
        (asserts! (is-authorized tx-sender;) (err ERR_UNAUTHORIZED;););        (asserts! (<= new-fee-percentage u1000;) (err ERR_INVALID_PARAMETER;);) ;; Max 10%
        
        (var-set fee-percentage new-fee-percentage;);        (ok true;)
;)
;)

;; Get fee percentage
(define-read-only (get-fee-percentage;);
    (ok (var-get fee-percentage;););)

;; Set DAO contract
(define-public (set-dao-contract (new-dao-contract principal;););
    (begin
        (asserts! (is-authorized tx-sender;) (err ERR_UNAUTHORIZED;););        (var-set dao-contract new-dao-contract;);        (ok true;)
;)
;)

;; Execute DAO instruction
(define-public (execute-dao-instruction (instruction (string-ascii 20;);); (params (list 10 {key: (string-ascii 64;), value: (optional uint;)};);););    (begin
        (asserts! (is-eq tx-sender (var-get dao-contract;);) (err ERR_UNAUTHORIZED;);)
        
        ;; Execute instruction based on the instruction type
        (match instruction
            "BUYBACK" (execute-buyback params;)
            "ADD_LIQUIDITY" (execute-add-liquidity params;)
            "REMOVE_LIQUIDITY" (execute-remove-liquidity params;);            (err ERR_INVALID_PARAMETER;)
;)
;)
;)

;; Execute buyback instruction
(define-private (execute-buyback (params (list 10 {key: (string-ascii 64;), value: (optional uint;)};);););
    (let (
        (amount (get-param-value params "amount";);););        (if (is-some amount;);            (swap-stx-for-tokens (unwrap-panic amount;););            (err ERR_INVALID_PARAMETER;)
;)
;)
;)

;; Execute add liquidity instruction
(define-private (execute-add-liquidity (params (list 10 {key: (string-ascii 64;), value: (optional uint;)};);););
    (let (
        (stx-amount (get-param-value params "stx_amount";););        (token-amount (get-param-value params "token_amount";);););        (if (and (is-some stx-amount;) (is-some token-amount;););            (provide-liquidity (unwrap-panic stx-amount;) (unwrap-panic token-amount;););            (err ERR_INVALID_PARAMETER;)
;)
;)
;)

;; Execute remove liquidity instruction
(define-private (execute-remove-liquidity (params (list 10 {key: (string-ascii 64;), value: (optional uint;)};);););
    (let (
        (amount (get-param-value params "amount";);););        (if (is-some amount;);            (remove-liquidity (unwrap-panic amount;););            (err ERR_INVALID_PARAMETER;)
;)
;)
;)

;; Helper function to get parameter value
(define-private (get-param-value (params (list 10 {key: (string-ascii 64;), value: (optional uint;)};);); (key-to-find (string-ascii 64;);););    (let (
        (param (unwrap! (element-at (filter find-by-key params;) u0;) none;);););        (get value param;)
;)
;)

;; Helper function to filter by key
(define-private (find-by-key (param {key: (string-ascii 64;), value: (optional uint;)};););
    (is-eq (get key param;) key-to-find;)
;)

;; Get 24-hour volume
(define-read-only (get-volume-24h;);
    (ok (var-get volume-24h;););)

;; Get trades count
(define-read-only (get-trades-count;);
    (ok (var-get trades-count;););)

;; Get price impact for a given amount
(define-read-only (get-price-impact (amount uint;););
    (let (
        (current-stx-reserve (var-get stx-reserve;););        (current-token-reserve (var-get token-reserve;););        (current-price (get-current-price;););        (new-stx-reserve (+ current-stx-reserve amount;););        (new-token-reserve (/ (* current-stx-reserve current-token-reserve;) new-stx-reserve;););        (new-price (/ (* new-stx-reserve PRICE_PRECISION;) new-token-reserve;););        (price-impact (if (> current-price u0;);                        (/ (* (- new-price current-price;) PRICE_PRECISION;) current-price;)
                        u0;);););        (ok price-impact;)
;)
;)

;; Square root function (Babylonian method;);(define-private (sqrti (n uint;););
    (let (
        (x (/ (+ n u1;) u2;););        (y n;)
;);        (sqrti-iter x y;)
;)
;)

;; Square root iteration
(define-private (sqrti-iter (x uint;); (y uint;););    (if (>= x y;);        (if (is-eq (- x y;) u0;)
            x
            (sqrti-iter (/ (+ x (/ y x;);) u2;) y;)
;);        (sqrti-iter (/ (+ x (/ y x;);) u2;) x;)
;)
;)

;; Add an administrator
(define-public (add-administrator (new-admin principal;););
    (begin
        (asserts! (is-authorized tx-sender;) (err ERR_UNAUTHORIZED;););        (map-set administrators new-admin true;);        (ok true;)
;)
;)

;; Remove an administrator
(define-public (remove-administrator (admin principal;););
    (begin
        (asserts! (is-authorized tx-sender;) (err ERR_UNAUTHORIZED;););        (map-set administrators admin false;);        (ok true;)
;)
;)