ext-sponsored-sbtc-transfer-many

SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9

Source Code

;; title: ext-sbtc-transfer-many
;; version: 1.0
;; summary: Transfers sBTC tokens to many recipients using custom tuple format.
;; description: Optimized for buffer size. Transfers can be sponsored, fees paid in sBTC.
;; Max recipients:
;; - 41 standard principals
;; - 11 contract principals

(define-constant err-invalid-payload (err u500))

(define-private (sbtc-transfer-many (recipients (list
  200
  {
    amount: uint,
    sender: principal,
    to: principal,
    memo: (optional (buff 34)),
  }
)))
  (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token
    transfer-many recipients
  )
)

(define-private (sbtc-transfer
    (amount uint)
    (from principal)
    (to principal)
  )
  (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token transfer
    amount from to none
  )
)

(define-private (to-native (transfer {
  a: uint,
  r: principal,
}))
  {
    amount: (get a transfer),
    sender: tx-sender,
    to: (get r transfer),
    memo: none,
  }
)

(define-public (call (payload (buff 2048)))
  (let ((details (unwrap!
      (from-consensus-buff? {
        recipients: (list
          200
          {
            a: uint,
            r: principal,
          }
        ),
        fees: uint,
      }
        payload
      )
      err-invalid-payload
    )))
    (try! (sbtc-transfer-many (map to-native (get recipients details))))
    (match tx-sponsor?
      spnsr (let ((fees (get fees details)))
        (and (> fees u0) (try! (sbtc-transfer fees tx-sender spnsr)))
      )
      true
    )
    (ok true)
  )
)

Functions (3)

FunctionAccessArgs
sbtc-transfer-manyprivaterecipients: (list 200 { amount: uint, sender: principal, to: principal, memo: (optional (buff 34
to-nativeprivatetransfer: { a: uint, r: principal, }
callpublicpayload: (buff 2048