Source Code

(define-constant CONTRACT-VERSION u1)

(define-constant ERR-NOT-AUTHORIZED (err u200))
(define-constant ERR-STRATEGY-NOT-FOUND (err u201))
(define-constant ERR-STRATEGY-INACTIVE (err u202))
(define-constant ERR-INVALID-ALLOCATION (err u203))
(define-constant ERR-INSUFFICIENT-LIQUIDITY (err u204))
(define-constant ERR-REBALANCE-THRESHOLD-NOT-MET (err u205))

(define-data-var contract-owner principal tx-sender)

(define-map strategies
  {strategy-id: (string-ascii 32)}
  {
    adapter-contract: principal,
    active: bool,
    risk-score: uint,
    current-allocation: uint,
    target-percentage: uint
  }
)

(define-data-var rebalance-threshold uint u500)
(define-data-var last-rebalance-block uint u0)
(define-data-var min-rebalance-interval uint u144)
(define-data-var active-strategies (list 10 (string-ascii 32)) (list))

(define-private (is-contract-owner)
  (is-eq tx-sender (var-get contract-owner))
)

(define-public (register-strategy
  (strategy-id (string-ascii 32))
  (adapter principal)
  (risk-score uint)
  (target-pct uint)
)
  (begin
    (asserts! (is-contract-owner) ERR-NOT-AUTHORIZED)
    (asserts! (<= target-pct u10000) ERR-INVALID-ALLOCATION)
    (map-set strategies
      {strategy-id: strategy-id}
      {
        adapter-contract: adapter,
        active: true,
        risk-score: risk-score,
        current-allocation: u0,
        target-percentage: target-pct
      }
    )
    (var-set active-strategies
      (unwrap-panic (as-max-len?
        (append (var-get active-strategies) strategy-id)
        u10
      ))
    )
    (ok strategy-id)
  )
)

(define-public (deactivate-strategy (strategy-id (string-ascii 32)))
  (let
    (
      (strategy (unwrap! (map-get? strategies {strategy-id: strategy-id}) ERR-STRATEGY-NOT-FOUND))
    )
    (asserts! (is-contract-owner) ERR-NOT-AUTHORIZED)
    (map-set strategies
      {strategy-id: strategy-id}
      (merge strategy {active: false})
    )
    (ok true)
  )
)

(define-read-only (get-strategy-info (strategy-id (string-ascii 32)))
  (ok (map-get? strategies {strategy-id: strategy-id}))
)

(define-read-only (get-active-strategies)
  (ok (var-get active-strategies))
)

(define-read-only (get-total-allocation)
  (ok u0)
)

(define-public (update-target-allocation
  (strategy-id (string-ascii 32))
  (new-target uint)
)
  (let
    (
      (strategy (unwrap! (map-get? strategies {strategy-id: strategy-id}) ERR-STRATEGY-NOT-FOUND))
    )
    (asserts! (is-contract-owner) ERR-NOT-AUTHORIZED)
    (asserts! (<= new-target u10000) ERR-INVALID-ALLOCATION)
    (map-set strategies
      {strategy-id: strategy-id}
      (merge strategy {target-percentage: new-target})
    )
    (ok new-target)
  )
)

(define-public (allocate-capital (amount uint))
  (begin
    (ok amount)
  )
)

(define-public (free-capital (amount uint))
  (begin
    (ok amount)
  )
)

(define-public (rebalance)
  (begin
    (asserts! (is-contract-owner) ERR-NOT-AUTHORIZED)
    (asserts!
      (>= (- block-height (var-get last-rebalance-block)) (var-get min-rebalance-interval))
      ERR-REBALANCE-THRESHOLD-NOT-MET
    )
    (var-set last-rebalance-block block-height)
    (ok true)
  )
)

(define-public (update-rebalance-config (threshold uint) (interval uint))
  (begin
    (asserts! (is-contract-owner) ERR-NOT-AUTHORIZED)
    (var-set rebalance-threshold threshold)
    (var-set min-rebalance-interval interval)
    (ok true)
  )
)

(define-public (transfer-ownership (new-owner principal))
  (begin
    (asserts! (is-contract-owner) ERR-NOT-AUTHORIZED)
    (var-set contract-owner new-owner)
    (ok new-owner)
  )
)

Functions (12)

FunctionAccessArgs
is-contract-ownerprivate
register-strategypublicstrategy-id: (string-ascii 32
deactivate-strategypublicstrategy-id: (string-ascii 32
get-strategy-inforead-onlystrategy-id: (string-ascii 32
get-active-strategiesread-only
get-total-allocationread-only
update-target-allocationpublicstrategy-id: (string-ascii 32
allocate-capitalpublicamount: uint
free-capitalpublicamount: uint
rebalancepublic
update-rebalance-configpublicthreshold: uint, interval: uint
transfer-ownershippublicnew-owner: principal