Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
network_balance = token.balance_of(
address=Address(token_network_address), block_identifier=blockhash
)
token_network_deposit_limit = token_network_proxy.token_network_deposit_limit(
block_identifier=blockhash
)
addendum = total_deposit - channel_state.our_state.contract_balance
channel_participant_deposit_limit = token_network_proxy.channel_participant_deposit_limit(
block_identifier=blockhash
)
total_channel_deposit = total_deposit + channel_state.partner_state.contract_balance
is_channel_open = channel.get_status(channel_state) == ChannelState.STATE_OPENED
if not is_channel_open:
raise UnexpectedChannelState("Channel is not in an open state.")
if safety_deprecation_switch:
msg = (
"This token_network has been deprecated. "
"All channels in this network should be closed and "
"the usage of the newly deployed token network contract "
"is highly encouraged."
)
raise TokenNetworkDeprecated(msg)
if total_deposit <= channel_state.our_state.contract_balance:
raise DepositMismatch("Total deposit did not increase.")
Returns:
TransitionResult: The resulting iteration.
"""
events: List[Event] = list()
if mediator_state.secret is None:
# The last sent transfer is the only one that may be refunded, all the
# previous ones are refunded already.
transfer_pair = mediator_state.transfers_pair[-1]
payee_transfer = transfer_pair.payee_transfer
payer_transfer = mediator_state_change.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())
is_valid, channel_events, _ = channel.handle_refundtransfer(
received_transfer=payee_transfer,
channel_state=payer_channel,
refund=mediator_state_change,
)
if not is_valid:
return TransitionResult(mediator_state, channel_events)
mediator_state.refunded_channels.append(
payer_channel.canonical_identifier.channel_identifier
)
iteration = mediate_transfer(
state=mediator_state,
candidate_route_states=mediator_state.routes,
payer_channel=payer_channel,
channelidentifiers_to_channels=channelidentifiers_to_channels,
nodeaddresses_to_networkstates=nodeaddresses_to_networkstates,
def from_channel_state(cls, channel_state: NettingChannelState) -> "PFSCapacityUpdate":
# pylint: disable=unexpected-keyword-arg
return cls(
canonical_identifier=channel_state.canonical_identifier,
updating_participant=channel_state.our_state.address,
other_participant=channel_state.partner_state.address,
updating_nonce=channel.get_current_nonce(channel_state.our_state),
other_nonce=channel.get_current_nonce(channel_state.partner_state),
updating_capacity=channel.get_distributable(
sender=channel_state.our_state, receiver=channel_state.partner_state
),
other_capacity=channel.get_distributable(
sender=channel_state.partner_state, receiver=channel_state.our_state
),
reveal_timeout=channel_state.reveal_timeout,
signature=EMPTY_SIGNATURE,
)
def has_secret_registration_started(
channel_states: List[NettingChannelState],
transfers_pair: List[MediationPairState],
secrethash: SecretHash,
) -> bool:
# If it's known the secret is registered on-chain, the node should not send
# a new transaction. Note there is a race condition:
#
# - Node B learns the secret on-chain, sends a secret reveal to A
# - Node A receives the secret reveal off-chain prior to the event for the
# secret registration, if the lock is in the danger zone A will try to
# register the secret on-chain, because from its perspective the secret
# is not there yet.
is_secret_registered_onchain = any(
channel.is_secret_known_onchain(payer_channel.partner_state, secrethash)
for payer_channel in channel_states
)
has_pending_transaction = any(
pair.payer_state == "payer_waiting_secret_reveal" for pair in transfers_pair
)
return is_secret_registered_onchain or has_pending_transaction
should_send_balanceproof_to_payee = (
payee_channel_open
and payee_knows_secret
and not payee_payed
and is_safe_to_send_balanceproof
)
if should_send_balanceproof_to_payee:
# At this point we are sure that payee_channel exists due to the
# payee_channel_open check above. So let mypy know about this
assert payee_channel
payee_channel = cast(NettingChannelState, payee_channel)
pair.payee_state = "payee_balance_proof"
message_identifier = message_identifier_from_prng(pseudo_random_generator)
unlock_lock = channel.send_unlock(
channel_state=payee_channel,
message_identifier=message_identifier,
payment_identifier=pair.payee_transfer.payment_identifier,
secret=secret,
secrethash=secrethash,
)
unlock_success = EventUnlockSuccess(
pair.payer_transfer.payment_identifier, pair.payer_transfer.lock.secrethash
)
events.append(unlock_lock)
events.append(unlock_success)
return events
the current lock removed from the pending locks and the transferred amount
updated.
"""
iteration: TransitionResult[Optional[InitiatorTransferState]]
secret = state_change.secret
secrethash = initiator_state.transfer_description.secrethash
is_valid_secret = is_valid_secret_reveal(
state_change=state_change, transfer_secrethash=secrethash
)
is_channel_open = channel.get_status(channel_state) == ChannelState.STATE_OPENED
is_lock_expired = state_change.block_number > initiator_state.transfer.lock.expiration
is_lock_unlocked = is_valid_secret and not is_lock_expired
if is_lock_unlocked:
channel.register_onchain_secret(
channel_state=channel_state,
secret=secret,
secrethash=secrethash,
secret_reveal_block_number=state_change.block_number,
)
if is_lock_unlocked and is_channel_open:
events = events_for_unlock_lock(
initiator_state,
channel_state,
state_change.secret,
state_change.secrethash,
pseudo_random_generator,
)
iteration = TransitionResult(None, events)
else:
shortest_routes: List[Neighbour] = list()
# Always use a direct channel if available:
# - There are no race conditions and the capacity is guaranteed to be
# available.
# - There will be no mediation fees
# - The transfer will be faster
if to_address in all_neighbors:
for channel_id in token_network.partneraddresses_to_channelidentifiers[
Address(to_address)
]:
channel_state = token_network.channelidentifiers_to_channels[channel_id]
# direct channels don't have fees
payment_with_fee_amount = PaymentWithFeeAmount(amount)
is_usable = channel.is_channel_usable_for_new_transfer(
channel_state, payment_with_fee_amount, None
)
if is_usable is channel.ChannelUsability.USABLE:
direct_route = RouteState(
route=[Address(from_address), Address(to_address)],
forward_channel_id=channel_state.canonical_identifier.channel_identifier,
estimated_fee=FeeAmount(0),
)
return (None, [direct_route], None)
error_direct = is_usable
for partner_address in all_neighbors:
for channel_id in token_network.partneraddresses_to_channelidentifiers[partner_address]:
channel_state = token_network.channelidentifiers_to_channels[channel_id]
should_send_balanceproof_to_payee = (
payee_channel_open
and payee_knows_secret
and not payee_payed
and is_safe_to_send_balanceproof
)
if should_send_balanceproof_to_payee:
# At this point we are sure that payee_channel exists due to the
# payee_channel_open check above. So let mypy know about this
assert payee_channel
payee_channel = cast(NettingChannelState, payee_channel)
pair.payee_state = "payee_balance_proof"
message_identifier = message_identifier_from_prng(pseudo_random_generator)
unlock_lock = channel.send_unlock(
channel_state=payee_channel,
message_identifier=message_identifier,
payment_identifier=pair.payee_transfer.payment_identifier,
secret=secret,
secrethash=secrethash,
)
unlock_success = EventUnlockSuccess(
pair.payer_transfer.payment_identifier, pair.payer_transfer.lock.secrethash
)
events.append(unlock_lock)
events.append(unlock_success)
return events
lock_timeout = BlockTimeout(payer_transfer.lock.expiration - block_number)
safe_to_use_channel = channel.is_channel_usable_for_mediation(
channel_state=payee_channel, transfer_amount=amount_after_fees, lock_timeout=lock_timeout
)
if not safe_to_use_channel:
return None, []
assert payee_channel.settle_timeout >= lock_timeout
assert payee_channel.token_address == payer_transfer.token
route_states = routes.prune_route_table(
route_states=route_state_table, selected_route=route_state
)
message_identifier = message_identifier_from_prng(pseudo_random_generator)
lockedtransfer_event = channel.send_lockedtransfer(
channel_state=payee_channel,
initiator=payer_transfer.initiator,
target=payer_transfer.target,
amount=amount_after_fees,
message_identifier=message_identifier,
payment_identifier=payer_transfer.payment_identifier,
expiration=payer_transfer.lock.expiration,
secrethash=payer_transfer.lock.secrethash,
route_states=route_states,
)
assert lockedtransfer_event
mediated_events: List[Event] = [lockedtransfer_event]
# create transfer pair
transfer_pair = MediationPairState(
payer_transfer=payer_transfer,
def handle_block(
target_state: TargetTransferState,
channel_state: NettingChannelState,
block_number: BlockNumber,
block_hash: BlockHash,
) -> TransitionResult[TargetTransferState]:
""" After Raiden learns about a new block this function must be called to
handle expiration of the hash time lock.
"""
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.expiration),
)
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: