Help us shape the future of Go! Take the 2026 Go Developer Survey

hdwallet

package module
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 24, 2025 License: MIT Imports: 16 Imported by: 254

README


logo


go-ethereum-hdwallet

Ethereum HD Wallet derivations from [mnemonic] seed in Go (golang). Implements the go-ethereum accounts.Wallet interface.

License Build Status Go Report Card GoDoc PRs Welcome

Install

go get -u github.com/miguelmota/go-ethereum-hdwallet

Documenation

https://godoc.org/github.com/miguelmota/go-ethereum-hdwallet

Getting started

package main

import (
	"fmt"
	"log"

	"github.com/miguelmota/go-ethereum-hdwallet"
)

func main() {
	mnemonic := "tag volcano eight thank tide danger coast health above argue embrace heavy"
	wallet, err := hdwallet.NewFromMnemonic(mnemonic)
	if err != nil {
		log.Fatal(err)
	}

	path := hdwallet.MustParseDerivationPath("m/44'/60'/0'/0/0")
	account, err := wallet.Derive(path, false)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(account.Address.Hex()) // 0xC49926C4124cEe1cbA0Ea94Ea31a6c12318df947

	path = hdwallet.MustParseDerivationPath("m/44'/60'/0'/0/1")
	account, err = wallet.Derive(path, false)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(account.Address.Hex()) // 0x8230645aC28A4EdD1b0B53E7Cd8019744E9dD559
}
Signing transaction
package main

import (
	"log"
	"math/big"

	"github.com/davecgh/go-spew/spew"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/miguelmota/go-ethereum-hdwallet"
)

func main() {
	mnemonic := "tag volcano eight thank tide danger coast health above argue embrace heavy"
	wallet, err := hdwallet.NewFromMnemonic(mnemonic)
	if err != nil {
		log.Fatal(err)
	}

	path := hdwallet.MustParseDerivationPath("m/44'/60'/0'/0/0")
	account, err := wallet.Derive(path, true)
	if err != nil {
		log.Fatal(err)
	}

	nonce := uint64(0)
	value := big.NewInt(1000000000000000000)
	toAddress := common.HexToAddress("0x0")
	gasLimit := uint64(21000)
	gasPrice := big.NewInt(21000000000)
	var data []byte

	tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data)
	signedTx, err := wallet.SignTx(account, tx, nil)
	if err != nil {
		log.Fatal(err)
	}

	spew.Dump(signedTx)
}

CLI

go install github.com/miguelmota/go-ethereum-hdwallet/cmd/geth-hdwallet@latest
$ geth-hdwallet -mnemonic "tag volcano eight thank tide danger coast health above argue embrace heavy" -path "m/44'/60'/0'/0/0"

public address: 0xC49926C4124cEe1cbA0Ea94Ea31a6c12318df947
private key: 63e21d10fd50155dbba0e7d3f7431a400b84b4c2ac1ee38872f82448fe3ecfb9

Development

Build CLI:

make build

Format code:

make format

Test

Run tests

make test

Contributing

Pull requests are welcome!

For contributions please create a new branch and submit a pull request for review.

License

Released under the MIT license.

© Miguel Mota

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DefaultBaseDerivationPath = accounts.DefaultBaseDerivationPath

DefaultBaseDerivationPath is the base path from which custom derivation endpoints are incremented. As such, the first account will be at m/44'/60'/0'/0, the second at m/44'/60'/0'/1, etc

View Source
var DefaultRootDerivationPath = accounts.DefaultRootDerivationPath

DefaultRootDerivationPath is the root path to which custom derivation endpoints are appended. As such, the first account will be at m/44'/60'/0'/0, the second at m/44'/60'/0'/1, etc.

Functions

func MustParseDerivationPath

func MustParseDerivationPath(path string) accounts.DerivationPath

MustParseDerivationPath parses the derivation path in string format into []uint32 but will panic if it can't parse it.

func NewEntropy

func NewEntropy(bits int) ([]byte, error)

NewEntropy returns a randomly generated entropy.

func NewMnemonic

func NewMnemonic(bits int) (string, error)

NewMnemonic returns a randomly generated BIP-39 mnemonic using 128-256 bits of entropy.

func NewMnemonicFromEntropy

func NewMnemonicFromEntropy(entropy []byte) (string, error)

NewMnemonicFromEntropy returns a BIP-39 mnemonic from entropy.

func NewSeed

func NewSeed() ([]byte, error)

NewSeed returns a randomly generated BIP-39 seed.

func NewSeedFromMnemonic

func NewSeedFromMnemonic(mnemonic string, passOpt ...string) ([]byte, error)

NewSeedFromMnemonic returns a BIP-39 seed based on a BIP-39 mnemonic.

func ParseDerivationPath

func ParseDerivationPath(path string) (accounts.DerivationPath, error)

ParseDerivationPath parses the derivation path in string format into []uint32

Types

type Wallet

type Wallet struct {
	// contains filtered or unexported fields
}

Wallet is the underlying wallet struct.

func NewFromMnemonic

func NewFromMnemonic(mnemonic string, passOpt ...string) (*Wallet, error)

NewFromMnemonic returns a new wallet from a BIP-39 mnemonic.

func NewFromSeed

func NewFromSeed(seed []byte) (*Wallet, error)

NewFromSeed returns a new wallet from a BIP-39 seed.

func (*Wallet) Accounts

func (w *Wallet) Accounts() []accounts.Account

Accounts implements accounts.Wallet, returning the list of accounts pinned to the wallet. If self-derivation was enabled, the account list is periodically expanded based on current chain state.

func (*Wallet) Address

func (w *Wallet) Address(account accounts.Account) (common.Address, error)

Address returns the address of the account.

func (*Wallet) AddressBytes

func (w *Wallet) AddressBytes(account accounts.Account) ([]byte, error)

AddressBytes returns the address in bytes format of the account.

func (*Wallet) AddressHex

func (w *Wallet) AddressHex(account accounts.Account) (string, error)

AddressHex returns the address in hex string format of the account.

func (*Wallet) Close

func (w *Wallet) Close() error

Close implements accounts.Wallet, however this does nothing since this is not a hardware device.

func (*Wallet) Contains

func (w *Wallet) Contains(account accounts.Account) bool

Contains implements accounts.Wallet, returning whether a particular account is or is not pinned into this wallet instance.

func (*Wallet) Derive

func (w *Wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error)

Derive implements accounts.Wallet, deriving a new account at the specific derivation path. If pin is set to true, the account will be added to the list of tracked accounts.

func (*Wallet) Open

func (w *Wallet) Open(passphrase string) error

Open implements accounts.Wallet, however this does nothing since this is not a hardware device.

func (*Wallet) Path

func (w *Wallet) Path(account accounts.Account) (string, error)

Path return the derivation path of the account.

func (*Wallet) PrivateKey

func (w *Wallet) PrivateKey(account accounts.Account) (*ecdsa.PrivateKey, error)

PrivateKey returns the ECDSA private key of the account.

func (*Wallet) PrivateKeyBytes

func (w *Wallet) PrivateKeyBytes(account accounts.Account) ([]byte, error)

PrivateKeyBytes returns the ECDSA private key in bytes format of the account.

func (*Wallet) PrivateKeyHex

func (w *Wallet) PrivateKeyHex(account accounts.Account) (string, error)

PrivateKeyHex return the ECDSA private key in hex string format of the account.

func (*Wallet) PublicKey

func (w *Wallet) PublicKey(account accounts.Account) (*ecdsa.PublicKey, error)

PublicKey returns the ECDSA public key of the account.

func (*Wallet) PublicKeyBytes

func (w *Wallet) PublicKeyBytes(account accounts.Account) ([]byte, error)

PublicKeyBytes returns the ECDSA public key in bytes format of the account.

func (*Wallet) PublicKeyHex

func (w *Wallet) PublicKeyHex(account accounts.Account) (string, error)

PublicKeyHex return the ECDSA public key in hex string format of the account.

func (*Wallet) SelfDerive

func (w *Wallet) SelfDerive(base []accounts.DerivationPath, chain ethereum.ChainStateReader)

SelfDerive implements accounts.Wallet, trying to discover accounts that the user used previously (based on the chain state), but ones that he/she did not explicitly pin to the wallet manually. To avoid chain head monitoring, self derivation only runs during account listing (and even then throttled).

func (*Wallet) SetFixIssue172

func (w *Wallet) SetFixIssue172(fixIssue172 bool)

SetFixIssue172 determines whether the standard (correct) bip39 derivation path was used, or if derivation should be affected by Issue172 [0] which was how this library was originally implemented. [0] https://github.com/btcsuite/btcutil/pull/182/files

func (*Wallet) SignData

func (w *Wallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error)

SignData signs keccak256(data). The mimetype parameter describes the type of data being signed

func (*Wallet) SignDataWithPassphrase

func (w *Wallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error)

SignDataWithPassphrase signs keccak256(data). The mimetype parameter describes the type of data being signed

func (*Wallet) SignHash

func (w *Wallet) SignHash(account accounts.Account, hash []byte) ([]byte, error)

SignHash implements accounts.Wallet, which allows signing arbitrary data.

func (*Wallet) SignHashWithPassphrase

func (w *Wallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error)

SignHashWithPassphrase implements accounts.Wallet, attempting to sign the given hash with the given account using the passphrase as extra authentication.

func (*Wallet) SignText

func (w *Wallet) SignText(account accounts.Account, text []byte) ([]byte, error)

SignText requests the wallet to sign the hash of a given piece of data, prefixed the needed details via SignHashWithPassphrase, or by other means (e.g. unlock the account in a keystore).

func (*Wallet) SignTextWithPassphrase

func (w *Wallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error)

SignTextWithPassphrase implements accounts.Wallet, attempting to sign the given text (which is hashed) with the given account using passphrase as extra authentication.

func (*Wallet) SignTx

func (w *Wallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error)

SignTx implements accounts.Wallet, which allows the account to sign an Ethereum transaction.

func (*Wallet) SignTxEIP155

func (w *Wallet) SignTxEIP155(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error)

SignTxEIP155 implements accounts.Wallet, which allows the account to sign an ERC-20 transaction.

func (*Wallet) SignTxEIP1559 added in v0.1.3

func (w *Wallet) SignTxEIP1559(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error)

SignTxEIP1559 uses the London Signer which supports EIP-1559 dynamic fee, EIP-2930 access list, EIP-155 replay protected, and legacy Homestead Transactions

func (*Wallet) SignTxWithPassphrase

func (w *Wallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error)

SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given transaction with the given account using passphrase as extra authentication.

func (*Wallet) SignTxWithSigner added in v0.1.3

func (w *Wallet) SignTxWithSigner(account accounts.Account, tx *types.Transaction, signer types.Signer) (*types.Transaction, error)

SignTxWithSigner allows the account to sign a transaction using a custom signer.

func (*Wallet) Status

func (w *Wallet) Status() (string, error)

Status implements accounts.Wallet, returning a custom status message from the underlying vendor-specific hardware wallet implementation, however this does nothing since this is not a hardware device.

func (*Wallet) URL

func (w *Wallet) URL() accounts.URL

URL implements accounts.Wallet, returning the URL of the device that the wallet is on, however this does nothing since this is not a hardware device.

func (*Wallet) Unpin

func (w *Wallet) Unpin(account accounts.Account) error

Unpin unpins account from list of pinned accounts.

Directories

Path Synopsis
cmd
geth-hdwallet command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL