diff --git a/lbrynet/extras/daemon/Daemon.py b/lbrynet/extras/daemon/Daemon.py index 22cf30c77..6326702a8 100644 --- a/lbrynet/extras/daemon/Daemon.py +++ b/lbrynet/extras/daemon/Daemon.py @@ -2609,8 +2609,16 @@ class Daemon(metaclass=JSONRPCServerType): elif old_txo.claim.is_signed and not clear_channel and not replace: channel = old_txo.channel - if 'fee_amount' in kwargs: - kwargs['fee_address'] = self.get_fee_address(kwargs, old_txo.claim.stream.fee.address or claim_address) + fee_address = self.get_fee_address(kwargs, old_txo.claim.stream.fee.address or claim_address) + if fee_address: + kwargs['fee_address'] = fee_address + kwargs['fee_currency'] = kwargs.get('fee_currency', old_txo.claim.stream.fee.currency if not replace else None) + kwargs['fee_amount'] = kwargs.get('fee_amount', old_txo.claim.stream.fee.amount if not replace else None) + valid_currency = kwargs['fee_currency'] if kwargs['fee_currency'] != 'UNKNOWN_CURRENCY' else None + if kwargs.get('fee_amount') and not valid_currency: + raise Exception('In order to set a fee amount, please specify a fee currency') + if valid_currency and not kwargs.get('fee_amount'): + raise Exception('In order to set a fee currency, please specify a fee amount') if replace: claim = Claim() diff --git a/lbrynet/schema/claim.py b/lbrynet/schema/claim.py index 9fa304f37..ff47a19c7 100644 --- a/lbrynet/schema/claim.py +++ b/lbrynet/schema/claim.py @@ -206,6 +206,8 @@ class Stream(BaseClaim): def update(self, file_path=None, height=None, width=None, duration=None, **kwargs): if kwargs.pop('clear_fee', False): + # clear_fee is set, ignore defaults + kwargs.pop('fee_address', None), kwargs.pop('fee_currency', None), kwargs.pop('fee_amount', None) self.message.ClearField('fee') else: self.fee.update( diff --git a/tests/integration/test_claim_commands.py b/tests/integration/test_claim_commands.py index b19f6e3d4..96ec7d3a1 100644 --- a/tests/integration/test_claim_commands.py +++ b/tests/integration/test_claim_commands.py @@ -2,6 +2,7 @@ import os.path import tempfile import logging from binascii import unhexlify +from copy import deepcopy from urllib.request import urlopen @@ -705,6 +706,39 @@ class StreamCommands(ClaimTestCase): fixed_values['locations'] = [{'country': 'BR'}] self.assertEqual(txo['value'], fixed_values) + # fee tests, replacing all (--replace) + fee_address = values['fee_address'] + with self.assertRaises(Exception, msg='In order to set a fee amount, please specify a fee currency'): + await self.stream_update(claim_id, fee_amount='0.1', replace=True, preview=True, confirm=False) + with self.assertRaises(Exception, msg='In order to set a fee currency, please specify a fee amount'): + await self.stream_update( + claim_id, fee_currency='usd', replace=True, preview=True, confirm=False, claim_address=fee_address + ) + tx = await self.stream_update( + claim_id, fee_amount='0.1', fee_currency='usd', replace=True, preview=True, confirm=False + ) + self.assertEqual( + tx['outputs'][0]['value']['fee'], + {'address': fee_address, 'currency': 'USD', 'amount': '0.1'} + ) + tx = await self.stream_update(claim_id, replace=True, preview=True, confirm=False) + self.assertNotIn('fee', tx['outputs'][0]['value']) + tx = await self.stream_update(claim_id, fee_address=fee_address, replace=True, preview=True, confirm=False) + self.assertEqual(tx['outputs'][0]['value']['fee'], {'address': fee_address}) + # fee tests, but now replacing a single field (default) + tx = await self.stream_update(claim_id, fee_address=txo['address'], preview=True, confirm=False) + expected_value = deepcopy(fixed_values) + expected_value['fee']['address'] = txo['address'] + self.assertEqual(tx['outputs'][0]['value'], expected_value) + tx = await self.stream_update(claim_id, fee_amount='42', preview=True, confirm=False) + expected_value['fee']['amount'] = '42' + expected_value['fee']['address'] = fixed_values['fee']['address'] + self.assertEqual(tx['outputs'][0]['value'], expected_value) + tx = await self.stream_update(claim_id, fee_currency='lbc', preview=True, confirm=False) + expected_value['fee']['currency'] = 'LBC' + expected_value['fee']['amount'] = fixed_values['fee']['amount'] + self.assertEqual(tx['outputs'][0]['value'], expected_value) + # clearing fee tx = await self.out(self.stream_update(claim_id, clear_fee=True)) txo = tx['outputs'][0] diff --git a/tests/integration/test_file_commands.py b/tests/integration/test_file_commands.py index 26a6c89db..d1b0da87e 100644 --- a/tests/integration/test_file_commands.py +++ b/tests/integration/test_file_commands.py @@ -278,8 +278,9 @@ class FileCommands(CommandTestCase): self.assertEqual(response['content_fee']['outputs'][0]['address'], target_address) async def __raw_value_update_no_fee_address(self, tx, claim_address, **kwargs): - tx = await self.daemon.jsonrpc_stream_update(tx['outputs'][0]['claim_id'], fee_amount='0.1', preview=True, claim_address=claim_address) - tx.outputs[0].claim.stream.update(**kwargs) + tx = await self.daemon.jsonrpc_stream_update( + tx['outputs'][0]['claim_id'], preview=True, claim_address=claim_address, **kwargs + ) tx.outputs[0].claim.stream.fee.address_bytes = b'' tx.outputs[0].script.generate() await tx.sign([self.account])