/
address.go
56 lines (51 loc) · 1.34 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
package v1beta2
import (
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ethereum/go-ethereum/crypto"
)
func (k Key) DeriveAddresses(ctx sdk.Context, types []AddressType) []AddressResponse {
responses := make([]AddressResponse, 0, len(types))
for _, addrType := range types {
var (
address string
err error
)
switch addrType {
case AddressType_ADDRESS_TYPE_ETHEREUM:
address, err = EthereumAddress(k)
case AddressType_ADDRESS_TYPE_OSMOSIS:
address, err = OsmosisAddress(k)
}
if err != nil {
ctx.Logger().Warn("failed to derive address for key %d: %w", k.Id, err)
continue
}
responses = append(responses, AddressResponse{
Address: address,
Type: addrType,
})
}
return responses
}
func EthereumAddress(key Key) (string, error) {
k, err := key.ToECDSASecp256k1()
if err != nil {
return "", err
}
addr := crypto.PubkeyToAddress(*k)
return addr.Hex(), nil
}
func OsmosisAddress(key Key) (string, error) {
return bech32Address("osmo", key)
}
func bech32Address(prefix string, key Key) (string, error) {
k, err := key.ToECDSASecp256k1()
if err != nil {
return "", err
}
var pubkey secp256k1.PubKey
pubkey.Key = crypto.CompressPubkey(k)
bech32Address := sdk.MustBech32ifyAddressBytes(prefix, pubkey.Address())
return bech32Address, nil
}