From 263d8e987ca0f64b3c9855febcfa972905b158af Mon Sep 17 00:00:00 2001 From: Andrey Bocharnikov Date: Thu, 6 Feb 2025 16:58:10 +0400 Subject: [PATCH] feat(rpc)_: integrate test.eth-rpc.status.im fixes #6327 --- api/default_networks.go | 79 +++++++++++++++++------------ api/defaults.go | 12 +++++ api/geth_backend.go | 2 +- node/get_status_node.go | 7 +-- params/config.go | 35 +++++++------ protocol/requests/create_account.go | 11 ++-- 6 files changed, 90 insertions(+), 56 deletions(-) diff --git a/api/default_networks.go b/api/default_networks.go index 10fec1eadb..ac4abc9a57 100644 --- a/api/default_networks.go +++ b/api/default_networks.go @@ -2,6 +2,7 @@ package api import ( "fmt" + "strings" "github.com/status-im/status-go/params" "github.com/status-im/status-go/params/networkhelper" @@ -31,18 +32,25 @@ const ( DirectGrove = "direct-grove" ) -func smartProxyUrl(chainName, networkName string) string { - return fmt.Sprintf("https://test.eth-rpc.status.im/%s/%s/", chainName, networkName) +func getProxyHost(customUrl, stageName string) string { + if customUrl != "" { + return strings.TrimRight(customUrl, "/") + } + return fmt.Sprintf("https://%s.eth-rpc.status.im", stageName) +} + +func smartProxyUrl(proxyHost, chainName, networkName string) string { + return fmt.Sprintf("%s/%s/%s/", proxyHost, chainName, networkName) } -func mainnet(stageName string) params.Network { +func mainnet(proxyHost string) params.Network { const chainID = MainnetChainID const chainName = "ethereum" const networkName = "mainnet" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://mainnet.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://eth.rpc.grove.city/v1/", false), @@ -66,14 +74,14 @@ func mainnet(stageName string) params.Network { } } -func sepolia(stageName string) params.Network { +func sepolia(proxyHost string) params.Network { const chainID = SepoliaChainID const chainName = "ethereum" const networkName = "sepolia" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://sepolia.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://eth-sepolia-testnet.rpc.grove.city/v1/", false), @@ -97,14 +105,14 @@ func sepolia(stageName string) params.Network { } } -func optimism(stageName string) params.Network { +func optimism(proxyHost string) params.Network { const chainID = OptimismChainID const chainName = "optimism" const networkName = "mainnet" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://optimism-mainnet.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://optimism.rpc.grove.city/v1/", false), @@ -128,14 +136,14 @@ func optimism(stageName string) params.Network { } } -func optimismSepolia(stageName string) params.Network { +func optimismSepolia(proxyHost string) params.Network { const chainID = OptimismSepoliaChainID const chainName = "optimism" const networkName = "sepolia" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://optimism-sepolia.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://optimism-sepolia-testnet.rpc.grove.city/v1/", false), @@ -159,14 +167,14 @@ func optimismSepolia(stageName string) params.Network { } } -func arbitrum(stageName string) params.Network { +func arbitrum(proxyHost string) params.Network { const chainID = ArbitrumChainID const chainName = "arbitrum" const networkName = "mainnet" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://arbitrum-mainnet.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://arbitrum-one.rpc.grove.city/v1/", false), @@ -190,14 +198,14 @@ func arbitrum(stageName string) params.Network { } } -func arbitrumSepolia(stageName string) params.Network { +func arbitrumSepolia(proxyHost string) params.Network { const chainID = ArbitrumSepoliaChainID const chainName = "arbitrum" const networkName = "sepolia" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://arbitrum-sepolia.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://arbitrum-sepolia-testnet.rpc.grove.city/v1/", false), @@ -221,14 +229,14 @@ func arbitrumSepolia(stageName string) params.Network { } } -func base(stageName string) params.Network { +func base(proxyHost string) params.Network { const chainID = BaseChainID const chainName = "base" const networkName = "mainnet" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://base-mainnet.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://base.rpc.grove.city/v1/", false), @@ -252,14 +260,14 @@ func base(stageName string) params.Network { } } -func baseSepolia(stageName string) params.Network { +func baseSepolia(proxyHost string) params.Network { const chainID = BaseSepoliaChainID const chainName = "base" const networkName = "sepolia" rpcProviders := []params.RpcProvider{ // Smart proxy provider - *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(chainName, networkName), false), + *params.NewProxyProvider(chainID, StatusSmartProxy, smartProxyUrl(proxyHost, chainName, networkName), false), // Direct providers *params.NewDirectProvider(chainID, DirectInfura, "https://base-sepolia.infura.io/v3/", true), *params.NewDirectProvider(chainID, DirectGrove, "https://base-testnet.rpc.grove.city/v1/", false), @@ -283,27 +291,34 @@ func baseSepolia(stageName string) params.Network { } } -func defaultNetworks(stageName string) []params.Network { +func defaultNetworks(proxyHost string) []params.Network { return []params.Network{ - mainnet(stageName), - sepolia(stageName), - optimism(stageName), - optimismSepolia(stageName), - arbitrum(stageName), - arbitrumSepolia(stageName), - base(stageName), - baseSepolia(stageName), + mainnet(proxyHost), + sepolia(proxyHost), + optimism(proxyHost), + optimismSepolia(proxyHost), + arbitrum(proxyHost), + arbitrumSepolia(proxyHost), + base(proxyHost), + baseSepolia(proxyHost), } } -func setRPCs(networks []params.Network, request *requests.WalletSecretsConfig) []params.Network { +func setRPCs(networks []params.Network, walletConfig *requests.WalletSecretsConfig) []params.Network { authTokens := map[string]string{ - "infura.io": request.InfuraToken, - "grove.city": request.PoktToken, + "infura.io": walletConfig.InfuraToken, + "grove.city": walletConfig.PoktToken, } - return networkhelper.OverrideDirectProvidersAuth(networks, authTokens) + networks = networkhelper.OverrideDirectProvidersAuth(networks, authTokens) + + return networkhelper.OverrideEmbeddedProxyProviders( + networks, + true, + walletConfig.EthRpcProxyUser, + walletConfig.EthRpcProxyPassword) } func BuildDefaultNetworks(walletSecretsConfig *requests.WalletSecretsConfig) []params.Network { - return setRPCs(defaultNetworks(walletSecretsConfig.StatusProxyStageName), walletSecretsConfig) + proxyHost := getProxyHost(walletSecretsConfig.EthRpcProxyUrl, walletSecretsConfig.StatusProxyStageName) + return setRPCs(defaultNetworks(proxyHost), walletSecretsConfig) } diff --git a/api/defaults.go b/api/defaults.go index 4706f66c3c..baad6d6fcf 100644 --- a/api/defaults.go +++ b/api/defaults.go @@ -228,6 +228,8 @@ func buildWalletConfig(request *requests.WalletSecretsConfig, statusProxyEnabled if request.StatusProxyMarketPassword != "" { walletConfig.StatusProxyMarketPassword = request.StatusProxyMarketPassword } + + // FIXME: remove when EthRpcProxy* is integrated if request.StatusProxyBlockchainUser != "" { walletConfig.StatusProxyBlockchainUser = request.StatusProxyBlockchainUser } @@ -235,6 +237,16 @@ func buildWalletConfig(request *requests.WalletSecretsConfig, statusProxyEnabled walletConfig.StatusProxyBlockchainPassword = request.StatusProxyBlockchainPassword } + if request.EthRpcProxyUrl != "" { + walletConfig.EthRpcProxyUrl = request.EthRpcProxyUrl + } + if request.EthRpcProxyUser != "" { + walletConfig.EthRpcProxyUser = request.EthRpcProxyUser + } + if request.EthRpcProxyPassword != "" { + walletConfig.EthRpcProxyPassword = request.EthRpcProxyPassword + } + walletConfig.StatusProxyEnabled = statusProxyEnabled return walletConfig diff --git a/api/geth_backend.go b/api/geth_backend.go index 4b368c97de..ef03e6ee64 100644 --- a/api/geth_backend.go +++ b/api/geth_backend.go @@ -564,7 +564,7 @@ func (b *GethStatusBackend) updateAccountColorHashAndColorID(keyUID string, acco } func (b *GethStatusBackend) overrideNetworks(conf *params.NodeConfig, request *requests.Login) { - conf.Networks = setRPCs(defaultNetworks(request.WalletSecretsConfig.StatusProxyStageName), &request.WalletSecretsConfig) + conf.Networks = BuildDefaultNetworks(&request.WalletSecretsConfig) } func (b *GethStatusBackend) LoginAccount(request *requests.Login) error { diff --git a/node/get_status_node.go b/node/get_status_node.go index 908dec3eb3..3beff7f4f9 100644 --- a/node/get_status_node.go +++ b/node/get_status_node.go @@ -345,8 +345,8 @@ func (n *StatusNode) setupRPCClient() (err error) { networks := networkhelper.OverrideEmbeddedProxyProviders( n.config.Networks, n.config.WalletConfig.StatusProxyEnabled, - n.config.WalletConfig.StatusProxyBlockchainUser, - n.config.WalletConfig.StatusProxyBlockchainPassword) + n.config.WalletConfig.EthRpcProxyUser, + n.config.WalletConfig.EthRpcProxyPassword) config := rpc.ClientConfig{ Client: gethNodeClient, @@ -360,9 +360,6 @@ func (n *StatusNode) setupRPCClient() (err error) { return } n.rpcClient.Start(context.Background()) - if err != nil { - return - } return } diff --git a/params/config.go b/params/config.go index 5cdaabd18b..035abd1ba1 100644 --- a/params/config.go +++ b/params/config.go @@ -500,21 +500,26 @@ type NodeConfig struct { // WalletConfig extra configuration for wallet.Service. type WalletConfig struct { - Enabled bool - OpenseaAPIKey string `json:"OpenseaAPIKey"` - RaribleMainnetAPIKey string `json:"RaribleMainnetAPIKey"` - RaribleTestnetAPIKey string `json:"RaribleTestnetAPIKey"` - AlchemyAPIKeys map[uint64]string `json:"AlchemyAPIKeys"` - InfuraAPIKey string `json:"InfuraAPIKey"` - InfuraAPIKeySecret string `json:"InfuraAPIKeySecret"` - StatusProxyMarketUser string `json:"StatusProxyMarketUser"` - StatusProxyMarketPassword string `json:"StatusProxyMarketPassword"` - StatusProxyBlockchainUser string `json:"StatusProxyBlockchainUser"` - StatusProxyBlockchainPassword string `json:"StatusProxyBlockchainPassword"` - StatusProxyEnabled bool `json:"StatusProxyEnabled"` - StatusProxyStageName string `json:"StatusProxyStageName"` - EnableCelerBridge bool `json:"EnableCelerBridge"` - EnableMercuryoProvider bool `json:"EnableMercuryoProvider"` + Enabled bool + OpenseaAPIKey string `json:"OpenseaAPIKey"` + RaribleMainnetAPIKey string `json:"RaribleMainnetAPIKey"` + RaribleTestnetAPIKey string `json:"RaribleTestnetAPIKey"` + AlchemyAPIKeys map[uint64]string `json:"AlchemyAPIKeys"` + InfuraAPIKey string `json:"InfuraAPIKey"` + InfuraAPIKeySecret string `json:"InfuraAPIKeySecret"` + StatusProxyMarketUser string `json:"StatusProxyMarketUser"` + StatusProxyMarketPassword string `json:"StatusProxyMarketPassword"` + // FIXME: remove when EthRpcProxy* is integrated + StatusProxyBlockchainUser string `json:"StatusProxyBlockchainUser"` + StatusProxyBlockchainPassword string `json:"StatusProxyBlockchainPassword"` + + StatusProxyEnabled bool `json:"StatusProxyEnabled"` + StatusProxyStageName string `json:"StatusProxyStageName"` + EnableCelerBridge bool `json:"EnableCelerBridge"` + EnableMercuryoProvider bool `json:"EnableMercuryoProvider"` + EthRpcProxyUrl string `json:"EthRpcProxyUrl"` + EthRpcProxyUser string `json:"EthRpcProxyUser"` + EthRpcProxyPassword string `json:"EthRpcProxyPassword"` } // MarshalJSON custom marshalling to avoid exposing sensitive data in log, diff --git a/protocol/requests/create_account.go b/protocol/requests/create_account.go index 714d06de50..909d8503b2 100644 --- a/protocol/requests/create_account.go +++ b/protocol/requests/create_account.go @@ -105,11 +105,16 @@ type WalletSecretsConfig struct { AlchemyBaseMainnetToken string `json:"alchemyBaseMainnetToken"` AlchemyBaseSepoliaToken string `json:"alchemyBaseSepoliaToken"` - StatusProxyStageName string `json:"statusProxyStageName"` - StatusProxyMarketUser string `json:"statusProxyMarketUser"` - StatusProxyMarketPassword string `json:"statusProxyMarketPassword"` + StatusProxyStageName string `json:"statusProxyStageName"` + StatusProxyMarketUser string `json:"statusProxyMarketUser"` + StatusProxyMarketPassword string `json:"statusProxyMarketPassword"` + // FIXME: remove when EthRpcProxy* is integrated StatusProxyBlockchainUser string `json:"statusProxyBlockchainUser"` StatusProxyBlockchainPassword string `json:"statusProxyBlockchainPassword"` + + EthRpcProxyUrl string `json:"ethRpcProxyUrl"` + EthRpcProxyUser string `json:"ethRpcProxyUser"` + EthRpcProxyPassword string `json:"ethRpcProxyPassword"` } func (c *CreateAccount) Validate(validation *CreateAccountValidation) error {