terra-oracle/pkg/signer/hd_signer.go

43 lines
1.1 KiB
Go

package signer
import (
"github.com/cosmos/cosmos-sdk/crypto/keys/hd"
ctypes "github.com/cosmos/cosmos-sdk/types"
bip39 "github.com/cosmos/go-bip39"
"github.com/tendermint/tendermint/crypto"
"github.com/tendermint/tendermint/crypto/secp256k1"
)
type HdSigner struct {
privKey secp256k1.PrivKeySecp256k1
address ctypes.AccAddress
}
func NewHdSignerFromMnemonic(mnemonic string) (*HdSigner, error) {
seed, err := bip39.NewSeedWithErrorChecking(mnemonic, "")
if err != nil {
return nil, err
}
masterPriv, ch := hd.ComputeMastersFromSeed(seed)
params := hd.NewFundraiserParams(0, 0)
derivedPriv, err := hd.DerivePrivateKeyForPath(masterPriv, ch, params.String())
privKey := secp256k1.PrivKeySecp256k1(derivedPriv)
return &HdSigner{
privKey: privKey,
address: ctypes.AccAddress(privKey.PubKey().Address()),
}, nil
}
func (signer *HdSigner) Address() ctypes.AccAddress {
return signer.address
}
func (signer *HdSigner) PubKey() crypto.PubKey {
return signer.privKey.PubKey()
}
func (signer *HdSigner) Sign(bytes []byte) ([]byte, error) {
return signer.privKey.Sign(bytes)
}