Source Code

;; previous-moccasin-penguin

;; Use DLMM pool trait and SIP 010 trait
(use-trait dlmm-pool-trait .consistent-harlequin-crane.dlmm-pool-trait)
(use-trait sip-010-trait 'SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.sip-010-trait-ft-standard-v-1-1.sip-010-trait)

(define-constant ERR_NO_RESULT_DATA (err u2001))
(define-constant ERR_MINIMUM_X_AMOUNT (err u2002))
(define-constant ERR_MINIMUM_Y_AMOUNT (err u2003))
(define-constant ERR_MINIMUM_LP_AMOUNT (err u2004))
(define-constant ERR_NO_ACTIVE_BIN_DATA (err u2005))
(define-constant ERR_EMPTY_POSITIONS_LIST (err u2006))

;; Add liquidity to multiple bins in multiple pools
(define-public (add-liquidity-multi
    (positions (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, x-amount: uint, y-amount: uint}))
    (min-dlp uint)
  )
  (let (
    (add-liquidity-result (try! (fold fold-add-liquidity-multi positions (ok u0))))
  )
    (asserts! (> (len positions) u0) ERR_EMPTY_POSITIONS_LIST)
    (asserts! (>= add-liquidity-result min-dlp) ERR_MINIMUM_LP_AMOUNT)
    (ok add-liquidity-result)
  )
)

;; Add liquidity to multiple bins in multiple pools relative to the active bin
(define-public (add-relative-liquidity-multi
    (positions (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, x-amount: uint, y-amount: uint}))
    (min-dlp uint)
  )
  (let (
    (add-liquidity-result (try! (fold fold-add-relative-liquidity-multi positions (ok u0))))
  )
    (asserts! (> (len positions) u0) ERR_EMPTY_POSITIONS_LIST)
    (asserts! (>= add-liquidity-result min-dlp) ERR_MINIMUM_LP_AMOUNT)
    (ok add-liquidity-result)
  )
)

;; Withdraw liquidity from multiple bins in multiple pools
(define-public (withdraw-liquidity-multi
    (positions (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, amount: uint}))
    (min-x-amount uint) (min-y-amount uint)
  )
  (let (
    (withdraw-liquidity-result (try! (fold fold-withdraw-liquidity-multi positions (ok {x-amount: u0, y-amount: u0}))))
  )
    (asserts! (> (len positions) u0) ERR_EMPTY_POSITIONS_LIST)
    (asserts! (>= (get x-amount withdraw-liquidity-result) min-x-amount) ERR_MINIMUM_X_AMOUNT)
    (asserts! (>= (get y-amount withdraw-liquidity-result) min-y-amount) ERR_MINIMUM_Y_AMOUNT)
    (ok withdraw-liquidity-result)
  )
)

;; Withdraw liquidity from multiple bins in multiple pools relative to the active bin
(define-public (withdraw-relative-liquidity-multi
    (positions (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, amount: uint}))
    (min-x-amount uint) (min-y-amount uint)
  )
  (let (
    (withdraw-liquidity-result (try! (fold fold-withdraw-relative-liquidity-multi positions (ok {x-amount: u0, y-amount: u0}))))
  )
    (asserts! (> (len positions) u0) ERR_EMPTY_POSITIONS_LIST)
    (asserts! (>= (get x-amount withdraw-liquidity-result) min-x-amount) ERR_MINIMUM_X_AMOUNT)
    (asserts! (>= (get y-amount withdraw-liquidity-result) min-y-amount) ERR_MINIMUM_Y_AMOUNT)
    (ok withdraw-liquidity-result)
  )
)

;; Move liquidity for multiple bins in multiple pools
(define-public (move-liquidity-multi
    (positions (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, to-bin-id: int, amount: uint}))
    (min-dlp uint)
  )
  (let (
    (move-liquidity-result (try! (fold fold-move-liquidity-multi positions (ok u0))))
  )
    (asserts! (> (len positions) u0) ERR_EMPTY_POSITIONS_LIST)
    (asserts! (>= move-liquidity-result min-dlp) ERR_MINIMUM_LP_AMOUNT)
    (ok move-liquidity-result)
  )
)

;; Move liquidity for multiple bins in multiple pools relative to the active bin
(define-public (move-relative-liquidity-multi
    (positions (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, active-bin-id-offset: int, amount: uint}))
    (min-dlp uint)
  )
  (let (
    (move-liquidity-result (try! (fold fold-move-relative-liquidity-multi positions (ok u0))))
  )
    (asserts! (> (len positions) u0) ERR_EMPTY_POSITIONS_LIST)
    (asserts! (>= move-liquidity-result min-dlp) ERR_MINIMUM_LP_AMOUNT)
    (ok move-liquidity-result)
  )
)

;; Fold function to add liquidity to multiple bins in multiple pools
(define-private (fold-add-liquidity-multi
    (position {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, x-amount: uint, y-amount: uint})
    (result (response uint uint))
  )
  (let (
    (add-liquidity-result (try! (contract-call? .working-amaranth-clownfish add-liquidity (get pool-trait position) (get x-token-trait position) (get y-token-trait position) (get bin-id position) (get x-amount position) (get y-amount position) u1)))
    (updated-result (+ (unwrap! result ERR_NO_RESULT_DATA) add-liquidity-result))
  )
    (ok updated-result)
  )
)

;; Fold function to add liquidity to multiple bins in multiple pools relative to the active bin
(define-private (fold-add-relative-liquidity-multi
    (position {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, x-amount: uint, y-amount: uint})
    (result (response uint uint))
  )
  (let (
    (pool-trait (get pool-trait position))
    (active-bin-id (unwrap! (contract-call? pool-trait get-active-bin-id) ERR_NO_ACTIVE_BIN_DATA))
    (bin-id (+ active-bin-id (get active-bin-id-offset position)))
    (add-liquidity-result (try! (contract-call? .working-amaranth-clownfish add-liquidity (get pool-trait position) (get x-token-trait position) (get y-token-trait position) bin-id (get x-amount position) (get y-amount position) u1)))
    (updated-result (+ (unwrap! result ERR_NO_RESULT_DATA) add-liquidity-result))
  )
    (ok updated-result)
  )
)

;; Fold function to withdraw liquidity from multiple bins in multiple pools
(define-private (fold-withdraw-liquidity-multi
    (position {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, amount: uint})
    (result (response {x-amount: uint, y-amount: uint} uint))
  )
  (let (
    (result-data (unwrap! result ERR_NO_RESULT_DATA))
    (pool-trait (get pool-trait position))
    (active-bin-id (unwrap! (contract-call? pool-trait get-active-bin-id) ERR_NO_ACTIVE_BIN_DATA))
    (bin-id (get bin-id position))
    (min-x-amount (if (>= bin-id active-bin-id) u1 u0))
    (min-y-amount (if (>= bin-id active-bin-id) u0 u1))
    (withdraw-liquidity-result (try! (contract-call? .working-amaranth-clownfish withdraw-liquidity (get pool-trait position) (get x-token-trait position) (get y-token-trait position) bin-id (get amount position) min-x-amount min-y-amount)))
    (updated-x-amount (+ (get x-amount result-data) (get x-amount withdraw-liquidity-result)))
    (updated-y-amount (+ (get y-amount result-data) (get y-amount withdraw-liquidity-result)))
  )
    (ok {x-amount: updated-x-amount, y-amount: updated-y-amount})
  )
)

;; Fold function to withdraw liquidity from multiple bins in multiple pools relative to the active bin
(define-private (fold-withdraw-relative-liquidity-multi
    (position {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, amount: uint})
    (result (response {x-amount: uint, y-amount: uint} uint))
  )
  (let (
    (result-data (unwrap! result ERR_NO_RESULT_DATA))
    (pool-trait (get pool-trait position))
    (active-bin-id (unwrap! (contract-call? pool-trait get-active-bin-id) ERR_NO_ACTIVE_BIN_DATA))
    (bin-id (+ active-bin-id (get active-bin-id-offset position)))
    (min-x-amount (if (>= bin-id active-bin-id) u1 u0))
    (min-y-amount (if (>= bin-id active-bin-id) u0 u1))
    (withdraw-liquidity-result (try! (contract-call? .working-amaranth-clownfish withdraw-liquidity (get pool-trait position) (get x-token-trait position) (get y-token-trait position) bin-id (get amount position) min-x-amount min-y-amount)))
    (updated-x-amount (+ (get x-amount result-data) (get x-amount withdraw-liquidity-result)))
    (updated-y-amount (+ (get y-amount result-data) (get y-amount withdraw-liquidity-result)))
  )
    (ok {x-amount: updated-x-amount, y-amount: updated-y-amount})
  )
)

;; Fold function to move liquidity for multiple bins in multiple pools
(define-private (fold-move-liquidity-multi
    (position {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, to-bin-id: int, amount: uint})
    (result (response uint uint))
  )
  (let (
    (move-liquidity-result (try! (contract-call? .working-amaranth-clownfish move-liquidity (get pool-trait position) (get x-token-trait position) (get y-token-trait position) (get from-bin-id position) (get to-bin-id position) (get amount position) u1)))
    (updated-result (+ (unwrap! result ERR_NO_RESULT_DATA) move-liquidity-result))
  )
    (ok updated-result)
  )
)

;; Fold function to move liquidity for multiple bins in multiple pools relative to the active bin
(define-private (fold-move-relative-liquidity-multi
    (position {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, active-bin-id-offset: int, amount: uint})
    (result (response uint uint))
  )
  (let (
    (pool-trait (get pool-trait position))
    (active-bin-id (unwrap! (contract-call? pool-trait get-active-bin-id) ERR_NO_ACTIVE_BIN_DATA))
    (to-bin-id (+ active-bin-id (get active-bin-id-offset position)))
    (move-liquidity-result (try! (contract-call? .working-amaranth-clownfish move-liquidity (get pool-trait position) (get x-token-trait position) (get y-token-trait position) (get from-bin-id position) to-bin-id (get amount position) u1)))
    (updated-result (+ (unwrap! result ERR_NO_RESULT_DATA) move-liquidity-result))
  )
    (ok updated-result)
  )
)

Functions (12)

FunctionAccessArgs
add-liquidity-multipublicpositions: (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, x-amount: uint, y-amount: uint}
add-relative-liquidity-multipublicpositions: (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, x-amount: uint, y-amount: uint}
withdraw-liquidity-multipublicpositions: (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, amount: uint}
withdraw-relative-liquidity-multipublicpositions: (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, amount: uint}
move-liquidity-multipublicpositions: (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, to-bin-id: int, amount: uint}
move-relative-liquidity-multipublicpositions: (list 350 {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, active-bin-id-offset: int, amount: uint}
fold-add-liquidity-multiprivateposition: {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, x-amount: uint, y-amount: uint}, result: (response uint uint
fold-add-relative-liquidity-multiprivateposition: {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, x-amount: uint, y-amount: uint}, result: (response uint uint
fold-withdraw-liquidity-multiprivateposition: {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, bin-id: int, amount: uint}, result: (response {x-amount: uint, y-amount: uint} uint
fold-withdraw-relative-liquidity-multiprivateposition: {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, active-bin-id-offset: int, amount: uint}, result: (response {x-amount: uint, y-amount: uint} uint
fold-move-liquidity-multiprivateposition: {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, to-bin-id: int, amount: uint}, result: (response uint uint
fold-move-relative-liquidity-multiprivateposition: {pool-trait: <dlmm-pool-trait>, x-token-trait: <sip-010-trait>, y-token-trait: <sip-010-trait>, from-bin-id: int, active-bin-id-offset: int, amount: uint}, result: (response uint uint