diff --git a/etherclient/client.go b/etherclient/client.go index c4a9066..59e68fb 100644 --- a/etherclient/client.go +++ b/etherclient/client.go @@ -3,6 +3,7 @@ package etherclient import ( "context" "errors" + "fmt" "math/big" "time" @@ -83,6 +84,7 @@ type Extras interface { type etherClient struct { provider provider.Provider[*ethclient.Client] retryInterval time.Duration + urls []string } var _ EtherClient = ðerClient{} @@ -102,6 +104,7 @@ func DialContext(ctx context.Context, rawurls ...string) (*etherClient, error) { return ðerClient{ provider: provider.NewRingProvider(clients...), retryInterval: defaultRetryInterval, + urls: rawurls, }, nil } @@ -509,3 +512,20 @@ func (ec *etherClient) SendTransaction(ctx context.Context, tx *types.Transactio return ethClient.SendTransaction(ctx, tx) }) } + +// CurrentRPCURL returns the RPC URL of the current provider. +func (ec *etherClient) CurrentRPCURL() (string, error) { + // Get the current client's index in the ring + currentClient := ec.provider.Provide() + p, ok := ec.provider.(*provider.RingProvider[*ethclient.Client]) + if !ok { + return "", fmt.Errorf("bad provider type") + } + + for i, client := range p.Elements() { + if client == currentClient { + return ec.urls[i], nil + } + } + return "", fmt.Errorf("no active clients") +}