Skip to content

Commit 72c601a

Browse files
authored
Merge pull request #27 from axone-protocol/feat/delegator-hrp
feat(delegators): add --hrp flag for Bech32 address delegators
2 parents a784a1e + 7f18288 commit 72c601a

File tree

4 files changed

+117
-23
lines changed

4 files changed

+117
-23
lines changed

cmd/delegators.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import (
66
"github.com/teambenny/goetl"
77
)
88

9+
const (
10+
flagHrp = "hrp"
11+
)
12+
913
var extractDelegatorsCmd = &cobra.Command{
1014
Use: "delegators [source]",
1115
Short: "Extract all delegators",
@@ -14,17 +18,33 @@ var extractDelegatorsCmd = &cobra.Command{
1418
chainName, _ := cmd.Flags().GetString(flagChainName)
1519
src := args[0]
1620

21+
processors := []goetl.Processor{}
22+
1723
read, err := delegators.NewDelegatorsReader(chainName, src, logger)
1824
if err != nil {
1925
return err
2026
}
27+
processors = append(processors, read)
28+
29+
hrps, err := cmd.Flags().GetStringSlice(flagHrp)
30+
if err != nil {
31+
return err
32+
}
33+
if len(hrps) != 0 {
34+
p, err := delegators.NewAddressEnhancer(hrps, logger)
35+
if err != nil {
36+
return err
37+
}
38+
processors = append(processors, p)
39+
}
2140

2241
write, err := newCSVWriter(cmd, args)
2342
if err != nil {
2443
return err
2544
}
45+
processors = append(processors, write)
2646

27-
pipeline := goetl.NewPipeline(read, write)
47+
pipeline := goetl.NewPipeline(processors...)
2848
pipeline.Name = "Delegators"
2949

3050
err = <-pipeline.Run()
@@ -34,4 +54,11 @@ var extractDelegatorsCmd = &cobra.Command{
3454

3555
func init() {
3656
extractCmd.AddCommand(extractDelegatorsCmd)
57+
58+
extractDelegatorsCmd.Flags().StringSliceP(
59+
flagHrp,
60+
"p",
61+
[]string{},
62+
"One or more Human-Readable Parts (HRPs) to append delegator addresses in the given Bech32 formats (e.g., cosmos, osmo). "+
63+
"Can be used multiple times for different HRPs.")
3764
}

pkg/delegators/enhancer.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package delegators
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/teambenny/goetl"
8+
"github.com/teambenny/goetl/etldata"
9+
10+
"cosmossdk.io/log"
11+
12+
"github.com/cosmos/cosmos-sdk/types/bech32"
13+
)
14+
15+
type addressEnhancer struct {
16+
prefixes []string
17+
logger log.Logger
18+
keys []string
19+
name string
20+
}
21+
22+
// NewAddressEnhancer returns a new processor that enrich the data with addresses with the given prefixes.
23+
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+
29+
return &addressEnhancer{
30+
prefixes: prefixes,
31+
logger: logger,
32+
keys: keys,
33+
name: fmt.Sprintf("AddressEnhancer(%s)", strings.Join(prefixes, ",")),
34+
}, nil
35+
}
36+
37+
func (p *addressEnhancer) ProcessData(payload etldata.Payload, outputChan chan etldata.Payload, killChan chan error) {
38+
delegation := Delegation{}
39+
if err := payload.Parse(&delegation); err != nil {
40+
p.logger.Error(err.Error())
41+
killChan <- err
42+
return
43+
}
44+
data, err := payload.Objects()
45+
if err != nil {
46+
p.logger.Error(err.Error())
47+
killChan <- err
48+
return
49+
}
50+
51+
for _, datum := range data {
52+
for idx, prefix := range p.prefixes {
53+
addr, err := convertAndEncodeMust(prefix, delegation.DelegatorNativeAddr)
54+
if err != nil {
55+
p.logger.Error(err.Error())
56+
killChan <- err
57+
return
58+
}
59+
datum[p.keys[idx]] = addr
60+
}
61+
}
62+
63+
json, err := etldata.NewJSON(data)
64+
if err != nil {
65+
p.logger.Error(err.Error())
66+
killChan <- err
67+
return
68+
}
69+
70+
outputChan <- json
71+
}
72+
73+
func (p *addressEnhancer) Finish(_ chan etldata.Payload, _ chan error) {
74+
}
75+
76+
func (p *addressEnhancer) String() string {
77+
return p.name
78+
}
79+
80+
func convertAndEncodeMust(hrp string, bech string) (string, error) {
81+
_, bytes, err := bech32.DecodeAndConvert(bech)
82+
if err != nil {
83+
return "", err
84+
}
85+
86+
return bech32.ConvertAndEncode(hrp, bytes)
87+
}

pkg/delegators/payload.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ package delegators
33
type Delegation struct {
44
ChainName string `json:"chain_name"`
55
DelegatorNativeAddr string `json:"delegator_native_addr"`
6-
DelegatorCosmosAddr string `json:"delegator_cosmos_addr"`
7-
DelegatorAxoneAddr string `json:"delegator_axone_addr"`
8-
9-
ValidatorAddr string `json:"validator_addr"`
10-
Shares string `json:"shares"`
6+
ValidatorAddr string `json:"validator_addr"`
7+
Shares string `json:"shares"`
118
}

pkg/delegators/reader.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"cosmossdk.io/math"
1919

2020
sdk "github.com/cosmos/cosmos-sdk/types"
21-
"github.com/cosmos/cosmos-sdk/types/bech32"
2221
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
2322
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
2423
)
@@ -85,8 +84,6 @@ func (r *delegatorsReader) ProcessData(_ etldata.Payload, outputChan chan etldat
8584
payload := Delegation{
8685
ChainName: r.chainName,
8786
DelegatorNativeAddr: delegation.DelegatorAddress,
88-
DelegatorCosmosAddr: convertAndEncodeMust("cosmos", delegation.DelegatorAddress),
89-
DelegatorAxoneAddr: convertAndEncodeMust("axone", delegation.DelegatorAddress),
9087
ValidatorAddr: delegation.ValidatorAddress,
9188
Shares: delegation.Shares.String(),
9289
}
@@ -140,20 +137,6 @@ func IterateAllAddresses(ctx context.Context, bankKeeper bankkeeper.BaseKeeper,
140137
return err
141138
}
142139

143-
func convertAndEncodeMust(hrp string, bech string) string {
144-
_, bytes, err := bech32.DecodeAndConvert(bech)
145-
if err != nil {
146-
panic(err)
147-
}
148-
149-
encoded, err := bech32.ConvertAndEncode(hrp, bytes)
150-
if err != nil {
151-
panic(err)
152-
}
153-
154-
return encoded
155-
}
156-
157140
func guessPrefixFromValoper(valoper string) (string, error) {
158141
if idx := strings.Index(valoper, "valoper"); idx != -1 {
159142
return valoper[:idx], nil

0 commit comments

Comments
 (0)