Skip to content

Commit

Permalink
Merge c6d1ee0 into 24cad95
Browse files Browse the repository at this point in the history
  • Loading branch information
mauricio1802 committed Dec 1, 2019
2 parents 24cad95 + c6d1ee0 commit 5fdfae3
Show file tree
Hide file tree
Showing 10 changed files with 1,115 additions and 26 deletions.
1,011 changes: 1,011 additions & 0 deletions src/coin/skycoin/coverage.out

Large diffs are not rendered by default.

78 changes: 70 additions & 8 deletions src/coin/skycoin/models/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func (wltSrv *SkycoinRemoteWallet) ListWallets() core.WalletIterator {
return NewSkycoinWalletIterator(wallets)
}

func (wltSrv *SkycoinRemoteWallet) CreateWallet(label string, seed string, IsEncrypted bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) {
func (wltSrv *SkycoinRemoteWallet) CreateWallet(label string, seed string, wltType string, IsEncrypted bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) {
logWallet.Info("Creating wallet")
wlt := &RemoteWallet{} //nolint megacheck False negative
c, err := NewSkycoinApiClient(wltSrv.poolSection)
Expand All @@ -113,7 +113,7 @@ func (wltSrv *SkycoinRemoteWallet) CreateWallet(label string, seed string, IsEnc
return nil, err
}
wltOpt := api.CreateWalletOptions{}
wltOpt.Type = WalletTypeDeterministic
wltOpt.Type = wltType
wltOpt.Seed = seed
wltOpt.Password = password
wltOpt.Encrypt = true
Expand All @@ -129,7 +129,7 @@ func (wltSrv *SkycoinRemoteWallet) CreateWallet(label string, seed string, IsEnc
wlt = walletResponseToWallet(*wltR)
} else {
wltOpt := api.CreateWalletOptions{}
wltOpt.Type = WalletTypeDeterministic
wltOpt.Type = wltType
wltOpt.Seed = seed
wltOpt.Encrypt = false
wltOpt.Label = label
Expand Down Expand Up @@ -802,7 +802,7 @@ func (wltSrv *SkycoinLocalWallet) GetWallet(id string) core.Wallet {
}
}

func (wltSrv *SkycoinLocalWallet) CreateWallet(label string, seed string, IsEncrypted bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) {
func (wltSrv *SkycoinLocalWallet) CreateWallet(label string, seed string, wltType string, IsEncrypted bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) {
logWallet.Info("Creating Skycoin local wallet")
password, err := pwd("Insert Password")

Expand All @@ -812,11 +812,12 @@ func (wltSrv *SkycoinLocalWallet) CreateWallet(label string, seed string, IsEncr
}

passwordByte := []byte(password)

opts := wallet.Options{
Label: label,
Seed: seed,
Encrypt: IsEncrypted,
Type: WalletTypeDeterministic,
Type: wltType,
Password: passwordByte,
}
wltName := wltSrv.newUnicWalletFilename()
Expand Down Expand Up @@ -1290,19 +1291,76 @@ func (wlt LocalWallet) Spend(unspent, new []core.TransactionOutput, change core.

return createTransaction(nil, new, unspent, change, options, createTxnFunc)
}

func (wlt *LocalWallet) GenAddresses(addrType core.AddressType, startIndex, count uint32, pwd core.PasswordReader) core.AddressIterator {

if addrType != core.AccountAddress && addrType != core.ChangeAddress {
logWallet.Error("Incorret address type")
return nil
}
logWallet.Info("Generating addresses in local wallet")
walletName := filepath.Join(wlt.WalletDir, wlt.Id)
walletLoaded, err := wallet.Load(walletName)
if err != nil {
logWallet.WithError(err).WithField("filename", walletName).Error("Call to wallet.Load(filename) inside GenAddresses failed.")
return nil
}

if addrType == core.ChangeAddress && walletLoaded.Type() != WalletTypeBip44 {
logWallet.Error("Incorrect address type")
return nil
}

genAddr := func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) {
return w.GenerateAddresses(n)
}

addressCount := walletLoaded.EntriesLen()

getAddrs := func(w wallet.Wallet) []cipher.Addresser {
return w.GetAddresses()[startIndex : startIndex+count]
}

if walletLoaded.Type() == WalletTypeBip44 {
addressCount = len((*(walletLoaded.(*wallet.Bip44Wallet))).ExternalEntries)

getAddrs = func(w wallet.Wallet) []cipher.Addresser {
addresser := make([]cipher.Addresser, 0)
for _, entry := range (*(walletLoaded.(*wallet.Bip44Wallet))).ExternalEntries[startIndex : startIndex+count] {
addresser = append(addresser, entry.Address)
}
return addresser
}

}
if addrType == core.ChangeAddress {
addressCount = len((*(walletLoaded.(*wallet.Bip44Wallet))).ChangeEntries)

genAddr = func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) {
addresser := make([]cipher.Addresser, 0)
for i := uint64(0); i < n; i++ {
addrs, err := w.(*wallet.Bip44Wallet).GenerateChangeEntry()
if err != nil {
return nil, err
}
addresser = append(addresser, addrs.Address)
}
return addresser, nil
}

getAddrs = func(w wallet.Wallet) []cipher.Addresser {
addresser := make([]cipher.Addresser, 0)
for _, entry := range (*(walletLoaded.(*wallet.Bip44Wallet))).ChangeEntries[startIndex : startIndex+count] {
addresser = append(addresser, entry.Address)
}
return addresser
}
}

if uint32(addressCount) < (startIndex + count) {
diff := (startIndex + count) - uint32(addressCount)
genAddressesInFile := func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) {
return w.GenerateAddresses(n)
return genAddr(w, n)
}

if walletLoaded.IsEncrypted() {
Expand All @@ -1316,8 +1374,11 @@ func (wlt *LocalWallet) GenAddresses(addrType core.AddressType, startIndex, coun
var addrs []cipher.Addresser
if err := wallet.GuardUpdate(w, passwordBytes, func(wlt wallet.Wallet) error {
var err error
addrs, err = wlt.GenerateAddresses(n)

addrs, err = genAddr(wlt, n)

logWallet.WithError(err).WithField("num", n).Error("Call to wlt.GenerateAddresses(num) inside wallet.GuardUpdate failed")

return err
}); err != nil {
logWallet.WithError(err).Error("Call to wallet.GuardUpdate inside genAddressesInFile failed")
Expand Down Expand Up @@ -1346,14 +1407,15 @@ func (wlt *LocalWallet) GenAddresses(addrType core.AddressType, startIndex, coun
return nil
}

addrs := walletLoaded.GetAddresses()[startIndex : startIndex+count]
addrs := getAddrs(walletLoaded)
skyAddrs := make([]core.Address, 0)
for _, addr := range addrs {
skyAddrs = append(skyAddrs, &SkycoinAddress{address: addr.String()})
}
return NewSkycoinAddressIterator(skyAddrs)

}

func (wlt *LocalWallet) GetCryptoAccount() core.CryptoAccount {
logWallet.Info("Getting CryptoAccount from local wallet")
return wlt
Expand Down
6 changes: 3 additions & 3 deletions src/coin/skycoin/models/wallet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,12 @@ func TestSkycoinRemoteWalletCreateWallet(t *testing.T) {
return "pwd", nil
}

wlt1, err := wltSrv.CreateWallet(label, seed, true, pwdReader, scanN)
wlt1, err := wltSrv.CreateWallet(label, seed, "deterministic", true, pwdReader, scanN)
require.NoError(t, err)
require.Equal(t, "walletEncrypted", wlt1.GetLabel())
require.Equal(t, "FiberCrypto", wlt1.GetId())

wlt2, err := wltSrv.CreateWallet(label, seed, false, pwdReader, scanN)
wlt2, err := wltSrv.CreateWallet(label, seed, "deterministic", false, pwdReader, scanN)
require.NoError(t, err)
require.Equal(t, "walletNonEncrypted", wlt2.GetLabel())
require.Equal(t, "FiberCrypto", wlt2.GetId())
Expand Down Expand Up @@ -800,7 +800,7 @@ func makeLocalWalletsFromKeyData(t *testing.T, keysData []KeyData) []core.Wallet
var err error
if w, isFound = walletsCache[kd.Mnemonic]; !isFound {
if w = walletSet.GetWallet(walletID); w == nil {
w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, false, func(string) (string, error) { return "", nil }, 0)
w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, "deterministic", false, func(string) (string, error) { return "", nil }, 0)
require.NoError(t, err)
}
walletsCache[kd.Mnemonic] = w
Expand Down
2 changes: 1 addition & 1 deletion src/core/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ type WalletSet interface {
// GetWallet to lookup wallet by ID
GetWallet(id string) Wallet
// CreateWallet instantiates a new wallet given account seed
CreateWallet(name string, seed string, isEncryptrd bool, pwd PasswordReader, scanAddressesN int) (Wallet, error)
CreateWallet(name string, seed string, walletType string, isEncryptrd bool, pwd PasswordReader, scanAddressesN int) (Wallet, error)
}

// WalletStorage provides access to the underlying wallets data store
Expand Down
13 changes: 7 additions & 6 deletions src/models/walletsManager.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ type WalletManager struct {
_ func(string) `slot:"updateAddresses"`
_ func() `slot:"updateWallets"`
_ func() `constructor:"init"`
_ func(seed string, label string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"`
_ func(seed string, label string, scanN int) *QWallet `slot:"createUnencryptedWallet"`
_ func(seed string, label string, walletType string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"`
_ func(seed string, label string, walletType string, scanN int) *QWallet `slot:"createUnencryptedWallet"`
_ func(entropy int) string `slot:"getNewSeed"`
_ func(seed string) int `slot:"verifySeed"`
_ func(id string, n int, password string) `slot:"newWalletAddress"`
Expand Down Expand Up @@ -486,12 +486,13 @@ func (walletM *WalletManager) signTxn(id, source, password string, index []int,
return qTxn
}

func (walletM *WalletManager) createEncryptedWallet(seed, label, password string, scanN int) *QWallet {
func (walletM *WalletManager) createEncryptedWallet(seed, label, wltType, password string, scanN int) *QWallet {
logWalletManager.Info("Creating encrypted wallet")
pwd := func(message string) (string, error) {
return password, nil
}
wlt, err := walletM.WalletEnv.GetWalletSet().CreateWallet(label, seed, true, pwd, scanN)
fmt.Println("WALLET TYPE ", wltType)
wlt, err := walletM.WalletEnv.GetWalletSet().CreateWallet(label, seed, wltType, true, pwd, scanN)
if err != nil {
logWalletManager.WithError(err).Error("Couldn't create encrypted wallet")
return nil
Expand All @@ -502,13 +503,13 @@ func (walletM *WalletManager) createEncryptedWallet(seed, label, password string

}

func (walletM *WalletManager) createUnencryptedWallet(seed, label string, scanN int) *QWallet {
func (walletM *WalletManager) createUnencryptedWallet(seed, label, wltType string, scanN int) *QWallet {
logWalletManager.Info("Creating encrypted wallet")
pwd := func(message string) (string, error) {
return "", nil
}

wlt, err := walletM.WalletEnv.GetWalletSet().CreateWallet(label, seed, false, pwd, scanN)
wlt, err := walletM.WalletEnv.GetWalletSet().CreateWallet(label, seed, wltType, false, pwd, scanN)
if err != nil {
logWalletManager.WithError(err).Error("Couldn't create unencrypted wallet")
return nil
Expand Down
2 changes: 1 addition & 1 deletion src/ui/CreateLoadWallet.qml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Item {
dataModified()
}
}

ControlGenerateSeed {
id: walletSeed
width: parent.width
Expand Down
18 changes: 16 additions & 2 deletions src/ui/Dialogs/DialogAddLoadWallet.qml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Dialog {
property alias mode: createLoadWallet.mode
property alias name: createLoadWallet.name
property alias seed: createLoadWallet.seed
//property alias type: comboBoxWalletType.model[comboBoxWalletType.currentIndex].value
property alias encryptionEnabled: checkBoxEncryptWallet.checked

Component.onCompleted: {
Expand All @@ -31,15 +32,15 @@ Dialog {
if (mode === CreateLoadWallet.Load){
scanA = 10
}
walletModel.addWallet(walletManager.createEncryptedWallet(seed, name,textFieldPassword.text , scanA))
walletModel.addWallet(walletManager.createEncryptedWallet(seed, name,textFieldPassword.text, comboBoxWalletType.model[comboBoxWalletType.currentIndex].value, scanA))

} else{

if (mode === CreateLoadWallet.Load){
scanA = 10
}

walletModel.addWallet(walletManager.createUnencryptedWallet(seed, name, scanA))
walletModel.addWallet(walletManager.createUnencryptedWallet(seed, name, comboBoxWalletType.model[comboBoxWalletType.currentIndex].value, scanA))
}
}

Expand Down Expand Up @@ -141,6 +142,19 @@ Dialog {
}
} // ColumnLayoutSeedWarning

RowLayout{
Label{
text:qsTr("Wallet Type: ")
}
ComboBox{
id: comboBoxWalletType
Layout.fillWidth: true
textRole: "name"
model: [{name:"Bip44-Wallet", value:"bip44"}, {name:"Deterministic-Wallet", value:"deterministic"} ]

}
}

CheckBox {
id: checkBoxEncryptWallet
text: qsTr("Encrypt wallet")
Expand Down
4 changes: 2 additions & 2 deletions src/ui/GeneralStackView.qml
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,12 @@ Item {

onWalletCreationRequested: {
stackView.replace(componentGeneralSwipeView)
walletManager.createUnencryptedWallet(pageCreateLoadWallet.seed, pageCreateLoadWallet.name,0)
walletManager.createUnencryptedWallet(pageCreateLoadWallet.seed, pageCreateLoadWallet.name, "deterministic" ,0)
}

onWalletLoadingRequested:{
stackView.replace(componentGeneralSwipeView)
walletManager.createUnencryptedWallet(pageCreateLoadWallet.seed, pageCreateLoadWallet.name,10)
walletManager.createUnencryptedWallet(pageCreateLoadWallet.seed, pageCreateLoadWallet.name, "deterministic", 10)
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/ui/PageCreateLoadWallet.qml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Item {
property alias name: createLoadWallet.name
property alias seed: createLoadWallet.seed
property alias confirmedSeed: createLoadWallet.seedConfirm

Column {
anchors.fill: parent
spacing: 30
Expand Down
6 changes: 3 additions & 3 deletions src/ui/PageWallets.qml
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ Page {
width: applicationWindow.width > 540 ? 540 - 40 : applicationWindow.width - 40
height: applicationWindow.height > 640 ? 640 - 40 : applicationWindow.height - 40

onAccepted: {
console.log("Add wallet")
}
//onAccepted: {
// console.log("Add wallet")
//}
}


Expand Down

0 comments on commit 5fdfae3

Please sign in to comment.