diff --git a/account.go b/account.go index 017a1b4..0ab7344 100644 --- a/account.go +++ b/account.go @@ -24,6 +24,7 @@ import ( "github.com/conformal/btcutil" "github.com/conformal/btcwallet/tx" "github.com/conformal/btcwallet/wallet" + "github.com/conformal/btcwire" "path/filepath" "sync" ) @@ -391,11 +392,8 @@ func (a *Account) ImportPrivateKey(pk []byte, compressed bool, log.Infof("Beginning rescan (height %d) for address %s", bs.Height, addrStr) - rescanAddrs := map[string]struct{}{ - addrStr: struct{}{}, - } jsonErr := Rescan(CurrentServerConn(), bs.Height, - rescanAddrs) + []string{addrStr}, nil) if jsonErr != nil { log.Errorf("Rescan for imported address %s failed: %v", addrStr, jsonErr.Message) @@ -522,7 +520,17 @@ func (a *Account) RescanActiveAddresses() { height, a.name) // Rescan active addresses starting at the determined block height. - Rescan(CurrentServerConn(), height, a.ActivePaymentAddresses()) + addrs := a.SortedActiveAddresses() + addrStrs := make([]string, 0, len(addrs)) + for i := range addrs { + addrStrs = append(addrStrs, addrs[i].Address().EncodeAddress()) + } + unspentRecvTxOuts := a.TxStore.UnspentOutputs() + unspentOutPoints := make([]*btcwire.OutPoint, 0, len(unspentRecvTxOuts)) + for _, record := range unspentRecvTxOuts { + unspentOutPoints = append(unspentOutPoints, record.OutPoint()) + } + Rescan(CurrentServerConn(), height, addrStrs, unspentOutPoints) a.MarkAllSynced() AcctMgr.ds.FlushAccount(a) @@ -644,19 +652,20 @@ func (a *Account) RecoverAddresses(n int) error { if err != nil { return err } + addrStrs := make([]string, 0, len(addrs)) + for i := range addrs { + addrStrs = append(addrStrs, addrs[i].EncodeAddress()) + } // Run a goroutine to rescan blockchain for recovered addresses. - m := make(map[string]struct{}) - for i := range addrs { - m[addrs[i].EncodeAddress()] = struct{}{} - } - go func(addrs map[string]struct{}) { - jsonErr := Rescan(CurrentServerConn(), lastInfo.FirstBlock(), addrs) + go func(addrs []string) { + jsonErr := Rescan(CurrentServerConn(), lastInfo.FirstBlock(), + addrs, nil) if jsonErr != nil { log.Errorf("Rescanning for recovered addresses failed: %v", jsonErr.Message) } - }(m) + }(addrStrs) return nil } diff --git a/rpcclient.go b/rpcclient.go index a00e743..e4f1944 100644 --- a/rpcclient.go +++ b/rpcclient.go @@ -366,9 +366,11 @@ func NotifySpent(rpc ServerConn, op *btcwire.OutPoint) *btcjson.Error { // Rescan requests a blockchain rescan for transactions to any number of // addresses and notifications to inform wallet about such transactions. -func Rescan(rpc ServerConn, beginBlock int32, addrs map[string]struct{}) *btcjson.Error { +func Rescan(rpc ServerConn, beginBlock int32, addrs []string, + outpoints []*btcwire.OutPoint) *btcjson.Error { + // NewRescanCmd cannot fail with no optargs, so omit the check. - cmd, _ := btcws.NewRescanCmd(<-NewJSONID, beginBlock, addrs) + cmd, _ := btcws.NewRescanCmd(<-NewJSONID, beginBlock, addrs, outpoints) request := NewServerRequest(cmd, nil) response := <-rpc.SendRequest(request) return response.Error()