Skip to content

Commit 54f6a89

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 e04001a commit 54f6a89

26 files changed

+587
-772
lines changed

api/default_networks.go

+104-85
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ package api
22

33
import (
44
"fmt"
5-
"strings"
65

7-
"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

@@ -20,17 +19,29 @@ const (
2019
sttSymbol = "STT"
2120
)
2221

23-
var ganacheTokenAddress = common.HexToAddress("0x8571Ddc46b10d31EF963aF49b6C7799Ea7eff818")
22+
func proxyUrl(stageName, provider, chainName, networkName string) string {
23+
return fmt.Sprintf("https://%s.api.status.im/%s/%s/%s/", stageName, provider, chainName, networkName)
24+
}
2425

2526
func mainnet(stageName string) params.Network {
27+
chainID := MainnetChainID
28+
chainName := "ethereum"
29+
networkName := "mainnet"
30+
31+
rpcProviders := []params.RpcProvider{
32+
// Proxy providers
33+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
34+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
35+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), false),
36+
// Direct providers
37+
*params.NewDirectProvider(chainID, "direct-infura", "https://mainnet.infura.io/v3/", true),
38+
*params.NewDirectProvider(chainID, "direct-grove", "https://eth-archival.rpc.grove.city/v1/", false),
39+
}
40+
2641
return params.Network{
27-
ChainID: MainnetChainID,
42+
ChainID: chainID,
2843
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/",
44+
RpcProviders: rpcProviders,
3445
BlockExplorerURL: "https://etherscan.io/",
3546
IconURL: "network/Network=Ethereum",
3647
ChainColor: "#627EEA",
@@ -46,14 +57,24 @@ func mainnet(stageName string) params.Network {
4657
}
4758

4859
func sepolia(stageName string) params.Network {
60+
chainID := SepoliaChainID
61+
chainName := "ethereum"
62+
networkName := "sepolia"
63+
64+
rpcProviders := []params.RpcProvider{
65+
// Proxy providers
66+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
67+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
68+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
69+
// Direct providers
70+
*params.NewDirectProvider(chainID, "direct-infura", "https://sepolia.infura.io/v3/", true),
71+
*params.NewDirectProvider(chainID, "direct-grove", "https://sepolia-archival.rpc.grove.city/v1/", false),
72+
}
73+
4974
return params.Network{
50-
ChainID: SepoliaChainID,
75+
ChainID: chainID,
5176
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/",
77+
RpcProviders: rpcProviders,
5778
BlockExplorerURL: "https://sepolia.etherscan.io/",
5879
IconURL: "network/Network=Ethereum",
5980
ChainColor: "#627EEA",
@@ -67,16 +88,25 @@ func sepolia(stageName string) params.Network {
6788
RelatedChainID: MainnetChainID,
6889
}
6990
}
70-
7191
func optimism(stageName string) params.Network {
92+
chainID := OptimismChainID
93+
chainName := "optimism"
94+
networkName := "mainnet"
95+
96+
rpcProviders := []params.RpcProvider{
97+
// Proxy providers
98+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
99+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
100+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
101+
// Direct providers
102+
*params.NewDirectProvider(chainID, "direct-infura", "https://optimism-mainnet.infura.io/v3/", true),
103+
*params.NewDirectProvider(chainID, "direct-grove", "https://optimism-archival.rpc.grove.city/v1/", false),
104+
}
105+
72106
return params.Network{
73-
ChainID: OptimismChainID,
107+
ChainID: chainID,
74108
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/",
109+
RpcProviders: rpcProviders,
80110
BlockExplorerURL: "https://optimistic.etherscan.io",
81111
IconURL: "network/Network=Optimism",
82112
ChainColor: "#E90101",
@@ -90,16 +120,25 @@ func optimism(stageName string) params.Network {
90120
RelatedChainID: OptimismSepoliaChainID,
91121
}
92122
}
93-
94123
func optimismSepolia(stageName string) params.Network {
124+
chainID := OptimismSepoliaChainID
125+
chainName := "optimism"
126+
networkName := "sepolia"
127+
128+
rpcProviders := []params.RpcProvider{
129+
// Proxy providers
130+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
131+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
132+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
133+
// Direct providers
134+
*params.NewDirectProvider(chainID, "direct-infura", "https://optimism-sepolia.infura.io/v3/", true),
135+
*params.NewDirectProvider(chainID, "direct-grove", "https://optimism-sepolia-archival.rpc.grove.city/v1/", false),
136+
}
137+
95138
return params.Network{
96-
ChainID: OptimismSepoliaChainID,
139+
ChainID: chainID,
97140
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/",
141+
RpcProviders: rpcProviders,
103142
BlockExplorerURL: "https://sepolia-optimism.etherscan.io/",
104143
IconURL: "network/Network=Optimism",
105144
ChainColor: "#E90101",
@@ -113,16 +152,25 @@ func optimismSepolia(stageName string) params.Network {
113152
RelatedChainID: OptimismChainID,
114153
}
115154
}
116-
117155
func arbitrum(stageName string) params.Network {
156+
chainID := ArbitrumChainID
157+
chainName := "arbitrum"
158+
networkName := "mainnet"
159+
160+
rpcProviders := []params.RpcProvider{
161+
// Proxy providers
162+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
163+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
164+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
165+
// Direct providers
166+
*params.NewDirectProvider(chainID, "direct-infura", "https://arbitrum-mainnet.infura.io/v3/", true),
167+
*params.NewDirectProvider(chainID, "direct-grove", "https://arbitrum-one.rpc.grove.city/v1/", false),
168+
}
169+
118170
return params.Network{
119-
ChainID: ArbitrumChainID,
171+
ChainID: chainID,
120172
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/",
173+
RpcProviders: rpcProviders,
126174
BlockExplorerURL: "https://arbiscan.io/",
127175
IconURL: "network/Network=Arbitrum",
128176
ChainColor: "#51D0F0",
@@ -136,16 +184,25 @@ func arbitrum(stageName string) params.Network {
136184
RelatedChainID: ArbitrumSepoliaChainID,
137185
}
138186
}
139-
140187
func arbitrumSepolia(stageName string) params.Network {
188+
chainID := ArbitrumSepoliaChainID
189+
chainName := "arbitrum"
190+
networkName := "sepolia"
191+
192+
rpcProviders := []params.RpcProvider{
193+
// Proxy providers
194+
*params.NewProxyProvider(chainID, "proxy-nodefleet", proxyUrl(stageName, "nodefleet", chainName, networkName), false),
195+
*params.NewProxyProvider(chainID, "proxy-infura", proxyUrl(stageName, "infura", chainName, networkName), false),
196+
*params.NewProxyProvider(chainID, "proxy-grove", proxyUrl(stageName, "grove", chainName, networkName), true),
197+
// Direct providers
198+
*params.NewDirectProvider(chainID, "direct-infura", "https://arbitrum-sepolia.infura.io/v3/", true),
199+
*params.NewDirectProvider(chainID, "direct-grove", "https://arbitrum-sepolia-archival.rpc.grove.city/v1/", false),
200+
}
201+
141202
return params.Network{
142-
ChainID: ArbitrumSepoliaChainID,
203+
ChainID: chainID,
143204
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/",
205+
RpcProviders: rpcProviders,
149206
BlockExplorerURL: "https://sepolia-explorer.arbitrum.io/",
150207
IconURL: "network/Network=Arbitrum",
151208
ChainColor: "#51D0F0",
@@ -171,50 +228,12 @@ func defaultNetworks(stageName string) []params.Network {
171228
}
172229
}
173230

174-
var mainnetGanacheTokenOverrides = params.TokenOverride{
175-
Symbol: sntSymbol,
176-
Address: ganacheTokenAddress,
177-
}
178-
179231
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
232+
authTokens := map[string]string{
233+
"infura.io": request.InfuraToken,
234+
"grove.city": request.PoktToken,
195235
}
196-
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)
215-
}
216-
217-
return networksWithRPC
236+
return networkhelper.OverrideDirectProvidersAuth(networks, authTokens)
218237
}
219238

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

api/default_networks_test.go

+22-26
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,22 @@ import (
44
"strings"
55
"testing"
66

7+
"github.com/status-im/status-go/params"
8+
79
"github.com/pkg/errors"
810
"github.com/stretchr/testify/require"
911

1012
"github.com/status-im/status-go/protocol/requests"
1113
)
1214

1315
func TestBuildDefaultNetworks(t *testing.T) {
14-
rpcToken := "infura-token"
15-
fallbackToken := ""
16+
infuraToken := "infura-token"
17+
poktToken := "pokt-token"
1618
stageName := "fast-n-bulbous"
1719
request := &requests.CreateAccount{
1820
WalletSecretsConfig: requests.WalletSecretsConfig{
19-
InfuraToken: rpcToken,
21+
InfuraToken: infuraToken,
22+
PoktToken: poktToken,
2023
StatusProxyStageName: stageName,
2124
},
2225
}
@@ -50,30 +53,23 @@ func TestBuildDefaultNetworks(t *testing.T) {
5053
// check fallback options
5154
require.True(t, strings.Contains(n.RPCURL, rpcToken))
5255
require.True(t, strings.Contains(n.FallbackURL, fallbackToken))
53-
}
54-
}
55-
56-
func TestBuildDefaultNetworksGanache(t *testing.T) {
57-
ganacheURL := "ganacheurl"
58-
request := &requests.CreateAccount{
59-
WalletSecretsConfig: requests.WalletSecretsConfig{
60-
GanacheURL: ganacheURL,
61-
},
62-
}
6356

64-
actualNetworks := BuildDefaultNetworks(&request.WalletSecretsConfig)
65-
66-
require.Len(t, actualNetworks, 6)
57+
// Check proxy providers for stageName
58+
for _, provider := range n.RpcProviders {
59+
if provider.Type == params.EmbeddedProxyProviderType {
60+
require.Contains(t, provider.URL, stageName, "Proxy provider URL should contain stageName")
61+
}
62+
}
6763

68-
for _, n := range actualNetworks {
69-
require.True(t, strings.Contains(n.RPCURL, ganacheURL))
70-
require.True(t, strings.Contains(n.FallbackURL, ganacheURL))
64+
// Check direct providers for tokens
65+
for _, provider := range n.RpcProviders {
66+
if provider.Type == params.EmbeddedDirectProviderType {
67+
if strings.Contains(provider.URL, "infura.io") {
68+
require.Equal(t, provider.AuthToken, infuraToken, "Direct provider URL should have infuraToken")
69+
} else if strings.Contains(provider.URL, "grove.city") {
70+
require.Equal(t, provider.AuthToken, poktToken, "Direct provider URL should have poktToken")
71+
}
72+
}
73+
}
7174
}
72-
73-
require.Equal(t, MainnetChainID, actualNetworks[0].ChainID)
74-
75-
require.NotNil(t, actualNetworks[0].TokenOverrides)
76-
require.Len(t, actualNetworks[0].TokenOverrides, 1)
77-
require.Equal(t, sntSymbol, actualNetworks[0].TokenOverrides[0].Symbol)
78-
require.Equal(t, ganacheTokenAddress, actualNetworks[0].TokenOverrides[0].Address)
7975
}

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())

0 commit comments

Comments
 (0)