def METHOD_NAME(self):
    add_new_block(self.manager, advance_clock=1)
    add_blocks_unlock_reward(self.manager)
    self.assertEqual(len(self.get_tips()), 0)
    tx1 = add_new_transactions(self.manager, 1, advance_clock=1)[0]
    # tx1 will be the tip
    self.assertCountEqual(self.get_tips(), set([tx1.hash]))
    tx2 = add_new_transactions(self.manager, 1, advance_clock=1)[0]
    # tx2 will be the tip now
    self.assertCountEqual(self.get_tips(), set([tx2.hash]))
    tx3 = Transaction.create_from_struct(tx2.get_struct())
    tx3.parents = [tx2.parents[1], tx2.parents[0]]
    tx3.resolve()
    # Propagate a conflicting twin transaction with tx2
    self.manager.propagate_tx(tx3)
    meta1 = tx2.get_metadata(force_reload=True)
    self.assertEqual(meta1.conflict_with, [tx3.hash])
    self.assertEqual(meta1.voided_by, {tx2.hash})
    self.assertEqual(meta1.twins, [tx3.hash])
    self.assertCountEqual(self.get_tips(), set([tx1.hash]))
    self.manager.reactor.advance(10)
    # Creating a new block that confirms tx3, then is will become valid and voiding tx2
    new_block = add_new_block(self.manager, propagate=False)
    new_block.parents = [new_block.parents[0], tx1.hash, tx3.hash]
    new_block.resolve()
    new_block.verify()
    self.manager.propagate_tx(new_block, fails_silently=False)
    self.manager.reactor.advance(10)
    self.assertIsNone(self.manager.tx_storage.get_metadata(tx3.hash).voided_by)
    self.assertIsNotNone(self.manager.tx_storage.get_metadata(tx2.hash).voided_by)
    # The block confirms tx3, so it's not a tip
    self.assertCountEqual(self.get_tips(), set())