github.com/decred/dcrlnd@v0.7.6/chainntnfs/dcrwnotify/dcrw.go (about)

     1  package dcrwnotify
     2  
     3  import (
     4  	"context"
     5  
     6  	"decred.org/dcrwallet/v4/wallet"
     7  	"github.com/decred/dcrd/chaincfg/chainhash"
     8  	"github.com/decred/dcrd/chaincfg/v3"
     9  	"github.com/decred/dcrd/wire"
    10  	"github.com/decred/dcrlnd/blockcache"
    11  	"github.com/decred/dcrlnd/chainntnfs"
    12  	csnotify "github.com/decred/dcrlnd/chainntnfs/chainscannotify"
    13  	"github.com/decred/dcrlnd/chainscan/csdrivers"
    14  )
    15  
    16  type DcrwChainSource struct {
    17  	*csdrivers.DcrwalletCSDriver
    18  	w *wallet.Wallet
    19  }
    20  
    21  func (s *DcrwChainSource) GetBlockHash(ctx context.Context, height int32) (*chainhash.Hash, error) {
    22  	id := wallet.NewBlockIdentifierFromHeight(height)
    23  	b, err := s.w.BlockInfo(ctx, id)
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	return &b.Hash, err
    29  }
    30  
    31  func (s *DcrwChainSource) GetBlockHeader(ctx context.Context, hash *chainhash.Hash) (*wire.BlockHeader, error) {
    32  	id := wallet.NewBlockIdentifierFromHash(hash)
    33  	b, err := s.w.BlockInfo(ctx, id)
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  
    38  	var header wire.BlockHeader
    39  	err = header.FromBytes(b.Header)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  
    44  	return &header, err
    45  }
    46  
    47  func (s *DcrwChainSource) StoresReorgedHeaders() bool {
    48  	return true
    49  }
    50  
    51  func NewDcrwChainSource(w *wallet.Wallet, bCache *blockcache.BlockCache) *DcrwChainSource {
    52  	cs := csdrivers.NewDcrwalletCSDriver(w, bCache)
    53  	return &DcrwChainSource{
    54  		w:                 w,
    55  		DcrwalletCSDriver: cs,
    56  	}
    57  }
    58  
    59  var _ csnotify.ChainSource = (*DcrwChainSource)(nil)
    60  
    61  // New returns a new DcrdNotifier instance. This function assumes the dcrd node
    62  // detailed in the passed configuration is already running, and willing to
    63  // accept new websockets clients.
    64  func New(w *wallet.Wallet, chainParams *chaincfg.Params,
    65  	spendHintCache chainntnfs.SpendHintCache,
    66  	confirmHintCache chainntnfs.ConfirmHintCache,
    67  	bCache *blockcache.BlockCache) (*csnotify.ChainscanNotifier, error) {
    68  
    69  	src := NewDcrwChainSource(w, bCache)
    70  	return csnotify.New(src, chainParams, spendHintCache, confirmHintCache)
    71  }