refactored address_list API to be more detailed
This commit is contained in:
parent
5c151a3a09
commit
81f16d7061
4 changed files with 153 additions and 115 deletions
File diff suppressed because one or more lines are too long
|
@ -1520,26 +1520,33 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@requires(WALLET_COMPONENT)
|
@requires(WALLET_COMPONENT)
|
||||||
def jsonrpc_address_list(self, account_id=None, page=None, page_size=None):
|
def jsonrpc_address_list(self, address=None, account_id=None, page=None, page_size=None):
|
||||||
"""
|
"""
|
||||||
List account addresses
|
List account addresses or details of single address.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
address_list [<account_id> | --account_id=<account_id>]
|
address_list [--address=<address>] [--account_id=<account_id>]
|
||||||
[--page=<page>] [--page_size=<page_size>]
|
[--page=<page>] [--page_size=<page_size>]
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
--address=<address> : (str) just show details for single address
|
||||||
--account_id=<account_id> : (str) id of the account to use
|
--account_id=<account_id> : (str) id of the account to use
|
||||||
--page=<page> : (int) page to return during paginating
|
--page=<page> : (int) page to return during paginating
|
||||||
--page_size=<page_size> : (int) number of items on page during pagination
|
--page_size=<page_size> : (int) number of items on page during pagination
|
||||||
|
|
||||||
Returns: {Paginated[Address]}
|
Returns: {Paginated[Address]}
|
||||||
"""
|
"""
|
||||||
account = self.get_account_or_default(account_id)
|
constraints = {
|
||||||
|
'cols': ('address', 'account', 'used_times')
|
||||||
|
}
|
||||||
|
if address:
|
||||||
|
constraints['address'] = address
|
||||||
|
if account_id:
|
||||||
|
constraints['accounts'] = [self.get_account_or_error(account_id)]
|
||||||
return maybe_paginate(
|
return maybe_paginate(
|
||||||
account.get_addresses,
|
self.ledger.get_addresses,
|
||||||
account.get_address_count,
|
self.ledger.get_address_count,
|
||||||
page, page_size
|
page, page_size, **constraints
|
||||||
)
|
)
|
||||||
|
|
||||||
@requires(WALLET_COMPONENT)
|
@requires(WALLET_COMPONENT)
|
||||||
|
|
12
lbry/tests/integration/test_other_commands.py
Normal file
12
lbry/tests/integration/test_other_commands.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
from lbry.testcase import CommandTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class AddressManagement(CommandTestCase):
|
||||||
|
|
||||||
|
async def test_address_list(self):
|
||||||
|
addresses = await self.daemon.jsonrpc_address_list()
|
||||||
|
self.assertEqual(27, len(addresses))
|
||||||
|
|
||||||
|
single = await self.daemon.jsonrpc_address_list(addresses[11]['address'])
|
||||||
|
self.assertEqual(1, len(single))
|
||||||
|
self.assertEqual(single[0], addresses[11])
|
|
@ -19,6 +19,7 @@ from torba.client.coinselection import CoinSelector
|
||||||
from torba.client.constants import COIN, NULL_HASH32
|
from torba.client.constants import COIN, NULL_HASH32
|
||||||
from torba.stream import StreamController
|
from torba.stream import StreamController
|
||||||
from torba.client.hash import hash160, double_sha256, sha256, Base58
|
from torba.client.hash import hash160, double_sha256, sha256, Base58
|
||||||
|
from torba.client.bip32 import PubKey, PrivateKey
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -185,13 +186,13 @@ class BaseLedger(metaclass=LedgerRegistry):
|
||||||
if match['account'] == account.public_key.address:
|
if match['account'] == account.public_key.address:
|
||||||
return account, match
|
return account, match
|
||||||
|
|
||||||
async def get_private_key_for_address(self, address):
|
async def get_private_key_for_address(self, address) -> Optional[PrivateKey]:
|
||||||
match = await self._get_account_and_address_info_for_address(address)
|
match = await self._get_account_and_address_info_for_address(address)
|
||||||
if match:
|
if match:
|
||||||
account, address_info = match
|
account, address_info = match
|
||||||
return account.get_private_key(address_info['chain'], address_info['position'])
|
return account.get_private_key(address_info['chain'], address_info['position'])
|
||||||
|
|
||||||
async def get_public_key_for_address(self, address):
|
async def get_public_key_for_address(self, address) -> Optional[PubKey]:
|
||||||
match = await self._get_account_and_address_info_for_address(address)
|
match = await self._get_account_and_address_info_for_address(address)
|
||||||
if match:
|
if match:
|
||||||
account, address_info = match
|
account, address_info = match
|
||||||
|
@ -210,6 +211,18 @@ class BaseLedger(metaclass=LedgerRegistry):
|
||||||
estimators.append(utxo.get_estimator(self))
|
estimators.append(utxo.get_estimator(self))
|
||||||
return estimators
|
return estimators
|
||||||
|
|
||||||
|
async def get_addresses(self, **constraints):
|
||||||
|
self.constraint_account_or_all(constraints)
|
||||||
|
addresses = await self.db.get_addresses(**constraints)
|
||||||
|
for address in addresses:
|
||||||
|
public_key = await self.get_public_key_for_address(address['address'])
|
||||||
|
address['public_key'] = public_key.extended_key_string()
|
||||||
|
return addresses
|
||||||
|
|
||||||
|
def get_address_count(self, **constraints):
|
||||||
|
self.constraint_account_or_all(constraints)
|
||||||
|
return self.db.get_address_count(**constraints)
|
||||||
|
|
||||||
async def get_spendable_utxos(self, amount: int, funding_accounts):
|
async def get_spendable_utxos(self, amount: int, funding_accounts):
|
||||||
async with self._utxo_reservation_lock:
|
async with self._utxo_reservation_lock:
|
||||||
txos = await self.get_effective_amount_estimators(funding_accounts)
|
txos = await self.get_effective_amount_estimators(funding_accounts)
|
||||||
|
|
Loading…
Reference in a new issue