Source Code

;; =====================================================================
;; StacksIndex OneClick V44 - Multi-Strategy Support by stxcity
;; =====================================================================
;;
;; Strategies:
;; - BITCOIN_MAXI: sBTC (60%), STX (40%) - from v30
;; - MEME_HUNTER:  WELSH (30%), LEO (30%), DOG (25%), DROID (15%)
;; - DEFI_YIELD:   USDH (30%), sBTC (25%), STX (25%), stSTX (20%)
;; - STACKS_BELIEVER: ALEX (35%), VELAR (35%), STX (30%)
;;
;; Routers:
;; - v-1-2: SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2
;; - v-1-5: SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-5
;; - Alex: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01
;; - Velar: SP20X3DC5R091J8B6YPQT638J8NR1W83KN6TN5BJY.path-apply_staging
;;
;; =====================================================================

;; =====================
;; TRAITS
;; =====================

(use-trait ft-trait 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.sip-010-trait-ft-standard-v-1-1.sip-010-trait)
(use-trait stableswap-pool-trait 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-trait-v-1-4.stableswap-pool-trait)
(use-trait xyk-pool-trait 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-trait-v-1-2.xyk-pool-trait)
(use-trait stableswap-pool-trait-v12 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-trait-v-1-2.stableswap-pool-trait)

;; =====================
;; ERROR CODES
;; =====================

(define-constant ERR-SWAP-FAILED (err u1001))
(define-constant ERR-SWAP-STX-FAILED (err u1002))
(define-constant ERR-SWAP-SBTC-FAILED (err u1003))
(define-constant ERR-SWAP-WELSH-FAILED (err u1004))
(define-constant ERR-SWAP-LEO-FAILED (err u1005))
(define-constant ERR-SWAP-DOG-FAILED (err u1006))
(define-constant ERR-SWAP-DROID-FAILED (err u1007))
(define-constant ERR-SWAP-USDH-FAILED (err u1008))
(define-constant ERR-SWAP-STSTX-FAILED (err u1009))
(define-constant ERR-SWAP-ALEX-FAILED (err u1010))
(define-constant ERR-SWAP-VELAR-FAILED (err u1011))

;; =====================
;; DATA VARIABLES
;; =====================

(define-data-var total-investments uint u0)
(define-data-var total-volume uint u0)

;; =====================
;; USER TRACKING MAP
;; =====================
;; Tracks per-address: total USDCx invested and total USDCx withdrawn
;; This allows calculating profit/loss: withdrawn - invested

(define-map user-stats
  principal
  {
    total-invested: uint,    ;; Total USDCx spent on investments
    total-withdrawn: uint,   ;; Total USDCx received from sells
    invest-count: uint,      ;; Number of investment transactions
    sell-count: uint         ;; Number of sell transactions
  }
)

;; =====================
;; READ-ONLY FUNCTIONS
;; =====================

(define-read-only (get-stats)
  {
    total-investments: (var-get total-investments),
    total-volume: (var-get total-volume)
  }
)

;; Get user's investment/withdrawal stats
(define-read-only (get-user-stats (user principal))
  (default-to
    { total-invested: u0, total-withdrawn: u0, invest-count: u0, sell-count: u0 }
    (map-get? user-stats user)
  )
)

;; Get user's profit/loss (positive = profit, negative would underflow so returns 0)
(define-read-only (get-user-pnl (user principal))
  (let
    (
      (stats (get-user-stats user))
      (invested (get total-invested stats))
      (withdrawn (get total-withdrawn stats))
    )
    {
      invested: invested,
      withdrawn: withdrawn,
      profit: (if (> withdrawn invested) (- withdrawn invested) u0),
      loss: (if (> invested withdrawn) (- invested withdrawn) u0),
      is-profit: (> withdrawn invested)
    }
  )
)

;; =====================
;; PRIVATE HELPER FUNCTIONS
;; =====================

;; Update user stats after investment
(define-private (record-investment (user principal) (amount uint))
  (let
    (
      (current-stats (get-user-stats user))
    )
    (map-set user-stats user
      {
        total-invested: (+ (get total-invested current-stats) amount),
        total-withdrawn: (get total-withdrawn current-stats),
        invest-count: (+ (get invest-count current-stats) u1),
        sell-count: (get sell-count current-stats)
      }
    )
  )
)

;; Update user stats after sell
(define-private (record-withdrawal (user principal) (amount uint))
  (let
    (
      (current-stats (get-user-stats user))
    )
    (map-set user-stats user
      {
        total-invested: (get total-invested current-stats),
        total-withdrawn: (+ (get total-withdrawn current-stats) amount),
        invest-count: (get invest-count current-stats),
        sell-count: (+ (get sell-count current-stats) u1)
      }
    )
  )
)

;; =====================================================================
;; STRATEGY 1: BITCOIN_MAXI (from v30)
;; sBTC: 60%, STX: 40%
;; =====================================================================

(define-public (invest-bitcoin-maxi
    (total-usdcx uint)
    ;; STX (40%)
    (stx-amount uint)
    (stx-min-out uint)
    (stx-ss-token-a <ft-trait>)
    (stx-ss-token-b <ft-trait>)
    (stx-ss-pool <stableswap-pool-trait>)
    (stx-xyk-token-a <ft-trait>)
    (stx-xyk-token-b <ft-trait>)
    (stx-xyk-pool <xyk-pool-trait>)
    ;; sBTC (60%)
    (sbtc-amount uint)
    (sbtc-min-out uint)
    (sbtc-ss-token-a <ft-trait>)
    (sbtc-ss-token-b <ft-trait>)
    (sbtc-ss-pool <stableswap-pool-trait>)
    (sbtc-xyk-token-a <ft-trait>)
    (sbtc-xyk-token-b <ft-trait>)
    (sbtc-xyk-token-c <ft-trait>)
    (sbtc-xyk-token-d <ft-trait>)
    (sbtc-xyk-pool-a <xyk-pool-trait>)
    (sbtc-xyk-pool-b <xyk-pool-trait>)
  )
  (begin
    ;; STX swap
    (if (> stx-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-a
          stx-amount stx-min-out none false
          { a: stx-ss-token-a, b: stx-ss-token-b }
          { a: stx-ss-pool }
          { a: stx-xyk-token-a, b: stx-xyk-token-b }
          { a: stx-xyk-pool }
        ) ERR-SWAP-STX-FAILED)
        true
      )
      true
    )
    ;; sBTC swap
    (if (> sbtc-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-b
          sbtc-amount sbtc-min-out none false
          { a: sbtc-ss-token-a, b: sbtc-ss-token-b }
          { a: sbtc-ss-pool }
          { a: sbtc-xyk-token-a, b: sbtc-xyk-token-b, c: sbtc-xyk-token-c, d: sbtc-xyk-token-d }
          { a: sbtc-xyk-pool-a, b: sbtc-xyk-pool-b }
        ) ERR-SWAP-SBTC-FAILED)
        true
      )
      true
    )
    (var-set total-investments (+ (var-get total-investments) u1))
    (var-set total-volume (+ (var-get total-volume) total-usdcx))
    (record-investment tx-sender total-usdcx)
    (print { event: "invest-bitcoin-maxi", investor: tx-sender, total: total-usdcx })
    (ok { invested: total-usdcx })
  )
)

;; =====================================================================
;; STRATEGY 2: MEME_HUNTER
;; WELSH: 30%, LEO: 30%, DOG: 25%, DROID: 15%
;; =====================================================================

(define-public (invest-meme-hunter
    (total-usdcx uint)
    ;; WELSH (30%) - v-1-5 swap-helper-a
    (welsh-amount uint)
    (welsh-min-out uint)
    (welsh-ss14-token-a <ft-trait>)
    (welsh-ss14-token-b <ft-trait>)
    (welsh-ss14-pool <stableswap-pool-trait>)
    (welsh-ss12-token-a <ft-trait>)
    (welsh-ss12-token-b <ft-trait>)
    (welsh-ss12-pool <stableswap-pool-trait-v12>)
    (welsh-xyk-token-a <ft-trait>)
    (welsh-xyk-token-b <ft-trait>)
    (welsh-xyk-pool <xyk-pool-trait>)
    ;; LEO (30%) - v-1-5 swap-helper-a
    (leo-amount uint)
    (leo-min-out uint)
    (leo-ss14-token-a <ft-trait>)
    (leo-ss14-token-b <ft-trait>)
    (leo-ss14-pool <stableswap-pool-trait>)
    (leo-ss12-token-a <ft-trait>)
    (leo-ss12-token-b <ft-trait>)
    (leo-ss12-pool <stableswap-pool-trait-v12>)
    (leo-xyk-token-a <ft-trait>)
    (leo-xyk-token-b <ft-trait>)
    (leo-xyk-pool <xyk-pool-trait>)
    ;; DOG (25%) - v-1-2 swap-helper-c
    (dog-amount uint)
    (dog-min-out uint)
    (dog-ss-token-a <ft-trait>)
    (dog-ss-token-b <ft-trait>)
    (dog-ss-pool <stableswap-pool-trait>)
    (dog-xyk-token-a <ft-trait>)
    (dog-xyk-token-b <ft-trait>)
    (dog-xyk-token-c <ft-trait>)
    (dog-xyk-token-d <ft-trait>)
    (dog-xyk-token-e <ft-trait>)
    (dog-xyk-token-f <ft-trait>)
    (dog-xyk-pool-a <xyk-pool-trait>)
    (dog-xyk-pool-b <xyk-pool-trait>)
    (dog-xyk-pool-c <xyk-pool-trait>)
    ;; DROID (15%) - v-1-2 swap-helper-c (same structure as DOG)
    (droid-amount uint)
    (droid-min-out uint)
    (droid-ss-token-a <ft-trait>)
    (droid-ss-token-b <ft-trait>)
    (droid-ss-pool <stableswap-pool-trait>)
    (droid-xyk-token-a <ft-trait>)
    (droid-xyk-token-b <ft-trait>)
    (droid-xyk-token-c <ft-trait>)
    (droid-xyk-token-d <ft-trait>)
    (droid-xyk-token-e <ft-trait>)
    (droid-xyk-token-f <ft-trait>)
    (droid-xyk-pool-a <xyk-pool-trait>)
    (droid-xyk-pool-b <xyk-pool-trait>)
    (droid-xyk-pool-c <xyk-pool-trait>)
  )
  (begin
    ;; WELSH swap via v-1-5 router
    (if (> welsh-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-5 swap-helper-a
          welsh-amount welsh-min-out none false
          { a: welsh-ss14-token-a, b: welsh-ss14-token-b }
          { a: welsh-ss14-pool }
          { a: welsh-ss12-token-a, b: welsh-ss12-token-b }
          { a: welsh-ss12-pool }
          { a: welsh-xyk-token-a, b: welsh-xyk-token-b }
          { a: welsh-xyk-pool }
        ) ERR-SWAP-WELSH-FAILED)
        true
      )
      true
    )
    ;; LEO swap via v-1-5 router
    (if (> leo-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-5 swap-helper-a
          leo-amount leo-min-out none false
          { a: leo-ss14-token-a, b: leo-ss14-token-b }
          { a: leo-ss14-pool }
          { a: leo-ss12-token-a, b: leo-ss12-token-b }
          { a: leo-ss12-pool }
          { a: leo-xyk-token-a, b: leo-xyk-token-b }
          { a: leo-xyk-pool }
        ) ERR-SWAP-LEO-FAILED)
        true
      )
      true
    )
    ;; DOG swap via v-1-2 router
    (if (> dog-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-c
          dog-amount dog-min-out none false
          { a: dog-ss-token-a, b: dog-ss-token-b }
          { a: dog-ss-pool }
          { a: dog-xyk-token-a, b: dog-xyk-token-b, c: dog-xyk-token-c, d: dog-xyk-token-d, e: dog-xyk-token-e, f: dog-xyk-token-f }
          { a: dog-xyk-pool-a, b: dog-xyk-pool-b, c: dog-xyk-pool-c }
        ) ERR-SWAP-DOG-FAILED)
        true
      )
      true
    )
    ;; DROID swap via v-1-2 router
    (if (> droid-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-c
          droid-amount droid-min-out none false
          { a: droid-ss-token-a, b: droid-ss-token-b }
          { a: droid-ss-pool }
          { a: droid-xyk-token-a, b: droid-xyk-token-b, c: droid-xyk-token-c, d: droid-xyk-token-d, e: droid-xyk-token-e, f: droid-xyk-token-f }
          { a: droid-xyk-pool-a, b: droid-xyk-pool-b, c: droid-xyk-pool-c }
        ) ERR-SWAP-DROID-FAILED)
        true
      )
      true
    )
    (var-set total-investments (+ (var-get total-investments) u1))
    (var-set total-volume (+ (var-get total-volume) total-usdcx))
    (record-investment tx-sender total-usdcx)
    (print { event: "invest-meme-hunter", investor: tx-sender, total: total-usdcx })
    (ok { invested: total-usdcx })
  )
)

;; =====================================================================
;; STRATEGY 3: DEFI_YIELD
;; USDH: 30%, sBTC: 25%, STX: 25%, stSTX: 20%
;; =====================================================================

(define-public (invest-defi-yield
    (total-usdcx uint)
    ;; USDH (30%) - v-1-5 swap-helper-c (stableswap only)
    (usdh-amount uint)
    (usdh-min-out uint)
    (usdh-ss14-token-a <ft-trait>)
    (usdh-ss14-token-b <ft-trait>)
    (usdh-ss14-pool <stableswap-pool-trait>)
    (usdh-ss12-token-a <ft-trait>)
    (usdh-ss12-token-b <ft-trait>)
    (usdh-ss12-pool <stableswap-pool-trait-v12>)
    ;; sBTC (25%) - v-1-2 swap-helper-b
    (sbtc-amount uint)
    (sbtc-min-out uint)
    (sbtc-ss-token-a <ft-trait>)
    (sbtc-ss-token-b <ft-trait>)
    (sbtc-ss-pool <stableswap-pool-trait>)
    (sbtc-xyk-token-a <ft-trait>)
    (sbtc-xyk-token-b <ft-trait>)
    (sbtc-xyk-token-c <ft-trait>)
    (sbtc-xyk-token-d <ft-trait>)
    (sbtc-xyk-pool-a <xyk-pool-trait>)
    (sbtc-xyk-pool-b <xyk-pool-trait>)
    ;; STX (25%) - v-1-2 swap-helper-a
    (stx-amount uint)
    (stx-min-out uint)
    (stx-ss-token-a <ft-trait>)
    (stx-ss-token-b <ft-trait>)
    (stx-ss-pool <stableswap-pool-trait>)
    (stx-xyk-token-a <ft-trait>)
    (stx-xyk-token-b <ft-trait>)
    (stx-xyk-pool <xyk-pool-trait>)
    ;; stSTX (20%) - Two-step: USDCx -> STX -> stSTX
    (ststx-usdcx-amount uint)
    (ststx-stx-min-out uint)
    (ststx-final-min-out uint)
    (ststx-ss-token-a <ft-trait>)
    (ststx-ss-token-b <ft-trait>)
    (ststx-ss-pool <stableswap-pool-trait>)
    (ststx-xyk-token-a <ft-trait>)
    (ststx-xyk-token-b <ft-trait>)
    (ststx-xyk-pool <xyk-pool-trait>)
  )
  (begin
    ;; USDH swap via v-1-5 router (stableswap only)
    (if (> usdh-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-5 swap-helper-c
          usdh-amount usdh-min-out none false
          { a: usdh-ss14-token-a, b: usdh-ss14-token-b }
          { a: usdh-ss14-pool }
          { a: usdh-ss12-token-a, b: usdh-ss12-token-b }
          { a: usdh-ss12-pool }
        ) ERR-SWAP-USDH-FAILED)
        true
      )
      true
    )
    ;; sBTC swap via v-1-2 router
    (if (> sbtc-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-b
          sbtc-amount sbtc-min-out none false
          { a: sbtc-ss-token-a, b: sbtc-ss-token-b }
          { a: sbtc-ss-pool }
          { a: sbtc-xyk-token-a, b: sbtc-xyk-token-b, c: sbtc-xyk-token-c, d: sbtc-xyk-token-d }
          { a: sbtc-xyk-pool-a, b: sbtc-xyk-pool-b }
        ) ERR-SWAP-SBTC-FAILED)
        true
      )
      true
    )
    ;; STX swap via v-1-2 router
    (if (> stx-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-a
          stx-amount stx-min-out none false
          { a: stx-ss-token-a, b: stx-ss-token-b }
          { a: stx-ss-pool }
          { a: stx-xyk-token-a, b: stx-xyk-token-b }
          { a: stx-xyk-pool }
        ) ERR-SWAP-STX-FAILED)
        true
      )
      true
    )
    ;; stSTX: Two-step swap, get the result from first tx and use it as input for second tx
    (if (> ststx-usdcx-amount u0)
      (let
        (
          ;; Step 1: USDCx -> STX - capture the output amount
          (stx-received (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-a
            ststx-usdcx-amount ststx-stx-min-out none false
            { a: ststx-ss-token-a, b: ststx-ss-token-b }
            { a: ststx-ss-pool }
            { a: ststx-xyk-token-a, b: ststx-xyk-token-b }
            { a: ststx-xyk-pool }
          ) ERR-SWAP-STX-FAILED))
        )
        ;; Step 2: STX -> stSTX - use the actual STX received from step 1
        (unwrap! (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2 swap-x-for-y
          'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token
          'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2
          stx-received
          ststx-final-min-out
        ) ERR-SWAP-STSTX-FAILED)
        true
      )
      true
    )
    (var-set total-investments (+ (var-get total-investments) u1))
    (var-set total-volume (+ (var-get total-volume) total-usdcx))
    (record-investment tx-sender total-usdcx)
    (print { event: "invest-defi-yield", investor: tx-sender, total: total-usdcx })
    (ok { invested: total-usdcx })
  )
)

;; =====================================================================
;; STRATEGY 4: STACKS_BELIEVER
;; ALEX: 35%, VELAR: 35%, STX: 30%
;; All routes are two-step: USDCx -> STX first, then STX -> target token
;; =====================================================================

(define-public (invest-stacks-believer
    (total-usdcx uint)
    ;; STX (30%) - direct via Bitflow
    (stx-usdcx-amount uint)
    (stx-min-out uint)
    ;; ALEX (35%) - two-step: USDCx -> STX -> ALEX
    (alex-usdcx-amount uint)
    (alex-stx-min-out uint)
    (alex-min-out uint)
    ;; VELAR (35%) - two-step: USDCx -> STX -> VELAR
    (velar-usdcx-amount uint)
    (velar-stx-min-out uint)
    (velar-min-out uint)
  )
  (begin
    ;; STX swap (30%) - USDCx -> STX via Bitflow router-stableswap-xyk-v-1-5
    (if (> stx-usdcx-amount u0)
      (begin
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-v-1-5 swap-helper-a
          stx-usdcx-amount stx-min-out none false
          { a: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
          { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-1 }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-1 }
        ) ERR-SWAP-STX-FAILED)
        true
      )
      true
    )
    ;; ALEX swap (35%) - Two-step: USDCx -> STX -> ALEX
    (if (> alex-usdcx-amount u0)
      (let
        (
          ;; Step 1: USDCx -> STX via Bitflow
          (stx-for-alex (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-v-1-5 swap-helper-a
            alex-usdcx-amount alex-stx-min-out none false
            { a: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
            { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
            { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-1 }
            { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-1 }
          ) ERR-SWAP-STX-FAILED))
        )
        ;; Step 2: STX -> ALEX via Alex AMM (swap-helper-a: wSTX -> wCORGI -> ALEX)
        (unwrap! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper-a
          'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-wstx-v2
          'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-wcorgi
          'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex
          u100000000  ;; factor-x
          u100000000  ;; factor-y
          stx-for-alex
          (some alex-min-out)
        ) ERR-SWAP-ALEX-FAILED)
        true
      )
      true
    )
    ;; VELAR swap (35%) - Two-step: USDCx -> STX -> VELAR
    (if (> velar-usdcx-amount u0)
      (let
        (
          ;; Step 1: USDCx -> STX via Bitflow
          (stx-for-velar (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-v-1-5 swap-helper-a
            velar-usdcx-amount velar-stx-min-out none false
            { a: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
            { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
            { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-1 }
            { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-1 }
          ) ERR-SWAP-STX-FAILED))
        )
        ;; Step 2: STX -> VELAR via Velar path-apply
        (unwrap! (contract-call? 'SP20X3DC5R091J8B6YPQT638J8NR1W83KN6TN5BJY.path-apply_staging apply
          ;; path: list of tuples defining the swap route
          (list
            {
              a: "u",
              b: 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.velar-stx,
              c: u21,
              d: 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.wstx,
              e: 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.velar-token,
              f: false
            }
          )
          stx-for-velar  ;; amt-in
          (some 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.wstx)         ;; token1
          (some 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.velar-token)  ;; token2
          none  ;; token3
          none  ;; token4
          none  ;; token5
          (some 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-share-fee-to)  ;; share-fee-to
          none none none none  ;; univ2v2-pool-1 to 4
          none none none none  ;; univ2v2-fees-1 to 4
          none none none none  ;; curve-pool-1 to 4
          none none none none  ;; curve-fees-1 to 4
          none none none none  ;; ststx-pool-1 to 4
          none none none none  ;; ststx-proxy-1 to 4
        ) ERR-SWAP-VELAR-FAILED)
        true
      )
      true
    )
    (var-set total-investments (+ (var-get total-investments) u1))
    (var-set total-volume (+ (var-get total-volume) total-usdcx))
    (record-investment tx-sender total-usdcx)
    (print { event: "invest-stacks-believer", investor: tx-sender, total: total-usdcx })
    (ok { invested: total-usdcx })
  )
)

;; =====================================================================
;; SELL FUNCTION - Convert portfolio tokens back to USDCx in one transaction
;; Supports all strategy tokens:
;; - BITCOIN_MAXI/DEFI_YIELD: STX, sBTC, stSTX, USDH
;; - MEME_HUNTER: WELSH, LEO, DOG, DROID
;; - STACKS_BELIEVER: ALEX, VELAR (+ STX)
;;
;; Routes:
;; - STX: router-stableswap-xyk-v-1-5.swap-helper-a (reversed)
;; - sBTC: router-stableswap-xyk-multihop-v-1-2.swap-helper-b (reversed)
;; - stSTX: stableswap-swap-helper-v-1-5 (stSTX->STX) then STX->USDCx
;; - WELSH: router-stableswap-xyk-multihop-v-1-2.swap-helper-b (reversed)
;; - LEO: router-stableswap-velar-v-1-5.swap-helper-a (reversed)
;; - DOG: router-stableswap-xyk-multihop-v-1-2.swap-helper-c (reversed)
;; - DROID: router-stableswap-xyk-multihop-v-1-2.swap-helper-c (reversed)
;; - USDH: stableswap-swap-helper-v-1-5.swap-helper-a
;; - ALEX: Alex AMM (ALEX->STX) then STX->USDCx
;; - VELAR: Velar path-apply (VELAR->STX) then STX->USDCx
;; =====================================================================

(define-public (sell-portfolio
    ;; STX -> USDCx (via router-stableswap-xyk-v-1-5.swap-helper-a reversed)
    (stx-amount uint)
    (stx-min-out uint)
    ;; sBTC -> USDCx (via v-1-2 swap-helper-b reversed)
    (sbtc-amount uint)
    (sbtc-min-out uint)
    ;; stSTX -> USDCx (two-step: stSTX -> STX via stableswap, then STX -> USDCx)
    (ststx-amount uint)
    (ststx-stx-min-out uint)
    (ststx-usdcx-min-out uint)
    ;; WELSH -> USDCx (via v-1-2 swap-helper-b reversed)
    (welsh-amount uint)
    (welsh-min-out uint)
    ;; LEO -> USDCx (via router-stableswap-velar-v-1-5.swap-helper-a reversed)
    (leo-amount uint)
    (leo-min-out uint)
    ;; DOG -> USDCx (via v-1-2 swap-helper-c reversed)
    (dog-amount uint)
    (dog-min-out uint)
    ;; DROID -> USDCx (via v-1-2 swap-helper-c reversed)
    (droid-amount uint)
    (droid-min-out uint)
    ;; USDH -> USDCx (via stableswap-swap-helper-v-1-5.swap-helper-a)
    (usdh-amount uint)
    (usdh-min-out uint)
    ;; ALEX -> USDCx (two-step: ALEX -> STX via Alex, then STX -> USDCx)
    (alex-amount uint)
    (alex-stx-min-out uint)
    (alex-usdcx-min-out uint)
    ;; VELAR -> USDCx (two-step: VELAR -> STX via Velar, then STX -> USDCx)
    (velar-amount uint)
    (velar-stx-min-out uint)
    (velar-usdcx-min-out uint)
  )
  (let
    (
      ;; ===== SELL STX -> USDCx =====
      (usdcx-from-stx (if (> stx-amount u0)
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-v-1-5 swap-helper-a
          stx-amount stx-min-out none true
          { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-1, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-1 }
        ) ERR-SWAP-STX-FAILED)
        u0))
      ;; ===== SELL sBTC -> USDCx =====
      (usdcx-from-sbtc (if (> sbtc-amount u0)
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-b
          sbtc-amount sbtc-min-out none true
          { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
          { a: 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, c: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, d: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-sbtc-stx-v-1-1, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-2 }
        ) ERR-SWAP-SBTC-FAILED)
        u0))
      ;; ===== SELL WELSH -> USDCx =====
      (usdcx-from-welsh (if (> welsh-amount u0)
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-b
          welsh-amount welsh-min-out none true
          { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
          { a: 'SP3NE50GEXFG9SZGTT51P40X2CKYSZ5CC4ZTZ7A2G.welshcorgicoin-token, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, c: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, d: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-welsh-stx-v-1-1, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-2 }
        ) ERR-SWAP-WELSH-FAILED)
        u0))
      ;; ===== SELL LEO -> USDCx =====
      (usdcx-from-leo (if (> leo-amount u0)
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-velar-v-1-5 swap-helper-a
          leo-amount leo-min-out none true
          { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
          { a: 'SP1AY6K3PQV5MRT6R4S671NWW2FRVPKM0BR162CT6.leo-token, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
          'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-share-fee-to
        ) ERR-SWAP-LEO-FAILED)
        u0))
      ;; ===== SELL DOG -> USDCx =====
      (usdcx-from-dog (if (> dog-amount u0)
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-c
          dog-amount dog-min-out none true
          { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
          { a: 'SP14NS8MVBRHXMM96BQY0727AJ59SWPV7RMHC0NCG.pontis-bridge-DOG, b: 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token, c: 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token, d: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, e: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, f: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-sbtc-dog-v-1-1, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-sbtc-stx-v-1-1, c: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-2 }
        ) ERR-SWAP-DOG-FAILED)
        u0))
      ;; ===== SELL DROID -> USDCx =====
      (usdcx-from-droid (if (> droid-amount u0)
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-multihop-v-1-2 swap-helper-c
          droid-amount droid-min-out none true
          { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
          { a: 'SP2EEV5QBZA454MSMW9W3WJNRXVJF36VPV17FFKYH.DROID, b: 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token, c: 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token, d: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, e: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2, f: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-sbtc-droid-v-1-1, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-sbtc-stx-v-1-1, c: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-2 }
        ) ERR-SWAP-DROID-FAILED)
        u0))
      ;; ===== SELL USDH -> USDCx =====
      (usdcx-from-usdh (if (> usdh-amount u0)
        (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-swap-helper-v-1-5 swap-helper-a
          usdh-amount usdh-min-out none
          { a: 'SPN5AKG35QZSK2M8GAMR4AFX45659RJHDW353HSG.usdh-token-v1, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
          { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-usdh-usdcx-v-1-1 }
        ) ERR-SWAP-USDH-FAILED)
        u0))
    )
    ;; ===== TWO-STEP SWAPS (stSTX, ALEX, VELAR) =====
    ;; These require nested lets for the intermediate STX amounts

    ;; Sell stSTX -> USDCx (two-step)
    (let
      (
        (usdcx-from-ststx (if (> ststx-amount u0)
          (let
            (
              (stx-received (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-swap-helper-v-1-5 swap-helper-a
                ststx-amount ststx-stx-min-out none
                { a: 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token, b: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-2 }
                { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-stx-ststx-v-1-4 }
              ) ERR-SWAP-STSTX-FAILED))
            )
            (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-v-1-5 swap-helper-a
              stx-received ststx-usdcx-min-out none true
              { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
              { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
              { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-1, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
              { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-1 }
            ) ERR-SWAP-STX-FAILED)
          )
          u0))
      )
      ;; Sell ALEX -> USDCx (two-step)
      (let
        (
          (usdcx-from-alex (if (> alex-amount u0)
            (let
              (
                (stx-from-alex (unwrap! (contract-call? 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01 swap-helper
                  'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex
                  'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-wstx-v2
                  u100000000
                  alex-amount
                  (some alex-stx-min-out)
                ) ERR-SWAP-ALEX-FAILED))
              )
              (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-v-1-5 swap-helper-a
                stx-from-alex alex-usdcx-min-out none true
                { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
                { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
                { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-1, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
                { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-1 }
              ) ERR-SWAP-STX-FAILED)
            )
            u0))
        )
        ;; Sell VELAR -> USDCx (two-step)
        (let
          (
            (usdcx-from-velar (if (> velar-amount u0)
              (let
                (
                  (velar-swap-result (unwrap! (contract-call? 'SP20X3DC5R091J8B6YPQT638J8NR1W83KN6TN5BJY.path-apply_staging apply
                    (list
                      {
                        a: "u",
                        b: 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.velar-stx,
                        c: u21,
                        d: 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.velar-token,
                        e: 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.wstx,
                        f: true
                      }
                    )
                    velar-amount
                    (some 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.velar-token)
                    (some 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.wstx)
                    none none none
                    (some 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-share-fee-to)
                    none none none none
                    none none none none
                    none none none none
                    none none none none
                    none none none none
                    none none none none
                  ) ERR-SWAP-VELAR-FAILED))
                  (stx-from-velar (get amt-out (get swap1 velar-swap-result)))
                )
                (unwrap! (contract-call? 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.router-stableswap-xyk-v-1-5 swap-helper-a
                  stx-from-velar velar-usdcx-min-out none true
                  { a: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc, b: 'SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx }
                  { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.stableswap-pool-aeusdc-usdcx-v-1-1 }
                  { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-stx-v-1-1, b: 'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc }
                  { a: 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.xyk-pool-stx-aeusdc-v-1-1 }
                ) ERR-SWAP-STX-FAILED)
              )
              u0))
            ;; Calculate total USDCx received
            (total-usdcx-received (+ usdcx-from-stx usdcx-from-sbtc usdcx-from-welsh usdcx-from-leo usdcx-from-dog usdcx-from-droid usdcx-from-usdh usdcx-from-ststx usdcx-from-alex usdcx-from-velar))
          )
          ;; Record the withdrawal
          (record-withdrawal tx-sender total-usdcx-received)
          (print { event: "sell-portfolio", seller: tx-sender, stx: stx-amount, sbtc: sbtc-amount, ststx: ststx-amount, welsh: welsh-amount, leo: leo-amount, dog: dog-amount, droid: droid-amount, usdh: usdh-amount, alex: alex-amount, velar: velar-amount, total-usdcx: total-usdcx-received })
          (ok { sold-stx: stx-amount, sold-sbtc: sbtc-amount, sold-ststx: ststx-amount, sold-welsh: welsh-amount, sold-leo: leo-amount, sold-dog: dog-amount, sold-droid: droid-amount, sold-usdh: usdh-amount, sold-alex: alex-amount, sold-velar: velar-amount, total-usdcx-received: total-usdcx-received })
        )
      )
    )
  )
)

;; =====================================================================
;; END OF CONTRACT
;; =====================================================================

Functions (5)

FunctionAccessArgs
get-statsread-only
get-user-statsread-onlyuser: principal
get-user-pnlread-onlyuser: principal
record-investmentprivateuser: principal, amount: uint
record-withdrawalprivateuser: principal, amount: uint