transaction list

This commit is contained in:
Lex Berezhny 2020-11-13 10:45:59 -05:00
parent 1e4613fd8a
commit e6a9417988
4 changed files with 22 additions and 34 deletions

View file

@ -243,24 +243,15 @@ def get_raw_transactions(tx_hashes):
) )
def get_transactions(**constraints) -> Tuple[List[Transaction], Optional[int]]: def get_transactions(include_total=False, **constraints) -> Tuple[List[Transaction], Optional[int]]:
txs = [] account_ids = constraints.pop('account_ids', None)
sql = select(TX.c.raw, TX.c.height, TX.c.position).select_from(TX)
rows = context().fetchall(query([TX], sql, **constraints))
for row in rows:
txs.append(Transaction(row['raw'], height=row['height'], position=row['position']))
return txs, 0
def _get_transactions(
wallet=None, include_total=False, **constraints
) -> Tuple[List[Transaction], Optional[int]]:
include_is_my_input = constraints.pop('include_is_my_input', False) include_is_my_input = constraints.pop('include_is_my_input', False)
include_is_my_output = constraints.pop('include_is_my_output', False) include_is_my_output = constraints.pop('include_is_my_output', False)
tx_rows = select_transactions( tx_rows = select_transactions(
[TX.c.tx_hash, TX.c.raw, TX.c.height, TX.c.position, TX.c.is_verified], [TX.c.tx_hash, TX.c.raw, TX.c.height, TX.c.position, TX.c.timestamp, TX.c.is_verified],
order_by=constraints.pop('order_by', ["height=0 DESC", "height DESC", "position DESC"]), order_by=constraints.pop('order_by', ["height=0 DESC", "height DESC", "position DESC"]),
account_ids=account_ids,
**constraints **constraints
) )
@ -269,7 +260,7 @@ def _get_transactions(
txids.append(row['tx_hash']) txids.append(row['tx_hash'])
txs.append(Transaction( txs.append(Transaction(
raw=row['raw'], height=row['height'], position=row['position'], raw=row['raw'], height=row['height'], position=row['position'],
is_verified=bool(row['is_verified']) timestamp=row['timestamp'], is_verified=bool(row['is_verified'])
)) ))
for txi in txs[-1].inputs: for txi in txs[-1].inputs:
txi_txoids.append(txi.txo_ref.hash) txi_txoids.append(txi.txo_ref.hash)
@ -279,7 +270,7 @@ def _get_transactions(
annotated_txos.update({ annotated_txos.update({
txo.id: txo for txo in txo.id: txo for txo in
get_txos( get_txos(
wallet=wallet, wallet_account_ids=account_ids,
tx_hash__in=txids[offset:offset + MAX_QUERY_VARIABLES], order_by='txo.tx_hash', tx_hash__in=txids[offset:offset + MAX_QUERY_VARIABLES], order_by='txo.tx_hash',
include_is_my_input=include_is_my_input, include_is_my_input=include_is_my_input,
include_is_my_output=include_is_my_output, include_is_my_output=include_is_my_output,
@ -291,7 +282,7 @@ def _get_transactions(
referenced_txos.update({ referenced_txos.update({
txo.id: txo for txo in txo.id: txo for txo in
get_txos( get_txos(
wallet=wallet, wallet_account_ids=account_ids,
txo_hash__in=txi_txoids[offset:offset + MAX_QUERY_VARIABLES], order_by='txo.txo_hash', txo_hash__in=txi_txoids[offset:offset + MAX_QUERY_VARIABLES], order_by='txo.txo_hash',
include_is_my_output=include_is_my_output, include_is_my_output=include_is_my_output,
)[0] )[0]

View file

@ -2644,13 +2644,11 @@ class API:
""" """
wallet = self.wallets.get_or_default(wallet_id) wallet = self.wallets.get_or_default(wallet_id)
if account_id: return await Paginated.from_getter(
account = wallet.get_account_or_error(account_id) wallet.list_transactions,
transactions = account.get_transaction_history accounts=wallet.accounts.get_or_all(account_id),
else: **pagination_kwargs
transactions = partial( )
self.ledger.get_transaction_history, wallet=wallet, accounts=wallet.accounts)
return await paginate_rows(transactions, page, page_size)
async def transaction_search( async def transaction_search(
self, self,

View file

@ -262,7 +262,7 @@ class Wallet:
async def list_transactions(self, **constraints): async def list_transactions(self, **constraints):
return txs_to_dict(await self.db.get_transactions( return txs_to_dict(await self.db.get_transactions(
include_is_my_output=True, **constraints include_is_my_output=True, **constraints
), self.ledger) ), self.ledger, await self.db.get_best_block_height())
async def create_transaction( async def create_transaction(
self, inputs: Iterable[Input], outputs: Iterable[Output], self, inputs: Iterable[Input], outputs: Iterable[Output],
@ -870,15 +870,14 @@ class PurchaseListManager(BaseListManager):
raise NotImplementedError raise NotImplementedError
def txs_to_dict(txs, ledger): def txs_to_dict(txs, ledger, tip_height):
history = [] history = []
for tx in txs: # pylint: disable=too-many-nested-blocks for tx in txs: # pylint: disable=too-many-nested-blocks
ts = ledger.headers.estimated_timestamp(tx.height)
item = { item = {
'txid': tx.id, 'txid': tx.id,
'timestamp': ts, 'timestamp': tx.timestamp,
'date': datetime.fromtimestamp(ts).isoformat(' ')[:-3] if tx.height > 0 else None, 'date': datetime.fromtimestamp(tx.timestamp).isoformat(' ')[:-3] if tx.height > 0 else None,
'confirmations': (ledger.headers.height + 1) - tx.height if tx.height > 0 else 0, 'confirmations': (tip_height + 1) - tx.height if tx.height > 0 else 0,
'claim_info': [], 'claim_info': [],
'update_info': [], 'update_info': [],
'support_info': [], 'support_info': [],
@ -976,4 +975,5 @@ def txs_to_dict(txs, ledger):
'is_spent': txo.is_spent, 'is_spent': txo.is_spent,
}) })
history.append(item) history.append(item)
return history txs.rows = history
return txs

View file

@ -122,8 +122,7 @@ class AccountManagement(CommandTestCase):
self.assertEqual([support2['txid']], [txo['txid'] for txo in await self.support_list(account_id=account2)]) self.assertEqual([support2['txid']], [txo['txid'] for txo in await self.support_list(account_id=account2)])
history = await self.transaction_list() history = await self.transaction_list()
self.assertItemCount(history, 8) self.assertEqual(len(history), 8)
history = history['items']
self.assertEqual(extract(history[0]['support_info'][0], ['claim_name', 'is_tip', 'amount', 'balance_delta']), { self.assertEqual(extract(history[0]['support_info'][0], ['claim_name', 'is_tip', 'amount', 'balance_delta']), {
'claim_name': 'stream-in-account2', 'claim_name': 'stream-in-account2',
'is_tip': False, 'is_tip': False,
@ -160,7 +159,7 @@ class AccountManagement(CommandTestCase):
self.assertEqual(history[7]['value'], '10.0') self.assertEqual(history[7]['value'], '10.0')
async def test_address_validation(self): async def test_address_validation(self):
address = await self.daemon.jsonrpc_address_unused() address = await self.address_unused()
bad_address = address[0:20] + '9999999' + address[27:] bad_address = address[0:20] + '9999999' + address[27:]
with self.assertRaisesRegex(Exception, f"'{bad_address}' is not a valid address"): with self.assertRaisesRegex(Exception, f"'{bad_address}' is not a valid address"):
await self.daemon.jsonrpc_account_send('0.1', addresses=[bad_address]) await self.wallet_send('0.1', bad_address)