github.com/decred/dcrlnd@v0.7.6/lnwallet/dcrwallet/extended_wallet.go (about)

     1  package dcrwallet
     2  
     3  import (
     4  	"context"
     5  
     6  	"decred.org/dcrwallet/v4/errors"
     7  	walleterr "decred.org/dcrwallet/v4/errors"
     8  	base "decred.org/dcrwallet/v4/wallet"
     9  	"github.com/decred/dcrd/chaincfg/chainhash"
    10  	"github.com/decred/dcrd/dcrec/secp256k1/v4"
    11  	"github.com/decred/dcrd/dcrutil/v4"
    12  	"github.com/decred/dcrd/txscript/v4/stdaddr"
    13  	"github.com/decred/dcrlnd/lnwallet"
    14  )
    15  
    16  var _ lnwallet.ExtendedWalletController = (*DcrWallet)(nil)
    17  
    18  func (b *DcrWallet) DeriveNextAccount(name string) error {
    19  	nb, err := b.wallet.NextAccount(context.Background(), name)
    20  	if err == nil {
    21  		dcrwLog.Infof("Created account %q (%d)", name, nb)
    22  	}
    23  	return err
    24  }
    25  
    26  func (b *DcrWallet) ExportPrivKey(addr stdaddr.Address) (*secp256k1.PrivateKey, error) {
    27  	str, err := b.wallet.DumpWIFPrivateKey(context.Background(), addr)
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  	wif, err := dcrutil.DecodeWIF(str, b.cfg.NetParams.PrivateKeyID)
    32  	pk := secp256k1.PrivKeyFromBytes(wif.PrivKey())
    33  	return pk, err
    34  }
    35  
    36  func (b *DcrWallet) RescanWallet(startHeight int32, progress func(height int32) error) error {
    37  	nb, err := b.wallet.NetworkBackend()
    38  	if err != nil {
    39  		return err
    40  	}
    41  
    42  	// Stop rescan if we exit early.
    43  	ctx, cancel := context.WithCancel(b.ctx)
    44  	defer cancel()
    45  	done := make(chan struct{})
    46  
    47  	// Start rescan.
    48  	p := make(chan base.RescanProgress)
    49  	go func() {
    50  		b.wallet.RescanProgressFromHeight(ctx, nb, startHeight, p)
    51  		close(done)
    52  	}()
    53  
    54  	// Progress through rescan.
    55  	for {
    56  		select {
    57  		case progr := <-p:
    58  			if progr.Err == nil && progress != nil {
    59  				err := progress(progr.ScannedThrough)
    60  				if err != nil {
    61  					return err
    62  				}
    63  			}
    64  			if progr.Err != nil {
    65  				return progr.Err
    66  			}
    67  
    68  		case <-done:
    69  			return nil
    70  		}
    71  	}
    72  }
    73  
    74  func (b *DcrWallet) GetWalletTransaction(txh chainhash.Hash) (*lnwallet.WalletTransaction, error) {
    75  	txs, confs, bh, err := b.wallet.TransactionSummary(context.Background(), &txh)
    76  	if errors.Is(err, walleterr.NotExist) {
    77  		return nil, lnwallet.ErrWalletTxNotExist
    78  	}
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	res := &lnwallet.WalletTransaction{
    84  		RawTx:         txs.Transaction,
    85  		Confirmations: confs,
    86  		BlockHash:     bh,
    87  	}
    88  	return res, nil
    89  }