feat: create acc from private key endpoint added

`CreateAccountFromPrivateKey` function added, it generates an account based on provided
private key, but doesn't store anything anywhere.
This commit is contained in:
Sale Djenic 2023-03-20 08:36:28 +01:00 committed by saledjenic
parent f10bd00ceb
commit a812365525
3 changed files with 56 additions and 7 deletions

View File

@ -69,6 +69,20 @@ func (g *Generator) Generate(mnemonicPhraseLength int, n int, bip39Passphrase st
return infos, err return infos, err
} }
func (g *Generator) CreateAccountFromPrivateKey(privateKeyHex string) (IdentifiedAccountInfo, error) {
privateKeyHex = strings.TrimPrefix(privateKeyHex, "0x")
privateKey, err := crypto.HexToECDSA(privateKeyHex)
if err != nil {
return IdentifiedAccountInfo{}, err
}
acc := &Account{
privateKey: privateKey,
}
return acc.ToIdentifiedAccountInfo(""), nil
}
func (g *Generator) ImportPrivateKey(privateKeyHex string) (IdentifiedAccountInfo, error) { func (g *Generator) ImportPrivateKey(privateKeyHex string) (IdentifiedAccountInfo, error) {
privateKeyHex = strings.TrimPrefix(privateKeyHex, "0x") privateKeyHex = strings.TrimPrefix(privateKeyHex, "0x")
privateKey, err := crypto.HexToECDSA(privateKeyHex) privateKey, err := crypto.HexToECDSA(privateKeyHex)
@ -124,8 +138,7 @@ func (g *Generator) CreateAccountFromMnemonicAndDeriveAccountsForPaths(mnemonicP
} }
} }
id := uuid.NewRandom().String() accInfo := acc.ToGeneratedAccountInfo("", mnemonicPhrase)
accInfo := acc.ToGeneratedAccountInfo(id, mnemonicPhrase)
return accInfo.toGeneratedAndDerived(derivedAccountsInfo), nil return accInfo.toGeneratedAndDerived(derivedAccountsInfo), nil
} }

View File

@ -44,6 +44,11 @@ const testAccountJSONFile = `{
"version":3 "version":3
}` }`
const (
path0 = "m/44'/60'/0'/0/0"
path1 = "m/44'/60'/0'/0/1"
)
func TestGenerator_Generate(t *testing.T) { func TestGenerator_Generate(t *testing.T) {
g := New(nil) g := New(nil)
assert.Equal(t, 0, len(g.accounts)) assert.Equal(t, 0, len(g.accounts))
@ -58,6 +63,17 @@ func TestGenerator_Generate(t *testing.T) {
} }
} }
func TestGenerator_CreateAccountFromPrivateKey(t *testing.T) {
g := New(nil)
assert.Equal(t, 0, len(g.accounts))
info, err := g.CreateAccountFromPrivateKey(testAccount.bip44Key0)
assert.NoError(t, err)
assert.Equal(t, 0, len(g.accounts))
assert.Equal(t, 66, len(info.KeyUID))
}
func TestGenerator_ImportPrivateKey(t *testing.T) { func TestGenerator_ImportPrivateKey(t *testing.T) {
g := New(nil) g := New(nil)
assert.Equal(t, 0, len(g.accounts)) assert.Equal(t, 0, len(g.accounts))
@ -74,12 +90,14 @@ func TestGenerator_CreateAccountFromMnemonicAndDeriveAccountsForPaths(t *testing
g := New(nil) g := New(nil)
assert.Equal(t, 0, len(g.accounts)) assert.Equal(t, 0, len(g.accounts))
info, err := g.CreateAccountFromMnemonicAndDeriveAccountsForPaths(testAccount.mnemonic, testAccount.bip39Passphrase, []string{}) info, err := g.CreateAccountFromMnemonicAndDeriveAccountsForPaths(testAccount.mnemonic, testAccount.bip39Passphrase, []string{path0, path1})
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(g.accounts)) assert.Equal(t, 0, len(g.accounts))
assert.Equal(t, 36, len(info.ID))
assert.Equal(t, 66, len(info.KeyUID)) assert.Equal(t, 66, len(info.KeyUID))
assert.Equal(t, testAccount.bip44Address0, info.Derived[path0].Address)
assert.Equal(t, testAccount.bip44Address1, info.Derived[path1].Address)
} }
func TestGenerator_ImportMnemonic(t *testing.T) { func TestGenerator_ImportMnemonic(t *testing.T) {
@ -121,9 +139,6 @@ func TestGenerator_DeriveAddresses(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(g.accounts)) assert.Equal(t, 1, len(g.accounts))
path0 := "m/44'/60'/0'/0/0"
path1 := "m/44'/60'/0'/0/1"
addresses, err := g.DeriveAddresses(info.ID, []string{path0, path1}) addresses, err := g.DeriveAddresses(info.ID, []string{path0, path1})
assert.NoError(t, err) assert.NoError(t, err)

View File

@ -138,6 +138,27 @@ func MultiAccountStoreDerivedAccounts(paramsJSON string) string {
return string(out) return string(out)
} }
// CreateAccountFromPrivateKey returns an account derived from the private key without storing it
func CreateAccountFromPrivateKey(paramsJSON string) string {
var p MultiAccountImportPrivateKeyParams
if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
return makeJSONResponse(err)
}
resp, err := statusBackend.AccountManager().AccountsGenerator().CreateAccountFromPrivateKey(p.PrivateKey)
if err != nil {
return makeJSONResponse(err)
}
out, err := json.Marshal(resp)
if err != nil {
return makeJSONResponse(err)
}
return string(out)
}
// MultiAccountImportPrivateKey imports a raw private key without storing it. // MultiAccountImportPrivateKey imports a raw private key without storing it.
func MultiAccountImportPrivateKey(paramsJSON string) string { func MultiAccountImportPrivateKey(paramsJSON string) string {
var p MultiAccountImportPrivateKeyParams var p MultiAccountImportPrivateKeyParams