code: def handle_block(
          target_state: TargetTransferState,
          channel_state: NettingChannelState,
          block_number: BlockNumber,
          block_hash: BlockHash,
  ) -> TransitionResult[TargetTransferState]:
      
      transfer = target_state.transfer
      events: List[Event] = list()
      lock = transfer.lock
  
      secret_known = channel.is_secret_known(
          channel_state.partner_state,
          lock.secrethash,
      )
      lock_has_expired, _ = channel.is_lock_expired(
          end_state=channel_state.our_state,
          lock=lock,
          block_number=block_number,
          lock_expiration_threshold=channel.get_receiver_expiration_threshold(lock),
      )
  
      if lock_has_expired and target_state.state != 'expired':
          failed = EventUnlockClaimFailed(
              identifier=transfer.payment_identifier,
              secrethash=transfer.lock.secrethash,
              reason=f'lock expired',
          )
          target_state.state = TargetTransferState.EXPIRED
          events = [failed]
      elif secret_known:
          events = events_for_onchain_secretreveal(
              target_state=target_state,
              channel_state=channel_state,
              block_number=block_number,
              block_hash=block_hash,
          )
  
      return TransitionResult(target_state, events)
docs: After Raiden learns about a new block this function must be called to
      handle expiration of the hash time lock.