Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refunding rollups on failed ics20 transfers does not check if sequencer is source or sink of an asset #1514

Closed
SuperFluffy opened this issue Sep 18, 2024 · 0 comments · Fixed by #1495
Labels
bug Something isn't working ibc pertaining to ibc, including ics20 sequencer pertaining to the astria-sequencer crate

Comments

@SuperFluffy
Copy link
Member

SuperFluffy commented Sep 18, 2024

When refunding failed ics20 transfers, sequencer short circuits when it can determine that a refund is due to a failed ics20 transfer originating from a rollup:

if is_refund
&& serde_json::from_str::<memos::v1alpha1::Ics20WithdrawalFromRollup>(&packet_data.memo)
.is_ok()
{
execute_withdrawal_refund_to_rollup(state, packet_data)
.await
.wrap_err("failed to execute rollup withdrawal refund")?;
return Ok(());
}

In execute_withdrawal_refund_to_rollup it subsequently does not check if sequencer is a source or sink for the refunded asset. This means that the asset will never be taken from the ics20 escrow channel.

This issue was found in a review of the refactor PR #1495.

┆Issue Number: ENG-816

@SuperFluffy SuperFluffy added bug Something isn't working sequencer pertaining to the astria-sequencer crate ibc pertaining to ibc, including ics20 labels Sep 18, 2024
github-merge-queue bot pushed a commit that referenced this issue Sep 19, 2024
## Summary
Fixes incorrect addresses in ics20 refunds, and fixes/adds source vs
sink zone detection of received/refunded asets.

## Background
This PR started with the goal of using
`Ics20WithdrawalFromRollup.rollup_return_address` when emitting ics20
deposit events instead of the rollup's bridge address (which for the
rollup was quite meaningless).

However, because the original logic was overly convoluted, this patch
evolved into a refactor which subsequently revealed 2 more bugs.

## Changes
- Refactor ics20 logic: split up `execute_ics20_transfer` into two
functions `receive_tokens` and `refund_tokens`
- Fix deposit events being emitted with the packet sender/bridge address
as the receiving address on the rollup: instead use
`Ics20WithdrawalFromRollup.rollup_return_address` which is the address
originally supplied and understood by the rollup.
- Fix bridge lock events of source tokens being emitted with an extra
(port, channel) pair added (this resulting token is likely completely
meaningless and not understood by the rollup): instead strip the leading
(port, channel) pair to get the original token on sequencer.
- Fix refunds to a rollup of failed ics20 transfers not checking if
sequencer is their source or sink zone: instead perform the check and
decrease the ibc escrow account is necessary.

## Testing

Renamed and expanded tests to also check for sink vs source zone assets
being received, the correct asset being emitted in bridge lock events,
and the correct rollup return address being emitted in refunds.
Specifically these tests were added or renamed:


- `receive_source_zone_asset_on_sequencer_account`
- `receive_sink_zone_asset_on_sequencer_account`
- `receive_source_zone_asset_on_bridge_account_and_emit_to_rollup`
- `receive_sink_zone_asset_on_bridge_account_and_emit_to_rollup`
- `transfer_to_bridge_is_rejected_due_to_invalid_memo`
- `transfer_to_bridge_account_is_rejected_due_to_not_permitted_token`
- `refund_sequencer_account_with_source_zone_asset`
- `refund_sequencer_account_with_sink_zone_asset`
- `refund_rollup_with_sink_zone_asset`
- `refund_rollup_with_source_zone_asset`
- `refund_rollup_with_source_zone_asset_compat_prefix`

## Related Issues
Closes #1439
Closes #1496
Closes #1514

---------

Co-authored-by: noot <36753753+noot@users.noreply.github.com>
github-merge-queue bot pushed a commit that referenced this issue Sep 19, 2024
## Summary
Fixes incorrect addresses in ics20 refunds, and fixes/adds source vs
sink zone detection of received/refunded asets.

## Background
This PR started with the goal of using
`Ics20WithdrawalFromRollup.rollup_return_address` when emitting ics20
deposit events instead of the rollup's bridge address (which for the
rollup was quite meaningless).

However, because the original logic was overly convoluted, this patch
evolved into a refactor which subsequently revealed 2 more bugs.

## Changes
- Refactor ics20 logic: split up `execute_ics20_transfer` into two
functions `receive_tokens` and `refund_tokens`
- Fix deposit events being emitted with the packet sender/bridge address
as the receiving address on the rollup: instead use
`Ics20WithdrawalFromRollup.rollup_return_address` which is the address
originally supplied and understood by the rollup.
- Fix bridge lock events of source tokens being emitted with an extra
(port, channel) pair added (this resulting token is likely completely
meaningless and not understood by the rollup): instead strip the leading
(port, channel) pair to get the original token on sequencer.
- Fix refunds to a rollup of failed ics20 transfers not checking if
sequencer is their source or sink zone: instead perform the check and
decrease the ibc escrow account is necessary.

## Testing

Renamed and expanded tests to also check for sink vs source zone assets
being received, the correct asset being emitted in bridge lock events,
and the correct rollup return address being emitted in refunds.
Specifically these tests were added or renamed:


- `receive_source_zone_asset_on_sequencer_account`
- `receive_sink_zone_asset_on_sequencer_account`
- `receive_source_zone_asset_on_bridge_account_and_emit_to_rollup`
- `receive_sink_zone_asset_on_bridge_account_and_emit_to_rollup`
- `transfer_to_bridge_is_rejected_due_to_invalid_memo`
- `transfer_to_bridge_account_is_rejected_due_to_not_permitted_token`
- `refund_sequencer_account_with_source_zone_asset`
- `refund_sequencer_account_with_sink_zone_asset`
- `refund_rollup_with_sink_zone_asset`
- `refund_rollup_with_source_zone_asset`
- `refund_rollup_with_source_zone_asset_compat_prefix`

## Related Issues
Closes #1439
Closes #1496
Closes #1514

---------

Co-authored-by: noot <36753753+noot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working ibc pertaining to ibc, including ics20 sequencer pertaining to the astria-sequencer crate
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant