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 }