@@ -2,18 +2,26 @@ package main
2
2
3
3
import (
4
4
"bufio"
5
+ "encoding/json"
5
6
"flag"
6
7
"fmt"
7
8
"log"
8
9
"os"
9
10
"strings"
10
11
11
12
"github.com/btcsuite/btcutil/bech32"
13
+ "github.com/cometbft/cometbft/crypto"
14
+ "github.com/cosmos/cosmos-sdk/types"
12
15
)
13
16
17
+ // GetModuleAddress computes the address for a given module name with a specific prefix.
18
+ func GetModuleAddress (moduleName string ) types.AccAddress {
19
+ return types .AccAddress (crypto .AddressHash ([]byte (moduleName )))
20
+ }
21
+
14
22
// convertAddresses takes a list of addresses and converts them from oldPrefix to newPrefix.
15
- func convertAddresses (addressList []string , oldPrefix , newPrefix string ) ([ ]string , error ) {
16
- var convertedAddresses [ ]string
23
+ func convertAddresses (addressList []string , oldPrefix , newPrefix string ) (map [ string ]string , error ) {
24
+ convertedMap := make ( map [ string ]string )
17
25
18
26
for _ , address := range addressList {
19
27
hrp , data , err := bech32 .Decode (address )
@@ -26,18 +34,16 @@ func convertAddresses(addressList []string, oldPrefix, newPrefix string) ([]stri
26
34
return nil , fmt .Errorf ("expected prefix '%s', but got '%s' for address '%s'" , oldPrefix , hrp , address )
27
35
}
28
36
29
- // Encode with the new prefix
30
37
mainnetAddress , err := bech32 .Encode (newPrefix , data )
31
38
if err != nil {
32
39
return nil , fmt .Errorf ("failed to encode address %s with new prefix %s: %w" , address , newPrefix , err )
33
40
}
34
41
35
- convertedAddresses = append ( convertedAddresses , mainnetAddress )
42
+ convertedMap [ address ] = mainnetAddress
36
43
}
37
- return convertedAddresses , nil
44
+ return convertedMap , nil
38
45
}
39
46
40
- // readAddressesFromFile reads a file line by line and returns a slice of addresses.
41
47
func readAddressesFromFile (filename string ) ([]string , error ) {
42
48
var addresses []string
43
49
@@ -59,23 +65,21 @@ func readAddressesFromFile(filename string) ([]string, error) {
59
65
return addresses , nil
60
66
}
61
67
62
- // writeAddressesToFile writes a slice of addresses to a file, one per line .
63
- func writeAddressesToFile (filename string , addresses [ ]string ) error {
68
+ // writeAddressesToJSONFile writes a map of old-to-new addresses to a JSON file .
69
+ func writeAddressesToJSONFile (filename string , addressMap map [ string ]string ) error {
64
70
file , err := os .Create (filename )
65
71
if err != nil {
66
72
return fmt .Errorf ("failed to create file %s: %w" , filename , err )
67
73
}
68
74
defer file .Close ()
69
75
70
- writer := bufio .NewWriter (file )
71
- for _ , address := range addresses {
72
- _ , err := writer .WriteString (address + "\n " )
73
- if err != nil {
74
- return fmt .Errorf ("failed to write to file %s: %w" , filename , err )
75
- }
76
+ encoder := json .NewEncoder (file )
77
+ encoder .SetIndent ("" , " " )
78
+ if err := encoder .Encode (addressMap ); err != nil {
79
+ return fmt .Errorf ("failed to write JSON to file %s: %w" , filename , err )
76
80
}
77
81
78
- return writer . Flush ()
82
+ return nil
79
83
}
80
84
81
85
func main () {
@@ -84,19 +88,38 @@ func main() {
84
88
newPrefix := flag .String ("newPrefix" , "" , "New prefix to replace the old prefix" )
85
89
addresses := flag .String ("addresses" , "" , "Comma-separated list of addresses to convert" )
86
90
addressFile := flag .String ("file" , "" , "File containing list of addresses to convert (one per line)" )
91
+ moduleName := flag .String ("module" , "" , "Module name to generate the address for" )
87
92
88
93
// Parse command-line arguments
89
94
flag .Parse ()
90
95
91
- // Check for required arguments
96
+ cfg := types .GetConfig ()
97
+
98
+ if * newPrefix == "arkeo" {
99
+ cfg .SetBech32PrefixForAccount ("arkeo" , "arkeopub" )
100
+ } else if * newPrefix == "tarkeo" {
101
+ cfg .SetBech32PrefixForAccount ("tarkeo" , "tarkeopub" )
102
+ } else {
103
+ log .Fatalf ("Unsupported module prefix '%s'. Supported prefixes are 'arkeo' and 'tarkeo'." , * newPrefix )
104
+ }
105
+
106
+ // Module address generation operation
107
+ if * moduleName != "" {
108
+
109
+ moduleAddr := GetModuleAddress (* moduleName )
110
+
111
+ fmt .Printf ("Generated address for module '%s': %s\n " , * moduleName , moduleAddr )
112
+ return
113
+ }
114
+
115
+ // Address conversion operation
92
116
if * oldPrefix == "" || * newPrefix == "" {
93
117
log .Fatal ("Usage: go run converter.go -oldPrefix=<oldPrefix> -newPrefix=<newPrefix> -addresses=<comma-separated addresses> or -file=<filename>" )
94
118
}
95
119
96
120
var addressList []string
97
121
var err error
98
122
99
- // Determine source of addresses (file or list)
100
123
if * addressFile != "" {
101
124
addressList , err = readAddressesFromFile (* addressFile )
102
125
if err != nil {
@@ -108,18 +131,16 @@ func main() {
108
131
log .Fatal ("Please provide addresses either through -addresses or -file option." )
109
132
}
110
133
111
- // Convert addresses
112
- convertedAddresses , err := convertAddresses (addressList , * oldPrefix , * newPrefix )
134
+ convertedMap , err := convertAddresses (addressList , * oldPrefix , * newPrefix )
113
135
if err != nil {
114
136
log .Fatalf ("Error converting addresses: %v" , err )
115
137
}
116
138
117
- // Write converted addresses to file
118
- outputFile := "converted.txt"
119
- err = writeAddressesToFile (outputFile , convertedAddresses )
139
+ outputFile := "converted.json"
140
+ err = writeAddressesToJSONFile (outputFile , convertedMap )
120
141
if err != nil {
121
142
log .Fatalf ("Error writing converted addresses to file: %v" , err )
122
143
}
123
144
124
- fmt .Printf ("Converted addresses written to %s\n " , outputFile )
145
+ fmt .Printf ("Converted addresses written to %s" , outputFile )
125
146
}
0 commit comments