Merge pull request #2872 from lbryio/claim_list_include_received_tips

added `--include_received_tips` to `claim_list` and `txo_list` commands
This commit is contained in:
Lex Berezhny 2020-03-22 18:00:35 -04:00 committed by GitHub
commit 285483b81a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 5 deletions

View file

@ -2194,7 +2194,7 @@ class Daemon(metaclass=JSONRPCServerType):
claim_list [--claim_type=<claim_type>...] [--claim_id=<claim_id>...] [--name=<name>...] claim_list [--claim_type=<claim_type>...] [--claim_id=<claim_id>...] [--name=<name>...]
[--channel_id=<channel_id>...] [--account_id=<account_id>] [--wallet_id=<wallet_id>] [--channel_id=<channel_id>...] [--account_id=<account_id>] [--wallet_id=<wallet_id>]
[--page=<page>] [--page_size=<page_size>] [--page=<page>] [--page_size=<page_size>]
[--resolve] [--order_by=<order_by>] [--no_totals] [--resolve] [--order_by=<order_by>] [--no_totals] [--include_received_tips]
Options: Options:
--claim_type=<claim_type> : (str or list) claim type: channel, stream, repost, collection --claim_type=<claim_type> : (str or list) claim type: channel, stream, repost, collection
@ -2209,6 +2209,7 @@ class Daemon(metaclass=JSONRPCServerType):
--order_by=<order_by> : (str) field to order by: 'name', 'height', 'amount' --order_by=<order_by> : (str) field to order by: 'name', 'height', 'amount'
--no_totals : (bool) do not calculate the total number of pages and items in result set --no_totals : (bool) do not calculate the total number of pages and items in result set
(significant performance boost) (significant performance boost)
--include_received_tips : (bool) calculate the amount of tips recieved for claim outputs
Returns: {Paginated[Output]} Returns: {Paginated[Output]}
""" """
@ -4170,7 +4171,7 @@ class Daemon(metaclass=JSONRPCServerType):
@requires(WALLET_COMPONENT) @requires(WALLET_COMPONENT)
def jsonrpc_txo_list( def jsonrpc_txo_list(
self, account_id=None, wallet_id=None, page=None, page_size=None, self, account_id=None, wallet_id=None, page=None, page_size=None,
resolve=False, order_by=None, no_totals=False, **kwargs): resolve=False, order_by=None, no_totals=False, include_received_tips=False, **kwargs):
""" """
List my transaction outputs. List my transaction outputs.
@ -4180,7 +4181,7 @@ class Daemon(metaclass=JSONRPCServerType):
[--is_my_input_or_output | [--is_my_input_or_output |
[[--is_my_output | --is_not_my_output] [--is_my_input | --is_not_my_input]] [[--is_my_output | --is_not_my_output] [--is_my_input | --is_not_my_input]]
] ]
[--exclude_internal_transfers] [--exclude_internal_transfers] [--include_received_tips]
[--wallet_id=<wallet_id>] [--page=<page>] [--page_size=<page_size>] [--wallet_id=<wallet_id>] [--page=<page>] [--page_size=<page_size>]
[--resolve] [--order_by=<order_by>][--no_totals] [--resolve] [--order_by=<order_by>][--no_totals]
@ -4203,6 +4204,7 @@ class Daemon(metaclass=JSONRPCServerType):
"--is_my_input --is_my_output --type=other" "--is_my_input --is_my_output --type=other"
this allows to exclude "change" payments, this this allows to exclude "change" payments, this
flag can be used in combination with any of the other flags flag can be used in combination with any of the other flags
--include_received_tips : (bool) calculate the amount of tips recieved for claim outputs
--account_id=<account_id> : (str) id of the account to query --account_id=<account_id> : (str) id of the account to query
--wallet_id=<wallet_id> : (str) restrict results to specific wallet --wallet_id=<wallet_id> : (str) restrict results to specific wallet
--page=<page> : (int) page to return during paginating --page=<page> : (int) page to return during paginating
@ -4227,6 +4229,7 @@ class Daemon(metaclass=JSONRPCServerType):
'include_is_spent': True, 'include_is_spent': True,
'include_is_my_input': True, 'include_is_my_input': True,
'include_is_my_output': True, 'include_is_my_output': True,
'include_received_tips': include_received_tips
} }
if order_by is not None: if order_by is not None:
if order_by == 'name': if order_by == 'name':

View file

@ -750,6 +750,7 @@ class Database(SQLiteMixin):
include_is_spent = constraints.get('include_is_spent', False) include_is_spent = constraints.get('include_is_spent', False)
include_is_my_input = constraints.get('include_is_my_input', False) include_is_my_input = constraints.get('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)
include_received_tips = constraints.pop('include_received_tips', False)
select_columns = [ select_columns = [
"tx.txid, raw, tx.height, tx.position as tx_position, tx.is_verified, " "tx.txid, raw, tx.height, tx.position as tx_position, tx.is_verified, "
@ -777,12 +778,20 @@ class Database(SQLiteMixin):
select_columns.append(f"""( select_columns.append(f"""(
txi.address IS NOT NULL AND txi.address IS NOT NULL AND
txi.address IN (SELECT address FROM account_address WHERE {my_accounts_sql}) txi.address IN (SELECT address FROM account_address WHERE {my_accounts_sql})
) AS is_my_input ) AS is_my_input""")
""")
if include_is_spent: if include_is_spent:
select_columns.append("spent.txoid IS NOT NULL AS is_spent") select_columns.append("spent.txoid IS NOT NULL AS is_spent")
if include_received_tips:
select_columns.append(f"""(
SELECT COALESCE(SUM(support.amount), 0) FROM txo AS support WHERE
support.claim_id = txo.claim_id AND
support.txo_type = {TXO_TYPES['support']} AND
support.address IN (SELECT address FROM account_address WHERE {my_accounts_sql}) AND
support.txoid NOT IN (SELECT txoid FROM txi)
) AS received_tips""")
if 'order_by' not in constraints or constraints['order_by'] == 'height': if 'order_by' not in constraints or constraints['order_by'] == 'height':
constraints['order_by'] = [ constraints['order_by'] = [
"tx.height=0 DESC", "tx.height DESC", "tx.position DESC", "txo.position" "tx.height=0 DESC", "tx.height DESC", "tx.position DESC", "txo.position"
@ -820,6 +829,8 @@ class Database(SQLiteMixin):
txo.is_internal_transfer = True txo.is_internal_transfer = True
else: else:
txo.is_internal_transfer = False txo.is_internal_transfer = False
if include_received_tips:
txo.received_tips = row['received_tips']
txos.append(txo) txos.append(txo)
channel_ids = set() channel_ids = set()
@ -854,6 +865,7 @@ class Database(SQLiteMixin):
def _clean_txo_constraints_for_aggregation(self, unspent, constraints): def _clean_txo_constraints_for_aggregation(self, unspent, constraints):
constraints.pop('include_is_my_input', None) constraints.pop('include_is_my_input', None)
constraints.pop('include_is_my_output', None) constraints.pop('include_is_my_output', None)
constraints.pop('include_received_tips', None)
constraints.pop('wallet', None) constraints.pop('wallet', None)
constraints.pop('resolve', None) constraints.pop('resolve', None)
constraints.pop('offset', None) constraints.pop('offset', None)

View file

@ -690,6 +690,44 @@ class ClaimCommands(ClaimTestCase):
await self.assertClaimList([stream1_id, stream3_id, stream2_id], claim_type='stream', order_by='amount') await self.assertClaimList([stream1_id, stream3_id, stream2_id], claim_type='stream', order_by='amount')
await self.assertClaimList([stream3_id, stream2_id, stream1_id], claim_type='stream', order_by='height') await self.assertClaimList([stream3_id, stream2_id, stream1_id], claim_type='stream', order_by='height')
async def test_claim_list_with_tips(self):
wallet2 = await self.daemon.jsonrpc_wallet_create('wallet2', create_account=True)
address2 = await self.daemon.jsonrpc_address_unused(wallet_id=wallet2.id)
await self.wallet_send('5.0', address2)
stream1_id = self.get_claim_id(await self.stream_create('one'))
stream2_id = self.get_claim_id(await self.stream_create('two'))
claims = await self.claim_list()
self.assertNotIn('received_tips', claims[0])
self.assertNotIn('received_tips', claims[1])
claims = await self.claim_list(include_received_tips=True)
self.assertEqual('0.0', claims[0]['received_tips'])
self.assertEqual('0.0', claims[1]['received_tips'])
await self.support_create(stream1_id, '0.7', tip=True)
await self.support_create(stream1_id, '0.3', tip=True, wallet_id=wallet2.id)
await self.support_create(stream1_id, '0.2', tip=True, wallet_id=wallet2.id)
await self.support_create(stream2_id, '0.4', tip=True, wallet_id=wallet2.id)
await self.support_create(stream2_id, '0.5', tip=True, wallet_id=wallet2.id)
await self.support_create(stream2_id, '0.1', tip=True, wallet_id=wallet2.id)
claims = await self.claim_list(include_received_tips=True)
self.assertEqual('1.0', claims[0]['received_tips'])
self.assertEqual('1.2', claims[1]['received_tips'])
await self.support_abandon(stream1_id)
claims = await self.claim_list(include_received_tips=True)
self.assertEqual('1.0', claims[0]['received_tips'])
self.assertEqual('0.0', claims[1]['received_tips'])
await self.support_abandon(stream2_id)
claims = await self.claim_list(include_received_tips=True)
self.assertEqual('0.0', claims[0]['received_tips'])
self.assertEqual('0.0', claims[1]['received_tips'])
class ChannelCommands(CommandTestCase): class ChannelCommands(CommandTestCase):