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

feat: bridging fee middleware #899

Merged
merged 16 commits into from
Jun 5, 2024
Merged

Conversation

mtsitrin
Copy link
Contributor

@mtsitrin mtsitrin commented May 23, 2024

This PR implements a bridging fee middleware which:

  • For transfers from rollapp to hub:
    • on finalization, charges bridging fee amount and moves it to the txfees module

The middleware reads BridgingFee param stored on delayedAck keeper

ADR: https://www.notion.so/dymension/ADR-x-Bridging-Fee-middleware-7ba8c191373f43ce81782fc759913299?pvs=4

Description


Closes #892

All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow-up issues.

PR review checkboxes:

I have...

  • Added a relevant changelog entry to the Unreleased section in CHANGELOG.md
  • Targeted PR against the correct branch
  • included the correct type prefix in the PR title
  • Linked to the GitHub issue with discussion and accepted design
  • Targets only one GitHub issue
  • Wrote unit and integration tests
  • Wrote relevant migration scripts if necessary
  • All CI checks have passed
  • Added relevant godoc comments
  • Updated the scripts for local run, e.g genesis_config_commands.sh if the PR changes parameters
  • Add an issue in the e2e-tests repo if necessary

SDK Checklist

  • Import/Export Genesis
  • Registered Invariants
  • Registered Events
  • Updated openapi.yaml
  • No usage of go map
  • No usage of time.Now()
  • Used fixed point arithmetic and not float arithmetic
  • Avoid panicking in Begin/End block as much as possible
  • No unexpected math Overflow
  • Used sendCoin and not SendCoins
  • Out-of-block compute is bounded
  • No serialized ID at the end of store keys
  • UInt to byte conversion should use BigEndian

Full security checklist here

----;

For Reviewer:

  • Confirmed the correct type prefix in the PR title
  • Reviewers assigned
  • Confirmed all author checklist items have been addressed

---;

After reviewer approval:

  • In case the PR targets the main branch, PR should not be squash merge in order to keep meaningful git history.
  • In case the PR targets a release branch, PR must be rebased.

Summary by CodeRabbit

  • New Features

    • Introduced bridging fee checks to ensure fees meet minimum requirements.
  • Bug Fixes

    • Corrected spelling in test scenarios from IsFullfilled to IsFulfilled.
  • Tests

    • Enhanced test cases with additional parameter checks and new scenarios for non-profitable order fulfillment.
  • Chores

    • Updated function signatures and parameters for improved code consistency and maintainability.

@mtsitrin mtsitrin requested a review from a team as a code owner May 23, 2024 07:56
@mtsitrin mtsitrin linked an issue May 23, 2024 that may be closed by this pull request
@mtsitrin mtsitrin marked this pull request as draft May 23, 2024 07:56
@mtsitrin mtsitrin marked this pull request as ready for review May 23, 2024 11:25
@mtsitrin mtsitrin requested review from zale144 and danwt May 27, 2024 08:53
@@ -74,7 +74,7 @@ func (im IBCMiddleware) eIBCDemandOrderHandler(ctx sdk.Context, rollappPacket co
// It validates the fungible token packet data, extracts the fee from the memo,
// calculates the demand order price, and creates a new demand order.
// It returns the created demand order or an error if there is any.
func (im IBCMiddleware) createDemandOrderFromIBCPacket(fungibleTokenPacketData transfertypes.FungibleTokenPacketData,
func (im IBCMiddleware) createDemandOrderFromIBCPacket(ctx sdk.Context, fungibleTokenPacketData transfertypes.FungibleTokenPacketData,
Copy link
Contributor

Choose a reason for hiding this comment

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

it would be really nice to cover this file with unit tests, especially since it has some critical features, and now we are adding changes without the possibility of regression testing

Copy link
Contributor

Choose a reason for hiding this comment

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

for example, scenarios such as eibc_fee < bridging_fee...

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 #916

@@ -19,3 +19,8 @@ func (k Keeper) EpochIdentifier(ctx sdk.Context) (res string) {
k.paramstore.Get(ctx, types.KeyEpochIdentifier, &res)
return
}

func (k Keeper) BridgingFee(ctx sdk.Context) (res sdk.Dec) {
Copy link
Contributor

Choose a reason for hiding this comment

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

can we not decouple BridgingFee from delayedack.Params? Correct me if I'm wrong, but I think bridging fee params do not belong in delayedack. Injecting a BridgingFeeKeeper into delayedack would be cleaner IMO

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I didn't want to create additional keeper and paramspace just for this
IMO the delayedAck module is actually "IBC support for rollapps" module
which includes:

  • keeper, params, and common code
  • delayed ack middleware
  • bridging fee
  • etc..

Copy link
Contributor

Choose a reason for hiding this comment

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

I do kinda agree we should decide on what this module does
It's quickly going to become a god module
I would lean on splitting things up more

@danwt
Copy link
Contributor

danwt commented Jun 3, 2024

It would be good to link the issue and adr in the description

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.

Couple nits and questions

I think I agree with @zale144 on moving the bridging fee param

Somehow we don't want delayedack to become some god module

Comment on lines 127 to 129
case commontypes.RollappPacket_ON_RECV:
bridgingFee := im.keeper.BridgingFee(ctx).MulInt(amt).TruncateInt()
if bridgingFee.GT(fee) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
case commontypes.RollappPacket_ON_RECV:
bridgingFee := im.keeper.BridgingFee(ctx).MulInt(amt).TruncateInt()
if bridgingFee.GT(fee) {
case commontypes.RollappPacket_ON_RECV:
bridgingFee := im.keeper.BridgingFee(ctx).MulInt(amt).TruncateInt()
if bridgingFee.GT(fee) {
// We check that the fee the fulfiller makes is at least as big as the bridging fee they will have to pay later
// this is to improve UX and help fulfillers not lose money.

Copy link
Contributor

Choose a reason for hiding this comment

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

Could you add a method to delayedack keeper to calculate the fee, given an amt
and DRY out with the usage here

fee := feePercentage.MulInt(transferAmount).TruncateInt()

Copy link
Contributor

Choose a reason for hiding this comment

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

TBH
If there isn't a technical reason for this I'm not sure we should include it
It doesn't seem to me for delayedack to have awareness of bridging fee as a concept
And we should rely on frontend for these kind of UX wins

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It makes no sense to create a "losing" order for the market makers

Copy link
Contributor

Choose a reason for hiding this comment

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

It does make sense from the code perspective though
It's arguably more code to maintain, for a problem which can be solved on the frontend level (before it becomes a TX) more easily

Copy link
Contributor

Choose a reason for hiding this comment

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

I believe the general guideline of moving user UX/responsiblity off-chain makes sense in many cases and we should probably have this in mind. however as this is already implemented I'd suggest not to change it now and continue with current implementation.

@@ -55,6 +55,7 @@ func (k Keeper) finalizeRollappPacket(

switch rollappPacket.Type {
case commontypes.RollappPacket_ON_RECV:
// TODO: makes more sense to modify the packet when calling the handler, instead storing in db "wrong" packet
Copy link
Contributor

Choose a reason for hiding this comment

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

@omritoptix
I think we thought of that but I can't remember exactly why we didn't do it at the time
Maybe we were just in a rush I think
Do you remember?

Comment on lines +52 to 80
func validateBridgingFee(i interface{}) error {
v, ok := i.(sdk.Dec)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}
if v.IsNil() {
return fmt.Errorf("invalid global pool params: %+v", i)
}
if v.IsNegative() {
return fmt.Errorf("bridging fee must be positive: %s", v)
}

if v.GTE(sdk.OneDec()) {
return fmt.Errorf("bridging fee too large: %s", v)
}

return nil
}

func validateEpochIdentifier(i interface{}) error {
v, ok := i.(string)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}
if len(v) == 0 {
return fmt.Errorf("epoch identifier cannot be empty")
}
return nil
}
Copy link
Contributor

Choose a reason for hiding this comment

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

would be nice to use sdkerrors

Copy link
Contributor

coderabbitai bot commented Jun 3, 2024

Walkthrough

The changes introduce a bridging fee middleware for IBC transfers in the delayedack module. These include adding a ctx parameter to createDemandOrderFromIBCPacket, enforcing a bridging fee check, updating parameter validation, and modifying related tests. Additionally, the IBCMiddleware now uses im.keeper for extracting rollapp ID and transfer packet data.

Changes

File Path Change Summary
x/delayedack/eibc.go Added ctx parameter to createDemandOrderFromIBCPacket and implemented bridging fee check.
x/delayedack/ibc_middleware.go Updated function calls to use im.keeper for extracting rollapp ID and transfer packet data.
x/delayedack/keeper/finalize.go Added a comment suggesting packet modification instead of storing as "wrong" packet.
x/delayedack/types/params.go Added KeyBridgeFee, updated NewParams, and added validation functions for BridgingFee.
x/eibc/genesis_test.go Corrected spelling from IsFullfilled to IsFulfilled and updated corresponding values.
x/eibc/keeper/hooks_test.go Included EpochIdentifier parameter in TestAfterRollappPacketDeleted.
x/eibc/keeper/msg_server_test.go Simplified expected post-fulfillment event attributes and added a new test case.
x/eibc/types/expected_keepers.go Added BridgingFeeFromAmt method to DelayedAckKeeper interface.

Sequence Diagram(s) (Beta)

sequenceDiagram
    participant User
    participant Rollapp
    participant IBCMiddleware
    participant Keeper
    User ->> Rollapp: Initiates IBC transfer
    Rollapp ->> IBCMiddleware: Sends IBC packet
    IBCMiddleware ->> Keeper: Extracts rollapp ID and packet data
    IBCMiddleware ->> Keeper: Checks bridging fee
    Keeper -->> IBCMiddleware: Returns fee validation
    IBCMiddleware ->> Keeper: Creates demand order
    Keeper -->> IBCMiddleware: Demand order created
    IBCMiddleware ->> Rollapp: Acknowledges receipt
    Rollapp -->> User: Transfer completed
Loading

Assessment against linked issues

Objective Addressed Explanation
Implement Bridging_fee middleware (Issue #892)
Middleware should have fee param (Issue #892)
Middleware should enforce IBC tax on all rollapp transfers to the hub (#892)

Poem

In code, a bridge now stands so grand,
Fees are checked, as was planned.
Rollapps transfer, swift and free,
With middleware's careful decree.
A rabbit's joy in lines of lore,
For changes made, we all adore.
🌉🐇✨


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

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 9b7fe28 and 806ff30.

Files ignored due to path filters (1)
  • x/delayedack/types/params.pb.go is excluded by !**/*.pb.go
Files selected for processing (21)
  • app/app.go (3 hunks)
  • app/apptesting/events.go (1 hunks)
  • ibctesting/bridging_fee_test.go (1 hunks)
  • ibctesting/eibc_test.go (1 hunks)
  • proto/dymension/delayedack/params.proto (1 hunks)
  • x/bridging_fee/events.go (1 hunks)
  • x/bridging_fee/ibc_middleware.go (1 hunks)
  • x/delayedack/eibc.go (4 hunks)
  • x/delayedack/genesis_test.go (3 hunks)
  • x/delayedack/ibc_middleware.go (5 hunks)
  • x/delayedack/keeper/finalize.go (1 hunks)
  • x/delayedack/keeper/fraud_test.go (1 hunks)
  • x/delayedack/keeper/hooks_test.go (1 hunks)
  • x/delayedack/keeper/keeper.go (2 hunks)
  • x/delayedack/keeper/params.go (2 hunks)
  • x/delayedack/types/params.go (2 hunks)
  • x/eibc/keeper/hooks_test.go (1 hunks)
  • x/eibc/keeper/msg_server.go (1 hunks)
  • x/eibc/keeper/msg_server_test.go (2 hunks)
  • x/eibc/types/errors.go (1 hunks)
  • x/eibc/types/expected_keepers.go (1 hunks)
Files skipped from review due to trivial changes (1)
  • x/bridging_fee/events.go
Additional comments not posted (28)
proto/dymension/delayedack/params.proto (1)

14-18: The protobuf definition for bridging_fee is correctly implemented with appropriate tags and custom type.

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

10-10: The modifications to GetParams and the addition of the BridgingFee method are correctly implemented and align with the PR objectives.

Also applies to: 23-26

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

23-23: The addition of the BridgingFee method to the DelayedAckKeeper interface is correctly implemented and necessary for the bridging fee functionality.

x/eibc/types/errors.go (1)

22-22: The addition of the ErrDemandOrderNotProfitable error is correctly implemented and aligns with the PR objectives for handling non-profitable orders.

app/apptesting/events.go (1)

54-54: The change from s.Require() to s.Assert() in AssertAttributes is a good practice in testing, allowing the continuation of test execution even if the assertion fails.

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

13-19: The additions and modifications related to BridgingFee in the Params struct, including new keys, default values, and validation functions, are correctly implemented and crucial for the module's functionality.

Also applies to: 23-23, 32-35, 41-41, 47-49, 52-69, 71-79, 84-88

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

46-48: This check ensures that the demand order is profitable by comparing the fee with the bridging fee. The logic appears correct and aligns with the PR's objectives.

x/delayedack/genesis_test.go (1)

27-27: The tests for BridgingFee in InitGenesis are well-implemented. They correctly handle cases with and without the BridgingFee parameter, ensuring robust initialization.

Also applies to: 33-39

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

73-73: The test for handling BridgingFee in the AfterEpochEnd hook is correctly implemented. It ensures that the system behaves as expected when the epoch ends, with the BridgingFee parameter set.

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

68-68: The test for handling BridgingFee in the AfterEpochEnd hook within the EIBC module is correctly implemented. It ensures that the system behaves as expected when the epoch ends, with the BridgingFee parameter set.

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

66-66: The test for handling BridgingFee in the AfterEpochEnd hook within the DelayedAck module is correctly implemented. It ensures that the system behaves as expected when the epoch ends, with the BridgingFee parameter set.

x/bridging_fee/ibc_middleware.go (1)

55-114: The implementation of OnRecvPacket in BridgingFeeMiddleware correctly handles the calculation and deduction of the bridging fee from the packet data. This is crucial for ensuring that the bridging fee is applied correctly before further processing.

ibctesting/bridging_fee_test.go (2)

26-50: The test TestNotRollappNoBridgingFee correctly verifies that no bridging fee is applied when transferring from a non-rollapp chain.


52-106: The test TestBridgingFee effectively validates the correct deduction of bridging fees on transfers from a rollapp, ensuring the system's financial integrity.

x/delayedack/eibc.go (1)

Line range hint 77-133: The enhancements in createDemandOrderFromIBCPacket to ensure the eIBC fee is not smaller than the bridging fee are crucial for maintaining financial integrity and improving user experience.

x/delayedack/ibc_middleware.go (3)

54-54: Enhancements in error handling and clarity in OnRecvPacket improve the robustness of packet processing.


136-136: The updates to OnAcknowledgementPacket enhance the system's reliability by improving error handling and validation processes.


222-222: The improvements in OnTimeoutPacket ensure consistent and reliable handling of timeout scenarios, enhancing overall system stability.

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

82-110: The updates to ExtractRollappIDAndTransferPacket enhance the accuracy and reliability of packet processing by improving error handling and validation.

x/eibc/keeper/msg_server_test.go (3)

139-141: The test case for already fulfilled demand orders is well-structured and covers the expected scenario appropriately.


162-164: The test case for demand orders with a status other than pending is correctly handled and tested.


186-188: The test case for non-profitable demand orders is well-implemented, ensuring that such orders are not fulfilled.

ibctesting/eibc_test.go (3)

43-43: The addition of BridgingFee to the test setup is correctly implemented.


43-43: Comprehensive testing of demand order creation under various scenarios enhances the robustness of the feature.


43-43: The test for demand order fulfillment is well-structured and covers both successful and error scenarios effectively.

app/app.go (3)

12-12: Integration of bridging_fee module.

This import is necessary for the subsequent use of the bridging_fee middleware in the application's IBC setup. It aligns with the PR's objective to implement a bridging fee middleware.


746-746: Proper integration of bridging_fee middleware in the IBC stack.

The bridging_fee.NewIBCMiddleware is correctly instantiated with the necessary dependencies. This setup is crucial for enforcing the bridging fee on transfers as described in the PR objectives.


1031-1031: Exclusion of txfeestypes.ModuleName from module account addresses.

This change is necessary to allow the txfees module to interact with the accounts directly, which is likely related to the handling of transaction fees, including the new bridging fees.

@@ -55,6 +55,7 @@ func (k Keeper) finalizeRollappPacket(

switch rollappPacket.Type {
case commontypes.RollappPacket_ON_RECV:
// TODO: makes more sense to modify the packet when calling the handler, instead storing in db "wrong" packet
Copy link
Contributor

Choose a reason for hiding this comment

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

Consider addressing the TODO comment about modifying the packet when calling the handler.

This could potentially improve the clarity and correctness of the packet handling. Would you like me to open a GitHub issue to track this improvement?

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 806ff30 and 0cce73f.

Files selected for processing (6)
  • ibctesting/bridging_fee_test.go (1 hunks)
  • x/bridging_fee/ibc_middleware.go (1 hunks)
  • x/delayedack/eibc.go (4 hunks)
  • x/delayedack/keeper/params.go (2 hunks)
  • x/eibc/keeper/msg_server.go (1 hunks)
  • x/eibc/types/expected_keepers.go (1 hunks)
Files skipped from review as they are similar to previous changes (6)
  • ibctesting/bridging_fee_test.go
  • x/bridging_fee/ibc_middleware.go
  • x/delayedack/eibc.go
  • x/delayedack/keeper/params.go
  • x/eibc/keeper/msg_server.go
  • x/eibc/types/expected_keepers.go

@mtsitrin mtsitrin requested review from zale144 and danwt June 4, 2024 10:05
@mtsitrin mtsitrin requested review from danwt and omritoptix June 4, 2024 10:05
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.

@mtsitrin there are still a few unresolved comments with no reply so I would assume you are still working on it if there's no reply

danwt
danwt previously approved these changes Jun 5, 2024
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 0cce73f and c7ef70d.

Files selected for processing (8)
  • x/delayedack/eibc.go (4 hunks)
  • x/delayedack/ibc_middleware.go (5 hunks)
  • x/delayedack/keeper/finalize.go (1 hunks)
  • x/delayedack/types/params.go (2 hunks)
  • x/eibc/genesis_test.go (2 hunks)
  • x/eibc/keeper/hooks_test.go (1 hunks)
  • x/eibc/keeper/msg_server_test.go (3 hunks)
  • x/eibc/types/expected_keepers.go (1 hunks)
Files skipped from review as they are similar to previous changes (7)
  • x/delayedack/eibc.go
  • x/delayedack/ibc_middleware.go
  • x/delayedack/keeper/finalize.go
  • x/delayedack/types/params.go
  • x/eibc/keeper/hooks_test.go
  • x/eibc/keeper/msg_server_test.go
  • x/eibc/types/expected_keepers.go
Additional comments not posted (1)
x/eibc/genesis_test.go (1)

26-26: Corrected spelling of IsFulfilled enhances code readability and consistency.

Also applies to: 35-35

@omritoptix
Copy link
Contributor

e2e tests are currently broken. we're working on a versioning scheme which would allow us to maintain previous e2e tests in case a hotfix will be required and create new e2e tests for current.

@omritoptix omritoptix merged commit a74ffb0 into main Jun 5, 2024
54 of 88 checks passed
@omritoptix omritoptix deleted the mtsitrin/892-bridging_fee-middleware branch June 5, 2024 21:22
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.

feat(bridging_fee): Implement Bridging_fee middleware
4 participants