chore_: add a status proxy to the nodefleet rpc as a primary service provider
fixes #5901
This commit is contained in:
parent
5c41e8211a
commit
66ee53175e
|
@ -29,8 +29,9 @@ func mainnet(stageName string) params.Network {
|
||||||
return params.Network{
|
return params.Network{
|
||||||
ChainID: mainnetChainID,
|
ChainID: mainnetChainID,
|
||||||
ChainName: "Mainnet",
|
ChainName: "Mainnet",
|
||||||
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/grove/ethereum/mainnet/", stageName),
|
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/ethereum/mainnet/", stageName),
|
||||||
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/ethereum/mainnet/", stageName),
|
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/ethereum/mainnet/", stageName),
|
||||||
|
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/ethereum/mainnet/", stageName),
|
||||||
RPCURL: "https://eth-archival.rpc.grove.city/v1/",
|
RPCURL: "https://eth-archival.rpc.grove.city/v1/",
|
||||||
FallbackURL: "https://mainnet.infura.io/v3/",
|
FallbackURL: "https://mainnet.infura.io/v3/",
|
||||||
BlockExplorerURL: "https://etherscan.io/",
|
BlockExplorerURL: "https://etherscan.io/",
|
||||||
|
@ -71,8 +72,9 @@ func sepolia(stageName string) params.Network {
|
||||||
return params.Network{
|
return params.Network{
|
||||||
ChainID: sepoliaChainID,
|
ChainID: sepoliaChainID,
|
||||||
ChainName: "Mainnet",
|
ChainName: "Mainnet",
|
||||||
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/grove/ethereum/sepolia/", stageName),
|
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/ethereum/sepolia/", stageName),
|
||||||
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/ethereum/sepolia/", stageName),
|
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/ethereum/sepolia/", stageName),
|
||||||
|
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/ethereum/sepolia/", stageName),
|
||||||
RPCURL: "https://sepolia-archival.rpc.grove.city/v1/",
|
RPCURL: "https://sepolia-archival.rpc.grove.city/v1/",
|
||||||
FallbackURL: "https://sepolia.infura.io/v3/",
|
FallbackURL: "https://sepolia.infura.io/v3/",
|
||||||
BlockExplorerURL: "https://sepolia.etherscan.io/",
|
BlockExplorerURL: "https://sepolia.etherscan.io/",
|
||||||
|
@ -93,8 +95,9 @@ func optimism(stageName string) params.Network {
|
||||||
return params.Network{
|
return params.Network{
|
||||||
ChainID: optimismChainID,
|
ChainID: optimismChainID,
|
||||||
ChainName: "Optimism",
|
ChainName: "Optimism",
|
||||||
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/grove/optimism/mainnet/", stageName),
|
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/optimism/mainnet/", stageName),
|
||||||
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/optimism/mainnet/", stageName),
|
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/optimism/mainnet/", stageName),
|
||||||
|
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/optimism/mainnet/", stageName),
|
||||||
RPCURL: "https://optimism-archival.rpc.grove.city/v1/",
|
RPCURL: "https://optimism-archival.rpc.grove.city/v1/",
|
||||||
FallbackURL: "https://optimism-mainnet.infura.io/v3/",
|
FallbackURL: "https://optimism-mainnet.infura.io/v3/",
|
||||||
BlockExplorerURL: "https://optimistic.etherscan.io",
|
BlockExplorerURL: "https://optimistic.etherscan.io",
|
||||||
|
@ -135,8 +138,9 @@ func optimismSepolia(stageName string) params.Network {
|
||||||
return params.Network{
|
return params.Network{
|
||||||
ChainID: optimismSepoliaChainID,
|
ChainID: optimismSepoliaChainID,
|
||||||
ChainName: "Optimism",
|
ChainName: "Optimism",
|
||||||
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/grove/optimism/sepolia/", stageName),
|
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/optimism/sepolia/", stageName),
|
||||||
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/optimism/sepolia/", stageName),
|
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/optimism/sepolia/", stageName),
|
||||||
|
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/optimism/sepolia/", stageName),
|
||||||
RPCURL: "https://optimism-sepolia-archival.rpc.grove.city/v1/",
|
RPCURL: "https://optimism-sepolia-archival.rpc.grove.city/v1/",
|
||||||
FallbackURL: "https://optimism-sepolia.infura.io/v3/",
|
FallbackURL: "https://optimism-sepolia.infura.io/v3/",
|
||||||
BlockExplorerURL: "https://sepolia-optimism.etherscan.io/",
|
BlockExplorerURL: "https://sepolia-optimism.etherscan.io/",
|
||||||
|
@ -157,8 +161,9 @@ func arbitrum(stageName string) params.Network {
|
||||||
return params.Network{
|
return params.Network{
|
||||||
ChainID: arbitrumChainID,
|
ChainID: arbitrumChainID,
|
||||||
ChainName: "Arbitrum",
|
ChainName: "Arbitrum",
|
||||||
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/grove/arbitrum/mainnet/", stageName),
|
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/arbitrum/mainnet/", stageName),
|
||||||
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/arbitrum/mainnet/", stageName),
|
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/arbitrum/mainnet/", stageName),
|
||||||
|
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/arbitrum/mainnet/", stageName),
|
||||||
RPCURL: "https://arbitrum-one.rpc.grove.city/v1/",
|
RPCURL: "https://arbitrum-one.rpc.grove.city/v1/",
|
||||||
FallbackURL: "https://arbitrum-mainnet.infura.io/v3/",
|
FallbackURL: "https://arbitrum-mainnet.infura.io/v3/",
|
||||||
BlockExplorerURL: "https://arbiscan.io/",
|
BlockExplorerURL: "https://arbiscan.io/",
|
||||||
|
@ -199,8 +204,9 @@ func arbitrumSepolia(stageName string) params.Network {
|
||||||
return params.Network{
|
return params.Network{
|
||||||
ChainID: arbitrumSepoliaChainID,
|
ChainID: arbitrumSepoliaChainID,
|
||||||
ChainName: "Arbitrum",
|
ChainName: "Arbitrum",
|
||||||
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/grove/arbitrum/sepolia/", stageName),
|
DefaultRPCURL: fmt.Sprintf("https://%s.api.status.im/nodefleet/arbitrum/sepolia/", stageName),
|
||||||
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/arbitrum/sepolia/", stageName),
|
DefaultFallbackURL: fmt.Sprintf("https://%s.api.status.im/infura/arbitrum/sepolia/", stageName),
|
||||||
|
DefaultFallbackURL2: fmt.Sprintf("https://%s.api.status.im/grove/arbitrum/sepolia/", stageName),
|
||||||
RPCURL: "https://arbitrum-sepolia-archival.rpc.grove.city/v1/",
|
RPCURL: "https://arbitrum-sepolia-archival.rpc.grove.city/v1/",
|
||||||
FallbackURL: "https://arbitrum-sepolia.infura.io/v3/",
|
FallbackURL: "https://arbitrum-sepolia.infura.io/v3/",
|
||||||
BlockExplorerURL: "https://sepolia-explorer.arbitrum.io/",
|
BlockExplorerURL: "https://sepolia-explorer.arbitrum.io/",
|
||||||
|
|
|
@ -31,6 +31,7 @@ func TestBuildDefaultNetworks(t *testing.T) {
|
||||||
require.True(t, strings.Contains(actualNetworks[0].FallbackURL, infuraToken))
|
require.True(t, strings.Contains(actualNetworks[0].FallbackURL, infuraToken))
|
||||||
require.True(t, strings.Contains(actualNetworks[0].DefaultRPCURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[0].DefaultRPCURL, stageName))
|
||||||
require.True(t, strings.Contains(actualNetworks[0].DefaultFallbackURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[0].DefaultFallbackURL, stageName))
|
||||||
|
require.True(t, strings.Contains(actualNetworks[0].DefaultFallbackURL2, stageName))
|
||||||
|
|
||||||
require.Equal(t, goerliChainID, actualNetworks[1].ChainID)
|
require.Equal(t, goerliChainID, actualNetworks[1].ChainID)
|
||||||
|
|
||||||
|
@ -42,6 +43,7 @@ func TestBuildDefaultNetworks(t *testing.T) {
|
||||||
require.True(t, strings.Contains(actualNetworks[2].FallbackURL, infuraToken))
|
require.True(t, strings.Contains(actualNetworks[2].FallbackURL, infuraToken))
|
||||||
require.True(t, strings.Contains(actualNetworks[2].DefaultRPCURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[2].DefaultRPCURL, stageName))
|
||||||
require.True(t, strings.Contains(actualNetworks[2].DefaultFallbackURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[2].DefaultFallbackURL, stageName))
|
||||||
|
require.True(t, strings.Contains(actualNetworks[2].DefaultFallbackURL2, stageName))
|
||||||
|
|
||||||
require.Equal(t, optimismChainID, actualNetworks[3].ChainID)
|
require.Equal(t, optimismChainID, actualNetworks[3].ChainID)
|
||||||
|
|
||||||
|
@ -49,6 +51,7 @@ func TestBuildDefaultNetworks(t *testing.T) {
|
||||||
require.True(t, strings.Contains(actualNetworks[3].FallbackURL, infuraToken))
|
require.True(t, strings.Contains(actualNetworks[3].FallbackURL, infuraToken))
|
||||||
require.True(t, strings.Contains(actualNetworks[3].DefaultRPCURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[3].DefaultRPCURL, stageName))
|
||||||
require.True(t, strings.Contains(actualNetworks[3].DefaultFallbackURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[3].DefaultFallbackURL, stageName))
|
||||||
|
require.True(t, strings.Contains(actualNetworks[3].DefaultFallbackURL2, stageName))
|
||||||
|
|
||||||
require.Equal(t, optimismGoerliChainID, actualNetworks[4].ChainID)
|
require.Equal(t, optimismGoerliChainID, actualNetworks[4].ChainID)
|
||||||
|
|
||||||
|
@ -61,6 +64,7 @@ func TestBuildDefaultNetworks(t *testing.T) {
|
||||||
require.True(t, strings.Contains(actualNetworks[5].FallbackURL, infuraToken))
|
require.True(t, strings.Contains(actualNetworks[5].FallbackURL, infuraToken))
|
||||||
require.True(t, strings.Contains(actualNetworks[5].DefaultRPCURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[5].DefaultRPCURL, stageName))
|
||||||
require.True(t, strings.Contains(actualNetworks[5].DefaultFallbackURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[5].DefaultFallbackURL, stageName))
|
||||||
|
require.True(t, strings.Contains(actualNetworks[5].DefaultFallbackURL2, stageName))
|
||||||
|
|
||||||
require.Equal(t, arbitrumChainID, actualNetworks[6].ChainID)
|
require.Equal(t, arbitrumChainID, actualNetworks[6].ChainID)
|
||||||
|
|
||||||
|
@ -68,6 +72,7 @@ func TestBuildDefaultNetworks(t *testing.T) {
|
||||||
require.True(t, strings.Contains(actualNetworks[6].FallbackURL, infuraToken))
|
require.True(t, strings.Contains(actualNetworks[6].FallbackURL, infuraToken))
|
||||||
require.True(t, strings.Contains(actualNetworks[6].DefaultRPCURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[6].DefaultRPCURL, stageName))
|
||||||
require.True(t, strings.Contains(actualNetworks[6].DefaultFallbackURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[6].DefaultFallbackURL, stageName))
|
||||||
|
require.True(t, strings.Contains(actualNetworks[6].DefaultFallbackURL2, stageName))
|
||||||
|
|
||||||
require.Equal(t, arbitrumGoerliChainID, actualNetworks[7].ChainID)
|
require.Equal(t, arbitrumGoerliChainID, actualNetworks[7].ChainID)
|
||||||
|
|
||||||
|
@ -80,6 +85,7 @@ func TestBuildDefaultNetworks(t *testing.T) {
|
||||||
require.True(t, strings.Contains(actualNetworks[8].FallbackURL, infuraToken))
|
require.True(t, strings.Contains(actualNetworks[8].FallbackURL, infuraToken))
|
||||||
require.True(t, strings.Contains(actualNetworks[8].DefaultRPCURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[8].DefaultRPCURL, stageName))
|
||||||
require.True(t, strings.Contains(actualNetworks[8].DefaultFallbackURL, stageName))
|
require.True(t, strings.Contains(actualNetworks[8].DefaultFallbackURL, stageName))
|
||||||
|
require.True(t, strings.Contains(actualNetworks[8].DefaultFallbackURL2, stageName))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -541,6 +541,7 @@ type Network struct {
|
||||||
ChainName string `json:"chainName"`
|
ChainName string `json:"chainName"`
|
||||||
DefaultRPCURL string `json:"defaultRpcUrl"` // proxy rpc url
|
DefaultRPCURL string `json:"defaultRpcUrl"` // proxy rpc url
|
||||||
DefaultFallbackURL string `json:"defaultFallbackURL"` // proxy fallback url
|
DefaultFallbackURL string `json:"defaultFallbackURL"` // proxy fallback url
|
||||||
|
DefaultFallbackURL2 string `json:"defaultFallbackURL2"` // second proxy fallback url
|
||||||
RPCURL string `json:"rpcUrl"`
|
RPCURL string `json:"rpcUrl"`
|
||||||
OriginalRPCURL string `json:"originalRpcUrl"`
|
OriginalRPCURL string `json:"originalRpcUrl"`
|
||||||
FallbackURL string `json:"fallbackURL"`
|
FallbackURL string `json:"fallbackURL"`
|
||||||
|
|
|
@ -264,11 +264,14 @@ func (c *Client) getEthClients(network *params.Network) []ethclient.RPSLimitedEt
|
||||||
if proxyProvider.Enabled {
|
if proxyProvider.Enabled {
|
||||||
key := ProviderStatusProxy
|
key := ProviderStatusProxy
|
||||||
keyFallback := ProviderStatusProxy + "-fallback"
|
keyFallback := ProviderStatusProxy + "-fallback"
|
||||||
|
keyFallback2 := ProviderStatusProxy + "-fallback2"
|
||||||
urls[key] = network.DefaultRPCURL
|
urls[key] = network.DefaultRPCURL
|
||||||
urls[keyFallback] = network.DefaultFallbackURL
|
urls[keyFallback] = network.DefaultFallbackURL
|
||||||
keys = []string{key, keyFallback}
|
urls[keyFallback2] = network.DefaultFallbackURL2
|
||||||
|
keys = []string{key, keyFallback, keyFallback2}
|
||||||
authMap[key] = proxyProvider.User + ":" + proxyProvider.Password
|
authMap[key] = proxyProvider.User + ":" + proxyProvider.Password
|
||||||
authMap[keyFallback] = authMap[key]
|
authMap[keyFallback] = authMap[key]
|
||||||
|
authMap[keyFallback2] = authMap[key]
|
||||||
}
|
}
|
||||||
keys = append(keys, []string{"main", "fallback"}...)
|
keys = append(keys, []string{"main", "fallback"}...)
|
||||||
urls["main"] = network.RPCURL
|
urls["main"] = network.RPCURL
|
||||||
|
|
|
@ -151,25 +151,25 @@ func TestGetClientsUsingCache(t *testing.T) {
|
||||||
providerConfigs := []params.ProviderConfig{providerConfig}
|
providerConfigs := []params.ProviderConfig{providerConfig}
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(2) // 2 providers
|
wg.Add(3) // 3 providers
|
||||||
|
|
||||||
// Create a new ServeMux
|
// Create a new ServeMux
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
|
|
||||||
path1 := "/foo"
|
path1 := "/foo"
|
||||||
path2 := "/bar"
|
path2 := "/bar"
|
||||||
// Register handlers for different URL paths
|
path3 := "/baz"
|
||||||
mux.HandleFunc(path1, func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
authToken := base64.StdEncoding.EncodeToString([]byte(providerConfig.User + ":" + providerConfig.Password))
|
|
||||||
require.Equal(t, fmt.Sprintf("Basic %s", authToken), r.Header.Get("Authorization"))
|
|
||||||
wg.Done()
|
|
||||||
})
|
|
||||||
|
|
||||||
mux.HandleFunc(path2, func(w http.ResponseWriter, r *http.Request) {
|
authHandler := func(w http.ResponseWriter, r *http.Request) {
|
||||||
authToken := base64.StdEncoding.EncodeToString([]byte(providerConfig.User + ":" + providerConfig.Password))
|
authToken := base64.StdEncoding.EncodeToString([]byte(providerConfig.User + ":" + providerConfig.Password))
|
||||||
require.Equal(t, fmt.Sprintf("Basic %s", authToken), r.Header.Get("Authorization"))
|
require.Equal(t, fmt.Sprintf("Basic %s", authToken), r.Header.Get("Authorization"))
|
||||||
wg.Done()
|
wg.Done()
|
||||||
})
|
}
|
||||||
|
|
||||||
|
// Register handlers for different URL paths
|
||||||
|
mux.HandleFunc(path1, authHandler)
|
||||||
|
mux.HandleFunc(path2, authHandler)
|
||||||
|
mux.HandleFunc(path3, authHandler)
|
||||||
|
|
||||||
// Create a new server with the mux as the handler
|
// Create a new server with the mux as the handler
|
||||||
server := httptest.NewServer(mux)
|
server := httptest.NewServer(mux)
|
||||||
|
@ -180,12 +180,13 @@ func TestGetClientsUsingCache(t *testing.T) {
|
||||||
ChainID: 1,
|
ChainID: 1,
|
||||||
DefaultRPCURL: server.URL + path1,
|
DefaultRPCURL: server.URL + path1,
|
||||||
DefaultFallbackURL: server.URL + path2,
|
DefaultFallbackURL: server.URL + path2,
|
||||||
|
DefaultFallbackURL2: server.URL + path3,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
c, err := NewClient(nil, 1, params.UpstreamRPCConfig{}, networks, db, providerConfigs)
|
c, err := NewClient(nil, 1, params.UpstreamRPCConfig{}, networks, db, providerConfigs)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Networks from DB must pick up DefaultRPCURL and DefaultFallbackURL
|
// Networks from DB must pick up DefaultRPCURL, DefaultFallbackURL, DefaultFallbackURL2
|
||||||
chainClient, err := c.getClientUsingCache(networks[0].ChainID)
|
chainClient, err := c.getClientUsingCache(networks[0].ChainID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, chainClient)
|
require.NotNil(t, chainClient)
|
||||||
|
|
|
@ -378,6 +378,7 @@ func findNetwork(networks []params.Network, chainID uint64) (params.Network, err
|
||||||
func addDefaultRPCURL(target *params.Network, source params.Network) {
|
func addDefaultRPCURL(target *params.Network, source params.Network) {
|
||||||
target.DefaultRPCURL = source.DefaultRPCURL
|
target.DefaultRPCURL = source.DefaultRPCURL
|
||||||
target.DefaultFallbackURL = source.DefaultFallbackURL
|
target.DefaultFallbackURL = source.DefaultFallbackURL
|
||||||
|
target.DefaultFallbackURL2 = source.DefaultFallbackURL2
|
||||||
}
|
}
|
||||||
|
|
||||||
func setDefaultRPCURL(target []*params.Network, source []params.Network) {
|
func setDefaultRPCURL(target []*params.Network, source []params.Network) {
|
||||||
|
|
Loading…
Reference in New Issue