mirror of
https://github.com/LBRYFoundation/lbry-sdk.git
synced 2025-08-28 16:01:28 +00:00
moved balance calculation to SQL
This commit is contained in:
parent
31367fb4c4
commit
6acf94a810
4 changed files with 40 additions and 31 deletions
|
@ -1556,7 +1556,7 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
wallet = self.wallet_manager.get_wallet_or_default(wallet_id)
|
wallet = self.wallet_manager.get_wallet_or_default(wallet_id)
|
||||||
account = wallet.get_account_or_default(account_id)
|
account = wallet.get_account_or_default(account_id)
|
||||||
balance = await account.get_detailed_balance(
|
balance = await account.get_detailed_balance(
|
||||||
confirmations=confirmations, reserved_subtotals=True, read_only=True
|
confirmations=confirmations, read_only=True
|
||||||
)
|
)
|
||||||
return dict_values_to_lbc(balance)
|
return dict_values_to_lbc(balance)
|
||||||
|
|
||||||
|
|
|
@ -566,35 +566,14 @@ class Account:
|
||||||
if gap_changed:
|
if gap_changed:
|
||||||
self.wallet.save()
|
self.wallet.save()
|
||||||
|
|
||||||
async def get_detailed_balance(self, confirmations=0, reserved_subtotals=False, read_only=False):
|
async def get_detailed_balance(self, confirmations=0, read_only=False):
|
||||||
tips_balance, supports_balance, claims_balance = 0, 0, 0
|
constraints = {}
|
||||||
get_total_balance = partial(self.get_balance, read_only=read_only, confirmations=confirmations,
|
if confirmations > 0:
|
||||||
include_claims=True)
|
height = self.ledger.headers.height - (confirmations-1)
|
||||||
total = await get_total_balance()
|
constraints.update({'height__lte': height, 'height__gt': 0})
|
||||||
if reserved_subtotals:
|
return await self.ledger.db.get_detailed_balance(
|
||||||
claims_balance = await get_total_balance(txo_type__in=CLAIM_TYPES)
|
accounts=[self], read_only=read_only, **constraints
|
||||||
for txo in await self.get_support_summary():
|
)
|
||||||
if confirmations > 0 and not 0 < txo.tx_ref.height <= self.ledger.headers.height - (confirmations - 1):
|
|
||||||
continue
|
|
||||||
if txo.is_my_input:
|
|
||||||
supports_balance += txo.amount
|
|
||||||
else:
|
|
||||||
tips_balance += txo.amount
|
|
||||||
reserved = claims_balance + supports_balance + tips_balance
|
|
||||||
else:
|
|
||||||
reserved = await self.get_balance(
|
|
||||||
confirmations=confirmations, include_claims=True, txo_type__gt=0
|
|
||||||
)
|
|
||||||
return {
|
|
||||||
'total': total,
|
|
||||||
'available': total - reserved,
|
|
||||||
'reserved': reserved,
|
|
||||||
'reserved_subtotals': {
|
|
||||||
'claims': claims_balance,
|
|
||||||
'supports': supports_balance,
|
|
||||||
'tips': tips_balance
|
|
||||||
} if reserved_subtotals else None
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_transaction_history(self, read_only=False, **constraints):
|
def get_transaction_history(self, read_only=False, **constraints):
|
||||||
return self.ledger.get_transaction_history(
|
return self.ledger.get_transaction_history(
|
||||||
|
|
|
@ -1142,6 +1142,35 @@ class Database(SQLiteMixin):
|
||||||
)
|
)
|
||||||
return balance[0]['total'] or 0
|
return balance[0]['total'] or 0
|
||||||
|
|
||||||
|
async def get_detailed_balance(self, accounts, read_only=False, **constraints):
|
||||||
|
constraints['accounts'] = accounts
|
||||||
|
result = (await self.select_txos(
|
||||||
|
f"COALESCE(SUM(amount), 0) AS total,"
|
||||||
|
f"COALESCE(SUM(CASE WHEN txo_type != {TXO_TYPES['other']} THEN amount ELSE 0 END), 0) AS reserved,"
|
||||||
|
f"COALESCE(SUM(CASE WHEN txo_type IN ({','.join(map(str, CLAIM_TYPES))}) THEN amount ELSE 0 END), 0) AS claims,"
|
||||||
|
f"COALESCE(SUM(CASE WHEN txo_type = {TXO_TYPES['support']} THEN amount ELSE 0 END), 0) AS supports,"
|
||||||
|
f"COALESCE(SUM("
|
||||||
|
f" CASE WHEN"
|
||||||
|
f" txo_type = {TXO_TYPES['support']} AND"
|
||||||
|
f" TXI.address IS NOT NULL AND"
|
||||||
|
f" TXI.address IN (SELECT address FROM account_address WHERE account = :$account__in0)"
|
||||||
|
f" THEN amount ELSE 0 END), 0) AS my_supports",
|
||||||
|
is_spent=False,
|
||||||
|
include_is_my_input=True,
|
||||||
|
read_only=read_only,
|
||||||
|
**constraints
|
||||||
|
))[0]
|
||||||
|
return {
|
||||||
|
"total": result["total"],
|
||||||
|
"available": result["total"] - result["reserved"],
|
||||||
|
"reserved": result["reserved"],
|
||||||
|
"reserved_subtotals": {
|
||||||
|
"claims": result["claims"],
|
||||||
|
"supports": result["my_supports"],
|
||||||
|
"tips": result["supports"] - result["my_supports"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async def select_addresses(self, cols, read_only=False, **constraints):
|
async def select_addresses(self, cols, read_only=False, **constraints):
|
||||||
return await self.db.execute_fetchall(*query(
|
return await self.db.execute_fetchall(*query(
|
||||||
f"SELECT {cols} FROM pubkey_address JOIN account_address USING (address)",
|
f"SELECT {cols} FROM pubkey_address JOIN account_address USING (address)",
|
||||||
|
|
|
@ -1171,7 +1171,7 @@ class Ledger(metaclass=LedgerRegistry):
|
||||||
balance = self._balance_cache.get(account.id)
|
balance = self._balance_cache.get(account.id)
|
||||||
if not balance:
|
if not balance:
|
||||||
balance = self._balance_cache[account.id] = \
|
balance = self._balance_cache[account.id] = \
|
||||||
await account.get_detailed_balance(confirmations, reserved_subtotals=True)
|
await account.get_detailed_balance(confirmations)
|
||||||
for key, value in balance.items():
|
for key, value in balance.items():
|
||||||
if key == 'reserved_subtotals':
|
if key == 'reserved_subtotals':
|
||||||
for subkey, subvalue in value.items():
|
for subkey, subvalue in value.items():
|
||||||
|
@ -1180,6 +1180,7 @@ class Ledger(metaclass=LedgerRegistry):
|
||||||
result[key] += value
|
result[key] += value
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
class TestNetLedger(Ledger):
|
class TestNetLedger(Ledger):
|
||||||
network_name = 'testnet'
|
network_name = 'testnet'
|
||||||
pubkey_address_prefix = bytes((111,))
|
pubkey_address_prefix = bytes((111,))
|
||||||
|
|
Loading…
Add table
Reference in a new issue