62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
from dataclasses import dataclass
|
|
from typing import List, Optional, Tuple
|
|
|
|
from chia.consensus.coinbase import pool_parent_id, farmer_parent_id
|
|
from chia.types.blockchain_format.coin import Coin
|
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
from chia.types.spend_bundle import SpendBundle
|
|
from chia.util.ints import uint8, uint32, uint64
|
|
from chia.util.streamable import Streamable, streamable
|
|
from chia.wallet.util.transaction_type import TransactionType
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
@streamable
|
|
class TransactionRecord(Streamable):
|
|
"""
|
|
Used for storing transaction data and status in wallets.
|
|
"""
|
|
|
|
confirmed_at_height: uint32
|
|
created_at_time: uint64
|
|
to_puzzle_hash: bytes32
|
|
amount: uint64
|
|
fee_amount: uint64
|
|
confirmed: bool
|
|
sent: uint32
|
|
spend_bundle: Optional[SpendBundle]
|
|
additions: List[Coin]
|
|
removals: List[Coin]
|
|
wallet_id: uint32
|
|
|
|
# Represents the list of peers that we sent the transaction to, whether each one
|
|
# included it in the mempool, and what the error message (if any) was
|
|
sent_to: List[Tuple[str, uint8, Optional[str]]]
|
|
trade_id: Optional[bytes32]
|
|
type: uint32 # TransactionType
|
|
name: bytes32
|
|
|
|
def is_in_mempool(self) -> bool:
|
|
# If one of the nodes we sent it to responded with success, we set it to success
|
|
for (_, mis, _) in self.sent_to:
|
|
if MempoolInclusionStatus(mis) == MempoolInclusionStatus.SUCCESS:
|
|
return True
|
|
# Note, transactions pending inclusion (pending) return false
|
|
return False
|
|
|
|
def height_farmed(self, genesis_challenge) -> Optional[uint32]:
|
|
if not self.confirmed:
|
|
return None
|
|
if self.type == TransactionType.FEE_REWARD or self.type == TransactionType.COINBASE_REWARD:
|
|
for block_index in range(self.confirmed_at_height, self.confirmed_at_height - 100, -1):
|
|
if block_index < 0:
|
|
return None
|
|
pool_parent = pool_parent_id(uint32(block_index), genesis_challenge)
|
|
farmer_parent = farmer_parent_id(uint32(block_index), genesis_challenge)
|
|
if pool_parent == self.additions[0].parent_coin_info:
|
|
return uint32(block_index)
|
|
if farmer_parent == self.additions[0].parent_coin_info:
|
|
return uint32(block_index)
|
|
return None
|