status-im/status-go

View on GitHub
mobile/multiaccount.go

Summary

Maintainability
A
0 mins
Test Coverage
F
0%
package statusgo

import (
    "encoding/json"
    "strings"
)

// MultiAccountGenerateParams are the params sent to MultiAccountGenerate.
type MultiAccountGenerateParams struct {
    N                    int    `json:"n"`
    MnemonicPhraseLength int    `json:"mnemonicPhraseLength"`
    Bip39Passphrase      string `json:"bip39Passphrase"`
}

// MultiAccountGenerateAndDeriveAddressesParams are the params sent to MultiAccountGenerateAndDeriveAddresses.
type MultiAccountGenerateAndDeriveAddressesParams struct {
    MultiAccountGenerateParams
    Paths []string `json:"paths"`
}

// MultiAccountDeriveAddressesParams are the params sent to MultiAccountDeriveAddresses.
type MultiAccountDeriveAddressesParams struct {
    AccountID string   `json:"accountID"`
    Paths     []string `json:"paths"`
}

// MultiAccountStoreDerivedAccountsParams are the params sent to MultiAccountStoreDerivedAccounts.
type MultiAccountStoreDerivedAccountsParams struct {
    MultiAccountDeriveAddressesParams
    Password string `json:"password"`
}

// MultiAccountStoreAccountParams are the params sent to MultiAccountStoreAccount.
type MultiAccountStoreAccountParams struct {
    AccountID string `json:"accountID"`
    Password  string `json:"password"`
}

// MultiAccountImportPrivateKeyParams are the params sent to MultiAccountImportPrivateKey.
type MultiAccountImportPrivateKeyParams struct {
    PrivateKey string `json:"privateKey"`
}

// MultiAccountLoadAccountParams are the params sent to MultiAccountLoadAccount.
type MultiAccountLoadAccountParams struct {
    Address  string `json:"address"`
    Password string `json:"password"`
}

// MultiAccountImportMnemonicParams are the params sent to MultiAccountImportMnemonic.
type MultiAccountImportMnemonicParams struct {
    MnemonicPhrase  string   `json:"mnemonicPhrase"`
    Bip39Passphrase string   `json:"Bip39Passphrase"`
    Paths           []string `json:"paths"`
}

// MultiAccountGenerate generates account in memory without storing them.
func MultiAccountGenerate(paramsJSON string) string {
    var p MultiAccountGenerateParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    resp, err := statusBackend.AccountManager().AccountsGenerator().Generate(p.MnemonicPhraseLength, p.N, p.Bip39Passphrase)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// MultiAccountGenerateAndDeriveAddresses combines Generate and DeriveAddresses in one call.
func MultiAccountGenerateAndDeriveAddresses(paramsJSON string) string {
    var p MultiAccountGenerateAndDeriveAddressesParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    resp, err := statusBackend.AccountManager().AccountsGenerator().GenerateAndDeriveAddresses(p.MnemonicPhraseLength, p.N, p.Bip39Passphrase, p.Paths)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// MultiAccountDeriveAddresses derive addresses from an account selected by ID, without storing them.
func MultiAccountDeriveAddresses(paramsJSON string) string {
    var p MultiAccountDeriveAddressesParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    resp, err := statusBackend.AccountManager().AccountsGenerator().DeriveAddresses(p.AccountID, p.Paths)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// MultiAccountStoreDerivedAccounts derive accounts from the specified key and store them encrypted with the specified password.
func MultiAccountStoreDerivedAccounts(paramsJSON string) string {
    var p MultiAccountStoreDerivedAccountsParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    resp, err := statusBackend.AccountManager().AccountsGenerator().StoreDerivedAccounts(p.AccountID, p.Password, p.Paths)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    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.
func MultiAccountImportPrivateKey(paramsJSON string) string {
    var p MultiAccountImportPrivateKeyParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    resp, err := statusBackend.AccountManager().AccountsGenerator().ImportPrivateKey(p.PrivateKey)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// CreateAccountFromMnemonicAndDeriveAccountsForPaths returns an account derived from the mnemonic phrase and the Bip39Passphrase
// and generate derived accounts for the list of paths without storing it
func CreateAccountFromMnemonicAndDeriveAccountsForPaths(paramsJSON string) string {
    var p MultiAccountImportMnemonicParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    // remove any duplicate whitespaces
    mnemonicPhraseNoExtraSpaces := strings.Join(strings.Fields(p.MnemonicPhrase), " ")

    resp, err := statusBackend.AccountManager().AccountsGenerator().CreateAccountFromMnemonicAndDeriveAccountsForPaths(mnemonicPhraseNoExtraSpaces, p.Bip39Passphrase, p.Paths)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// MultiAccountImportMnemonic imports an account derived from the mnemonic phrase and the Bip39Passphrase storing it.
func MultiAccountImportMnemonic(paramsJSON string) string {
    var p MultiAccountImportMnemonicParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    // remove any duplicate whitespaces
    mnemonicPhraseNoExtraSpaces := strings.Join(strings.Fields(p.MnemonicPhrase), " ")

    resp, err := statusBackend.AccountManager().AccountsGenerator().ImportMnemonic(mnemonicPhraseNoExtraSpaces, p.Bip39Passphrase)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// MultiAccountStoreAccount stores the select account.
func MultiAccountStoreAccount(paramsJSON string) string {
    var p MultiAccountStoreAccountParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    resp, err := statusBackend.AccountManager().AccountsGenerator().StoreAccount(p.AccountID, p.Password)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// MultiAccountLoadAccount loads in memory the account specified by address unlocking it with password.
func MultiAccountLoadAccount(paramsJSON string) string {
    var p MultiAccountLoadAccountParams

    if err := json.Unmarshal([]byte(paramsJSON), &p); err != nil {
        return makeJSONResponse(err)
    }

    resp, err := statusBackend.AccountManager().AccountsGenerator().LoadAccount(p.Address, p.Password)
    if err != nil {
        return makeJSONResponse(err)
    }

    out, err := json.Marshal(resp)
    if err != nil {
        return makeJSONResponse(err)
    }

    return string(out)
}

// MultiAccountReset remove all the multi-account keys from memory.
func MultiAccountReset() string {
    statusBackend.AccountManager().AccountsGenerator().Reset()
    return makeJSONResponse(nil)
}