-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathaddress.go
81 lines (66 loc) · 2.18 KB
/
address.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package utils
import (
"github.com/pkg/errors"
cmtcrypto "github.com/cometbft/cometbft/crypto"
"cosmossdk.io/core/address"
"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
sdk "github.com/cosmos/cosmos-sdk/types"
authcodec "github.com/cosmos/cosmos-sdk/x/auth/codec"
ophosttypes "github.com/initia-labs/OPinit/x/ophost/types"
)
func L1AddressCodec() address.Codec {
return authcodec.NewBech32Codec("init")
}
func L2AddressCodec() address.Codec {
return authcodec.NewBech32Codec(sdk.GetConfig().GetBech32AccountAddrPrefix())
}
func CelestiaAddressCodec() address.Codec {
return authcodec.NewBech32Codec("celestia")
}
func HackBech32Prefix(prefix string) func() {
originPrefix := sdk.GetConfig().GetBech32AccountAddrPrefix()
originPubPrefix := sdk.GetConfig().GetBech32AccountPubPrefix()
sdk.GetConfig().SetBech32PrefixForAccount(prefix, prefix+"pub")
return func() {
sdk.GetConfig().SetBech32PrefixForAccount(originPrefix, originPubPrefix)
}
}
func DeriveL1Address(mnemonic string) (string, error) {
return deriveAddress(mnemonic, L1AddressCodec())
}
func DeriveL2Address(mnemonic string) (string, error) {
return deriveAddress(mnemonic, L2AddressCodec())
}
func DeriveDAAddress(mnemonic string, chainType ophosttypes.BatchInfo_ChainType) (string, error) {
var codec address.Codec
switch chainType {
case ophosttypes.BatchInfo_INITIA:
codec = L1AddressCodec()
case ophosttypes.BatchInfo_CELESTIA:
codec = CelestiaAddressCodec()
default:
return "", errors.New("unsupported chain type")
}
return deriveAddress(mnemonic, codec)
}
func deriveAddress(mnemonic string, codec address.Codec) (string, error) {
addrBz, err := deriveAddressBz(mnemonic)
if err != nil {
return "", errors.Wrap(err, "failed to convert address to bech32")
}
return codec.BytesToString(addrBz)
}
func deriveAddressBz(mnemonic string) (cmtcrypto.Address, error) {
algo := hd.Secp256k1
derivedPriv, err := algo.Derive()(
mnemonic,
keyring.DefaultBIP39Passphrase,
sdk.GetConfig().GetFullBIP44Path(),
)
if err != nil {
return nil, errors.Wrap(err, "failed to derive private key")
}
privKey := algo.Generate()(derivedPriv)
return privKey.PubKey().Address(), nil
}