def set_onchain_secret( state: MediatorTransferState, channelidentifiers_to_channels: typing.ChannelMap, secret: typing.Secret, secrethash: typing.SecretHash, block_number: typing.BlockNumber, ) -> typing.List[Event]: """ Set the secret to all mediated transfers. The secret should have been learned from the secret registry. """ state.secret = secret for pair in state.transfers_pair: payer_channel = channelidentifiers_to_channels[ pair.payer_transfer.balance_proof.channel_identifier ] channel.register_onchain_secret( payer_channel, secret, secrethash, block_number, ) payee_channel = channelidentifiers_to_channels[ pair.payee_transfer.balance_proof.channel_identifier ] channel.register_onchain_secret( channel_state=payee_channel, secret=secret, secrethash=secrethash, secret_reveal_block_number=block_number, ) # Like the off-chain secret reveal, the secret should never be revealed # on-chain if there is a waiting transfer. if state.waiting_transfer: payer_channel = channelidentifiers_to_channels[ state.waiting_transfer.transfer.balance_proof.channel_identifier ] channel.register_onchain_secret( channel_state=payer_channel, secret=secret, secrethash=secrethash, secret_reveal_block_number=block_number, ) unexpected_reveal = EventUnexpectedSecretReveal( secrethash=secrethash, reason='The mediator has a waiting transfer.', ) return [unexpected_reveal] return list()
def set_offchain_secret( state: MediatorTransferState, channelidentifiers_to_channels: typing.ChannelMap, secret: typing.Secret, secrethash: typing.SecretHash, ) -> typing.List[Event]: """ Set the secret to all mediated transfers. """ state.secret = secret for pair in state.transfers_pair: payer_channel = channelidentifiers_to_channels[ pair.payer_transfer.balance_proof.channel_identifier ] channel.register_offchain_secret( payer_channel, secret, secrethash, ) payee_channel = channelidentifiers_to_channels[ pair.payee_transfer.balance_proof.channel_identifier ] channel.register_offchain_secret( payee_channel, secret, secrethash, ) # The secret should never be revealed if `waiting_transfer` is not None. # For this to happen this node must have received a transfer, which it did # *not* mediate, and neverthless the secret was revealed. # # This can only be possible if the initiator reveals the secret without the # target's secret request, or if the node which sent the `waiting_transfer` # has sent another transfer which reached the target (meaning someone along # the path will lose tokens). if state.waiting_transfer: payer_channel = channelidentifiers_to_channels[ state.waiting_transfer.transfer.balance_proof.channel_identifier ] channel.register_offchain_secret( payer_channel, secret, secrethash, ) unexpected_reveal = EventUnexpectedSecretReveal( secrethash=secrethash, reason='The mediator has a waiting transfer.', ) return [unexpected_reveal] return list()