44 "context"
55 "flag"
66 "log"
7+ "math"
78 "net"
89 "net/http"
910 "os"
@@ -45,6 +46,14 @@ func main() {
4546 var batchIntervalStr string
4647 var autoConsolidationIntervalStr string
4748 clientIPHeaderDefault := os .Getenv ("FAUCET_CLIENT_IP_HEADER" )
49+ payoutFeeRateDefault := service .DefaultPayoutFeeRateSatsPerVB
50+ if value := strings .TrimSpace (os .Getenv ("FAUCET_PAYOUT_FEE_RATE_SATS_PER_VB" )); value != "" {
51+ parsed , err := strconv .ParseFloat (value , 64 )
52+ if err != nil {
53+ log .Fatalf ("Error: invalid FAUCET_PAYOUT_FEE_RATE_SATS_PER_VB value %q: %v" , value , err )
54+ }
55+ payoutFeeRateDefault = parsed
56+ }
4857
4958 flag .StringVar (& cfg .ListenAddr , "listen" , ":8080" , "HTTP server listen address" )
5059 flag .StringVar (& cfg .MetricsAddr , "metrics-addr" , "0.0.0.0:9222" , "Metrics server listen address" )
@@ -56,6 +65,7 @@ func main() {
5665 flag .StringVar (& cfg .BitcoinCoreWalletName , "bitcoin-wallet-name" , "faucet" , "Bitcoin wallet name, will be loaded at start" )
5766
5867 flag .StringVar (& batchIntervalStr , "batch-interval" , "1m" , "Batch processing interval (e.g., 1m, 5m, 30s)" )
68+ flag .Float64Var (& cfg .PayoutFeeRateSatsPerVB , "payout-fee-rate-sats-per-vb" , payoutFeeRateDefault , "Fee rate for automatic faucet payouts in sat/vB (0 uses the Bitcoin Core wallet default)" )
5969 flag .StringVar (& enabledAmountRangesStr , "enabled-amount-ranges" , "1,2,3" , "Comma-separated amount ranges to enable (1=0.001-0.009, 2=0.01-0.09, 3=0.1-0.9, 4=1.0-2.0)" )
6070 flag .IntVar (& cfg .DefaultAmountRange , "default-amount-range" , 2 , "Default selected amount range (1-4)" )
6171 flag .Float64Var (& cfg .MinBalance , "min-balance" , 0.1 , "Minimum wallet balance threshold (BTC)" )
@@ -98,6 +108,9 @@ func main() {
98108 if cfg .MinConsolidationUTXOs > cfg .MaxConsolidationUTXOs {
99109 log .Fatalf ("invalid consolidation cfg, min: %d > max: %d" , cfg .MinConsolidationUTXOs , cfg .MaxConsolidationUTXOs )
100110 }
111+ if cfg .PayoutFeeRateSatsPerVB < 0 || math .IsNaN (cfg .PayoutFeeRateSatsPerVB ) || math .IsInf (cfg .PayoutFeeRateSatsPerVB , 0 ) {
112+ log .Fatal ("Error: payout fee rate must be a finite number greater than or equal to 0" )
113+ }
101114
102115 if len (adminAllowlistIP ) == 0 && len (adminAllowlistCIDR ) == 0 {
103116 adminAllowlistIP = []string {"127.0.0.1" }
@@ -173,6 +186,11 @@ func main() {
173186 log .Printf ("Metrics address: %s" , cfg .MetricsAddr )
174187 log .Printf ("Data directory: %s" , cfg .DataDir )
175188 log .Printf ("Batch interval: %s" , cfg .BatchInterval )
189+ if cfg .PayoutFeeRateSatsPerVB == 0 {
190+ log .Printf ("Payout fee rate: Bitcoin Core wallet default" )
191+ } else {
192+ log .Printf ("Payout fee rate: %.8f sat/vB" , cfg .PayoutFeeRateSatsPerVB )
193+ }
176194 log .Printf ("Enabled amount ranges: %v (default: %d)" , cfg .EnabledAmountRanges , cfg .DefaultAmountRange )
177195 if cfg .ClientIPHeader == "" {
178196 log .Printf ("Client IP source: direct peer address" )
0 commit comments