lbry-sdk/lbrynet/wallet/transaction.py

49 lines
1.6 KiB
Python

import struct
from binascii import hexlify
from typing import List
from twisted.internet import defer
from torba.baseaccount import BaseAccount
from torba.basetransaction import BaseTransaction, BaseInput, BaseOutput
from torba.hash import hash160
from lbryschema.claim import ClaimDict
from .script import InputScript, OutputScript
def claim_id_hash(txid, n):
return hash160(txid + struct.pack('>I', n))
class Input(BaseInput):
script_class = InputScript
class Output(BaseOutput):
script_class = OutputScript
@classmethod
def pay_claim_name_pubkey_hash(cls, amount, claim_name, claim, pubkey_hash):
script = cls.script_class.pay_claim_name_pubkey_hash(claim_name, claim, pubkey_hash)
return cls(amount, script)
class Transaction(BaseTransaction):
input_class = Input
output_class = Output
def get_claim_id(self, output_index):
output = self.outputs[output_index] # type: Output
assert output.script.is_claim_name, 'Not a name claim.'
return claim_id_hash(self.hash, output_index)
@classmethod
def claim(cls, name, meta, amount, holding_address, funding_accounts, change_account):
# type: (bytes, ClaimDict, int, bytes, List[BaseAccount], BaseAccount) -> defer.Deferred
ledger = cls.ensure_all_have_same_ledger(funding_accounts, change_account)
claim_output = Output.pay_claim_name_pubkey_hash(
amount, name, hexlify(meta.serialized), ledger.address_to_hash160(holding_address)
)
return cls.pay([claim_output], funding_accounts, change_account)