async def coins_of_interest_added(self, coins: List[Coin], height: uint32) -> List[Coin]: ( trade_removals, trade_additions, ) = await self.trade_manager.get_coins_of_interest() trade_adds: List[Coin] = [] block: Optional[BlockRecord] = await self.blockchain.get_block_record_from_db( self.blockchain.height_to_hash(height) ) assert block is not None pool_rewards = set() farmer_rewards = set() prev = await self.blockchain.get_block_record_from_db(block.prev_hash) # [block 1] [block 2] [tx block 3] [block 4] [block 5] [tx block 6] # [tx block 6] will contain rewards for [block 1] [block 2] [tx block 3] while prev is not None: # step 1 find previous block if prev.is_transaction_block: break prev = await self.blockchain.get_block_record_from_db(prev.prev_hash) if prev is not None: # include last block pool_parent = pool_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) farmer_parent = farmer_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) pool_rewards.add(pool_parent) farmer_rewards.add(farmer_parent) prev = await self.blockchain.get_block_record_from_db(prev.prev_hash) while prev is not None: # step 2 traverse from previous block to the block before it pool_parent = pool_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) farmer_parent = farmer_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) pool_rewards.add(pool_parent) farmer_rewards.add(farmer_parent) if prev.is_transaction_block: break prev = await self.blockchain.get_block_record_from_db(prev.prev_hash) for coin in coins: if coin.name() in trade_additions: trade_adds.append(coin) is_coinbase = False is_fee_reward = False if coin.parent_coin_info in pool_rewards: is_coinbase = True if coin.parent_coin_info in farmer_rewards: is_fee_reward = True info = await self.puzzle_store.wallet_info_for_puzzle_hash(coin.puzzle_hash) if info is not None: wallet_id, wallet_type = info await self.coin_added(coin, is_coinbase, is_fee_reward, uint32(wallet_id), wallet_type, height) return trade_adds
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
async def coins_of_interest_added( self, coins: List[Coin], height: uint32 ) -> Tuple[List[Coin], List[WalletCoinRecord]]: ( trade_removals, trade_additions, ) = await self.trade_manager.get_coins_of_interest() trade_adds: List[Coin] = [] block: Optional[BlockRecord] = await self.blockchain.get_block_record_from_db( self.blockchain.height_to_hash(height) ) assert block is not None pool_rewards = set() farmer_rewards = set() added = [] prev = await self.blockchain.get_block_record_from_db(block.prev_hash) # [block 1] [block 2] [tx block 3] [block 4] [block 5] [tx block 6] # [tx block 6] will contain rewards for [block 1] [block 2] [tx block 3] while prev is not None: # step 1 find previous block if prev.is_transaction_block: break prev = await self.blockchain.get_block_record_from_db(prev.prev_hash) if prev is not None: # include last block pool_parent = pool_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) farmer_parent = farmer_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) pool_rewards.add(pool_parent) farmer_rewards.add(farmer_parent) prev = await self.blockchain.get_block_record_from_db(prev.prev_hash) while prev is not None: # step 2 traverse from previous block to the block before it pool_parent = pool_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) farmer_parent = farmer_parent_id(uint32(prev.height), self.constants.GENESIS_CHALLENGE) pool_rewards.add(pool_parent) farmer_rewards.add(farmer_parent) if prev.is_transaction_block: break prev = await self.blockchain.get_block_record_from_db(prev.prev_hash) wallet_ids: Set[int] = set() for coin in coins: info = await self.puzzle_store.wallet_info_for_puzzle_hash(coin.puzzle_hash) if info is not None: wallet_ids.add(info[0]) all_outgoing_tx: Dict[int, List[TransactionRecord]] = {} for wallet_id in wallet_ids: all_outgoing_tx[wallet_id] = await self.tx_store.get_all_transactions_for_wallet( wallet_id, TransactionType.OUTGOING_TX ) for coin in coins: if coin.name() in trade_additions: trade_adds.append(coin) is_coinbase = False is_fee_reward = False if coin.parent_coin_info in pool_rewards: is_coinbase = True if coin.parent_coin_info in farmer_rewards: is_fee_reward = True info = await self.puzzle_store.wallet_info_for_puzzle_hash(coin.puzzle_hash) if info is not None: wallet_id, wallet_type = info added_coin_record = await self.coin_added( coin, is_coinbase, is_fee_reward, uint32(wallet_id), wallet_type, height, all_outgoing_tx[wallet_id] ) added.append(added_coin_record) derivation_index = await self.puzzle_store.index_for_puzzle_hash(coin.puzzle_hash) if derivation_index is not None: await self.puzzle_store.set_used_up_to(derivation_index, True) return trade_adds, added