2020-01-06 05:29:48 +01:00
|
|
|
import asyncio
|
|
|
|
import logging
|
|
|
|
|
|
|
|
from lbry.wallet import Wallet
|
|
|
|
from lbry.wallet.ledger import Ledger
|
|
|
|
from lbry.wallet.dewies import lbc_to_dewies
|
|
|
|
from lbry.wallet.transaction import Output, Transaction
|
|
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class WalletServerPayer:
|
2020-01-06 09:07:37 +01:00
|
|
|
PAYMENT_PERIOD = 24 * 60 * 60
|
2020-01-06 05:29:48 +01:00
|
|
|
|
|
|
|
def __init__(self, ledger: Ledger, wallet: Wallet):
|
|
|
|
self.ledger = ledger
|
|
|
|
self.wallet = wallet
|
|
|
|
self.running = False
|
|
|
|
self.task = None
|
|
|
|
|
|
|
|
async def pay(self):
|
|
|
|
while self.running:
|
2020-01-06 09:07:37 +01:00
|
|
|
await asyncio.sleep(self.PAYMENT_PERIOD)
|
2020-01-06 05:29:48 +01:00
|
|
|
features = await self.ledger.network.get_server_features()
|
|
|
|
address = features['payment_address']
|
2020-01-06 09:07:37 +01:00
|
|
|
amount = str(features['daily_fee'])
|
|
|
|
if not address or not amount:
|
|
|
|
continue
|
2020-01-06 05:29:48 +01:00
|
|
|
|
|
|
|
if not self.ledger.is_valid_address(address):
|
|
|
|
raise Exception(f"Invalid address: {address}")
|
|
|
|
if self.wallet.is_locked:
|
|
|
|
raise Exception("Cannot spend funds with locked wallet")
|
|
|
|
|
|
|
|
amount = lbc_to_dewies(features['daily_fee']) # check that this is in lbc and not dewies
|
|
|
|
# todo: check that amount is less than our max
|
|
|
|
|
|
|
|
tx = await Transaction.create([],
|
|
|
|
[Output.pay_pubkey_hash(amount, self.ledger.address_to_hash160(address))],
|
|
|
|
self.wallet.get_accounts_or_all(None),
|
|
|
|
self.wallet.get_account_or_default(None))
|
|
|
|
|
|
|
|
await self.ledger.broadcast(tx)
|
2020-01-06 09:07:37 +01:00
|
|
|
# await self.analytics_manager.send_credits_sent() fixme: handle that
|
2020-01-06 05:29:48 +01:00
|
|
|
|
|
|
|
async def start(self):
|
|
|
|
self.running = True
|
|
|
|
self.task = asyncio.ensure_future(self.pay())
|
|
|
|
self.task.add_done_callback(lambda _: log.info("Stopping wallet server payments."))
|
|
|
|
|
|
|
|
async def stop(self):
|
|
|
|
if self.running:
|
|
|
|
self.running = False
|
|
|
|
self.task.cancel()
|