From 98e77b29b0685401650d9da8704777b04b7cfc66 Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 21 Nov 2025 09:36:46 +0300 Subject: [PATCH] feat: Add option to specify wallets list to get bridges list from --- bridge_config.go | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ config/config.go | 1 + main.go | 12 ++++----- 3 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 bridge_config.go diff --git a/bridge_config.go b/bridge_config.go new file mode 100644 index 0000000..54cae4c --- /dev/null +++ b/bridge_config.go @@ -0,0 +1,68 @@ +package main + +import ( + "api_monitoring_stats/services" + "api_monitoring_stats/services/connect" + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" +) + +var defaultBridges = []metrics[services.BridgeMetrics]{ + connect.NewBridge("tonapi", "https://bridge.tonapi.io/bridge"), + connect.NewBridge("MTW", "https://tonconnectbridge.mytonwallet.org/bridge"), + connect.NewBridge("tonhub", "https://connect.tonhubapi.com/tonconnect"), + connect.NewBridge("TonSpace", "https://bridge.ton.space/bridge"), + connect.NewBridge("DeWallet", "https://bridge.dewallet.pro/bridge"), +} + +func GetBridgeConfig(configUrl string) ([]metrics[services.BridgeMetrics], error) { + if configUrl == "" { + return defaultBridges, nil + } + + bridges := []metrics[services.BridgeMetrics]{} + req, err := http.NewRequest(http.MethodGet, configUrl, nil) + req.Header.Set("Content-Type", "application/json") + if err != nil { + return defaultBridges, fmt.Errorf("failed to create request: %v", err) + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return defaultBridges, fmt.Errorf("failed to get wallets config: %v", err) + } + defer resp.Body.Close() + + type WalletConfig struct { + AppName string `json:"app_name"` + Bridges []struct { + Type string `json:"type"` + URL string `json:"url"` + } `json:"bridge"` + } + var config []WalletConfig + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return defaultBridges, fmt.Errorf("failed to read wallets config: %v", err) + } + err = json.NewDecoder(bytes.NewReader(respBody)).Decode(&config) + if err != nil { + return defaultBridges, fmt.Errorf("failed to decode wallets config: %v", err) + } + + for _, wallet := range config { + for _, bridge := range wallet.Bridges { + if bridge.Type == "sse" { + bridges = append(bridges, connect.NewBridge(wallet.AppName, bridge.URL)) + } + } + } + + if len(bridges) == 0 { + return defaultBridges, fmt.Errorf("no bridges found") + } + return bridges, nil +} diff --git a/config/config.go b/config/config.go index 8fb808b..f2cd61a 100644 --- a/config/config.go +++ b/config/config.go @@ -23,6 +23,7 @@ var Config = struct { DtonLiteServers []liteclient.LiteserverConfig `env:"DTON_LITE_SERVERS"` DtonToken string `env:"DTONTOKEN"` ChainstackToken string `env:"CHAINSTACK_TOKEN"` + WalletListUrl string `env:"WALLET_LIST_URL"` }{} func LoadConfig() { diff --git a/main.go b/main.go index 440ed73..045d898 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,6 @@ import ( "api_monitoring_stats/config" "api_monitoring_stats/services" - "api_monitoring_stats/services/connect" "api_monitoring_stats/services/dapps" "api_monitoring_stats/services/dton" public_config "api_monitoring_stats/services/public-config" @@ -56,13 +55,12 @@ func main() { dapps.StonFi, dapps.Getgems, } - bridges := []metrics[services.BridgeMetrics]{ - connect.NewBridge("tonapi", "https://bridge.tonapi.io/bridge"), - connect.NewBridge("MTW", "https://tonconnectbridge.mytonwallet.org/bridge"), - connect.NewBridge("tonhub", "https://connect.tonhubapi.com/tonconnect"), - connect.NewBridge("TonSpace", "https://bridge.ton.space/bridge"), - connect.NewBridge("DeWallet", "https://bridge.dewallet.pro/bridge"), + + bridges, bridgeConfigErr := GetBridgeConfig(config.Config.WalletListUrl) + if bridgeConfigErr != nil { + log.Printf("failed to get bridge config, using default bridges: %v", bridgeConfigErr) } + go workerMetrics(apis, apiMetricsCollect) go workerMetrics(dappsMetrics, dappsMetricsCollect) go workerMetrics(bridges, bridgeMetricsCollect)