From 09e923ca1d3113ae068f6d06c146f24fe8981a8c Mon Sep 17 00:00:00 2001 From: bernd2022 Date: Mon, 24 Nov 2025 08:33:26 +0100 Subject: [PATCH] [DEV-4498] Boltz ERC-20 swaps --- .../config/boltz/backend/dev-boltz.conf | 149 +++++++++++++++--- .../config/boltz/backend/prd-boltz.conf | 149 +++++++++++++++--- 2 files changed, 246 insertions(+), 52 deletions(-) diff --git a/infrastructure/config/boltz/backend/dev-boltz.conf b/infrastructure/config/boltz/backend/dev-boltz.conf index 5c1d50ad..99ba8764 100644 --- a/infrastructure/config/boltz/backend/dev-boltz.conf +++ b/infrastructure/config/boltz/backend/dev-boltz.conf @@ -49,7 +49,7 @@ network = "bitcoinMainnet" # Wallet balances - adjusted for testing minWalletBalance = 100_000 # 0.001 BTC (100k sats) -minChannelBalance = 100_000 # 0.001 BTC (100k sats) +minChannelBalance = 100_000 # 0.001 BTC (100k sats) # Swap limits maxSwapAmount = 10_000_000 # 0.1 BTC maximum @@ -85,15 +85,13 @@ maxZeroConfAmount = 0 # Disable 0-conf for security [[pairs]] base = "BTC" quote = "BTC" -rate = 1 # 1:1 exchange rate - -# Fee configuration (in percent) -fee = 0.5 # 0.5% service fee -swapInFee = 0.25 # 0.25% for submarine swaps (chain -> lightning) +rate = 1 +fee = 0.5 # 0.5% service fee +swapInFee = 0.25 # 0.25% for submarine swaps (chain -> lightning) # Swap amount limits (in satoshis) -maxSwapAmount = 10_000_000 # 0.1 BTC -minSwapAmount = 2_500 # 2,500 sats (pair level) +maxSwapAmount = 10_000_000 # 0.1 BTC +minSwapAmount = 2_500 # 2,500 sats (pair level) # Submarine Swap specific settings (Chain -> Lightning) [pairs.submarineSwap] @@ -115,36 +113,135 @@ minSwapAmount = 2_500 # 2,500 sats (pair level) [[pairs]] base = "BTC" quote = "RBTC" -rate = 1 # 1:1 peg between BTC and RBTC - -# Fee configuration (in percent) +rate = 1 fee = 0.25 swapInFee = 0.1 # Swap amount limits (in satoshis) -maxSwapAmount = 10_000_000 # 0.1 BTC/RBTC -minSwapAmount = 2_500 # 2,500 sats minimum (Rootstock has lower fees) +maxSwapAmount = 10_000_000 # 0.1 BTC/RBTC +minSwapAmount = 2_500 # 2,500 sats minimum (Rootstock has lower fees) + + [pairs.timeoutDelta] + chain = 1440 # Chain swap timeout (~24 hours = 144 blocks) + reverse = 1440 # ~24 hours for reverse swaps (lightning -> chain) + swapMinimal = 1440 # Minimum timeout for submarine swaps (~24 hours = 144 blocks) + swapMaximal = 2880 # Maximum timeout (~48 hours = 288 blocks) + swapTaproot = 10080 # 1 week for taproot swaps (10080 blocks) + +[[pairs]] +base = "BTC" +quote = "cBTC" +rate = 1 +fee = 0.25 +swapInFee = 0.1 + +maxSwapAmount = 10_000_000 # 0.1 BTC/cBTC +minSwapAmount = 2_500 # 2,500 sats minimum (Citrea Testnet has low fees) + + [pairs.timeoutDelta] + chain = 60 # Chain swap timeout (~1 hour, due to fast 2s blocks) + reverse = 180 # Reverse swap timeout (Lightning -> cBTC) - increased for CLTV requirements + swapMinimal = 1440 # Minimum timeout (~13.3 hours) - minimum for Lightning CLTV (80 blocks × 10 min) + swapMaximal = 2880 # Maximum timeout (~16.7 hours) - allows 100 Bitcoin blocks CLTV + swapTaproot = 10080 # Taproot timeout (~16.7 hours) + +[[pairs]] +base = "USDT_ETH" +quote = "USDT_CITREA" +rate = 1 +fee = 0.25 +swapInFee = 0.1 + +maxSwapAmount = 1_000_000_000 # 1000 USDT_ETH/USDT_CITREA +minSwapAmount = 1_000_000 # 1 USDT_ETH/USDT_CITREA + + [pairs.timeoutDelta] + chain = 1440 # Chain swap timeout (~24 hours = 144 blocks) + reverse = 1440 # ~24 hours for reverse swaps (lightning -> chain) + swapMinimal = 1440 # Minimum timeout for submarine swaps (~24 hours = 144 blocks) + swapMaximal = 2880 # Maximum timeout (~48 hours = 288 blocks) + swapTaproot = 10080 # 1 week for taproot swaps (10080 blocks) + +[[pairs]] +base = "USDT_POLYGON" +quote = "USDT_CITREA" +rate = 1 +fee = 0.25 +swapInFee = 0.1 + +maxSwapAmount = 1_000_000_000 # 1000 USDT_POLYGON/USDT_CITREA +minSwapAmount = 1_000_000 # 1 USDT_POLYGON/USDT_CITREA [pairs.timeoutDelta] - chain = 1440 # Chain swap timeout (~24 hours) - reverse = 1440 # Reverse swap timeout (Lightning -> RBTC) - swapMinimal = 1440 # Minimum timeout - swapMaximal = 2880 # Maximum timeout - swapTaproot = 10080 + chain = 1440 # Chain swap timeout (~24 hours = 144 blocks) + reverse = 1440 # ~24 hours for reverse swaps (lightning -> chain) + swapMinimal = 1440 # Minimum timeout for submarine swaps (~24 hours = 144 blocks) + swapMaximal = 2880 # Maximum timeout (~48 hours = 288 blocks) + swapTaproot = 10080 # 1 week for taproot swaps (10080 blocks) # RSK (Rootstock) Configuration [rsk] networkName = "RSK Mainnet" providerEndpoint = "[PROVIDER_ENDPOINT]" - [[rsk.contracts]] - etherSwap = "0x3d9cc5780CA1db78760ad3D35458509178A85A4A" - erc20Swap = "0x7d5a2187CC8EF75f8822daB0E8C9a2DB147BA045" + [[rsk.contracts]] + etherSwap = "0x3d9cc5780CA1db78760ad3D35458509178A85A4A" + erc20Swap = "0x7d5a2187CC8EF75f8822daB0E8C9a2DB147BA045" + + [[rsk.tokens]] + symbol = "RBTC" + + minWalletBalance = 10_000 + +# ETH (Ethereum) Configuration +[ethereum] +networkName = "Ethereum Mainnet" +providerEndpoint = "[PROVIDER_ENDPOINT]" + + [[ethereum.contracts]] + etherSwap = "0x9ADfB0F1B783486289Fc23f3A3Ad2927cebb17e4" + erc20Swap = "0x2E21F58Da58c391F110467c7484EdfA849C1CB9B" + + [[ethereum.tokens]] + symbol = "USDT_ETH" + decimals = 6 + contractAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7" + + minWalletBalance = 1_000_000 # 1 USDT_ETH + +# POL (Polygon) Configuration +[polygon] +networkName = "Polygon Mainnet" +providerEndpoint = "[PROVIDER_ENDPOINT]" + + [[polygon.contracts]] + etherSwap = "0x9ADfB0F1B783486289Fc23f3A3Ad2927cebb17e4" + erc20Swap = "0x2E21F58Da58c391F110467c7484EdfA849C1CB9B" + + [[polygon.tokens]] + symbol = "USDT_POLYGON" + decimals = 6 + contractAddress = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F" + + minWalletBalance = 1_000_000 # 1 USDT_POLYGON + +# Citrea Testnet Configuration +[citrea] +networkName = "Citrea Testnet" +providerEndpoint = "https://dev.rpc.testnet.juiceswap.com" + + [[citrea.contracts]] + etherSwap = "0xd02731fD8c5FDD53B613A699234FAd5EE8851B65" + erc20Swap = "0xf2e019a371e5Fd32dB2fC564Ad9eAE9E433133cc" + + [[citrea.tokens]] + symbol = "cBTC" - [[rsk.tokens]] - symbol = "RBTC" + minWalletBalance = 100_000 - maxSwapAmount = 10_000_000 - minSwapAmount = 2_500 + [[citrea.tokens]] + symbol = "USDT_CITREA" + decimals = 6 + contractAddress = "0x1Dd3057888944ff1f914626aB4BD47Dc8b6285Fe" - minWalletBalance = 10_000 + minWalletBalance = 1_000_000 # 1 USDT_CITREA diff --git a/infrastructure/config/boltz/backend/prd-boltz.conf b/infrastructure/config/boltz/backend/prd-boltz.conf index 5c1d50ad..99ba8764 100644 --- a/infrastructure/config/boltz/backend/prd-boltz.conf +++ b/infrastructure/config/boltz/backend/prd-boltz.conf @@ -49,7 +49,7 @@ network = "bitcoinMainnet" # Wallet balances - adjusted for testing minWalletBalance = 100_000 # 0.001 BTC (100k sats) -minChannelBalance = 100_000 # 0.001 BTC (100k sats) +minChannelBalance = 100_000 # 0.001 BTC (100k sats) # Swap limits maxSwapAmount = 10_000_000 # 0.1 BTC maximum @@ -85,15 +85,13 @@ maxZeroConfAmount = 0 # Disable 0-conf for security [[pairs]] base = "BTC" quote = "BTC" -rate = 1 # 1:1 exchange rate - -# Fee configuration (in percent) -fee = 0.5 # 0.5% service fee -swapInFee = 0.25 # 0.25% for submarine swaps (chain -> lightning) +rate = 1 +fee = 0.5 # 0.5% service fee +swapInFee = 0.25 # 0.25% for submarine swaps (chain -> lightning) # Swap amount limits (in satoshis) -maxSwapAmount = 10_000_000 # 0.1 BTC -minSwapAmount = 2_500 # 2,500 sats (pair level) +maxSwapAmount = 10_000_000 # 0.1 BTC +minSwapAmount = 2_500 # 2,500 sats (pair level) # Submarine Swap specific settings (Chain -> Lightning) [pairs.submarineSwap] @@ -115,36 +113,135 @@ minSwapAmount = 2_500 # 2,500 sats (pair level) [[pairs]] base = "BTC" quote = "RBTC" -rate = 1 # 1:1 peg between BTC and RBTC - -# Fee configuration (in percent) +rate = 1 fee = 0.25 swapInFee = 0.1 # Swap amount limits (in satoshis) -maxSwapAmount = 10_000_000 # 0.1 BTC/RBTC -minSwapAmount = 2_500 # 2,500 sats minimum (Rootstock has lower fees) +maxSwapAmount = 10_000_000 # 0.1 BTC/RBTC +minSwapAmount = 2_500 # 2,500 sats minimum (Rootstock has lower fees) + + [pairs.timeoutDelta] + chain = 1440 # Chain swap timeout (~24 hours = 144 blocks) + reverse = 1440 # ~24 hours for reverse swaps (lightning -> chain) + swapMinimal = 1440 # Minimum timeout for submarine swaps (~24 hours = 144 blocks) + swapMaximal = 2880 # Maximum timeout (~48 hours = 288 blocks) + swapTaproot = 10080 # 1 week for taproot swaps (10080 blocks) + +[[pairs]] +base = "BTC" +quote = "cBTC" +rate = 1 +fee = 0.25 +swapInFee = 0.1 + +maxSwapAmount = 10_000_000 # 0.1 BTC/cBTC +minSwapAmount = 2_500 # 2,500 sats minimum (Citrea Testnet has low fees) + + [pairs.timeoutDelta] + chain = 60 # Chain swap timeout (~1 hour, due to fast 2s blocks) + reverse = 180 # Reverse swap timeout (Lightning -> cBTC) - increased for CLTV requirements + swapMinimal = 1440 # Minimum timeout (~13.3 hours) - minimum for Lightning CLTV (80 blocks × 10 min) + swapMaximal = 2880 # Maximum timeout (~16.7 hours) - allows 100 Bitcoin blocks CLTV + swapTaproot = 10080 # Taproot timeout (~16.7 hours) + +[[pairs]] +base = "USDT_ETH" +quote = "USDT_CITREA" +rate = 1 +fee = 0.25 +swapInFee = 0.1 + +maxSwapAmount = 1_000_000_000 # 1000 USDT_ETH/USDT_CITREA +minSwapAmount = 1_000_000 # 1 USDT_ETH/USDT_CITREA + + [pairs.timeoutDelta] + chain = 1440 # Chain swap timeout (~24 hours = 144 blocks) + reverse = 1440 # ~24 hours for reverse swaps (lightning -> chain) + swapMinimal = 1440 # Minimum timeout for submarine swaps (~24 hours = 144 blocks) + swapMaximal = 2880 # Maximum timeout (~48 hours = 288 blocks) + swapTaproot = 10080 # 1 week for taproot swaps (10080 blocks) + +[[pairs]] +base = "USDT_POLYGON" +quote = "USDT_CITREA" +rate = 1 +fee = 0.25 +swapInFee = 0.1 + +maxSwapAmount = 1_000_000_000 # 1000 USDT_POLYGON/USDT_CITREA +minSwapAmount = 1_000_000 # 1 USDT_POLYGON/USDT_CITREA [pairs.timeoutDelta] - chain = 1440 # Chain swap timeout (~24 hours) - reverse = 1440 # Reverse swap timeout (Lightning -> RBTC) - swapMinimal = 1440 # Minimum timeout - swapMaximal = 2880 # Maximum timeout - swapTaproot = 10080 + chain = 1440 # Chain swap timeout (~24 hours = 144 blocks) + reverse = 1440 # ~24 hours for reverse swaps (lightning -> chain) + swapMinimal = 1440 # Minimum timeout for submarine swaps (~24 hours = 144 blocks) + swapMaximal = 2880 # Maximum timeout (~48 hours = 288 blocks) + swapTaproot = 10080 # 1 week for taproot swaps (10080 blocks) # RSK (Rootstock) Configuration [rsk] networkName = "RSK Mainnet" providerEndpoint = "[PROVIDER_ENDPOINT]" - [[rsk.contracts]] - etherSwap = "0x3d9cc5780CA1db78760ad3D35458509178A85A4A" - erc20Swap = "0x7d5a2187CC8EF75f8822daB0E8C9a2DB147BA045" + [[rsk.contracts]] + etherSwap = "0x3d9cc5780CA1db78760ad3D35458509178A85A4A" + erc20Swap = "0x7d5a2187CC8EF75f8822daB0E8C9a2DB147BA045" + + [[rsk.tokens]] + symbol = "RBTC" + + minWalletBalance = 10_000 + +# ETH (Ethereum) Configuration +[ethereum] +networkName = "Ethereum Mainnet" +providerEndpoint = "[PROVIDER_ENDPOINT]" + + [[ethereum.contracts]] + etherSwap = "0x9ADfB0F1B783486289Fc23f3A3Ad2927cebb17e4" + erc20Swap = "0x2E21F58Da58c391F110467c7484EdfA849C1CB9B" + + [[ethereum.tokens]] + symbol = "USDT_ETH" + decimals = 6 + contractAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7" + + minWalletBalance = 1_000_000 # 1 USDT_ETH + +# POL (Polygon) Configuration +[polygon] +networkName = "Polygon Mainnet" +providerEndpoint = "[PROVIDER_ENDPOINT]" + + [[polygon.contracts]] + etherSwap = "0x9ADfB0F1B783486289Fc23f3A3Ad2927cebb17e4" + erc20Swap = "0x2E21F58Da58c391F110467c7484EdfA849C1CB9B" + + [[polygon.tokens]] + symbol = "USDT_POLYGON" + decimals = 6 + contractAddress = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F" + + minWalletBalance = 1_000_000 # 1 USDT_POLYGON + +# Citrea Testnet Configuration +[citrea] +networkName = "Citrea Testnet" +providerEndpoint = "https://dev.rpc.testnet.juiceswap.com" + + [[citrea.contracts]] + etherSwap = "0xd02731fD8c5FDD53B613A699234FAd5EE8851B65" + erc20Swap = "0xf2e019a371e5Fd32dB2fC564Ad9eAE9E433133cc" + + [[citrea.tokens]] + symbol = "cBTC" - [[rsk.tokens]] - symbol = "RBTC" + minWalletBalance = 100_000 - maxSwapAmount = 10_000_000 - minSwapAmount = 2_500 + [[citrea.tokens]] + symbol = "USDT_CITREA" + decimals = 6 + contractAddress = "0x1Dd3057888944ff1f914626aB4BD47Dc8b6285Fe" - minWalletBalance = 10_000 + minWalletBalance = 1_000_000 # 1 USDT_CITREA