Source Code

(impl-trait .trait-ownable.ownable-trait)
(use-trait ft-trait .sip-010-trait-ft-standard.sip-010-trait)

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

(define-constant ERR-NOT-AUTHORIZED (err u10000))
(define-constant ERR-FEE-TOO-HIGH (err u10001))
(define-constant ERR-MIN-TOO-HIGH (err u10002))
(define-constant ERR-SAME-OWNER (err u10003))
(define-constant ERR-RUNES-FEE-TOO-HIGH (err u10004))
(define-constant ERR-ORDINALS-FEE-TOO-HIGH (err u10005))
(define-constant ERR-ORDINALS-ADDITIONAL-FEE-TOO-HIGH (err u10006))
(define-constant ERR-NO-NETWORK-CONFIG (err u10007))

;; Max possible fee is 20 STX
(define-constant MAX-FUNGIBLE-FEE u20000000)
;; Max possible ordinals fee is 2 STX
(define-constant MAX-ORDINALS-FEE u2000000)
;; Max possible percent fee is 1%
(define-constant MAX-PERCENT-FEE u10000000)
(define-constant PERCENT-FEE-DIVIDER u1000000000)

(define-data-var ordinals-base-fee uint u2000000)
(define-data-var ordinals-additional-one-nft-fee uint u1000000)

;; default fee is 0.25%
(define-data-var btc-percent-fee uint u2500000)
;; default fee is 0.25%
(define-data-var runes-percent-fee uint u2500000)

;; default min bridge is 0.0005 BTC or Rune
(define-data-var min-btc-bridge uint u50000)
(define-data-var min-runes-bridge uint u50000)

(define-map custom-rune-tokens-min-bridge principal uint)

;; maximum possible for min bridge is 0.005 BTC
(define-constant MAX-BTC-BRIDGE-MINIMUM u500000)

;; maximum possible for min bridge is 1 Rune token considering 18 decimals
(define-constant MAX-RUNE-BRIDGE-MINIMUM u1000000000000000000)

;; network name -> fee configuration to bridge to this network
(define-map network-fee (buff 12) {
	btc-base-fee: uint,
	runes-base-fee: uint
})

(define-data-var fee-recipient principal tx-sender)

(define-read-only (get-contract-owner)
	(ok (var-get contract-owner))
)

(define-public (propose-contract-owner (owner principal))
	(begin
		(try! (check-is-owner))
		(ok (var-set proposed-owner owner))
	)
)

(define-public (claim-ownership)
	(begin
		(asserts! (not (is-eq (var-get contract-owner) (var-get proposed-owner))) ERR-SAME-OWNER)
		(try! (check-is-proposed-owner))
		(ok (var-set contract-owner contract-caller))
	)
)

(define-private (check-is-owner)
	(ok (asserts! (is-eq contract-caller (var-get contract-owner)) ERR-NOT-AUTHORIZED))
)

(define-private (check-is-proposed-owner)
	(ok (asserts! (is-eq contract-caller (var-get proposed-owner)) ERR-NOT-AUTHORIZED))
)

(define-read-only (get-network-config (network (buff 12))) 
	(ok {
		network-fee: (map-get? network-fee network),
		btc-percent-fee: (var-get btc-percent-fee),
		runes-percent-fee: (var-get runes-percent-fee),
		min-btc-bridge: (var-get min-btc-bridge),
		ordinals-base-fee: (var-get ordinals-base-fee),
		ordinals-additional-one-nft-fee: (var-get ordinals-additional-one-nft-fee)
	})
)

(define-read-only (get-fee-recipient)
	(ok (var-get fee-recipient))
)

(define-read-only (get-min-btc-bridge)
	(ok (var-get min-btc-bridge))
)

(define-read-only (get-runes-base-fee (network (buff 12)))
	(let (
			(network-fee-config (unwrap! (map-get? network-fee network) ERR-NO-NETWORK-CONFIG))
		)
		(ok (get runes-base-fee network-fee-config))
	)
)

(define-read-only (get-btc-base-fee (network (buff 12)))
	(let (
			(network-fee-config (unwrap! (map-get? network-fee network) ERR-NO-NETWORK-CONFIG))
		)
		(ok (get btc-base-fee network-fee-config))
	)
)

(define-read-only (get-ordinals-base-fee)
	(ok (var-get ordinals-base-fee))
)

(define-read-only (get-ordinals-additional-one-nft-fee)
	(ok (var-get ordinals-additional-one-nft-fee))
)

(define-read-only (get-min-runes-bridge (rune principal))
	(ok (default-to (var-get min-runes-bridge) (map-get? custom-rune-tokens-min-bridge rune)))
)

(define-read-only (calculate-btc-percent-fee (amount uint))
  (let (
      (fee (/ (* amount (var-get btc-percent-fee)) PERCENT-FEE-DIVIDER))
      (remainder (mod (* amount (var-get btc-percent-fee)) PERCENT-FEE-DIVIDER))
    )
    (if (> remainder u0)
      (+ fee u1)
      fee
    )
  )
)

(define-read-only (calculate-runes-percent-fee (amount uint))
  (let (
      (fee (/ (* amount (var-get runes-percent-fee)) PERCENT-FEE-DIVIDER))
      (remainder (mod (* amount (var-get runes-percent-fee)) PERCENT-FEE-DIVIDER))
    )
    (if (> remainder u0)
      (+ fee u1)
      fee
    )
  )
)

(define-public (set-network-config
 	(network (buff 12))
	(btc-base-fee uint)
	(runes-base-fee uint)
)
	(begin
		(try! (check-is-owner))
		(asserts! (<= btc-base-fee MAX-FUNGIBLE-FEE) ERR-FEE-TOO-HIGH)
		(asserts! (<= runes-base-fee MAX-FUNGIBLE-FEE) ERR-RUNES-FEE-TOO-HIGH)

		(map-set network-fee network {
			btc-base-fee: btc-base-fee,
			runes-base-fee: runes-base-fee
		})
		(ok true)
	)
)

(define-public (set-ordinals-base-fee (new-fee uint))
	(begin
		(try! (check-is-owner))
		(asserts! (<= new-fee MAX-ORDINALS-FEE) ERR-FEE-TOO-HIGH)
		(var-set ordinals-base-fee new-fee)
		(ok true)
	)
)

(define-public (set-ordinals-additional-one-nft-fee (new-fee uint))
	(begin
		(try! (check-is-owner))
		(asserts! (<= new-fee MAX-ORDINALS-FEE) ERR-FEE-TOO-HIGH)
		(var-set ordinals-additional-one-nft-fee new-fee)
		(ok true)
	)
)

(define-public (delete-network-config (network (buff 12)))
 (begin 
		(try! (check-is-owner))
		(ok (map-delete network-fee network))
	)
)

(define-public (set-btc-percent-fee (new-fee uint))
	(begin
		(try! (check-is-owner))
		(asserts! (<= new-fee MAX-PERCENT-FEE) ERR-FEE-TOO-HIGH)
		(var-set btc-percent-fee new-fee)
		(ok true)
	)
)

(define-public (set-runes-percent-fee (new-fee uint))
	(begin
		(try! (check-is-owner))
		(asserts! (<= new-fee MAX-PERCENT-FEE) ERR-FEE-TOO-HIGH)
		(var-set runes-percent-fee new-fee)
		(ok true)
	)
)

(define-public (set-min-btc-bridge (min-bridge uint))
	(begin
		(try! (check-is-owner))
		(asserts! (<= min-bridge MAX-BTC-BRIDGE-MINIMUM) ERR-MIN-TOO-HIGH)
		(var-set min-btc-bridge min-bridge)
		(ok true)
	)
)

(define-public (set-min-runes-bridge (min-bridge uint))
	(begin
		(try! (check-is-owner))
		(asserts! (<= min-bridge MAX-RUNE-BRIDGE-MINIMUM) ERR-MIN-TOO-HIGH)
		(var-set min-runes-bridge min-bridge)
		(ok true)
	)
)

(define-public (set-custom-min-runes-bridge (rune principal) (min-bridge uint))
	(begin
		(try! (check-is-owner))
		(asserts! (<= min-bridge MAX-RUNE-BRIDGE-MINIMUM) ERR-MIN-TOO-HIGH)
		(map-set custom-rune-tokens-min-bridge rune min-bridge)
		(ok true)
	)
)

(define-public (set-fee-recipient (new-fee-recipient principal))
	(begin
		(try! (check-is-owner))
		(var-set fee-recipient new-fee-recipient)
		(ok true)
	)
)

(define-public (pay-stx-fee (amount uint))
	(if (> amount u0) (stx-transfer? amount tx-sender (var-get fee-recipient)) (ok false))
)

(define-public (pay-ft-fee (amount uint) (token <ft-trait>))
	(if (> amount u0) (contract-call? token transfer amount tx-sender (var-get fee-recipient) none) (ok false))
)

(define-public (pay-ordinals-stx-fee (amount-of-nfts uint))
	(if (or (> (var-get ordinals-base-fee) u0) (> (var-get ordinals-additional-one-nft-fee) u0))
	 (stx-transfer? (+ (var-get ordinals-base-fee) (* (var-get ordinals-additional-one-nft-fee) amount-of-nfts)) tx-sender (var-get fee-recipient))
	 (ok false)
	)
)

Functions (28)

FunctionAccessArgs
get-contract-ownerread-only
propose-contract-ownerpublicowner: principal
claim-ownershippublic
check-is-ownerprivate
check-is-proposed-ownerprivate
get-network-configread-onlynetwork: (buff 12
get-fee-recipientread-only
get-min-btc-bridgeread-only
get-runes-base-feeread-onlynetwork: (buff 12
get-btc-base-feeread-onlynetwork: (buff 12
get-ordinals-base-feeread-only
get-ordinals-additional-one-nft-feeread-only
get-min-runes-bridgeread-onlyrune: principal
calculate-btc-percent-feeread-onlyamount: uint
calculate-runes-percent-feeread-onlyamount: uint
set-network-configpublicnetwork: (buff 12
set-ordinals-base-feepublicnew-fee: uint
set-ordinals-additional-one-nft-feepublicnew-fee: uint
delete-network-configpublicnetwork: (buff 12
set-btc-percent-feepublicnew-fee: uint
set-runes-percent-feepublicnew-fee: uint
set-min-btc-bridgepublicmin-bridge: uint
set-min-runes-bridgepublicmin-bridge: uint
set-custom-min-runes-bridgepublicrune: principal, min-bridge: uint
set-fee-recipientpublicnew-fee-recipient: principal
pay-stx-feepublicamount: uint
pay-ft-feepublicamount: uint, token: <ft-trait>
pay-ordinals-stx-feepublicamount-of-nfts: uint