github.com/avahowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/modules/wallet/transactions.go (about)

     1  package wallet
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/NebulousLabs/Sia/modules"
     7  	"github.com/NebulousLabs/Sia/types"
     8  )
     9  
    10  var (
    11  	errOutOfBounds      = errors.New("requesting transactions at unknown confirmation heights")
    12  	errNoHistoryForAddr = errors.New("no history found for provided address")
    13  )
    14  
    15  // AddressTransactions returns all of the wallet transactions associated with a
    16  // single unlock hash.
    17  func (w *Wallet) AddressTransactions(uh types.UnlockHash) (pts []modules.ProcessedTransaction) {
    18  	w.mu.Lock()
    19  	defer w.mu.Unlock()
    20  
    21  	for _, pt := range w.processedTransactions {
    22  		relevant := false
    23  		for _, input := range pt.Inputs {
    24  			if input.RelatedAddress == uh {
    25  				relevant = true
    26  				break
    27  			}
    28  		}
    29  		for _, output := range pt.Outputs {
    30  			if output.RelatedAddress == uh {
    31  				relevant = true
    32  				break
    33  			}
    34  		}
    35  		if relevant {
    36  			pts = append(pts, pt)
    37  		}
    38  	}
    39  	return pts
    40  }
    41  
    42  // AddressUnconfirmedHistory returns all of the unconfirmed wallet transactions
    43  // related to a specific address.
    44  func (w *Wallet) AddressUnconfirmedTransactions(uh types.UnlockHash) (pts []modules.ProcessedTransaction) {
    45  	w.mu.Lock()
    46  	defer w.mu.Unlock()
    47  
    48  	// Scan the full list of unconfirmed transactions to see if there are any
    49  	// related transactions.
    50  	for _, pt := range w.unconfirmedProcessedTransactions {
    51  		relevant := false
    52  		for _, input := range pt.Inputs {
    53  			if input.RelatedAddress == uh {
    54  				relevant = true
    55  				break
    56  			}
    57  		}
    58  		for _, output := range pt.Outputs {
    59  			if output.RelatedAddress == uh {
    60  				relevant = true
    61  				break
    62  			}
    63  		}
    64  		if relevant {
    65  			pts = append(pts, pt)
    66  		}
    67  	}
    68  	return pts
    69  }
    70  
    71  // Transaction returns the transaction with the given id. 'False' is returned
    72  // if the transaction does not exist.
    73  func (w *Wallet) Transaction(txid types.TransactionID) (modules.ProcessedTransaction, bool) {
    74  	w.mu.Lock()
    75  	defer w.mu.Unlock()
    76  	pt, exists := w.processedTransactionMap[txid]
    77  	if !exists {
    78  		return modules.ProcessedTransaction{}, exists
    79  	}
    80  	return *pt, exists
    81  }
    82  
    83  // Transactions returns all transactions relevant to the wallet that were
    84  // confirmed in the range [startHeight, endHeight].
    85  func (w *Wallet) Transactions(startHeight, endHeight types.BlockHeight) (pts []modules.ProcessedTransaction, err error) {
    86  	w.mu.Lock()
    87  	defer w.mu.Unlock()
    88  
    89  	if startHeight > w.consensusSetHeight || startHeight > endHeight {
    90  		return nil, errOutOfBounds
    91  	}
    92  	if len(w.processedTransactions) == 0 {
    93  		return nil, nil
    94  	}
    95  
    96  	for _, pt := range w.processedTransactions {
    97  		if pt.ConfirmationHeight > endHeight {
    98  			break
    99  		}
   100  		if pt.ConfirmationHeight >= startHeight {
   101  			pts = append(pts, pt)
   102  		}
   103  	}
   104  	return pts, nil
   105  }
   106  
   107  // UnconfirmedTransactions returns the set of unconfirmed transactions that are
   108  // relevant to the wallet.
   109  func (w *Wallet) UnconfirmedTransactions() []modules.ProcessedTransaction {
   110  	w.mu.Lock()
   111  	defer w.mu.Unlock()
   112  	return w.unconfirmedProcessedTransactions
   113  }