Skip to content

Commit e0e484f

Browse files
committed
chore(config)_: Integration of new RPC Provider configurations
* default_networks.go * explicit provider initialization with more granular config (rps limiter, order) * token overrides made more flexible, support not only infura and grove * get_status_node.go * override status-proxy auth instead of passing override config to rpc/client.go * config.go * ProviderConfig removed * client.go * Now any provider can be enabled/disabled (if user wants to use only his custom RPC urls) * Use bearer auth instead of URL auth * Provider order is defined by default_networks.go
1 parent 50ee868 commit e0e484f

23 files changed

+585
-748
lines changed

api/default_networks.go

+110-78
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ package api
22

33
import (
44
"fmt"
5-
"strings"
6-
75
"github.com/ethereum/go-ethereum/common"
86
"github.com/status-im/status-go/params"
7+
"github.com/status-im/status-go/params/networkhelper"
98
"github.com/status-im/status-go/protocol/requests"
109
)
1110

@@ -22,15 +21,29 @@ const (
2221

2322
var ganacheTokenAddress = common.HexToAddress("0x8571Ddc46b10d31EF963aF49b6C7799Ea7eff818")
2423

24+
func proxyUrl(stageName, provider, chainName, networkName string) string {
25+
return fmt.Sprintf("https://%s.api.status.im/%s/%s/%s/", stageName, provider, chainName, networkName)
26+
}
27+
2528
func mainnet(stageName string) params.Network {
29+
chainID := mainnetChainID
30+
chainName := "ethereum"
31+
networkName := "mainnet"
32+
33+
rpcProviders := []params.RpcProvider{
34+
// Proxy providers
35+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
36+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
37+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), false),
38+
// Direct providers
39+
*params.NewDirectProvider(chainID, "direct-infura", "https://mainnet.infura.io/v3/", true),
40+
*params.NewDirectProvider(chainID, "direct-grove", "https://eth-archival.rpc.grove.city/v1/", false),
41+
}
42+
2643
return params.Network{
27-
ChainID: mainnetChainID,
44+
ChainID: chainID,
2845
ChainName: "Mainnet",
29-
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/ethereum/mainnet/", stageName),
30-
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/ethereum/mainnet/", stageName),
31-
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/ethereum/mainnet/", stageName),
32-
RPCURL: "https://mainnet.infura.io/v3/",
33-
FallbackURL: "https://eth-archival.rpc.grove.city/v1/",
46+
RpcProviders: rpcProviders,
3447
BlockExplorerURL: "https://etherscan.io/",
3548
IconURL: "network/Network=Ethereum",
3649
ChainColor: "#627EEA",
@@ -44,16 +57,25 @@ func mainnet(stageName string) params.Network {
4457
RelatedChainID: sepoliaChainID,
4558
}
4659
}
47-
4860
func sepolia(stageName string) params.Network {
61+
chainID := sepoliaChainID
62+
chainName := "ethereum"
63+
networkName := "sepolia"
64+
65+
rpcProviders := []params.RpcProvider{
66+
// Proxy providers
67+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
68+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
69+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
70+
// Direct providers
71+
*params.NewDirectProvider(chainID, "direct-infura", "https://sepolia.infura.io/v3/", true),
72+
*params.NewDirectProvider(chainID, "direct-grove", "https://sepolia-archival.rpc.grove.city/v1/", false),
73+
}
74+
4975
return params.Network{
50-
ChainID: sepoliaChainID,
51-
ChainName: "Mainnet",
52-
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/ethereum/sepolia/", stageName),
53-
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/ethereum/sepolia/", stageName),
54-
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/ethereum/sepolia/", stageName),
55-
RPCURL: "https://sepolia.infura.io/v3/",
56-
FallbackURL: "https://sepolia-archival.rpc.grove.city/v1/",
76+
ChainID: chainID,
77+
ChainName: "Sepolia",
78+
RpcProviders: rpcProviders,
5779
BlockExplorerURL: "https://sepolia.etherscan.io/",
5880
IconURL: "network/Network=Ethereum",
5981
ChainColor: "#627EEA",
@@ -67,16 +89,25 @@ func sepolia(stageName string) params.Network {
6789
RelatedChainID: mainnetChainID,
6890
}
6991
}
70-
7192
func optimism(stageName string) params.Network {
93+
chainID := optimismChainID
94+
chainName := "optimism"
95+
networkName := "mainnet"
96+
97+
rpcProviders := []params.RpcProvider{
98+
// Proxy providers
99+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
100+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
101+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
102+
// Direct providers
103+
*params.NewDirectProvider(chainID, "direct-infura", "https://optimism-mainnet.infura.io/v3/", true),
104+
*params.NewDirectProvider(chainID, "direct-grove", "https://optimism-archival.rpc.grove.city/v1/", false),
105+
}
106+
72107
return params.Network{
73-
ChainID: optimismChainID,
108+
ChainID: chainID,
74109
ChainName: "Optimism",
75-
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/optimism/mainnet/", stageName),
76-
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/optimism/mainnet/", stageName),
77-
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/optimism/mainnet/", stageName),
78-
RPCURL: "https://optimism-mainnet.infura.io/v3/",
79-
FallbackURL: "https://optimism-archival.rpc.grove.city/v1/",
110+
RpcProviders: rpcProviders,
80111
BlockExplorerURL: "https://optimistic.etherscan.io",
81112
IconURL: "network/Network=Optimism",
82113
ChainColor: "#E90101",
@@ -90,16 +121,25 @@ func optimism(stageName string) params.Network {
90121
RelatedChainID: optimismSepoliaChainID,
91122
}
92123
}
93-
94124
func optimismSepolia(stageName string) params.Network {
125+
chainID := optimismSepoliaChainID
126+
chainName := "optimism"
127+
networkName := "sepolia"
128+
129+
rpcProviders := []params.RpcProvider{
130+
// Proxy providers
131+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
132+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
133+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
134+
// Direct providers
135+
*params.NewDirectProvider(chainID, "direct-infura", "https://optimism-sepolia.infura.io/v3/", true),
136+
*params.NewDirectProvider(chainID, "direct-grove", "https://optimism-sepolia-archival.rpc.grove.city/v1/", false),
137+
}
138+
95139
return params.Network{
96-
ChainID: optimismSepoliaChainID,
140+
ChainID: chainID,
97141
ChainName: "Optimism",
98-
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/optimism/sepolia/", stageName),
99-
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/optimism/sepolia/", stageName),
100-
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/optimism/sepolia/", stageName),
101-
RPCURL: "https://optimism-sepolia.infura.io/v3/",
102-
FallbackURL: "https://optimism-sepolia-archival.rpc.grove.city/v1/",
142+
RpcProviders: rpcProviders,
103143
BlockExplorerURL: "https://sepolia-optimism.etherscan.io/",
104144
IconURL: "network/Network=Optimism",
105145
ChainColor: "#E90101",
@@ -113,16 +153,25 @@ func optimismSepolia(stageName string) params.Network {
113153
RelatedChainID: optimismChainID,
114154
}
115155
}
116-
117156
func arbitrum(stageName string) params.Network {
157+
chainID := arbitrumChainID
158+
chainName := "arbitrum"
159+
networkName := "mainnet"
160+
161+
rpcProviders := []params.RpcProvider{
162+
// Proxy providers
163+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
164+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
165+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
166+
// Direct providers
167+
*params.NewDirectProvider(chainID, "direct-infura", "https://arbitrum-mainnet.infura.io/v3/", true),
168+
*params.NewDirectProvider(chainID, "direct-grove", "https://arbitrum-one.rpc.grove.city/v1/", false),
169+
}
170+
118171
return params.Network{
119-
ChainID: arbitrumChainID,
172+
ChainID: chainID,
120173
ChainName: "Arbitrum",
121-
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/arbitrum/mainnet/", stageName),
122-
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/arbitrum/mainnet/", stageName),
123-
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/arbitrum/mainnet/", stageName),
124-
RPCURL: "https://arbitrum-mainnet.infura.io/v3/",
125-
FallbackURL: "https://arbitrum-one.rpc.grove.city/v1/",
174+
RpcProviders: rpcProviders,
126175
BlockExplorerURL: "https://arbiscan.io/",
127176
IconURL: "network/Network=Arbitrum",
128177
ChainColor: "#51D0F0",
@@ -136,16 +185,25 @@ func arbitrum(stageName string) params.Network {
136185
RelatedChainID: arbitrumSepoliaChainID,
137186
}
138187
}
139-
140188
func arbitrumSepolia(stageName string) params.Network {
189+
chainID := arbitrumSepoliaChainID
190+
chainName := "arbitrum"
191+
networkName := "sepolia"
192+
193+
rpcProviders := []params.RpcProvider{
194+
// Proxy providers
195+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
196+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
197+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
198+
// Direct providers
199+
*params.NewDirectProvider(chainID, "direct-infura", "https://arbitrum-sepolia.infura.io/v3/", true),
200+
*params.NewDirectProvider(chainID, "direct-grove", "https://arbitrum-sepolia-archival.rpc.grove.city/v1/", false),
201+
}
202+
141203
return params.Network{
142-
ChainID: arbitrumSepoliaChainID,
204+
ChainID: chainID,
143205
ChainName: "Arbitrum",
144-
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/arbitrum/sepolia/", stageName),
145-
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/arbitrum/sepolia/", stageName),
146-
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/arbitrum/sepolia/", stageName),
147-
RPCURL: "https://arbitrum-sepolia.infura.io/v3/",
148-
FallbackURL: "https://arbitrum-sepolia-archival.rpc.grove.city/v1/",
206+
RpcProviders: rpcProviders,
149207
BlockExplorerURL: "https://sepolia-explorer.arbitrum.io/",
150208
IconURL: "network/Network=Arbitrum",
151209
ChainColor: "#51D0F0",
@@ -177,44 +235,18 @@ var mainnetGanacheTokenOverrides = params.TokenOverride{
177235
}
178236

179237
func setRPCs(networks []params.Network, request *requests.WalletSecretsConfig) []params.Network {
180-
181-
var networksWithRPC []params.Network
182-
183-
const (
184-
infura = "infura.io/"
185-
grove = "grove.city/"
186-
)
187-
188-
appendToken := func(url string) string {
189-
if strings.Contains(url, infura) && request.InfuraToken != "" {
190-
return url + request.InfuraToken
191-
} else if strings.Contains(url, grove) && request.PoktToken != "" {
192-
return url + request.PoktToken
193-
}
194-
return url
238+
authTokens := map[string]string{
239+
"infura.io": request.InfuraToken,
240+
"grove.city": request.PoktToken,
195241
}
196242

197-
for _, n := range networks {
198-
n.DefaultRPCURL = appendToken(n.DefaultRPCURL)
199-
n.DefaultFallbackURL = appendToken(n.DefaultFallbackURL)
200-
n.DefaultFallbackURL2 = appendToken(n.DefaultFallbackURL2)
201-
n.RPCURL = appendToken(n.RPCURL)
202-
n.FallbackURL = appendToken(n.FallbackURL)
203-
204-
if request.GanacheURL != "" {
205-
n.RPCURL = request.GanacheURL
206-
n.FallbackURL = request.GanacheURL
207-
if n.ChainID == mainnetChainID {
208-
n.TokenOverrides = []params.TokenOverride{
209-
mainnetGanacheTokenOverrides,
210-
}
211-
}
212-
}
213-
214-
networksWithRPC = append(networksWithRPC, n)
243+
updatedNetworks := networkhelper.OverrideDirectProvidersAuth(networks, authTokens)
244+
245+
if request.GanacheURL != "" {
246+
updatedNetworks = networkhelper.OverrideGanacheToken(updatedNetworks, request.GanacheURL, mainnetChainID, mainnetGanacheTokenOverrides)
215247
}
216248

217-
return networksWithRPC
249+
return updatedNetworks
218250
}
219251

220252
func BuildDefaultNetworks(walletSecretsConfig *requests.WalletSecretsConfig) []params.Network {

node/get_status_node.go

+10-11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"reflect"
1212
"sync"
1313

14+
"github.com/status-im/status-go/params/networkhelper"
15+
1416
"github.com/syndtr/goleveldb/leveldb"
1517
"go.uber.org/zap"
1618

@@ -336,25 +338,22 @@ func (n *StatusNode) setupRPCClient() (err error) {
336338
return
337339
}
338340

339-
// ProviderConfigs should be passed not in wallet secrets config on login
341+
// Proxy AuthConfigs should be passed not in wallet secrets config on login
340342
// but some other way, as it's not wallet specific and should not be passed with login request
341343
// but currently there is no other way to pass it
342-
providerConfigs := []params.ProviderConfig{
343-
{
344-
Enabled: n.config.WalletConfig.StatusProxyEnabled,
345-
Name: rpc.ProviderStatusProxy,
346-
User: n.config.WalletConfig.StatusProxyBlockchainUser,
347-
Password: n.config.WalletConfig.StatusProxyBlockchainPassword,
348-
},
349-
}
344+
// (maybe move to default_networks.go)
345+
networks := networkhelper.OverrideEmbeddedProxyProviders(
346+
n.config.Networks,
347+
n.config.WalletConfig.StatusProxyEnabled,
348+
n.config.WalletConfig.StatusProxyBlockchainUser,
349+
n.config.WalletConfig.StatusProxyBlockchainPassword)
350350

351351
config := rpc.ClientConfig{
352352
Client: gethNodeClient,
353353
UpstreamChainID: n.config.NetworkID,
354-
Networks: n.config.Networks,
354+
Networks: networks,
355355
DB: n.appDB,
356356
WalletFeed: &n.walletFeed,
357-
ProviderConfigs: providerConfigs,
358357
}
359358
n.rpcClient, err = rpc.NewClient(config)
360359
n.rpcClient.Start(context.Background())

params/config.go

-15
Original file line numberDiff line numberDiff line change
@@ -293,21 +293,6 @@ func NewLimits(min, max int) Limits {
293293
}
294294
}
295295

296-
type ProviderConfig struct {
297-
// Enabled flag specifies whether feature is enabled
298-
Enabled bool `validate:"required"`
299-
300-
// To identify provider
301-
Name string `validate:"required"`
302-
303-
// URL sets the rpc upstream host address for communication with
304-
// a non-local infura endpoint.
305-
User string `json:",omitempty"`
306-
Password string `json:",omitempty"`
307-
APIKey string `json:"APIKey,omitempty"`
308-
APIKeySecret string `json:"APIKeySecret,omitempty"`
309-
}
310-
311296
// ----------
312297
// NodeConfig
313298
// ----------

0 commit comments

Comments
 (0)