a28c9d09c8
- working CommonWorkflowTests integration test - pylint, unit and integration test fixes - switch integration tests to use async/await
75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
from binascii import hexlify
|
|
from twisted.internet import defer
|
|
from torba.basedatabase import BaseDatabase
|
|
from .certificate import Certificate
|
|
|
|
|
|
class WalletDatabase(BaseDatabase):
|
|
|
|
CREATE_TXO_TABLE = """
|
|
create table if not exists txo (
|
|
txid text references tx,
|
|
txoid text primary key,
|
|
address text references pubkey_address,
|
|
position integer not null,
|
|
amount integer not null,
|
|
script blob not null,
|
|
is_reserved boolean not null default 0,
|
|
|
|
claim_id text,
|
|
claim_name text,
|
|
is_claim boolean not null default 0,
|
|
is_update boolean not null default 0,
|
|
is_support boolean not null default 0
|
|
);
|
|
"""
|
|
|
|
CREATE_TABLES_QUERY = (
|
|
BaseDatabase.CREATE_TX_TABLE +
|
|
BaseDatabase.CREATE_PUBKEY_ADDRESS_TABLE +
|
|
CREATE_TXO_TABLE +
|
|
BaseDatabase.CREATE_TXI_TABLE
|
|
)
|
|
|
|
def txo_to_row(self, tx, address, txo):
|
|
row = super(WalletDatabase, self).txo_to_row(tx, address, txo)
|
|
row.update({
|
|
'is_claim': txo.script.is_claim_name,
|
|
'is_update': txo.script.is_update_claim,
|
|
'is_support': txo.script.is_support_claim,
|
|
})
|
|
if txo.script.is_claim_involved:
|
|
row['claim_name'] = txo.script.values['claim_name'].decode()
|
|
if txo.script.is_update_claim or txo.script.is_support_claim:
|
|
row['claim_id'] = hexlify(txo.script.values['claim_id'][::-1])
|
|
elif txo.script.is_claim_name:
|
|
row['claim_id'] = hexlify(tx.get_claim_id(txo.position)[::-1])
|
|
return row
|
|
|
|
@defer.inlineCallbacks
|
|
def get_certificates(self, name, private_key_accounts=None, exclude_without_key=False):
|
|
txos = yield self.db.runQuery(
|
|
"""
|
|
SELECT tx.txid, txo.position, txo.claim_id
|
|
FROM txo JOIN tx ON tx.txid=txo.txid
|
|
WHERE claim_name=? AND (is_claim OR is_update)
|
|
GROUP BY txo.claim_id ORDER BY tx.height DESC;
|
|
""", (name,)
|
|
)
|
|
|
|
certificates = []
|
|
# Lookup private keys for each certificate.
|
|
if private_key_accounts is not None:
|
|
for txhash, nout, claim_id in txos:
|
|
for account in private_key_accounts:
|
|
private_key = account.get_certificate_private_key(
|
|
txhash, nout
|
|
)
|
|
certificates.append(Certificate(txhash, nout, claim_id, name, private_key))
|
|
|
|
if exclude_without_key:
|
|
defer.returnValue([
|
|
c for c in certificates if c.private_key is not None
|
|
])
|
|
|
|
defer.returnValue(certificates)
|