Skip to content

Commit e22ab0f

Browse files
authored
Merge branch 'master' into senddestination_verify_address
2 parents efe2393 + 679bc84 commit e22ab0f

File tree

12 files changed

+174
-62
lines changed

12 files changed

+174
-62
lines changed

accounts.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99
"github.com/decred/dcrwallet/errors/v2"
1010
)
1111

12-
func (wallet *Wallet) GetAccounts(requiredConfirmations int32) (string, error) {
13-
accountsResponse, err := wallet.GetAccountsRaw(requiredConfirmations)
12+
func (wallet *Wallet) GetAccounts() (string, error) {
13+
accountsResponse, err := wallet.GetAccountsRaw()
1414
if err != nil {
1515
return "", nil
1616
}
@@ -19,14 +19,14 @@ func (wallet *Wallet) GetAccounts(requiredConfirmations int32) (string, error) {
1919
return string(result), nil
2020
}
2121

22-
func (wallet *Wallet) GetAccountsRaw(requiredConfirmations int32) (*Accounts, error) {
22+
func (wallet *Wallet) GetAccountsRaw() (*Accounts, error) {
2323
resp, err := wallet.internal.Accounts(wallet.shutdownContext())
2424
if err != nil {
2525
return nil, err
2626
}
2727
accounts := make([]*Account, len(resp.Accounts))
2828
for i, account := range resp.Accounts {
29-
balance, err := wallet.GetAccountBalance(int32(account.AccountNumber), requiredConfirmations)
29+
balance, err := wallet.GetAccountBalance(int32(account.AccountNumber))
3030
if err != nil {
3131
return nil, err
3232
}
@@ -51,8 +51,8 @@ func (wallet *Wallet) GetAccountsRaw(requiredConfirmations int32) (*Accounts, er
5151
}, nil
5252
}
5353

54-
func (wallet *Wallet) AccountsIterator(requiredConfirmations int32) (*AccountsIterator, error) {
55-
accounts, err := wallet.GetAccountsRaw(requiredConfirmations)
54+
func (wallet *Wallet) AccountsIterator() (*AccountsIterator, error) {
55+
accounts, err := wallet.GetAccountsRaw()
5656
if err != nil {
5757
return nil, err
5858
}
@@ -77,13 +77,13 @@ func (accountsInterator *AccountsIterator) Reset() {
7777
accountsInterator.currentIndex = 0
7878
}
7979

80-
func (wallet *Wallet) GetAccount(accountNumber int32, requiredConfirmations int32) (*Account, error) {
80+
func (wallet *Wallet) GetAccount(accountNumber int32) (*Account, error) {
8181
props, err := wallet.internal.AccountProperties(wallet.shutdownContext(), uint32(accountNumber))
8282
if err != nil {
8383
return nil, err
8484
}
8585

86-
balance, err := wallet.GetAccountBalance(accountNumber, requiredConfirmations)
86+
balance, err := wallet.GetAccountBalance(accountNumber)
8787
if err != nil {
8888
return nil, err
8989
}
@@ -102,8 +102,8 @@ func (wallet *Wallet) GetAccount(accountNumber int32, requiredConfirmations int3
102102
return account, nil
103103
}
104104

105-
func (wallet *Wallet) GetAccountBalance(accountNumber int32, requiredConfirmations int32) (*Balance, error) {
106-
balance, err := wallet.internal.CalculateAccountBalance(wallet.shutdownContext(), uint32(accountNumber), requiredConfirmations)
105+
func (wallet *Wallet) GetAccountBalance(accountNumber int32) (*Balance, error) {
106+
balance, err := wallet.internal.CalculateAccountBalance(wallet.shutdownContext(), uint32(accountNumber), wallet.RequiredConfirmations())
107107
if err != nil {
108108
return nil, err
109109
}
@@ -119,8 +119,8 @@ func (wallet *Wallet) GetAccountBalance(accountNumber int32, requiredConfirmatio
119119
}, nil
120120
}
121121

122-
func (wallet *Wallet) SpendableForAccount(account int32, requiredConfirmations int32) (int64, error) {
123-
bals, err := wallet.internal.CalculateAccountBalance(wallet.shutdownContext(), uint32(account), requiredConfirmations)
122+
func (wallet *Wallet) SpendableForAccount(account int32) (int64, error) {
123+
bals, err := wallet.internal.CalculateAccountBalance(wallet.shutdownContext(), uint32(account), wallet.RequiredConfirmations())
124124
if err != nil {
125125
log.Error(err)
126126
return 0, translateError(err)

log.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ func setLogLevel(subsystemID string, logLevel string) {
142142
logger.SetLevel(level)
143143
}
144144

145+
// Log writes a message to the log using LevelInfo.
145146
func Log(m string) {
146147
log.Info(m)
147148
}
149+
150+
// LogT writes a tagged message to the log using LevelInfo.
151+
func LogT(tag, m string) {
152+
log.Infof("%s: %s", tag, m)
153+
}

multiwallet.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"path/filepath"
88
"strconv"
99
"strings"
10+
"sync"
1011

1112
"github.com/asdine/storm"
1213
"github.com/asdine/storm/q"
@@ -29,6 +30,7 @@ type MultiWallet struct {
2930
wallets map[int]*Wallet
3031
syncData *syncData
3132

33+
notificationListenersMu sync.RWMutex
3234
txAndBlockNotificationListeners map[string]TxAndBlockNotificationListener
3335
blocksRescanProgressListener BlocksRescanProgressListener
3436

@@ -296,10 +298,6 @@ func (mw *MultiWallet) RestoreWallet(seedMnemonic, privatePassphrase string, pri
296298
}
297299

298300
func (mw *MultiWallet) LinkExistingWallet(walletDataDir, originalPubPass string, privatePassphraseType int32) (*Wallet, error) {
299-
if mw.IsSyncing() {
300-
return nil, errors.New(ErrSyncAlreadyInProgress)
301-
}
302-
303301
// check if `walletDataDir` contains wallet.db
304302
if !WalletExistsAt(walletDataDir) {
305303
return nil, errors.New(ErrNotExist)
@@ -374,20 +372,20 @@ func (mw *MultiWallet) LinkExistingWallet(walletDataDir, originalPubPass string,
374372
// - calls the provided `setupWallet` function to perform any necessary creation,
375373
// restoration or linking of the just saved wallet
376374
//
377-
// Iff all the above operations succeed, the wallet info will be persisted to db
375+
// IFF all the above operations succeed, the wallet info will be persisted to db
378376
// and the wallet will be added to `mw.wallets`.
379377
func (mw *MultiWallet) saveNewWallet(wallet *Wallet, setupWallet func() error) (*Wallet, error) {
380-
if mw.IsSyncing() {
381-
return nil, errors.New(ErrSyncAlreadyInProgress)
382-
}
383-
384378
exists, err := mw.WalletNameExists(wallet.Name)
385379
if err != nil {
386380
return nil, err
387381
} else if exists {
388382
return nil, errors.New(ErrExist)
389383
}
390384

385+
if mw.IsConnectedToDecredNetwork() {
386+
mw.CancelSync()
387+
defer mw.SpvSync()
388+
}
391389
// Perform database save operations in batch transaction
392390
// for automatic rollback if error occurs at any point.
393391
err = mw.batchDbTransaction(func(db storm.Node) error {
@@ -445,15 +443,21 @@ func (mw *MultiWallet) RenameWallet(walletID int, newName string) error {
445443
}
446444

447445
func (mw *MultiWallet) DeleteWallet(walletID int, privPass []byte) error {
448-
if mw.IsSyncing() {
449-
return errors.New(ErrSyncAlreadyInProgress)
450-
}
451446

452447
wallet := mw.WalletWithID(walletID)
453448
if wallet == nil {
454449
return errors.New(ErrNotExist)
455450
}
456451

452+
if mw.IsConnectedToDecredNetwork() {
453+
mw.CancelSync()
454+
defer func() {
455+
if mw.OpenedWalletsCount() > 0 {
456+
mw.SpvSync()
457+
}
458+
}()
459+
}
460+
457461
err := wallet.deleteWallet(privPass)
458462
if err != nil {
459463
return translateError(err)

multiwallet_config.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const (
3333
)
3434

3535
type configSaveFn = func(key string, value interface{}) error
36-
type configReadFn = func(key string, valueOut interface{}) error
36+
type configReadFn = func(multiwallet bool, key string, valueOut interface{}) error
3737

3838
func (mw *MultiWallet) walletConfigSetFn(walletID int) configSaveFn {
3939
return func(key string, value interface{}) error {
@@ -43,9 +43,11 @@ func (mw *MultiWallet) walletConfigSetFn(walletID int) configSaveFn {
4343
}
4444

4545
func (mw *MultiWallet) walletConfigReadFn(walletID int) configReadFn {
46-
return func(key string, valueOut interface{}) error {
47-
walletUniqueKey := WalletUniqueConfigKey(walletID, key)
48-
return mw.db.Get(userConfigBucketName, walletUniqueKey, valueOut)
46+
return func(multiwallet bool, key string, valueOut interface{}) error {
47+
if !multiwallet {
48+
key = WalletUniqueConfigKey(walletID, key)
49+
}
50+
return mw.db.Get(userConfigBucketName, key, valueOut)
4951
}
5052
}
5153

multiwallet_utils.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package dcrlibwallet
22

33
import (
44
"context"
5+
"os"
6+
"path/filepath"
57

68
"github.com/asdine/storm"
79
"github.com/decred/dcrwallet/errors/v2"
@@ -98,3 +100,19 @@ func (mw *MultiWallet) setNetworkBackend(syncer *spv.Syncer) {
98100
}
99101
}
100102
}
103+
104+
// RootDirFileSizeInBytes returns the total directory size of
105+
// multiwallet's root directory in bytes.
106+
func (mw *MultiWallet) RootDirFileSizeInBytes() (int64, error) {
107+
var size int64
108+
err := filepath.Walk(mw.rootDir, func(_ string, info os.FileInfo, err error) error {
109+
if err != nil {
110+
return err
111+
}
112+
if !info.IsDir() {
113+
size += info.Size()
114+
}
115+
return err
116+
})
117+
return size, err
118+
}

spv/go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ require (
66
github.com/decred/dcrd/addrmgr v1.1.0
77
github.com/decred/dcrd/blockchain/stake/v2 v2.0.2
88
github.com/decred/dcrd/chaincfg/chainhash v1.0.2
9-
github.com/decred/dcrd/dcrec/secp256k1 v1.0.2 // indirect
109
github.com/decred/dcrd/dcrutil/v2 v2.0.1
1110
github.com/decred/dcrd/gcs v1.1.0
1211
github.com/decred/dcrd/txscript/v2 v2.1.0

spv/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ github.com/decred/base58 v1.0.1/go.mod h1:H2ENcsJjye1G7CbRa67kV9OFaui0LGr56ntKKo
2020
github.com/decred/dcrd/addrmgr v1.0.2/go.mod h1:gNnmTuf/Xkg8ZX3j5GXbajzPrSdf5bA7HitO2bjmq0Q=
2121
github.com/decred/dcrd/addrmgr v1.1.0 h1:VQkn1qmafZypfN2u7yi7J/girwz4ZDicquo7JzsoxdQ=
2222
github.com/decred/dcrd/addrmgr v1.1.0/go.mod h1:exghL+0+QeVvO4MXezWJ1C2tcpBn3ngfuP6S1R+adB8=
23+
github.com/decred/dcrd/blockchain/stake v1.0.1 h1:IYGsNZRyMUsoFtVAUjd7XIccrIQ4YIqDeNzQJCjyS8A=
2324
github.com/decred/dcrd/blockchain/stake v1.0.1/go.mod h1:hgoGmWMIu2LLApBbcguVpzCEEfX7M2YhuMrQdpohJzc=
2425
github.com/decred/dcrd/blockchain/stake/v2 v2.0.0/go.mod h1:jv/rKMcZ87lhvVkHot/tElxeAYEUJ3mnKPHJ7WPq86U=
2526
github.com/decred/dcrd/blockchain/stake/v2 v2.0.2 h1:tRrJTywABGsUpf6qrTrtdIOKXyZflA51b0sqWf7p5gk=
@@ -44,6 +45,7 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK
4445
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
4546
github.com/decred/dcrd/crypto/ripemd160 v1.0.0 h1:MciTnR4NfBqDFRFjFkrn8WPLP4Vo7t6ww6ghfn6wcXQ=
4647
github.com/decred/dcrd/crypto/ripemd160 v1.0.0/go.mod h1:F0H8cjIuWTRoixr/LM3REB8obcWkmYx0gbxpQWR8RPg=
48+
github.com/decred/dcrd/database v1.0.1 h1:BSIerNf4RhSA0iDhiE/320RYqD2y9T+SCj99Pv7svgo=
4749
github.com/decred/dcrd/database v1.0.1/go.mod h1:ILCeyOHFew3fZ7K2B9jl+tp5qFOap/pEGoo6Yy6Wk0g=
4850
github.com/decred/dcrd/database/v2 v2.0.0/go.mod h1:Sj2lvTRB0mfSu9uD7ObfwCY/eJ954GFU/X+AndJIyfE=
4951
github.com/decred/dcrd/database/v2 v2.0.1 h1:ghLzkKpVpwvjrdRv3njrEfkvygQpYQX66sGVs8ha+E8=
@@ -67,6 +69,7 @@ github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0 h1:3GIJYXQDAKpLEFriGFN8SbSffak1
6769
github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0/go.mod h1:3s92l0paYkZoIHuj4X93Teg/HB7eGM9x/zokGw+u4mY=
6870
github.com/decred/dcrd/dcrjson/v3 v3.0.1 h1:b9cpplNJG+nutE2jS8K/BtSGIJihEQHhFjFAsvJF/iI=
6971
github.com/decred/dcrd/dcrjson/v3 v3.0.1/go.mod h1:fnTHev/ABGp8IxFudDhjGi9ghLiXRff1qZz/wvq12Mg=
72+
github.com/decred/dcrd/dcrutil v1.1.1 h1:zOkGiumN/JkobhAgpG/zfFgUoolGKVGYT5na1hbYUoE=
7073
github.com/decred/dcrd/dcrutil v1.1.1/go.mod h1:Jsttr0pEvzPAw+qay1kS1/PsbZYPyhluiNwwY6yBJS4=
7174
github.com/decred/dcrd/dcrutil/v2 v2.0.0/go.mod h1:gUshVAXpd51DlcEhr51QfWL2HJGkMDM1U8chY+9VvQg=
7275
github.com/decred/dcrd/dcrutil/v2 v2.0.1 h1:aL+c7o7Q66HV1gIif+XkNYo9DeorN3l01Vns8mh0mqs=
@@ -79,6 +82,7 @@ github.com/decred/dcrd/hdkeychain/v2 v2.1.0 h1:NVNIz36HPukOnaysBDsLO+2kWqijLM4tv
7982
github.com/decred/dcrd/hdkeychain/v2 v2.1.0/go.mod h1:DR+lD4uV8G0i3c9qnUJwjiGaaEWK+nSrbWCz1BRHBL8=
8083
github.com/decred/dcrd/rpc/jsonrpc/types v1.0.1 h1:sWsGtWzdmrna6aysDCHwjANTJh+Lxt2xp6S10ahP79Y=
8184
github.com/decred/dcrd/rpc/jsonrpc/types v1.0.1/go.mod h1:dJUp9PoyFYklzmlImpVkVLOr6j4zKuUv66YgemP2sd8=
85+
github.com/decred/dcrd/txscript v1.0.1 h1:IMgxZFCw3AyG4EbKwywE3SDNshOSHsoUK1Wk/5GqWJ0=
8286
github.com/decred/dcrd/txscript v1.0.1/go.mod h1:FqUX07Y+u3cJ1eIGPoyWbJg+Wk1NTllln/TyDpx9KnY=
8387
github.com/decred/dcrd/txscript/v2 v2.0.0/go.mod h1:WStcyYYJa+PHJB4XjrLDRzV96/Z4thtsu8mZoVrU6C0=
8488
github.com/decred/dcrd/txscript/v2 v2.1.0 h1:IKIpNm0lPmNQoaZ2zxZm1qMwfmLb/XXeahxXlfc+MrA=

sync.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,12 @@ func (wallet *Wallet) IsSyncing() bool {
309309
return wallet.syncing
310310
}
311311

312+
func (mw *MultiWallet) IsConnectedToDecredNetwork() bool {
313+
mw.syncData.mu.RLock()
314+
defer mw.syncData.mu.RUnlock()
315+
return mw.syncData.syncing || mw.syncData.synced
316+
}
317+
312318
func (mw *MultiWallet) IsSynced() bool {
313319
mw.syncData.mu.RLock()
314320
defer mw.syncData.mu.RUnlock()

txandblocknotifications.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ func (mw *MultiWallet) listenForTransactions(walletID int) {
6262
}
6363

6464
func (mw *MultiWallet) AddTxAndBlockNotificationListener(txAndBlockNotificationListener TxAndBlockNotificationListener, uniqueIdentifier string) error {
65+
mw.notificationListenersMu.Lock()
66+
defer mw.notificationListenersMu.Unlock()
67+
6568
_, ok := mw.txAndBlockNotificationListeners[uniqueIdentifier]
6669
if ok {
6770
return errors.New(ErrListenerAlreadyExist)
@@ -73,22 +76,34 @@ func (mw *MultiWallet) AddTxAndBlockNotificationListener(txAndBlockNotificationL
7376
}
7477

7578
func (mw *MultiWallet) RemoveTxAndBlockNotificationListener(uniqueIdentifier string) {
79+
mw.notificationListenersMu.Lock()
80+
defer mw.notificationListenersMu.Unlock()
81+
7682
delete(mw.txAndBlockNotificationListeners, uniqueIdentifier)
7783
}
7884

7985
func (mw *MultiWallet) mempoolTransactionNotification(transaction string) {
86+
mw.notificationListenersMu.RLock()
87+
defer mw.notificationListenersMu.RUnlock()
88+
8089
for _, txAndBlockNotifcationListener := range mw.txAndBlockNotificationListeners {
8190
txAndBlockNotifcationListener.OnTransaction(transaction)
8291
}
8392
}
8493

8594
func (mw *MultiWallet) publishTransactionConfirmed(walletID int, transactionHash string, blockHeight int32) {
95+
mw.notificationListenersMu.RLock()
96+
defer mw.notificationListenersMu.RUnlock()
97+
8698
for _, txAndBlockNotifcationListener := range mw.txAndBlockNotificationListeners {
8799
txAndBlockNotifcationListener.OnTransactionConfirmed(walletID, transactionHash, blockHeight)
88100
}
89101
}
90102

91103
func (mw *MultiWallet) publishBlockAttached(walletID int, blockHeight int32) {
104+
mw.notificationListenersMu.RLock()
105+
defer mw.notificationListenersMu.RUnlock()
106+
92107
for _, txAndBlockNotifcationListener := range mw.txAndBlockNotificationListeners {
93108
txAndBlockNotifcationListener.OnBlockAttached(walletID, blockHeight)
94109
}

0 commit comments

Comments
 (0)