diff --git a/lbry/extras/daemon/components.py b/lbry/extras/daemon/components.py index 55e2c30bd..fe045a6c2 100644 --- a/lbry/extras/daemon/components.py +++ b/lbry/extras/daemon/components.py @@ -21,6 +21,7 @@ from lbry.extras.daemon.component import Component from lbry.extras.daemon.exchange_rate_manager import ExchangeRateManager from lbry.extras.daemon.storage import SQLiteStorage from lbry.wallet import WalletManager +from lbry.wallet.usage_payment import WalletServerPayer log = logging.getLogger(__name__) @@ -29,6 +30,7 @@ log = logging.getLogger(__name__) DATABASE_COMPONENT = "database" BLOB_COMPONENT = "blob_manager" WALLET_COMPONENT = "wallet" +WALLET_SERVER_PAYMENTS_COMPONENT = "wallet_server_payments" DHT_COMPONENT = "dht" HASH_ANNOUNCER_COMPONENT = "hash_announcer" STREAM_MANAGER_COMPONENT = "stream_manager" @@ -154,13 +156,40 @@ class WalletComponent(Component): log.info("Starting wallet") self.wallet_manager = await WalletManager.from_lbrynet_config(self.conf) await self.wallet_manager.start() - self.wallet_manager.usage_payment_service.analytics_manager = self.component_manager.analytics_manager async def stop(self): await self.wallet_manager.stop() self.wallet_manager = None +class WalletServerPaymentsComponent(Component): + component_name = WALLET_SERVER_PAYMENTS_COMPONENT + depends_on = [WALLET_COMPONENT] + + def __init__(self, component_manager): + super().__init__(component_manager) + self.usage_payment_service = WalletServerPayer( + max_fee=self.conf.max_wallet_server_fee, analytics_manager=self.component_manager.analytics_manager, + ) + + @property + def component(self) -> typing.Optional[WalletServerPayer]: + return self.usage_payment_service + + async def start(self): + wallet_manager = self.component_manager.get_component(WALLET_COMPONENT) + await self.usage_payment_service.start(wallet_manager.ledger, wallet_manager.default_wallet) + + async def stop(self): + await self.usage_payment_service.stop() + + async def get_status(self): + return { + 'max_fee': self.usage_payment_service.max_fee, + 'running': self.usage_payment_service.running + } + + class BlobComponent(Component): component_name = BLOB_COMPONENT depends_on = [DATABASE_COMPONENT] diff --git a/lbry/wallet/manager.py b/lbry/wallet/manager.py index 5e374051c..6e8cc5db1 100644 --- a/lbry/wallet/manager.py +++ b/lbry/wallet/manager.py @@ -15,7 +15,6 @@ from .account import Account from .ledger import Ledger, LedgerRegistry from .transaction import Transaction, Output from .database import Database -from .usage_payment import WalletServerPayer from .wallet import Wallet, WalletStorage, ENCRYPT_ON_DISK from .rpc.jsonrpc import CodeMessageError @@ -34,7 +33,6 @@ class WalletManager: self.ledgers = ledgers or {} self.running = False self.config: Optional[Config] = None - self.usage_payment_service = WalletServerPayer() @classmethod def from_config(cls, config: dict) -> 'WalletManager': @@ -81,15 +79,11 @@ class WalletManager: await asyncio.gather(*( l.start() for l in self.ledgers.values() )) - await self.usage_payment_service.start( - self.ledger, self.default_wallet, self.config.max_wallet_server_fee if self.config else None - ) async def stop(self): await asyncio.gather(*( l.stop() for l in self.ledgers.values() )) - await self.usage_payment_service.stop() self.running = False def get_wallet_or_default(self, wallet_id: Optional[str]) -> Wallet: diff --git a/lbry/wallet/usage_payment.py b/lbry/wallet/usage_payment.py index b5f7130bf..167f10ed6 100644 --- a/lbry/wallet/usage_payment.py +++ b/lbry/wallet/usage_payment.py @@ -8,13 +8,13 @@ log = logging.getLogger(__name__) class WalletServerPayer: - def __init__(self, payment_period=24 * 60 * 60, max_fee='1.0'): + def __init__(self, payment_period=24 * 60 * 60, max_fee='1.0', analytics_manager=None): self.ledger = None self.wallet = None self.running = False self.task = None self.payment_period = payment_period - self.analytics_manager = None + self.analytics_manager = analytics_manager self.max_fee = max_fee async def pay(self): @@ -53,10 +53,9 @@ class WalletServerPayer: if self.analytics_manager: await self.analytics_manager.send_credits_sent() - async def start(self, ledger, default_wallet, max_fee=None): - self.max_fee = max_fee or self.max_fee + async def start(self, ledger=None, wallet=None): self.ledger = ledger - self.wallet = default_wallet + self.wallet = wallet self.running = True self.task = asyncio.ensure_future(self.pay()) self.task.add_done_callback(lambda _: log.info("Stopping wallet server payments.")) diff --git a/tests/integration/blockchain/test_wallet_server_sessions.py b/tests/integration/blockchain/test_wallet_server_sessions.py index 233cbd2b5..1dbb7735f 100644 --- a/tests/integration/blockchain/test_wallet_server_sessions.py +++ b/tests/integration/blockchain/test_wallet_server_sessions.py @@ -55,9 +55,10 @@ class TestSegwitServer(IntegrationTestCase): class TestUsagePayment(CommandTestCase): async def test_single_server_payment(self): - self.manager.usage_payment_service.payment_period = 1 - await self.manager.usage_payment_service.stop() - await self.manager.usage_payment_service.start(self.ledger, self.wallet) + wallet_pay_service = self.daemon.component_manager.get_component('wallet_server_payments') + wallet_pay_service.payment_period = 1 + await wallet_pay_service.stop() + await wallet_pay_service.start(ledger=self.ledger, wallet=self.wallet) address = (await self.account.receiving.get_addresses(limit=1, only_usable=True))[0] _, history = await self.ledger.get_local_status_and_history(address) diff --git a/tests/integration/other/test_cli.py b/tests/integration/other/test_cli.py index b9e6c3d28..59b629747 100644 --- a/tests/integration/other/test_cli.py +++ b/tests/integration/other/test_cli.py @@ -7,7 +7,7 @@ from lbry.extras import cli from lbry.extras.daemon.components import ( DATABASE_COMPONENT, BLOB_COMPONENT, WALLET_COMPONENT, DHT_COMPONENT, HASH_ANNOUNCER_COMPONENT, STREAM_MANAGER_COMPONENT, PEER_PROTOCOL_SERVER_COMPONENT, - UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT + UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT, WALLET_SERVER_PAYMENTS_COMPONENT ) from lbry.extras.daemon.daemon import Daemon @@ -22,7 +22,7 @@ class CLIIntegrationTest(AsyncioTestCase): conf.components_to_skip = ( DATABASE_COMPONENT, BLOB_COMPONENT, WALLET_COMPONENT, DHT_COMPONENT, HASH_ANNOUNCER_COMPONENT, STREAM_MANAGER_COMPONENT, PEER_PROTOCOL_SERVER_COMPONENT, - UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT + UPNP_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT, WALLET_SERVER_PAYMENTS_COMPONENT ) Daemon.component_attributes = {} self.daemon = Daemon(conf) diff --git a/tests/unit/components/test_component_manager.py b/tests/unit/components/test_component_manager.py index f9d2463f5..d8d2ed5a9 100644 --- a/tests/unit/components/test_component_manager.py +++ b/tests/unit/components/test_component_manager.py @@ -27,6 +27,7 @@ class TestComponentManager(AsyncioTestCase): components.HashAnnouncerComponent, components.PeerProtocolServerComponent, components.StreamManagerComponent, + components.WalletServerPaymentsComponent ] ] self.component_manager = ComponentManager(Config())