Skip to content

Commit e919fdd

Browse files
committed
refactor(delegators): adopt samber/lo functional style for cleaner logic
1 parent 26dc6bb commit e919fdd

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

pkg/delegators/enhancer.go

+5-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"strings"
66

7+
"github.com/samber/lo"
78
"github.com/teambenny/goetl"
89
"github.com/teambenny/goetl/etldata"
910

@@ -21,16 +22,13 @@ type addressEnhancer struct {
2122

2223
// NewAddressEnhancer returns a new processor that enrich the data with addresses with the given prefixes.
2324
func NewAddressEnhancer(prefixes []string, logger log.Logger) (goetl.Processor, error) {
24-
keys := make([]string, len(prefixes))
25-
for i, prefix := range prefixes {
26-
keys[i] = fmt.Sprintf("delegator-%s-address", prefix)
27-
}
28-
2925
return &addressEnhancer{
3026
prefixes: prefixes,
3127
logger: logger,
32-
keys: keys,
33-
name: fmt.Sprintf("AddressEnhancer(%s)", strings.Join(prefixes, ",")),
28+
keys: lo.Map(prefixes, func(prefix string, _ int) string {
29+
return fmt.Sprintf("delegator_%s_address", prefix)
30+
}),
31+
name: fmt.Sprintf("AddressEnhancer(%s)", strings.Join(prefixes, ",")),
3432
}, nil
3533
}
3634

pkg/delegators/reader.go

+32-17
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@ import (
99

1010
"github.com/axone-protocol/cosmos-extractor/pkg/keeper"
1111
cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
12+
"github.com/samber/lo"
1213
"github.com/teambenny/goetl"
1314
"github.com/teambenny/goetl/etldata"
14-
"github.com/teambenny/goetl/etlutil"
1515

1616
"cosmossdk.io/collections"
1717
"cosmossdk.io/log"
1818
"cosmossdk.io/math"
1919

2020
sdk "github.com/cosmos/cosmos-sdk/types"
2121
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
22+
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
2223
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
2324
)
2425

@@ -65,22 +66,11 @@ func (r *delegatorsReader) ProcessData(_ etldata.Payload, outputChan chan etldat
6566

6667
configureSdk(prefix)
6768

68-
err = IterateAllAddresses(ctx, keepers.Bank, func(addr sdk.AccAddress) (stop bool) {
69-
for _, val := range validators {
70-
valAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress)
71-
etlutil.KillPipelineIfErr(err, killChan)
72-
73-
delegation, err := keepers.Staking.GetDelegation(ctx, addr, valAddr)
74-
if err != nil {
75-
if errors.Is(err, stakingtypes.ErrNoDelegation) {
76-
continue
77-
}
78-
79-
r.logger.Error(err.Error())
80-
killChan <- err
81-
return true
82-
}
69+
err = iterateAllAddresses(ctx, keepers.Bank, func(addr sdk.AccAddress) (stop bool) {
70+
delegations := lo.RejectMap(validators,
71+
toDelegations(ctx, addr, r.logger, keepers.Staking, killChan))
8372

73+
for _, delegation := range delegations {
8474
payload := Delegation{
8575
ChainName: r.chainName,
8676
DelegatorNativeAddr: delegation.DelegatorAddress,
@@ -122,7 +112,7 @@ func (r *delegatorsReader) String() string {
122112

123113
// IterateAllAddresses iterates over all the accounts that are provided to a callback.
124114
// If true is returned from the callback, iteration is halted.
125-
func IterateAllAddresses(ctx context.Context, bankKeeper bankkeeper.BaseKeeper, cb func(sdk.AccAddress) bool) error {
115+
func iterateAllAddresses(ctx context.Context, bankKeeper bankkeeper.BaseKeeper, cb func(sdk.AccAddress) bool) error {
126116
lastSeenAddr := ""
127117
err := bankKeeper.Balances.Walk(ctx, nil, func(key collections.Pair[sdk.AccAddress, string], _ math.Int) (stop bool, err error) {
128118
addr := key.K1()
@@ -137,6 +127,31 @@ func IterateAllAddresses(ctx context.Context, bankKeeper bankkeeper.BaseKeeper,
137127
return err
138128
}
139129

130+
func toDelegations(
131+
ctx context.Context, address sdk.AccAddress, logger log.Logger, stakingKeeper *stakingkeeper.Keeper, killChan chan error,
132+
) func(item stakingtypes.Validator, index int) (stakingtypes.Delegation, bool) {
133+
return func(item stakingtypes.Validator, _ int) (stakingtypes.Delegation, bool) {
134+
valAddr, err := sdk.ValAddressFromBech32(item.OperatorAddress)
135+
if err != nil {
136+
logger.Error(err.Error())
137+
killChan <- err
138+
return stakingtypes.Delegation{}, true
139+
}
140+
141+
delegation, err := stakingKeeper.GetDelegation(ctx, address, valAddr)
142+
if err != nil {
143+
if errors.Is(err, stakingtypes.ErrNoDelegation) {
144+
return stakingtypes.Delegation{}, true
145+
}
146+
147+
logger.Error(err.Error())
148+
killChan <- err
149+
return stakingtypes.Delegation{}, true
150+
}
151+
return delegation, false
152+
}
153+
}
154+
140155
func guessPrefixFromValoper(valoper string) (string, error) {
141156
if idx := strings.Index(valoper, "valoper"); idx != -1 {
142157
return valoper[:idx], nil

0 commit comments

Comments
 (0)