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

fix(eIBC): bridging_fee taken from original recipient and not from fufliller #918

Conversation

mtsitrin
Copy link
Contributor

@mtsitrin mtsitrin commented Jun 10, 2024

This PR moves the "bridging fee" tax from the fulfiller to the original destination address of the transfer.

So when a demand order created:

* Price = transfer amt - fee **- bridging fee**
* Fee  = as set in memo

instead of currently:

* Price = transfer amt - fee
* Fee  = as set in memo - bridging fee

So the fulfiller sends the Price on fulfillment, and gets
Amt **- bridging fee** (==fee)

Closes #917

Summary by CodeRabbit

  • New Features

    • Introduced EIBCDemandOrderHandler to manage EIBC packets by creating demand orders based on packet data.
    • Added LogString method for RollappPacket to generate formatted strings of packet details.
    • Added BlockedAddr method to check for blocked addresses.
  • Refactor

    • Renamed various methods and fields for clarity and consistency.
    • Updated package name from delayedack to keeper.
  • Style

    • Improved comments for better clarity and consistency.

Copy link
Contributor

coderabbitai bot commented Jun 10, 2024

Walkthrough

The changes focus on restructuring the Keeper struct and various functions in the eibc module. Key updates include replacing embedded types with explicit fields, renaming methods for clarity, and adding new functionality such as checking if an address is blocked. The restructuring should improve readability, maintainability, and consistency. Additionally, the EIBCDemandOrderHandler now handles IBC packets more effectively by differentiating packet types and processing them accordingly.

Changes

File Change Summary
x/eibc/keeper/keeper.go Restructured Keeper struct, updated method names, added new functions for demand order handling.
x/eibc/keeper/demand_order.go Changed package name, renamed functions, added demand order handling and BlockedAddr method.
x/common/types/rollapp_packet.go Introduced new LogString() method to RollappPacket for formatted string representation.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Keeper
    participant RollappPacket
    participant AccountKeeper
    participant BankKeeper

    User->>Keeper: Initiate EIBCDemandOrderHandler
    Keeper->>RollappPacket: Validate Packet
    Note over Keeper: Check if Address is Blocked
    Keeper->>AccountKeeper: Create Demand Order
    AccountKeeper-->>Keeper: Returns Demand Order
    Keeper->>BankKeeper: Process Payment
    BankKeeper-->>Keeper: Payment Success
    Keeper-->>User: Demand Order Processed Successfully
Loading

Assessment against linked issues

Objective Addressed Explanation
Change ibc bridge fee to be taken from original recipient and not from fulfiller (#917) There is no clear indication in the provided changeset that the IBC bridge fee handling logic has been updated to charge the original recipient instead of the fulfiller.

Poem

Amidst the code, a rabbit’s tale,
Where Keeper's roles now clear and hale.
No more tangled in a nested stack,
EIBC orders on the proper track.
Address checks now keep us safe,
In this structured digital scape.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Outside diff range and nitpick comments (1)
app/app.go (1)

655-655: Ensure that the EIBCKeeper reference is correctly managed throughout the application lifecycle.

Passing EIBCKeeper by reference allows for more flexible and efficient management of its state across different parts of the application. However, it's crucial to ensure that all parts of the application that interact with EIBCKeeper are updated to handle it as a reference to avoid runtime errors. Consider adding unit tests to cover these interactions.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between a74ffb0 and 14c1f5c.

Files selected for processing (11)
  • app/app.go (1 hunks)
  • ibctesting/eibc_test.go (8 hunks)
  • x/bridging_fee/ibc_middleware.go (2 hunks)
  • x/delayedack/ibc_middleware.go (3 hunks)
  • x/delayedack/keeper/keeper.go (2 hunks)
  • x/delayedack/types/expected_keepers.go (2 hunks)
  • x/eibc/keeper/demand_order.go (9 hunks)
  • x/eibc/keeper/invariants.go (1 hunks)
  • x/eibc/keeper/keeper.go (4 hunks)
  • x/eibc/keeper/msg_server.go (1 hunks)
  • x/eibc/keeper/msg_server_test.go (1 hunks)
Files skipped from review due to trivial changes (1)
  • x/eibc/keeper/msg_server_test.go
Additional comments not posted (27)
x/eibc/keeper/msg_server.go (4)

46-46: Ensure proper handling of blocked addresses.

This check prevents transactions involving blocked addresses, aligning with security best practices.


50-50: Validate the existence of the fulfiller's account.

This validation ensures that the fulfiller's account exists before proceeding, which is crucial for the integrity of the transaction.


56-56: Ensure funds transfer logic is correct.

The logic to transfer funds from the fulfiller to the recipient is crucial for the correct execution of the order.


62-65: Confirm order fulfillment updates.

This segment correctly updates the order status and handles potential errors, ensuring robust error handling and state management.

x/delayedack/types/expected_keepers.go (1)

50-50: Addition of EIBCDemandOrderHandler method to EIBCKeeper.

This new method enhances the interface by providing a clear contract for handling EIBC demand orders, which is essential for the new functionality introduced in this PR.

x/eibc/keeper/invariants.go (1)

70-70: Ensure underlying packets for demand orders are correctly retrieved.

This invariant check is crucial for maintaining the integrity of the system by ensuring that all demand orders have corresponding underlying packets.

x/bridging_fee/ibc_middleware.go (1)

102-104: Enhance event attributes for bridging fee transactions.

The addition of these attributes improves the traceability and clarity of bridging fee transactions by providing detailed information about the receiver, denomination, and amount.

x/eibc/keeper/keeper.go (4)

23-25: The restructuring of the Keeper struct to use individual fields for ak, bk, and dack instead of embedding types directly is a good practice. This change enhances clarity and control over the dependencies.


44-50: The constructor function NewKeeper correctly initializes the Keeper struct with the new fields. This ensures that all dependencies are properly set up when a new instance of Keeper is created.


109-116: The method SetOrderFulfilled is well-implemented with clear documentation and proper error handling. The addition of a hook call after the demand order is fulfilled is a good practice, as it allows for extensible behavior.


210-210: The addition of the SetDelayedAckKeeper method in the Keeper struct allows for dynamic setting of the DelayedAckKeeper. This is useful for cases where the keeper needs to be swapped or reinitialized during runtime.

x/eibc/keeper/demand_order.go (5)

17-23: The BlockedAddr method is correctly implemented to check if an address is blocked. It uses the BankKeeper's BlockedAddr method, which abstracts away the specifics of how addresses are determined to be blocked.


Line range hint 29-75: The EIBCDemandOrderHandler method is well-structured and handles different packet types effectively. The use of a switch statement to handle different types of rollapp packets (ON_RECV, ON_TIMEOUT, ON_ACK) is clear and maintainable.


Line range hint 86-112: The createDemandOrderFromIBCPacket method is comprehensive and handles the creation of demand orders robustly. It includes validation of packet data and calculation of fees, which are crucial for the integrity of demand orders.


139-145: The logic to ensure that the eIBC fee is not smaller than the bridging fee is crucial for preventing financial losses for fulfillers. This check improves the robustness of the fee handling mechanism.


159-159: The getEIBCTransferDenom method correctly handles the determination of the denomination for eIBC transfers. It considers whether the receiver chain is the source and adjusts the denomination accordingly, which is important for correct value transfers across chains.

x/delayedack/ibc_middleware.go (3)

105-105: The call to EIBCDemandOrderHandler in the OnRecvPacket method is correctly placed to handle the creation of demand orders upon the receipt of packets. This ensures that the eIBC logic is integrated into the packet reception process.


197-197: The integration of EIBCDemandOrderHandler in the OnAcknowledgementPacket method is appropriate for handling cases where the acknowledgement is an error. This ensures that demand orders are created even in error scenarios, which is important for robust error handling.


280-280: The addition of EIBCDemandOrderHandler in the OnTimeoutPacket method is crucial for handling timeout scenarios. This ensures that demand orders are processed even when packets timeout, which is important for maintaining consistency and reliability in packet handling.

x/delayedack/keeper/keeper.go (1)

160-161: The delegation of the EIBCDemandOrderHandler method to the EIBCKeeper is a good example of using composition over inheritance, which simplifies the architecture and makes the code easier to manage.

ibctesting/eibc_test.go (7)

183-183: Introduce bankKeeper variable to improve test isolation.

This change allows the test to manipulate and verify bank operations directly, enhancing test reliability and clarity.


216-216: Ensure correct handling of initial balances.

Retrieving the initial balance of the IBC original recipient is crucial for validating the state changes accurately in the test.


245-245: Check the fulfiller's balance after finalization.

This step is essential for ensuring that the fulfiller's balance is updated correctly after the transaction, which is critical for the integrity of the test.


288-288: Validate the demand order fulfillment logic.

This line initiates the process of fulfilling a demand order, which is central to the test's objective of verifying the eIBC functionality.


310-311: Verify the balances of fulfiller and recipient after transactions.

These lines are crucial for asserting that the balances are updated correctly post-transaction, which is a key aspect of the test's integrity.


326-326: Check the fulfiller's balance after the rollapp state finalization.

This ensures that the test verifies the final state of the fulfiller's balance, confirming the correct application of transaction effects.


372-372: Introduce bankKeeper variable in the timeout test scenario.

Similar to the earlier introduction of bankKeeper, this change allows for direct manipulation and verification of bank operations in the context of timeout handling, improving test accuracy.

@mtsitrin mtsitrin requested a review from omritoptix June 10, 2024 08:02
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 14c1f5c and 31dc352.

Files selected for processing (1)
  • x/eibc/keeper/keeper.go (4 hunks)
Files skipped from review as they are similar to previous changes (1)
  • x/eibc/keeper/keeper.go

@mtsitrin mtsitrin requested a review from danwt June 10, 2024 11:41
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 31dc352 and c48d2f9.

Files selected for processing (1)
  • x/eibc/keeper/demand_order.go (9 hunks)
Files skipped from review as they are similar to previous changes (1)
  • x/eibc/keeper/demand_order.go

…en-from-original-recipient-and-not-from-fufliller-when-using-eibc
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between c48d2f9 and a6aa551.

Files selected for processing (8)
  • app/app.go (1 hunks)
  • ibctesting/eibc_test.go (8 hunks)
  • x/bridging_fee/ibc_middleware.go (2 hunks)
  • x/delayedack/ibc_middleware.go (3 hunks)
  • x/delayedack/keeper/keeper.go (2 hunks)
  • x/delayedack/types/expected_keepers.go (2 hunks)
  • x/eibc/keeper/invariants.go (1 hunks)
  • x/eibc/keeper/keeper.go (4 hunks)
Files skipped from review as they are similar to previous changes (8)
  • app/app.go
  • ibctesting/eibc_test.go
  • x/bridging_fee/ibc_middleware.go
  • x/delayedack/ibc_middleware.go
  • x/delayedack/keeper/keeper.go
  • x/delayedack/types/expected_keepers.go
  • x/eibc/keeper/invariants.go
  • x/eibc/keeper/keeper.go

Copy link
Contributor

@zale144 zale144 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work! left a couple of comments

if amt.LT(fee) {
return nil, fmt.Errorf("fee cannot be larger than amount: fee: %s: amt :%s", fee, fungibleTokenPacketData.Amount)
}

// Get the bridging fee from the amount
bridgingFee := k.dack.BridgingFeeFromAmt(ctx, amt)
demandOrderPrice := amt.Sub(fee).Sub(bridgingFee)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isn't it possible that the demandOrderPrice can be zero or less? I think the check on line 105: if amt.LT(fee) should include the bridgingFee as well

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also, it would be nice to cover this with tests

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added check.
UT will be handled in #916

@mtsitrin mtsitrin requested a review from zale144 June 13, 2024 08:56
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between a6aa551 and 6952722.

Files selected for processing (1)
  • x/eibc/keeper/demand_order.go (9 hunks)
Files skipped from review as they are similar to previous changes (1)
  • x/eibc/keeper/demand_order.go

if amt.LT(fee) {
return nil, fmt.Errorf("fee cannot be larger than amount: fee: %s: amt :%s", fee, fungibleTokenPacketData.Amount)
}

// Get the bridging fee from the amount
bridgingFee := k.dack.BridgingFeeFromAmt(ctx, amt)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

onTimeout and AckErr shouldn't charge bridging fee, only OnRecv

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 6952722 and b76bce7.

Files selected for processing (2)
  • x/common/types/rollapp_packet.go (1 hunks)
  • x/eibc/keeper/demand_order.go (1 hunks)
Additional comments not posted (5)
x/common/types/rollapp_packet.go (1)

11-14: The new LogString() method provides a clear, formatted string of RollappPacket's important fields, which enhances logging and debugging capabilities.

x/eibc/keeper/demand_order.go (4)

1-1: Changing the package name from delayedack to keeper aligns with the restructuring of the module, promoting clarity and consistency.


25-58: The EIBCDemandOrderHandler method has been updated to handle different types of rollappPacket. The logic is well-structured, separating concerns based on packet type, which enhances readability and maintainability.


60-107: The createDemandOrderFromIBCPacket function is robust, with comprehensive error handling and validations. It correctly handles various scenarios, including blocked addresses and validation of the metadata and amount.


109-190: The PrepareProtocolDemandOrder function has been updated to handle timeout and ack error scenarios. The method is well-documented and follows good coding practices by validating inputs and handling errors appropriately.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between b76bce7 and 2b15914.

Files selected for processing (1)
  • x/eibc/keeper/demand_order.go (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • x/eibc/keeper/demand_order.go

Copy link
Contributor

@danwt danwt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please rename and give a short docstring to PrepareProtocolDemandOrder
And dry out the fungibleTokenPacketData vaildation and blocked addr, and
eibctypes.NewDemandOrder bits

other than that nice work

Comment on lines 11 to 14
func (r RollappPacket) LogString() string {
return fmt.Sprintf("RollappPacket{%s, %s, %s, %s, %s, %d}",
r.RollappId, r.Type, r.Status, r.Packet.SourcePort, r.Packet.SourceChannel, r.Packet.Sequence)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add error and proof height

Comment on lines 114 to 115
func (k Keeper) EIBCDemandOrderHandler(ctx sdk.Context, rollappPacket commontypes.RollappPacket, transferPacketData transfertypes.FungibleTokenPacketData) error {
return k.EIBCKeeper.EIBCDemandOrderHandler(ctx, rollappPacket, transferPacketData)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline

Comment on lines 132 to 146
/*
In case of timeout/errack:

fee = fee_multiplier*transfer_amount
price = transfer_amount-fee
order is created with (price,fee)
the order creator immediately receives price on fulfillment from fulfiller
when the ack/timeout finalizes, the fulfiller receives the transfer_amount

therefore:
fulfiller balance += (transfer_amount - (transfer_amount-fee))
equivalent to += fee_multiplier*transfer_amount
demander balance += (transfer_amount - fee)
equivalent to += (1-fee_multiplier)*transfer_amount
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

invalid docstring format

Comment on lines 150 to 152
// Validate the fungible token packet data as we're going to use it to create the demand order
if err := fungibleTokenPacketData.ValidateBasic(); err != nil {
return nil, err
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

its already validated right?

Comment on lines 181 to 185
order := eibctypes.NewDemandOrder(*rollappPacket, demandOrderPrice, fee, demandOrderDenom, demandOrderRecipient)
if err := order.Validate(); err != nil {
return nil, fmt.Errorf("validate eibc data: %w", err)
}
return order, nil
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

duplicated, could be dried out

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dried out some
but the creation I prefer to do in the inner func, otherwise I need to return all args (demandOrderPrice, fee, demandOrderDenom, demandOrderRecipient)

@danwt
Copy link
Contributor

danwt commented Jun 14, 2024

I would say though it's getting very hard and confusing to follow for me

We should refactor at some point to just have 1 very clear calculation in the code somehwere

	// fulfiller balance += transferAmt - bridgeFee - (transferAmt - bridgeFee - fee)
	// receiver balance += transferAmt - bridgeFee - fee
	// bridge balance += fee
	```

@mtsitrin mtsitrin requested a review from danwt June 16, 2024 07:30
@mtsitrin mtsitrin requested a review from omritoptix June 16, 2024 07:30
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 2b15914 and 827211e.

Files selected for processing (3)
  • x/common/types/rollapp_packet.go (1 hunks)
  • x/delayedack/keeper/keeper.go (2 hunks)
  • x/eibc/keeper/demand_order.go (1 hunks)
Files skipped from review as they are similar to previous changes (3)
  • x/common/types/rollapp_packet.go
  • x/delayedack/keeper/keeper.go
  • x/eibc/keeper/demand_order.go

@mtsitrin mtsitrin requested a review from omritoptix June 17, 2024 07:38
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Outside diff range and nitpick comments (1)
x/eibc/keeper/demand_order.go (1)

17-21: This function's documentation effectively outlines its responsibilities and the conditions under which it operates. However, it could be enhanced by specifying what types of errors might be returned and under what conditions.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 827211e and 6af3822.

Files selected for processing (1)
  • x/eibc/keeper/demand_order.go (1 hunks)
Additional comments not posted (1)
x/eibc/keeper/demand_order.go (1)

27-33: Excellent error handling for basic validation and blocked address checks. This ensures that only valid and permitted operations proceed, enhancing the security and integrity of the transactions.

Copy link
Contributor

@danwt danwt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gj

@mtsitrin mtsitrin merged commit 7654979 into main Jun 18, 2024
49 of 88 checks passed
@mtsitrin mtsitrin deleted the mtsitrin/917-change-ibc-bridge-fee-to-be-taken-from-original-recipient-and-not-from-fufliller-when-using-eibc branch June 18, 2024 10:17
danwt added a commit that referenced this pull request Jun 18, 2024
danwt added a commit that referenced this pull request Jun 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Change ibc bridge fee to be taken from original recipient and not from fufliller when using eibc
4 participants