// BUGS: // - MinimumRecentTransactions is ignored. // - Wrong error codes when a block height or hash is not recognized func (s *walletServer) GetTransactions(ctx context.Context, req *pb.GetTransactionsRequest) ( resp *pb.GetTransactionsResponse, err error) { var startBlock, endBlock *wallet.BlockIdentifier if req.StartingBlockHash != nil && req.StartingBlockHeight != 0 { return nil, errors.New( "starting block hash and height may not be specified simultaneously") } else if req.StartingBlockHash != nil { startBlockHash, err := wire.NewShaHash(req.StartingBlockHash) if err != nil { return nil, grpc.Errorf(codes.InvalidArgument, "%s", err.Error()) } startBlock = wallet.NewBlockIdentifierFromHash(startBlockHash) } else if req.StartingBlockHeight != 0 { startBlock = wallet.NewBlockIdentifierFromHeight(req.StartingBlockHeight) } if req.EndingBlockHash != nil && req.EndingBlockHeight != 0 { return nil, grpc.Errorf(codes.InvalidArgument, "ending block hash and height may not be specified simultaneously") } else if req.EndingBlockHash != nil { endBlockHash, err := wire.NewShaHash(req.EndingBlockHash) if err != nil { return nil, grpc.Errorf(codes.InvalidArgument, "%s", err.Error()) } endBlock = wallet.NewBlockIdentifierFromHash(endBlockHash) } else if req.EndingBlockHeight != 0 { endBlock = wallet.NewBlockIdentifierFromHeight(req.EndingBlockHeight) } var minRecentTxs int if req.MinimumRecentTransactions != 0 { if endBlock != nil { return nil, grpc.Errorf(codes.InvalidArgument, "ending block and minimum number of recent transactions "+ "may not be specified simultaneously") } minRecentTxs = int(req.MinimumRecentTransactions) if minRecentTxs < 0 { return nil, grpc.Errorf(codes.InvalidArgument, "minimum number of recent transactions may not be negative") } } _ = minRecentTxs gtr, err := s.wallet.GetTransactions(startBlock, endBlock, ctx.Done()) if err != nil { return nil, translateError(err) } return marshalGetTransactionsResult(gtr) }
// ListTransactionDetails returns a list of all transactions which are // relevant to the wallet. // // This is a part of the WalletController interface. func (b *BtcWallet) ListTransactionDetails() ([]*lnwallet.TransactionDetail, error) { // Grab the best block the wallet knows of, we'll use this to calculate // # of confirmations shortly below. bestBlock := b.wallet.Manager.SyncedTo() currentHeight := bestBlock.Height // TODO(roasbeef): can replace with start "wallet birthday" start := base.NewBlockIdentifierFromHeight(0) stop := base.NewBlockIdentifierFromHeight(bestBlock.Height) txns, err := b.wallet.GetTransactions(start, stop, nil) if err != nil { return nil, err } txDetails := make([]*lnwallet.TransactionDetail, 0, len(txns.MinedTransactions)+len(txns.UnminedTransactions)) // For both confirmed and unconfirme dtransactions, create a // TransactionDetail which re-packages the data returned by the base // wallet. for _, blockPackage := range txns.MinedTransactions { details, err := minedTransactionsToDetails(currentHeight, blockPackage) if err != nil { return nil, err } txDetails = append(txDetails, details...) } for _, tx := range txns.UnminedTransactions { detail, err := unminedTransactionsToDetail(tx) if err != nil { return nil, err } txDetails = append(txDetails, detail) } return txDetails, nil }