diff --git a/src/cli/merchant_provider_test.go b/src/cli/merchant_provider_test.go index 5d1a4b611..62a6df501 100644 --- a/src/cli/merchant_provider_test.go +++ b/src/cli/merchant_provider_test.go @@ -22,14 +22,14 @@ func (m *namedMerchant) DrainMint(mintURL string) (string, uint64, error) { return "", 0, nil } func (m *namedMerchant) GetAcceptedMints() []config_manager.MintConfig { return nil } -func (m *namedMerchant) GetBalance() uint64 { return 0 } -func (m *namedMerchant) GetBalanceByMint(mintURL string) uint64 { return 0 } -func (m *namedMerchant) GetAllMintBalances() map[string]uint64 { return nil } +func (m *namedMerchant) GetBalance() uint64 { return 0 } +func (m *namedMerchant) GetBalanceByMint(mintURL string) uint64 { return 0 } +func (m *namedMerchant) GetAllMintBalances() map[string]uint64 { return nil } func (m *namedMerchant) PurchaseSession(cashuToken string, macAddress string) (*nostr.Event, error) { return nil, nil } -func (m *namedMerchant) GetAdvertisement() string { return "" } -func (m *namedMerchant) StartPayoutRoutine() {} +func (m *namedMerchant) GetAdvertisement() string { return "" } +func (m *namedMerchant) StartPayoutRoutine() {} func (m *namedMerchant) StartDataUsageMonitoring() {} func (m *namedMerchant) CreateNoticeEvent(level, code, message, customerPubkey string) (*nostr.Event, error) { return nil, nil diff --git a/src/cmd/tollgate-cli/contract_test.go b/src/cmd/tollgate-cli/contract_test.go index 60e670de6..b505aea2d 100644 --- a/src/cmd/tollgate-cli/contract_test.go +++ b/src/cmd/tollgate-cli/contract_test.go @@ -272,9 +272,9 @@ func TestConfigSetResponseShape(t *testing.T) { func TestWalletDrainDataShape(t *testing.T) { data := map[string]interface{}{ - "success": true, - "tokens": []interface{}{}, - "total_sats": uint64(1000), + "success": true, + "tokens": []interface{}{}, + "total_sats": uint64(1000), "save_to_file": "drain.txt", } diff --git a/src/config_manager/config_schema.go b/src/config_manager/config_schema.go index 770b45ac9..5ab31555b 100644 --- a/src/config_manager/config_schema.go +++ b/src/config_manager/config_schema.go @@ -1,17 +1,17 @@ package config_manager type FieldSchema struct { - Name string `json:"name"` - Type string `json:"type"` - Description string `json:"description,omitempty"` - Default interface{} `json:"default,omitempty"` - Required bool `json:"required"` - Enum []string `json:"enum,omitempty"` - Min interface{} `json:"min,omitempty"` - Max interface{} `json:"max,omitempty"` - Children []FieldSchema `json:"children,omitempty"` - JSONKey string `json:"json_key"` - Editable bool `json:"editable"` + Name string `json:"name"` + Type string `json:"type"` + Description string `json:"description,omitempty"` + Default interface{} `json:"default,omitempty"` + Required bool `json:"required"` + Enum []string `json:"enum,omitempty"` + Min interface{} `json:"min,omitempty"` + Max interface{} `json:"max,omitempty"` + Children []FieldSchema `json:"children,omitempty"` + JSONKey string `json:"json_key"` + Editable bool `json:"editable"` } func GetConfigSchema() []FieldSchema { @@ -73,7 +73,7 @@ func GetConfigSchema() []FieldSchema { Name: "ProfitShare", JSONKey: "profit_share", Type: "array", Description: "Profit sharing configuration", Required: true, Editable: true, Children: []FieldSchema{ - {Name: "Factor", JSONKey: "factor", Type: "float64", Description: "Share ratio (0.0\u20131.0). All factors MUST sum to 1.0. Use 0.79 not 79\u2014this is a ratio, not a percentage.", Required: true, Editable: true, Min: 0.0, Max: 1.0}, + {Name: "Factor", JSONKey: "factor", Type: "float64", Description: "Share ratio (0.0\u20131.0). All factors MUST sum to 1.0. Use 0.79 not 79\u2014this is a ratio, not a percentage.", Required: true, Editable: true, Min: 0.0, Max: 1.0}, {Name: "Identity", JSONKey: "identity", Type: "string", Description: "Identity name from identities.json", Required: true, Editable: true}, }, }, diff --git a/src/main.go b/src/main.go index feda56af1..483cc6b78 100644 --- a/src/main.go +++ b/src/main.go @@ -203,8 +203,8 @@ func init() { } valve.AuthDelay = time.Duration(delaySeconds) * time.Second mainLogger.WithFields(logrus.Fields{ - "redirect_url": mainConfig.RedirectURL, - "auth_delay": valve.AuthDelay, + "redirect_url": mainConfig.RedirectURL, + "auth_delay": valve.AuthDelay, "auth_delay_source": func() string { if mainConfig.AuthDelaySeconds > 0 { return "config" diff --git a/src/main_test.go b/src/main_test.go index bd5191886..17f5f8531 100644 --- a/src/main_test.go +++ b/src/main_test.go @@ -177,14 +177,14 @@ func (m *namedMerchant) DrainMint(mintURL string) (string, uint64, error) { return "", 0, nil } func (m *namedMerchant) GetAcceptedMints() []config_manager.MintConfig { return nil } -func (m *namedMerchant) GetBalance() uint64 { return 0 } -func (m *namedMerchant) GetBalanceByMint(mintURL string) uint64 { return 0 } -func (m *namedMerchant) GetAllMintBalances() map[string]uint64 { return nil } +func (m *namedMerchant) GetBalance() uint64 { return 0 } +func (m *namedMerchant) GetBalanceByMint(mintURL string) uint64 { return 0 } +func (m *namedMerchant) GetAllMintBalances() map[string]uint64 { return nil } func (m *namedMerchant) PurchaseSession(cashuToken string, macAddress string) (*nostr.Event, error) { return nil, nil } -func (m *namedMerchant) GetAdvertisement() string { return "" } -func (m *namedMerchant) StartPayoutRoutine() {} +func (m *namedMerchant) GetAdvertisement() string { return "" } +func (m *namedMerchant) StartPayoutRoutine() {} func (m *namedMerchant) StartDataUsageMonitoring() {} func (m *namedMerchant) CreateNoticeEvent(level, code, message, customerPubkey string) (*nostr.Event, error) { return nil, nil @@ -204,4 +204,4 @@ func (m *namedMerchant) GetLightningInvoiceStatus(quoteID, macAddress string) (* return nil, nil } func (m *namedMerchant) SetOnReachableSetChanged(func()) {} -func (m *namedMerchant) Shutdown() error { return nil } +func (m *namedMerchant) Shutdown() error { return nil } diff --git a/src/merchant/lightning.go b/src/merchant/lightning.go index b47f6fc21..24ba8fa05 100644 --- a/src/merchant/lightning.go +++ b/src/merchant/lightning.go @@ -9,9 +9,9 @@ import ( "math/rand" "time" + "github.com/OpenTollGate/gonuts-tollgate/cashu/nuts/nut04" "github.com/OpenTollGate/tollgate-module-basic-go/src/utils" "github.com/OpenTollGate/tollgate-module-basic-go/src/valve" - "github.com/OpenTollGate/gonuts-tollgate/cashu/nuts/nut04" ) var ErrQuoteNotFound = errors.New("lightning quote not found") diff --git a/src/merchant/merchant_degraded_test.go b/src/merchant/merchant_degraded_test.go index 8a9dfd388..9ea4b85a8 100644 --- a/src/merchant/merchant_degraded_test.go +++ b/src/merchant/merchant_degraded_test.go @@ -451,11 +451,11 @@ func TestOnFirstReachable_FiredAfterSetOnFirstReachableForDegradedReset(t *testi } type mockWallet struct { - balance uint64 - balanceByMint map[string]uint64 - overpaymentErr error + balance uint64 + balanceByMint map[string]uint64 + overpaymentErr error overpaymentResult string - shutdownCalled bool + shutdownCalled bool } func (w *mockWallet) GetBalance() uint64 { diff --git a/src/merchant/merchant_provider_test.go b/src/merchant/merchant_provider_test.go index 08238f90c..a74d02d45 100644 --- a/src/merchant/merchant_provider_test.go +++ b/src/merchant/merchant_provider_test.go @@ -42,8 +42,8 @@ func (m *mockMerchantForProvider) PurchaseSession(cashuToken string, macAddress return nil, fmt.Errorf("mock: %s", m.name) } -func (m *mockMerchantForProvider) GetAdvertisement() string { return "" } -func (m *mockMerchantForProvider) StartPayoutRoutine() {} +func (m *mockMerchantForProvider) GetAdvertisement() string { return "" } +func (m *mockMerchantForProvider) StartPayoutRoutine() {} func (m *mockMerchantForProvider) StartDataUsageMonitoring() {} func (m *mockMerchantForProvider) CreateNoticeEvent(level, code, message, customerPubkey string) (*nostr.Event, error) { diff --git a/src/merchant/mint_health_tracker.go b/src/merchant/mint_health_tracker.go index de850ea75..79ca75ad5 100644 --- a/src/merchant/mint_health_tracker.go +++ b/src/merchant/mint_health_tracker.go @@ -12,8 +12,8 @@ import ( const ( defaultRecoveryThreshold uint8 = 3 - probeTimeout = 30 * time.Second - probeInterval = 5 * time.Minute + probeTimeout = 30 * time.Second + probeInterval = 5 * time.Minute // Aggressive retry: when no mints are reachable at startup (e.g. WiFi STA // not yet connected), probe every 15s with immediate recovery (threshold=1) @@ -29,17 +29,17 @@ type mintConfigProvider interface { } type MintHealthTracker struct { - mu sync.RWMutex - reachableMints map[string]bool - consecutiveSuccesses map[string]uint8 - httpClient *http.Client - configProvider mintConfigProvider - recoveryThreshold uint8 - onFirstReachable func() - hadReachableMint bool + mu sync.RWMutex + reachableMints map[string]bool + consecutiveSuccesses map[string]uint8 + httpClient *http.Client + configProvider mintConfigProvider + recoveryThreshold uint8 + onFirstReachable func() + hadReachableMint bool onReachableSetChanged func() - reachableCount int - stopCh chan struct{} + reachableCount int + stopCh chan struct{} } func NewMintHealthTracker(configProvider mintConfigProvider) *MintHealthTracker { diff --git a/src/merchant/offline_wallet_integration_test.go b/src/merchant/offline_wallet_integration_test.go index c73e94863..1481673a7 100644 --- a/src/merchant/offline_wallet_integration_test.go +++ b/src/merchant/offline_wallet_integration_test.go @@ -16,11 +16,11 @@ import ( "testing" "time" - "github.com/OpenTollGate/tollgate-module-basic-go/src/config_manager" - "github.com/OpenTollGate/tollgate-module-basic-go/src/tollwallet" "github.com/OpenTollGate/gonuts-tollgate/cashu" "github.com/OpenTollGate/gonuts-tollgate/cashu/nuts/nut04" "github.com/OpenTollGate/gonuts-tollgate/wallet" + "github.com/OpenTollGate/tollgate-module-basic-go/src/config_manager" + "github.com/OpenTollGate/tollgate-module-basic-go/src/tollwallet" ) const testMintTarget = "https://nofee.testnut.cashu.space" diff --git a/src/tollgate_protocol/validator.go b/src/tollgate_protocol/validator.go index a7cd2644c..3a040c0f9 100644 --- a/src/tollgate_protocol/validator.go +++ b/src/tollgate_protocol/validator.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "strconv" + "github.com/nbd-wtf/go-nostr" ) diff --git a/src/upstream_session_manager/merchant_provider_test.go b/src/upstream_session_manager/merchant_provider_test.go index 2beaa4f6f..12b91178b 100644 --- a/src/upstream_session_manager/merchant_provider_test.go +++ b/src/upstream_session_manager/merchant_provider_test.go @@ -17,7 +17,7 @@ func (m *namedMerchant) CreatePaymentTokenWithOverpayment(mintURL string, amount return "", fmt.Errorf("mock: %s", m.name) } func (m *namedMerchant) GetAcceptedMints() []config_manager.MintConfig { return nil } -func (m *namedMerchant) GetBalanceByMint(mintURL string) uint64 { return 0 } +func (m *namedMerchant) GetBalanceByMint(mintURL string) uint64 { return 0 } func (m *namedMerchant) Fund(cashuToken string) (uint64, error) { return 0, fmt.Errorf("mock: %s", m.name) } diff --git a/src/wireless_gateway_manager/scanner.go b/src/wireless_gateway_manager/scanner.go index 86595b6ca..34e213520 100644 --- a/src/wireless_gateway_manager/scanner.go +++ b/src/wireless_gateway_manager/scanner.go @@ -116,11 +116,11 @@ func (s *Scanner) ParseIwinfoOutput(output []byte, radio string) []NetworkInfo { var networks []NetworkInfo var current *struct { - bssid string - ssid string - signal int - encrypt string - channel string + bssid string + ssid string + signal int + encrypt string + channel string hasSignal bool } @@ -139,11 +139,11 @@ func (s *Scanner) ParseIwinfoOutput(output []byte, radio string) []NetworkInfo { } fields := strings.Fields(line) current = &struct { - bssid string - ssid string - signal int - encrypt string - channel string + bssid string + ssid string + signal int + encrypt string + channel string hasSignal bool }{} if len(fields) > 0 { @@ -293,4 +293,3 @@ func FormatScanResults(networks []NetworkInfo) string { func init() { logger.WithField("module", "wireless_gateway_manager").Info("Wireless gateway manager module loaded") } - diff --git a/src/wireless_gateway_manager/types.go b/src/wireless_gateway_manager/types.go index 2c400ffa2..5f1a51d4f 100644 --- a/src/wireless_gateway_manager/types.go +++ b/src/wireless_gateway_manager/types.go @@ -25,9 +25,9 @@ type UpstreamManagerConfig struct { SwitchCooldown time.Duration StartupGracePeriod time.Duration PostSwitchWait time.Duration - StartupSettle time.Duration - StartupRetryInterval time.Duration - StartupScanInterval time.Duration + StartupSettle time.Duration + StartupRetryInterval time.Duration + StartupScanInterval time.Duration } type Connector struct { diff --git a/src/wireless_gateway_manager/upstream_manager.go b/src/wireless_gateway_manager/upstream_manager.go index ba620b2a2..c00efdb46 100644 --- a/src/wireless_gateway_manager/upstream_manager.go +++ b/src/wireless_gateway_manager/upstream_manager.go @@ -25,19 +25,19 @@ type ResellerModeChecker interface { } type UpstreamManager struct { - connector ConnectorInterface - scanner ScannerInterface - reseller ResellerModeChecker - config UpstreamManagerConfig - stopChan chan struct{} - pauseMu sync.Mutex - pauseUntil time.Time - blacklist map[string]time.Time - blacklistMu sync.Mutex - failMu sync.Mutex - consecutiveFails int - cooldownUntil time.Time - connectivityCheckFn func() bool + connector ConnectorInterface + scanner ScannerInterface + reseller ResellerModeChecker + config UpstreamManagerConfig + stopChan chan struct{} + pauseMu sync.Mutex + pauseUntil time.Time + blacklist map[string]time.Time + blacklistMu sync.Mutex + failMu sync.Mutex + consecutiveFails int + cooldownUntil time.Time + connectivityCheckFn func() bool isTollGateConnection bool } @@ -58,9 +58,9 @@ func DefaultUpstreamManagerConfig() UpstreamManagerConfig { SwitchCooldown: 10 * time.Minute, StartupGracePeriod: 90 * time.Second, PostSwitchWait: 5 * time.Second, - StartupSettle: 15 * time.Second, - StartupRetryInterval: 10 * time.Second, - StartupScanInterval: 10 * time.Second, + StartupSettle: 15 * time.Second, + StartupRetryInterval: 10 * time.Second, + StartupScanInterval: 10 * time.Second, } } @@ -303,7 +303,7 @@ func (um *UpstreamManager) Start(ctx context.Context) { reason = "not-associated" } else { currentSignal, _ = um.getCurrentSignal(staNetdev) - connected := um.checkConnectivityForStartup(staNetdev) + connected := um.checkConnectivityForStartup(staNetdev) if connected { if lostCount > 0 { logger.WithField("lost_count", lostCount).Info("Connectivity restored") @@ -314,16 +314,16 @@ func (um *UpstreamManager) Start(ctx context.Context) { shouldScan = true reason = "scheduled" } - } else { - if um.isPaused() { - continue - } - lostCount++ - lostThreshold := um.config.LostThreshold - if um.isTollGateConnection { - lostThreshold = um.config.TollGateLostThreshold - } - logger.WithField("lost_count", lostCount).Info("Connectivity lost") + } else { + if um.isPaused() { + continue + } + lostCount++ + lostThreshold := um.config.LostThreshold + if um.isTollGateConnection { + lostThreshold = um.config.TollGateLostThreshold + } + logger.WithField("lost_count", lostCount).Info("Connectivity lost") if lostCount >= lostThreshold { if err := um.connector.CleanupStaleSTAs(); err != nil { logger.WithError(err).Warn("Failed to cleanup stale STAs during emergency") @@ -391,7 +391,7 @@ func (um *UpstreamManager) recordSwitchFailure() { if um.consecutiveFails >= um.config.MaxConsecutiveFailures { um.cooldownUntil = time.Now().Add(um.config.SwitchCooldown) logger.WithFields(logrus.Fields{ - "failures": um.consecutiveFails, + "failures": um.consecutiveFails, "cooldown_minutes": um.config.SwitchCooldown.Minutes(), }).Warn("Circuit breaker triggered: entering cooldown") }