added wallet management tests and address unsubscribe feature on wallet server

This commit is contained in:
Lex Berezhny 2019-10-30 17:05:23 -04:00
parent a5ee60c1c9
commit 41e0e6762c
5 changed files with 35 additions and 2 deletions

View file

@ -1134,7 +1134,7 @@ class Daemon(metaclass=JSONRPCServerType):
return wallet return wallet
@requires("wallet") @requires("wallet")
def jsonrpc_wallet_remove(self, wallet_id): async def jsonrpc_wallet_remove(self, wallet_id):
""" """
Remove an existing wallet. Remove an existing wallet.
@ -1146,8 +1146,10 @@ class Daemon(metaclass=JSONRPCServerType):
Returns: {Wallet} Returns: {Wallet}
""" """
wallet = self.wallet_manager.get_wallet_or_default(wallet_id) wallet = self.wallet_manager.get_wallet_or_error(wallet_id)
self.wallet_manager.wallets.remove(wallet) self.wallet_manager.wallets.remove(wallet)
for account in wallet.accounts:
await self.ledger.unsubscribe_account(account)
return wallet return wallet
@requires("wallet") @requires("wallet")

View file

@ -4,6 +4,19 @@ from lbry.testcase import CommandTestCase
from torba.client.wallet import ENCRYPT_ON_DISK from torba.client.wallet import ENCRYPT_ON_DISK
class WalletCommands(CommandTestCase):
async def test_wallet_create_and_add_subscribe(self):
session = next(iter(self.conductor.spv_node.server.session_mgr.sessions))
self.assertEqual(len(session.hashX_subs), 27)
wallet = await self.daemon.jsonrpc_wallet_create('foo', create_account=True, single_key=True)
self.assertEqual(len(session.hashX_subs), 28)
await self.daemon.jsonrpc_wallet_remove(wallet.id)
self.assertEqual(len(session.hashX_subs), 27)
await self.daemon.jsonrpc_wallet_add(wallet.id)
self.assertEqual(len(session.hashX_subs), 28)
class WalletEncryptionAndSynchronization(CommandTestCase): class WalletEncryptionAndSynchronization(CommandTestCase):
SEED = ( SEED = (

View file

@ -392,6 +392,10 @@ class BaseLedger(metaclass=LedgerRegistry):
await self.subscribe_addresses(address_manager, await address_manager.get_addresses()) await self.subscribe_addresses(address_manager, await address_manager.get_addresses())
await account.ensure_address_gap() await account.ensure_address_gap()
async def unsubscribe_account(self, account: baseaccount.BaseAccount):
for address in await account.get_addresses():
await self.network.unsubscribe_address(address)
async def announce_addresses(self, address_manager: baseaccount.AddressManager, addresses: List[str]): async def announce_addresses(self, address_manager: baseaccount.AddressManager, addresses: List[str]):
await self.subscribe_addresses(address_manager, addresses) await self.subscribe_addresses(address_manager, addresses)
await self._on_address_controller.add( await self._on_address_controller.add(

View file

@ -261,6 +261,9 @@ class BaseNetwork:
self.client.abort() self.client.abort()
raise asyncio.CancelledError() raise asyncio.CancelledError()
def unsubscribe_address(self, address):
return self.rpc('blockchain.address.unsubscribe', [address], True)
def get_server_features(self): def get_server_features(self):
return self.rpc('server.features', (), restricted=True) return self.rpc('server.features', (), restricted=True)

View file

@ -882,6 +882,9 @@ class ElectrumX(SessionBase):
self.hashX_subs[hashX] = alias self.hashX_subs[hashX] = alias
return await self.address_status(hashX) return await self.address_status(hashX)
async def hashX_unsubscribe(self, hashX, alias):
del self.hashX_subs[hashX]
def address_to_hashX(self, address): def address_to_hashX(self, address):
try: try:
return self.coin.address_to_hashX(address) return self.coin.address_to_hashX(address)
@ -916,6 +919,13 @@ class ElectrumX(SessionBase):
hashX = self.address_to_hashX(address) hashX = self.address_to_hashX(address)
return await self.hashX_subscribe(hashX, address) return await self.hashX_subscribe(hashX, address)
async def address_unsubscribe(self, address):
"""Unsubscribe an address.
address: the address to unsubscribe"""
hashX = self.address_to_hashX(address)
return await self.hashX_unsubscribe(hashX, address)
async def get_balance(self, hashX): async def get_balance(self, hashX):
utxos = await self.db.all_utxos(hashX) utxos = await self.db.all_utxos(hashX)
confirmed = sum(utxo.value for utxo in utxos) confirmed = sum(utxo.value for utxo in utxos)
@ -1284,6 +1294,7 @@ class ElectrumX(SessionBase):
'blockchain.address.get_mempool': self.address_get_mempool, 'blockchain.address.get_mempool': self.address_get_mempool,
'blockchain.address.listunspent': self.address_listunspent, 'blockchain.address.listunspent': self.address_listunspent,
'blockchain.address.subscribe': self.address_subscribe, 'blockchain.address.subscribe': self.address_subscribe,
'blockchain.address.unsubscribe': self.address_unsubscribe,
}) })
self.request_handlers = handlers self.request_handlers = handlers