Skip to content

Commit c2f37ae

Browse files
committed
feat: add Bech32 prefix configuration for account and validator addresses
1 parent 4bb1471 commit c2f37ae

3 files changed

Lines changed: 84 additions & 23 deletions

File tree

.github/integration-tests/docker-compose.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ services:
9999
- GM_HOME=/home/attester/.gm
100100
- MNEMONIC=abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
101101
- VERBOSE=true
102+
- BECH32_ACCOUNT_PREFIX=gm
103+
- BECH32_ACCOUNT_PUBKEY=gmpub
104+
- BECH32_VALIDATOR_PREFIX=gmvaloper
105+
- BECH32_VALIDATOR_PUBKEY=gmvaloperpub
102106
depends_on:
103107
gm-chain:
104108
condition: service_healthy

.github/integration-tests/scripts/run-attester.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,20 @@ GM_API="${GM_API:-http://gm-chain:1417}"
99
MNEMONIC="${MNEMONIC:-abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about}"
1010
VERBOSE="${VERBOSE:-true}"
1111

12+
# Bech32 prefix configuration
13+
BECH32_ACCOUNT_PREFIX="${BECH32_ACCOUNT_PREFIX:-gm}"
14+
BECH32_ACCOUNT_PUBKEY="${BECH32_ACCOUNT_PUBKEY:-gmpub}"
15+
BECH32_VALIDATOR_PREFIX="${BECH32_VALIDATOR_PREFIX:-gmvaloper}"
16+
BECH32_VALIDATOR_PUBKEY="${BECH32_VALIDATOR_PUBKEY:-gmvaloperpub}"
17+
1218
echo "🤖 Starting attester service..."
1319
echo " Chain ID: $CHAIN_ID"
1420
echo " Node: $GM_NODE"
1521
echo " API: $GM_API"
1622
echo " Home: $GM_HOME"
23+
echo " Bech32 Prefixes:"
24+
echo " Account: $BECH32_ACCOUNT_PREFIX / $BECH32_ACCOUNT_PUBKEY"
25+
echo " Validator: $BECH32_VALIDATOR_PREFIX / $BECH32_VALIDATOR_PUBKEY"
1726

1827
# Wait for GM chain to be ready
1928
echo "⏳ Waiting for GM chain to be ready..."
@@ -55,6 +64,10 @@ ATTESTER_CMD=(attester
5564
--mnemonic="$MNEMONIC"
5665
--api-addr="$GM_API"
5766
--node="$GM_NODE"
67+
--bech32-account-prefix="$BECH32_ACCOUNT_PREFIX"
68+
--bech32-account-pubkey="$BECH32_ACCOUNT_PUBKEY"
69+
--bech32-validator-prefix="$BECH32_VALIDATOR_PREFIX"
70+
--bech32-validator-pubkey="$BECH32_VALIDATOR_PUBKEY"
5871
)
5972

6073
if [[ "$VERBOSE" == "true" ]]; then

attester/main.go

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,37 @@ import (
4141
)
4242

4343
const (
44-
flagChainID = "chain-id"
45-
flagNode = "node"
46-
flagAPIAddr = "api-addr"
47-
flagHome = "home"
48-
flagVerbose = "verbose"
49-
flagMnemonic = "mnemonic"
44+
flagChainID = "chain-id"
45+
flagNode = "node"
46+
flagAPIAddr = "api-addr"
47+
flagHome = "home"
48+
flagVerbose = "verbose"
49+
flagMnemonic = "mnemonic"
50+
flagBech32AccountPrefix = "bech32-account-prefix"
51+
flagBech32AccountPubkey = "bech32-account-pubkey"
52+
flagBech32ValidatorPrefix = "bech32-validator-prefix"
53+
flagBech32ValidatorPubkey = "bech32-validator-pubkey"
5054
)
5155

5256
// Config holds all configuration parameters for the attester
5357
type Config struct {
54-
ChainID string
55-
Node string
56-
APIAddr string
57-
Home string
58-
Verbose bool
59-
Mnemonic string
58+
ChainID string
59+
Node string
60+
APIAddr string
61+
Home string
62+
Verbose bool
63+
Mnemonic string
64+
Bech32AccountPrefix string
65+
Bech32AccountPubkey string
66+
Bech32ValidatorPrefix string
67+
Bech32ValidatorPubkey string
6068
}
6169

6270
func main() {
6371
rootCmd := &cobra.Command{
64-
Use: "attester_ws",
65-
Short: "Attester client for Rollkit using websocket",
66-
Long: `Attester client for Rollkit that joins the attester set and attests to blocks at the end of each epoch.`,
72+
Use: "attester",
73+
Short: "Attester client for Rollkit",
74+
Long: `Attester client for Rollkit that joins the attester set and attests to blocks`,
6775
DisableFlagParsing: false,
6876
SuggestionsMinimumDistance: 2,
6977
RunE: runAttester,
@@ -76,6 +84,10 @@ func main() {
7684
rootCmd.Flags().String(flagHome, "", "Directory for config and data")
7785
rootCmd.Flags().Bool(flagVerbose, false, "Enable verbose output")
7886
rootCmd.Flags().String(flagMnemonic, "", "Mnemonic for the private key")
87+
rootCmd.Flags().String(flagBech32AccountPrefix, "gm", "Bech32 prefix for account addresses")
88+
rootCmd.Flags().String(flagBech32AccountPubkey, "gmpub", "Bech32 prefix for account public keys")
89+
rootCmd.Flags().String(flagBech32ValidatorPrefix, "gmvaloper", "Bech32 prefix for validator addresses")
90+
rootCmd.Flags().String(flagBech32ValidatorPubkey, "gmvaloperpub", "Bech32 prefix for validator public keys")
7991

8092
_ = rootCmd.MarkFlagRequired(flagChainID)
8193
_ = rootCmd.MarkFlagRequired(flagMnemonic)
@@ -119,13 +131,37 @@ func ParseFlags(cmd *cobra.Command) (*Config, error) {
119131
return nil, err
120132
}
121133

134+
bech32AccountPrefix, err := cmd.Flags().GetString(flagBech32AccountPrefix)
135+
if err != nil {
136+
return nil, err
137+
}
138+
139+
bech32AccountPubkey, err := cmd.Flags().GetString(flagBech32AccountPubkey)
140+
if err != nil {
141+
return nil, err
142+
}
143+
144+
bech32ValidatorPrefix, err := cmd.Flags().GetString(flagBech32ValidatorPrefix)
145+
if err != nil {
146+
return nil, err
147+
}
148+
149+
bech32ValidatorPubkey, err := cmd.Flags().GetString(flagBech32ValidatorPubkey)
150+
if err != nil {
151+
return nil, err
152+
}
153+
122154
return &Config{
123-
ChainID: chainID,
124-
Node: node,
125-
APIAddr: apiAddr,
126-
Home: home,
127-
Verbose: verbose,
128-
Mnemonic: mnemonic,
155+
ChainID: chainID,
156+
Node: node,
157+
APIAddr: apiAddr,
158+
Home: home,
159+
Verbose: verbose,
160+
Mnemonic: mnemonic,
161+
Bech32AccountPrefix: bech32AccountPrefix,
162+
Bech32AccountPubkey: bech32AccountPubkey,
163+
Bech32ValidatorPrefix: bech32ValidatorPrefix,
164+
Bech32ValidatorPubkey: bech32ValidatorPubkey,
129165
}, nil
130166
}
131167

@@ -139,10 +175,18 @@ func runAttester(cmd *cobra.Command, _ []string) error {
139175
defer cancel()
140176

141177
sdkConfig := sdk.GetConfig()
142-
sdkConfig.SetBech32PrefixForAccount("gm", "gmpub")
143-
sdkConfig.SetBech32PrefixForValidator("gmvaloper", "gmvaloperpub")
178+
sdkConfig.SetBech32PrefixForAccount(config.Bech32AccountPrefix, config.Bech32AccountPubkey)
179+
sdkConfig.SetBech32PrefixForValidator(config.Bech32ValidatorPrefix, config.Bech32ValidatorPubkey)
144180
sdkConfig.Seal()
145181

182+
if config.Verbose {
183+
fmt.Printf("Bech32 Configuration:\n")
184+
fmt.Printf(" Account prefix: %s\n", config.Bech32AccountPrefix)
185+
fmt.Printf(" Account pubkey: %s\n", config.Bech32AccountPubkey)
186+
fmt.Printf(" Validator prefix: %s\n", config.Bech32ValidatorPrefix)
187+
fmt.Printf(" Validator pubkey: %s\n", config.Bech32ValidatorPubkey)
188+
}
189+
146190
operatorPrivKey, err := privateKeyFromMnemonic(config.Mnemonic)
147191
if err != nil {
148192
return fmt.Errorf("failed to create private key from mnemonic: %w", err)

0 commit comments

Comments
 (0)