Skip to content

Commit 46682e4

Browse files
feat: add multiple rpcs (#13)
* feat: add lcd tables * chore: add NodesManager * chore: instantiate NodesManager * chore: use NodesManager for validators * chore: use NodesManager for slashing params and signing infos * chore: use NodesManager for gov and mint params * chore: use NodesManager for inflation * chore: use NodesManager for balances * chore: use NodesManager for rewards and commissions * chore: use NodesManager for delegations * chore: use NodesManager for supply * chore: use NodesManager for block time * chore: use NodesManager for gov * chore: use NodesManager for staking params and validator * chore: add /lcd_add command and removed lcd endpoint from chains * chore: add /lcd_delete command * chore: bump golang version in ci * add /chain command
1 parent 6a3595d commit 46682e4

36 files changed

+896
-256
lines changed

.github/workflows/actions.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
- uses: actions/checkout@master
1111
- uses: actions/setup-go@v5
1212
with:
13-
go-version: '1.21.3'
13+
go-version: '1.23.2'
1414
- run: go version
1515
- run: go mod download
1616
- run: go build cmd/astronomer.go
@@ -20,7 +20,7 @@ jobs:
2020
- uses: actions/checkout@master
2121
- uses: actions/setup-go@v5
2222
with:
23-
go-version: '1.21.3'
23+
go-version: '1.23.2'
2424
- run: go version
2525
- run: go mod download
2626
- run: go vet ./...
@@ -39,7 +39,7 @@ jobs:
3939
steps:
4040
- uses: actions/setup-go@v5
4141
with:
42-
go-version: '1.21.3'
42+
go-version: '1.23.2'
4343
- name: Check out code into the Go module directory
4444
uses: actions/checkout@v2
4545
- name: Run tests
@@ -66,7 +66,7 @@ jobs:
6666
uses: actions/checkout@v2
6767
- uses: actions/setup-go@v5
6868
with:
69-
go-version: '1.21.3'
69+
go-version: '1.23.2'
7070
- run: go build cmd/astronomer.go
7171
- run: ./astronomer migrate --config assets/config-ci.toml
7272
- run: ./astronomer rollback --config assets/config-ci.toml

.github/workflows/release.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818

1919
- uses: actions/setup-go@v2
2020
with:
21-
go-version: '1.21.3'
21+
go-version: '1.23.2'
2222

2323
- name: Run GoReleaser
2424
uses: goreleaser/goreleaser-action@v6

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module main
22

3-
go 1.21.10
3+
go 1.22
44

55
require (
66
cosmossdk.io/math v1.3.0

migrations/20241027213549_add_lcd.sql

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- +goose Up
2+
-- +goose StatementBegin
3+
CREATE TABLE lcd (
4+
chain TEXT NOT NULL REFERENCES chains(name),
5+
host TEXT NOT NULL,
6+
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
7+
PRIMARY KEY (chain, host)
8+
);
9+
INSERT INTO lcd (chain, host) (SELECT name chain, lcd_endpoint host FROM chains);
10+
-- +goose StatementEnd
11+
12+
-- +goose Down
13+
DROP TABLE lcd;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-- +goose Up
2+
-- +goose StatementBegin
3+
ALTER TABLE chains DROP COLUMN lcd_endpoint;
4+
-- +goose StatementEnd
5+
6+
-- +goose Down
7+
-- +goose StatementBegin
8+
ALTER TABLE chains ADD COLUMN lcd_endpoint TEXT;
9+
-- +goose StatementEnd

pkg/app.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"main/pkg/interacter/telegram"
1010
"main/pkg/logger"
1111
"main/pkg/metrics"
12+
"main/pkg/tendermint"
1213
"main/pkg/types"
1314

1415
"github.com/rs/zerolog"
@@ -47,7 +48,8 @@ func NewApp(configPath string, filesystem fs.FS, version string) *App {
4748
converter := converterPkg.NewConverter()
4849
database := databasePkg.NewDatabase(log, config.DatabaseConfig)
4950
metricsManager := metrics.NewManager(log, config.MetricsConfig)
50-
dataFetcher := datafetcher.NewDataFetcher(*log, database, converter, metricsManager)
51+
nodesManager := tendermint.NewNodeManager(log, database, converter, metricsManager)
52+
dataFetcher := datafetcher.NewDataFetcher(log, database, converter, metricsManager, nodesManager)
5153
interacters := []interacterPkg.Interacter{
5254
telegram.NewInteracter(config.TelegramConfig, version, log, dataFetcher, database, metricsManager),
5355
}

pkg/constants/constants.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ const (
1818
PrometheusMetricsPrefix = "astronomer_"
1919

2020
RPCQueryTimeout = 10
21+
RetriesCount = 3
2122
)
2223

2324
var (
2425
ErrWrongInvocation = errors.New("wrong invocation")
2526
ErrChainNotFound = fmt.Errorf("chain not found")
2627
ErrChainNotBound = fmt.Errorf("chain not bound to this chat")
28+
ErrLCDNotFound = fmt.Errorf("chain LCD host not found")
2729
)

pkg/data_fetcher/balances.go

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,12 @@ func (f *DataFetcher) GetBalances(userID, reporter string) *types.WalletsBalance
6666
go func(chain *types.Chain, chainWallet *types.WalletLink) {
6767
defer wg.Done()
6868

69-
rpc := f.GetRPC(chain)
70-
71-
balances, _, err := rpc.GetBalance(chainWallet.Address)
69+
balances, balancesErr := f.NodesManager.GetBalance(chain, chainWallet.Address)
7270
mutex.Lock()
7371
defer mutex.Unlock()
7472

75-
if err != nil {
76-
response.SetBalancesError(chain.Name, chainWallet, err)
73+
if balancesErr != nil {
74+
response.SetBalancesError(chain.Name, chainWallet, balancesErr)
7775
return
7876
}
7977

@@ -94,13 +92,11 @@ func (f *DataFetcher) GetBalances(userID, reporter string) *types.WalletsBalance
9492
go func(chain *types.Chain, chainWallet *types.WalletLink) {
9593
defer wg.Done()
9694

97-
rpc := f.GetRPC(chain)
98-
99-
rewards, _, err := rpc.GetRewards(chainWallet.Address)
95+
rewards, rewardsErr := f.NodesManager.GetRewards(chain, chainWallet.Address)
10096
mutex.Lock()
10197
defer mutex.Unlock()
10298

103-
if err != nil {
99+
if rewardsErr != nil {
104100
response.SetRewardsError(chain.Name, chainWallet, err)
105101
return
106102
}
@@ -122,22 +118,20 @@ func (f *DataFetcher) GetBalances(userID, reporter string) *types.WalletsBalance
122118
go func(chain *types.Chain, chainWallet *types.WalletLink) {
123119
defer wg.Done()
124120

125-
valoper, err := utils.ConvertBech32Prefix(chainWallet.Address, chain.Bech32ValidatorPrefix)
126-
if err != nil {
121+
valoper, convertErr := utils.ConvertBech32Prefix(chainWallet.Address, chain.Bech32ValidatorPrefix)
122+
if convertErr != nil {
127123
mutex.Lock()
128-
response.SetCommissionsError(chain.Name, chainWallet, err)
124+
response.SetCommissionsError(chain.Name, chainWallet, convertErr)
129125
mutex.Unlock()
130126
return
131127
}
132128

133-
rpc := f.GetRPC(chain)
134-
135-
rewards, _, err := rpc.GetCommission(valoper)
129+
rewards, rewardsErr := f.NodesManager.GetCommission(chain, valoper)
136130
mutex.Lock()
137131
defer mutex.Unlock()
138132

139-
if err != nil {
140-
response.SetCommissionsError(chain.Name, chainWallet, err)
133+
if rewardsErr != nil {
134+
response.SetCommissionsError(chain.Name, chainWallet, rewardsErr)
141135
return
142136
}
143137

@@ -158,14 +152,12 @@ func (f *DataFetcher) GetBalances(userID, reporter string) *types.WalletsBalance
158152
go func(chain *types.Chain, chainWallet *types.WalletLink) {
159153
defer wg.Done()
160154

161-
rpc := f.GetRPC(chain)
162-
163-
delegations, _, err := rpc.GetDelegations(chainWallet.Address)
155+
delegations, delegationsErr := f.NodesManager.GetDelegations(chain, chainWallet.Address)
164156
mutex.Lock()
165157
defer mutex.Unlock()
166158

167-
if err != nil {
168-
response.SetDelegationsError(chain.Name, chainWallet, err)
159+
if delegationsErr != nil {
160+
response.SetDelegationsError(chain.Name, chainWallet, delegationsErr)
169161
return
170162
}
171163
walletDelegations := utils.Map(delegations.DelegationResponses, func(b stakingTypes.DelegationResponse) *types.Delegation {
@@ -195,14 +187,12 @@ func (f *DataFetcher) GetBalances(userID, reporter string) *types.WalletsBalance
195187
go func(chain *types.Chain, chainWallet *types.WalletLink) {
196188
defer wg.Done()
197189

198-
rpc := f.GetRPC(chain)
199-
200-
redelegations, _, err := rpc.GetRedelegations(chainWallet.Address)
190+
redelegations, redelegationsErr := f.NodesManager.GetRedelegations(chain, chainWallet.Address)
201191
mutex.Lock()
202192
defer mutex.Unlock()
203193

204-
if err != nil {
205-
response.SetRedelegationsError(chain.Name, chainWallet, err)
194+
if redelegationsErr != nil {
195+
response.SetRedelegationsError(chain.Name, chainWallet, redelegationsErr)
206196
return
207197
}
208198
walletRedelegations := []*types.Redelegation{}
@@ -248,14 +238,12 @@ func (f *DataFetcher) GetBalances(userID, reporter string) *types.WalletsBalance
248238
go func(chain *types.Chain, chainWallet *types.WalletLink) {
249239
defer wg.Done()
250240

251-
rpc := f.GetRPC(chain)
252-
253-
unbonds, _, err := rpc.GetUnbonds(chainWallet.Address)
241+
unbonds, unbondsErr := f.NodesManager.GetUnbonds(chain, chainWallet.Address)
254242
mutex.Lock()
255243
defer mutex.Unlock()
256244

257-
if err != nil {
258-
response.SetUnbondsError(chain.Name, chainWallet, err)
245+
if unbondsErr != nil {
246+
response.SetUnbondsError(chain.Name, chainWallet, unbondsErr)
259247
return
260248
}
261249

pkg/data_fetcher/data_fetcher.go

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88
"main/pkg/metrics"
99
priceFetcher "main/pkg/price_fetcher"
1010
"main/pkg/tendermint"
11-
"main/pkg/types"
12-
"sync"
1311

1412
"github.com/rs/zerolog"
1513
)
@@ -22,14 +20,15 @@ type DataFetcher struct {
2220
PriceFetchers map[constants.PriceFetcherName]priceFetcher.PriceFetcher
2321
Cache *cache.Cache
2422
RPCs map[string]*tendermint.RPC
25-
mutex sync.Mutex
23+
NodesManager *tendermint.NodeManager
2624
}
2725

2826
func NewDataFetcher(
29-
logger zerolog.Logger,
27+
logger *zerolog.Logger,
3028
database *database.Database,
3129
converter *converterPkg.Converter,
3230
metricsManager *metrics.Manager,
31+
nodesManager *tendermint.NodeManager,
3332
) *DataFetcher {
3433
priceFetchers := map[constants.PriceFetcherName]priceFetcher.PriceFetcher{
3534
constants.PriceFetcherNameCoingecko: priceFetcher.NewCoingeckoPriceFetcher(logger),
@@ -43,17 +42,6 @@ func NewDataFetcher(
4342
PriceFetchers: priceFetchers,
4443
Cache: cache.NewCache(),
4544
RPCs: map[string]*tendermint.RPC{},
45+
NodesManager: nodesManager,
4646
}
4747
}
48-
49-
func (f *DataFetcher) GetRPC(chain *types.Chain) *tendermint.RPC {
50-
f.mutex.Lock()
51-
defer f.mutex.Unlock()
52-
53-
if rpc, ok := f.RPCs[chain.Name]; ok {
54-
return rpc
55-
}
56-
57-
f.RPCs[chain.Name] = tendermint.NewRPC(chain, constants.RPCQueryTimeout, f.Logger, f.Converter, f.MetricsManager)
58-
return f.RPCs[chain.Name]
59-
}

0 commit comments

Comments
 (0)