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 txid, nout, claim_id in txos: for account in private_key_accounts: private_key = account.get_certificate_private_key( TXORef(TXRefImmutable.from_id(txid), nout)) certificates.append( Certificate(txid, 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)
def get_claim(self, account, claim_id=None, txid=None, nout=None): if claim_id is not None: filter_sql = "claim_id=?" filter_value = (claim_id, ) else: filter_sql = "txo.txid=? AND txo.position=?" filter_value = (txid, nout) utxos = yield self.db.runQuery( """ SELECT amount, script, txo.txid, txo.position, account FROM txo JOIN tx ON tx.txid=txo.txid JOIN pubkey_address ON pubkey_address.address=txo.address WHERE {} AND (is_claim OR is_update) AND txoid NOT IN (SELECT txoid FROM txi) ORDER BY tx.height DESC, tx.position ASC LIMIT 1; """.format(filter_sql), filter_value) output_class = account.ledger.transaction_class.output_class account_id = account.public_key.address return [ output_class(values[0], output_class.script_class(values[1]), TXRefImmutable.from_id(values[2]), position=values[3], is_change=False, is_my_account=values[4] == account_id) for values in utxos ]
def deserialize_from(cls, stream): tx_ref = TXRefImmutable.from_hash(stream.read(32)) position = stream.read_uint32() script = stream.read_string() sequence = stream.read_uint32() return cls(TXORef(tx_ref, position), cls.script_class(script) if not tx_ref.is_null else script, sequence)
def get_utxos_for_account(self, account, **constraints): constraints['account'] = account.public_key.address utxos = yield self.run_query( """ SELECT amount, script, txid, txo.position FROM txo JOIN pubkey_address ON pubkey_address.address=txo.address WHERE account=:account AND txo.is_reserved=0 AND txoid NOT IN (SELECT txoid FROM txi) """ + constraints_to_sql(constraints), constraints) output_class = account.ledger.transaction_class.output_class defer.returnValue([ output_class(values[0], output_class.script_class(values[1]), TXRefImmutable.from_id(values[2]), position=values[3]) for values in utxos ])
def get_claim(self, account, claim_id): utxos = yield self.db.runQuery( """ SELECT amount, script, txo.txid, position FROM txo JOIN tx ON tx.txid=txo.txid WHERE claim_id=? AND (is_claim OR is_update) AND txoid NOT IN (SELECT txoid FROM txi) ORDER BY tx.height DESC LIMIT 1; """, (claim_id, )) output_class = account.ledger.transaction_class.output_class defer.returnValue([ output_class(values[0], output_class.script_class(values[1]), TXRefImmutable.from_id(values[2]), position=values[3]) for values in utxos ])
async def get_txos(self, my_account=None, **constraints): my_account = my_account or constraints.get('account', None) if isinstance(my_account, BaseAccount): my_account = my_account.public_key.address rows = await self.select_txos( "amount, script, txid, tx.height, txo.position, chain, account", **constraints) output_class = self.ledger.transaction_class.output_class return [ output_class(amount=row[0], script=output_class.script_class(row[1]), tx_ref=TXRefImmutable.from_id(row[2], row[3]), position=row[4], is_change=row[5] == 1, is_my_account=row[6] == my_account) for row in rows ]
def get_claims(self, account): utxos = yield self.db.runQuery( """ SELECT amount, script, txo.txid, txo.position FROM txo JOIN tx ON tx.txid=txo.txid JOIN pubkey_address ON pubkey_address.address=txo.address WHERE (is_claim OR is_update) AND txoid NOT IN (SELECT txoid FROM txi) AND account = :account ORDER BY tx.height DESC, tx.position ASC; """, {'account': account.public_key.address}) output_class = account.ledger.transaction_class.output_class return [ output_class(values[0], output_class.script_class(values[1]), TXRefImmutable.from_id(values[2]), position=values[3], is_change=False, is_my_account=True) for values in utxos ]
def get_certificates(self, name=None, channel_id=None, private_key_accounts=None, exclude_without_key=False): if name is not None: filter_sql = 'claim_name=?' filter_value = name elif channel_id is not None: filter_sql = 'claim_id=?' filter_value = channel_id else: raise ValueError("'name' or 'claim_id' is required") txos = yield self.db.runQuery( """ SELECT tx.txid, txo.position, txo.claim_id FROM txo JOIN tx ON tx.txid=txo.txid WHERE {} AND (is_claim OR is_update) GROUP BY txo.claim_id ORDER BY tx.height DESC, tx.position ASC; """.format(filter_sql), (filter_value, )) certificates = [] # Lookup private keys for each certificate. if private_key_accounts is not None: for txid, nout, claim_id in txos: for account in private_key_accounts: private_key = account.get_certificate_private_key( TXORef(TXRefImmutable.from_id(txid), nout)) certificates.append( Certificate(txid, nout, claim_id, name, private_key)) if exclude_without_key: return [c for c in certificates if c.private_key is not None] return certificates