2019-03-24 16:55:04 -04:00
|
|
|
from typing import List
|
|
|
|
|
2018-11-04 01:24:41 -05:00
|
|
|
from torba.client.basedatabase import BaseDatabase
|
2018-06-12 11:53:29 -04:00
|
|
|
|
2019-03-24 16:55:04 -04:00
|
|
|
from lbrynet.wallet.transaction import Output
|
|
|
|
|
2018-06-12 11:53:29 -04:00
|
|
|
|
|
|
|
class WalletDatabase(BaseDatabase):
|
|
|
|
|
2018-07-09 09:55:07 -04:00
|
|
|
CREATE_TXO_TABLE = """
|
|
|
|
create table if not exists txo (
|
2018-07-14 23:02:19 -04:00
|
|
|
txid text references tx,
|
|
|
|
txoid text primary key,
|
|
|
|
address text references pubkey_address,
|
2018-07-09 09:55:07 -04:00
|
|
|
position integer not null,
|
|
|
|
amount integer not null,
|
|
|
|
script blob not null,
|
|
|
|
is_reserved boolean not null default 0,
|
2018-07-11 23:18:59 -04:00
|
|
|
|
2018-07-14 23:02:19 -04:00
|
|
|
claim_id text,
|
2018-07-09 09:55:07 -04:00
|
|
|
claim_name text,
|
|
|
|
is_claim boolean not null default 0,
|
|
|
|
is_update boolean not null default 0,
|
2018-08-14 16:16:29 -04:00
|
|
|
is_support boolean not null default 0,
|
2018-08-22 23:47:37 -04:00
|
|
|
is_buy boolean not null default 0,
|
|
|
|
is_sell boolean not null default 0
|
2018-07-09 09:55:07 -04:00
|
|
|
);
|
2018-10-09 23:58:32 -04:00
|
|
|
create index if not exists txo_claim_id_idx on txo (claim_id);
|
2018-07-09 09:55:07 -04:00
|
|
|
"""
|
|
|
|
|
2018-06-12 11:53:29 -04:00
|
|
|
CREATE_TABLES_QUERY = (
|
|
|
|
BaseDatabase.CREATE_TX_TABLE +
|
|
|
|
BaseDatabase.CREATE_PUBKEY_ADDRESS_TABLE +
|
2018-10-09 23:40:02 -04:00
|
|
|
BaseDatabase.CREATE_PUBKEY_ADDRESS_INDEX +
|
2018-07-09 09:55:07 -04:00
|
|
|
CREATE_TXO_TABLE +
|
2018-10-09 23:40:02 -04:00
|
|
|
BaseDatabase.CREATE_TXO_INDEX +
|
|
|
|
BaseDatabase.CREATE_TXI_TABLE +
|
|
|
|
BaseDatabase.CREATE_TXI_INDEX
|
2018-06-12 11:53:29 -04:00
|
|
|
)
|
2018-07-09 09:55:07 -04:00
|
|
|
|
|
|
|
def txo_to_row(self, tx, address, txo):
|
2018-07-21 18:34:59 -04:00
|
|
|
row = super().txo_to_row(tx, address, txo)
|
2018-07-09 09:55:07 -04:00
|
|
|
row.update({
|
|
|
|
'is_claim': txo.script.is_claim_name,
|
|
|
|
'is_update': txo.script.is_update_claim,
|
|
|
|
'is_support': txo.script.is_support_claim,
|
2018-08-22 23:47:37 -04:00
|
|
|
'is_buy': txo.script.is_buy_claim,
|
|
|
|
'is_sell': txo.script.is_sell_claim,
|
2018-07-09 09:55:07 -04:00
|
|
|
})
|
|
|
|
if txo.script.is_claim_involved:
|
2018-08-04 12:10:41 -04:00
|
|
|
row['claim_id'] = txo.claim_id
|
|
|
|
row['claim_name'] = txo.claim_name
|
2018-07-09 09:55:07 -04:00
|
|
|
return row
|
2018-07-11 23:18:59 -04:00
|
|
|
|
2019-03-24 16:55:04 -04:00
|
|
|
async def get_txos(self, **constraints) -> List[Output]:
|
2018-10-08 10:41:07 -04:00
|
|
|
my_account = constraints.get('my_account', constraints.get('account', None))
|
|
|
|
|
2018-10-15 17:16:43 -04:00
|
|
|
txos = await super().get_txos(**constraints)
|
2018-10-05 09:02:02 -04:00
|
|
|
|
2018-10-08 10:41:07 -04:00
|
|
|
channel_ids = set()
|
2018-10-05 09:02:02 -04:00
|
|
|
for txo in txos:
|
2019-06-06 23:42:31 -04:00
|
|
|
if txo.is_claim and txo.can_decode_claim:
|
2019-03-20 01:46:23 -04:00
|
|
|
if txo.claim.is_signed:
|
2019-03-22 02:18:34 -04:00
|
|
|
channel_ids.add(txo.claim.signing_channel_id)
|
2019-03-24 16:55:04 -04:00
|
|
|
if txo.claim.is_channel and my_account is not None:
|
2019-05-28 18:46:50 -04:00
|
|
|
txo.private_key = my_account.get_channel_private_key(
|
2019-05-19 02:14:33 +05:30
|
|
|
txo.claim.channel.public_key_bytes
|
|
|
|
)
|
2018-10-05 09:02:02 -04:00
|
|
|
|
2018-10-08 10:41:07 -04:00
|
|
|
if channel_ids:
|
2018-10-05 09:02:02 -04:00
|
|
|
channels = {
|
|
|
|
txo.claim_id: txo for txo in
|
2018-10-30 16:20:43 -04:00
|
|
|
(await self.get_claims(
|
2018-10-05 09:02:02 -04:00
|
|
|
my_account=my_account,
|
2018-10-08 10:41:07 -04:00
|
|
|
claim_id__in=channel_ids
|
2018-10-05 09:02:02 -04:00
|
|
|
))
|
|
|
|
}
|
|
|
|
for txo in txos:
|
|
|
|
if txo.script.is_claim_name or txo.script.is_update_claim:
|
2019-03-22 02:18:34 -04:00
|
|
|
txo.channel = channels.get(txo.claim.signing_channel_id, None)
|
2018-10-05 09:02:02 -04:00
|
|
|
|
|
|
|
return txos
|
|
|
|
|
2018-10-08 10:41:07 -04:00
|
|
|
@staticmethod
|
|
|
|
def constrain_claims(constraints):
|
2019-03-24 16:55:04 -04:00
|
|
|
constraints['claim_type__any'] = {'is_claim': 1, 'is_update': 1}
|
2018-10-08 10:41:07 -04:00
|
|
|
|
2019-03-24 16:55:04 -04:00
|
|
|
async def get_claims(self, **constraints) -> List[Output]:
|
2018-10-08 10:41:07 -04:00
|
|
|
self.constrain_claims(constraints)
|
2019-03-24 16:55:04 -04:00
|
|
|
return await self.get_utxos(**constraints)
|
2018-09-18 22:23:41 -04:00
|
|
|
|
2018-10-09 14:46:44 -04:00
|
|
|
def get_claim_count(self, **constraints):
|
2018-10-08 10:41:07 -04:00
|
|
|
self.constrain_claims(constraints)
|
|
|
|
return self.get_utxo_count(**constraints)
|
|
|
|
|
2019-03-25 18:30:43 -04:00
|
|
|
@staticmethod
|
|
|
|
def constrain_streams(constraints):
|
|
|
|
if 'claim_name' not in constraints or 'claim_id' not in constraints:
|
|
|
|
constraints['claim_name__not_like'] = '@%'
|
|
|
|
|
|
|
|
def get_streams(self, **constraints):
|
|
|
|
self.constrain_streams(constraints)
|
|
|
|
return self.get_claims(**constraints)
|
|
|
|
|
|
|
|
def get_stream_count(self, **constraints):
|
|
|
|
self.constrain_streams(constraints)
|
|
|
|
return self.get_claim_count(**constraints)
|
|
|
|
|
2018-10-08 10:41:07 -04:00
|
|
|
@staticmethod
|
|
|
|
def constrain_channels(constraints):
|
2018-10-03 12:00:21 -04:00
|
|
|
if 'claim_name' not in constraints or 'claim_id' not in constraints:
|
|
|
|
constraints['claim_name__like'] = '@%'
|
2018-10-08 10:41:07 -04:00
|
|
|
|
|
|
|
def get_channels(self, **constraints):
|
|
|
|
self.constrain_channels(constraints)
|
2018-10-03 12:00:21 -04:00
|
|
|
return self.get_claims(**constraints)
|
2018-07-11 23:18:59 -04:00
|
|
|
|
2018-10-09 14:46:44 -04:00
|
|
|
def get_channel_count(self, **constraints):
|
2018-10-08 10:41:07 -04:00
|
|
|
self.constrain_channels(constraints)
|
2018-10-09 14:46:44 -04:00
|
|
|
return self.get_claim_count(**constraints)
|
2018-10-08 10:41:07 -04:00
|
|
|
|
2019-03-24 16:55:04 -04:00
|
|
|
@staticmethod
|
|
|
|
def constrain_supports(constraints):
|
|
|
|
constraints['is_support'] = 1
|
|
|
|
|
|
|
|
def get_supports(self, **constraints):
|
|
|
|
self.constrain_supports(constraints)
|
|
|
|
return self.get_utxos(**constraints)
|
|
|
|
|
|
|
|
def get_support_count(self, **constraints):
|
|
|
|
self.constrain_supports(constraints)
|
|
|
|
return self.get_utxo_count(**constraints)
|
2019-01-04 02:49:29 -05:00
|
|
|
|
|
|
|
async def release_all_outputs(self, account):
|
|
|
|
await self.db.execute(
|
|
|
|
"UPDATE txo SET is_reserved = 0 WHERE"
|
|
|
|
" is_reserved = 1 AND txo.address IN ("
|
|
|
|
" SELECT address from pubkey_address WHERE account = ?"
|
|
|
|
" )", [account.public_key.address]
|
|
|
|
)
|