github.com/mavryk-network/mvgo@v1.19.9/internal/compose/wallet.go (about)

     1  // Copyright (c) 2023 Blockwatch Data Inc.
     2  // Author: alex@blockwatch.cc, abdul@blockwatch.cc
     3  
     4  package compose
     5  
     6  import (
     7  	"crypto/ed25519"
     8  
     9  	"github.com/mavryk-network/mvgo/mavryk"
    10  	"github.com/tyler-smith/go-bip32"
    11  )
    12  
    13  func (c *Context) MakeAccount(id int, alias string) (Account, error) {
    14  	if alias == "" {
    15  		return Account{}, ErrNoAccountName
    16  	}
    17  	for _, acc := range c.Accounts {
    18  		if acc.Id == id {
    19  			c.AddVariable(alias, acc.Address.String())
    20  			return acc, nil
    21  		}
    22  	}
    23  	if id < 0 {
    24  		id = c.MaxId + 1
    25  	}
    26  	sk, err := deriveChildKey(c.BaseAccount.PrivateKey, id)
    27  	if err != nil {
    28  		return Account{}, nil
    29  	}
    30  	acc := Account{
    31  		Id:         id,
    32  		Address:    sk.Address(),
    33  		PrivateKey: sk,
    34  	}
    35  	c.Log.Debugf("Creating account %d %s %s", id, acc.Address, alias)
    36  	c.AddVariable(alias, acc.Address.String())
    37  	c.AddAccount(acc)
    38  	c.MaxId = acc.Id
    39  	return acc, nil
    40  }
    41  
    42  func deriveChildKey(seed mavryk.PrivateKey, id int) (mavryk.PrivateKey, error) {
    43  	var sk mavryk.PrivateKey
    44  	masterKey, err := bip32.NewMasterKey(seed.Data)
    45  	if err != nil {
    46  		return sk, err
    47  	}
    48  	bip32ChildKey, err := masterKey.NewChildKey(uint32(id))
    49  	if err != nil {
    50  		return sk, err
    51  	}
    52  	sk = mavryk.PrivateKey{
    53  		Type: mavryk.KeyTypeEd25519,
    54  		Data: ed25519.NewKeyFromSeed(bip32ChildKey.Key),
    55  	}
    56  	return sk, nil
    57  }