code: def handle_offchain_secretreveal(
          mediator_state: MediatorTransferState,
          mediator_state_change: ReceiveSecretReveal,
          channelidentifiers_to_channels: ChannelMap,
          pseudo_random_generator: random.Random,
          block_number: BlockNumber,
          block_hash: BlockHash,
  ) -> TransitionResult[MediatorTransferState]:
      
      is_valid_reveal = is_valid_secret_reveal(
          state_change=mediator_state_change,
          transfer_secrethash=mediator_state.secrethash,
          secret=mediator_state_change.secret,
      )
      is_secret_unknown = mediator_state.secret is None
  
      # a SecretReveal should be rejected if the payer transfer
      # has expired. To check for this, we use the last
      # transfer pair.
      transfer_pair = mediator_state.transfers_pair[-1]
      payer_transfer = transfer_pair.payer_transfer
      channel_identifier = payer_transfer.balance_proof.channel_identifier
      payer_channel = channelidentifiers_to_channels.get(channel_identifier)
      if not payer_channel:
          return TransitionResult(mediator_state, list())
  
      has_payer_transfer_expired = channel.is_transfer_expired(
          transfer=transfer_pair.payer_transfer,
          affected_channel=payer_channel,
          block_number=block_number,
      )
  
      if is_secret_unknown and is_valid_reveal and not has_payer_transfer_expired:
          iteration = secret_learned(
              state=mediator_state,
              channelidentifiers_to_channels=channelidentifiers_to_channels,
              pseudo_random_generator=pseudo_random_generator,
              block_number=block_number,
              block_hash=block_hash,
              secret=mediator_state_change.secret,
              secrethash=mediator_state_change.secrethash,
              payee_address=mediator_state_change.sender,
          )
  
      else:
          iteration = TransitionResult(mediator_state, list())
  
      return iteration
docs: Handles the secret reveal and sends SendBalanceProof/RevealSecret if necessary.