mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-12 01:10:36 +00:00
70b183fb9d
When changing accounts or VM, it is useful to be able to regenerate all wallets easy and fast.
125 lines
2.9 KiB
Go
125 lines
2.9 KiB
Go
package wallet
|
|
|
|
import (
|
|
"fmt"
|
|
"path"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
const regenerate = false
|
|
|
|
const dockerWalletDir = "../../.docker/wallets/"
|
|
|
|
var (
|
|
// privNetKeys is a list of unencrypted WIFs sorted by wallet number.
|
|
privnetWIFs = []string{
|
|
"KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY",
|
|
"KzfPUYDC9n2yf4fK5ro4C8KMcdeXtFuEnStycbZgX3GomiUsvX6W",
|
|
"L2oEXKRAAMiPEZukwR5ho2S6SMeQLhcK9mF71ZnF7GvT8dU4Kkgz",
|
|
"KzgWE3u3EDp13XPXXuTKZxeJ3Gi8Bsm8f9ijY3ZsCKKRvZUo1Cdn",
|
|
}
|
|
|
|
passwords = []string{"one", "two", "three", "four"}
|
|
)
|
|
|
|
func getKeys(t *testing.T) []*keys.PublicKey {
|
|
var pubs []*keys.PublicKey
|
|
|
|
for i := range privnetWIFs {
|
|
priv, err := keys.NewPrivateKeyFromWIF(privnetWIFs[i])
|
|
require.NoError(t, err)
|
|
pubs = append(pubs, priv.PublicKey())
|
|
}
|
|
return pubs
|
|
}
|
|
|
|
func getAccount(t *testing.T, wif, pass string) *Account {
|
|
acc, err := NewAccountFromWIF(wif)
|
|
require.NoError(t, err)
|
|
require.NoError(t, acc.Encrypt(pass))
|
|
return acc
|
|
}
|
|
|
|
func TestRegenerateSoloWallet(t *testing.T) {
|
|
if !regenerate {
|
|
return
|
|
}
|
|
walletPath := path.Join(dockerWalletDir, "wallet1_solo.json")
|
|
wif := privnetWIFs[0]
|
|
acc1 := getAccount(t, wif, "one")
|
|
acc2 := getAccount(t, wif, "one")
|
|
require.NoError(t, acc2.ConvertMultisig(3, getKeys(t)))
|
|
|
|
acc3 := getAccount(t, wif, "one")
|
|
require.NoError(t, acc3.ConvertMultisig(1, keys.PublicKeys{getKeys(t)[0]}))
|
|
|
|
w, err := NewWallet(walletPath)
|
|
require.NoError(t, err)
|
|
w.AddAccount(acc1)
|
|
w.AddAccount(acc2)
|
|
w.AddAccount(acc3)
|
|
require.NoError(t, w.savePretty())
|
|
w.Close()
|
|
}
|
|
|
|
func regenerateWallets(t *testing.T, dir string) {
|
|
pubs := getKeys(t)
|
|
for i := range privnetWIFs {
|
|
acc1 := getAccount(t, privnetWIFs[i], passwords[i])
|
|
acc2 := getAccount(t, privnetWIFs[i], passwords[i])
|
|
require.NoError(t, acc2.ConvertMultisig(3, pubs))
|
|
|
|
w, err := NewWallet(path.Join(dir, fmt.Sprintf("wallet%d.json", i+1)))
|
|
require.NoError(t, err)
|
|
w.AddAccount(acc1)
|
|
w.AddAccount(acc2)
|
|
require.NoError(t, w.savePretty())
|
|
w.Close()
|
|
}
|
|
}
|
|
|
|
func TestRegeneratePrivnetWallets(t *testing.T) {
|
|
if !regenerate {
|
|
return
|
|
}
|
|
dirs := []string{
|
|
dockerWalletDir,
|
|
"../consensus/testdata",
|
|
}
|
|
for i := range dirs {
|
|
regenerateWallets(t, dirs[i])
|
|
}
|
|
}
|
|
|
|
func TestRegenerateWalletTestdata(t *testing.T) {
|
|
if !regenerate {
|
|
return
|
|
}
|
|
const walletDir = "./testdata/"
|
|
|
|
acc1 := getAccount(t, privnetWIFs[0], "one")
|
|
acc2 := getAccount(t, privnetWIFs[0], "one")
|
|
pubs := getKeys(t)
|
|
require.NoError(t, acc2.ConvertMultisig(3, pubs))
|
|
|
|
acc3 := getAccount(t, privnetWIFs[1], "two")
|
|
acc3.Default = true
|
|
|
|
w, err := NewWallet(path.Join(walletDir, "wallet1.json"))
|
|
require.NoError(t, err)
|
|
w.AddAccount(acc1)
|
|
w.AddAccount(acc2)
|
|
require.NoError(t, w.savePretty())
|
|
w.Close()
|
|
|
|
w, err = NewWallet(path.Join(walletDir, "wallet2.json"))
|
|
require.NoError(t, err)
|
|
w.AddAccount(acc1)
|
|
w.AddAccount(acc2)
|
|
w.AddAccount(acc3)
|
|
require.NoError(t, w.savePretty())
|
|
w.Close()
|
|
}
|