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(x/accounts): add event emission to accounts module #19636

Merged
merged 8 commits into from
Mar 5, 2024
Merged

Conversation

tac0turtle
Copy link
Member

@tac0turtle tac0turtle commented Mar 4, 2024

Description

Closes: #17687

add event emission to accounts module


Author Checklist

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.

I have...

  • included the correct type prefix in the PR title
  • confirmed ! in the type prefix if API or client breaking change
  • targeted the correct branch (see PR Targeting)
  • provided a link to the relevant issue or specification
  • reviewed "Files changed" and left comments if necessary
  • included the necessary unit and integration tests
  • added a changelog entry to CHANGELOG.md
  • updated the relevant documentation or specification, including comments for documenting Go code
  • confirmed all CI checks have passed

Reviewers Checklist

All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.

I have...

  • confirmed the correct type prefix in the PR title
  • confirmed all author checklist items have been addressed
  • reviewed state machine logic, API design and naming, documentation is accurate, tests and test coverage

Summary by CodeRabbit

  • Refactor

    • Modified account initialization and function signatures across various files to enhance integration with external services and dependencies.
    • Streamlined codebase by removing unused fields and references, improving overall code quality and maintainability.
  • New Features

    • Enhanced account testing capabilities by introducing new parameters and error handling in test functions.
  • Chores

    • Updated dependencies to include appmodule and event, facilitating new features and refactors.

@tac0turtle tac0turtle marked this pull request as ready for review March 4, 2024 11:00
@tac0turtle tac0turtle requested a review from a team as a code owner March 4, 2024 11:00
Copy link
Contributor

coderabbitai bot commented Mar 4, 2024

Walkthrough

The changes revolve around the introduction of appmodule.Environment parameter across various functions, removal of the hs field, adjustments to function parameters to include environment contexts, and the addition of event emission capabilities in accounts. These modifications suggest an effort to standardize the environment context across the application and enhance the accounts module with event emission functionalities, aligning with the objectives of improving modular integration and extending features.

Changes

Files Change Summary
x/accounts/defaults/base/account.go, x/accounts/testing/counter/counter.go Removed hs field and added appmodule.Environment parameter in functions.
x/accounts/internal/implementation/api_builder_test.go, x/accounts/internal/implementation/implementation.go, x/accounts/keeper.go, x/accounts/testing/account_abstraction/minimal.go, x/accounts/internal/implementation/context.go Introduced appmodule.Environment parameter, adjusted function parameters, removed references to gas and header packages, and added event emission capabilities.

Assessment against linked issues

Objective Addressed Explanation
feat(accounts): Add event emission (#17687)

The code changes directly address the primary objective outlined in the linked issue by introducing event emission capabilities in the accounts module, as evidenced by the addition of event handling and emission functionalities in x/accounts/testing/account_abstraction/minimal.go. There is no need for further explanation as the changes align with the objective of allowing accounts to emit events, fulfilling the requirement without ambiguity.

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-tests 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 tests 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 tests.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

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 a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @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.
  • The JSON schema for the configuration file is available here.
  • 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/coderabbit-overrides.v2.json

CodeRabbit Discord Community

Join our Discord Community to get help, request features, and share feedback.

Copy link
Contributor

github-actions bot commented Mar 4, 2024

@tac0turtle your pull request is missing a changelog!

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.

Review Status

Actionable comments generated: 0

Configuration used: .coderabbit.yml

Commits Files that changed from the base of the PR and between 7f84815 and 150c8a8.
Files selected for processing (13)
  • x/accounts/account_test.go (6 hunks)
  • x/accounts/accountstd/exports.go (2 hunks)
  • x/accounts/defaults/base/account.go (4 hunks)
  • x/accounts/internal/implementation/account_test.go (2 hunks)
  • x/accounts/internal/implementation/api_builder.go (7 hunks)
  • x/accounts/internal/implementation/api_builder_test.go (2 hunks)
  • x/accounts/internal/implementation/context_test.go (2 hunks)
  • x/accounts/internal/implementation/implementation.go (2 hunks)
  • x/accounts/internal/implementation/implementation_test.go (1 hunks)
  • x/accounts/internal/implementation/protoaccount.go (4 hunks)
  • x/accounts/keeper.go (3 hunks)
  • x/accounts/testing/account_abstraction/minimal.go (2 hunks)
  • x/accounts/testing/counter/counter.go (5 hunks)
Additional comments: 40
x/accounts/internal/implementation/api_builder_test.go (2)
  • 14-18: The addition of env appmodule.Environment as a parameter in RegisterExecuteHandler functions within TestRouterDoubleRegistration aligns with the new requirement for handlers to be aware of the environment context. This change is consistent and correctly implemented.
  • 36-39: In TestEmptyQueryExecuteHandler, the introduction of env appmodule.Environment as a parameter for the qh and eh functions is correctly implemented, ensuring that the environment context is passed to query and execute handlers. This is a necessary adjustment to accommodate the new event emission functionality.
x/accounts/internal/implementation/account_test.go (3)
  • 29-29: Adding appmodule.Environment as a parameter in RegisterInitHandler is correctly implemented, ensuring that initialization handlers can access environmental context. This is crucial for the new event emission functionality.
  • 35-44: The modifications in RegisterExecuteHandlers to include appmodule.Environment in the function signatures are correctly implemented. This ensures that execute handlers have access to the environment, which is essential for the intended functionality.
  • 50-53: The changes in RegisterQueryHandlers to include appmodule.Environment in the function signatures are correctly implemented. This adjustment allows query handlers to utilize environmental context, aligning with the new requirements.
x/accounts/internal/implementation/implementation_test.go (1)
  • 19-19: The creation of env appmodule.Environment and its inclusion in method calls within TestImplementation is correctly implemented. This ensures that the tests accurately reflect the new requirement for environment context in Execute, Init, and Query functions.
x/accounts/internal/implementation/protoaccount.go (3)
  • 14-23: The addition of appmodule.Environment to the RegisterInitHandler function signature is correctly implemented. This change ensures that initialization handlers for smart accounts using protobuf can interact with the environment context.
  • 41-52: > 📝 NOTE

This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [35-49]

The update to RegisterExecuteHandler to include appmodule.Environment in the function signature is correctly implemented. This adjustment allows execution handlers for smart accounts using protobuf to utilize environmental context, which is essential for the new functionality.

  • 61-61: The inclusion of appmodule.Environment in the RegisterQueryHandler function signature is correctly implemented. This ensures that query handlers for smart accounts using protobuf can access the environment, aligning with the new requirements.
x/accounts/testing/account_abstraction/minimal.go (3)
  • 39-39: The inclusion of appmodule.Environment in the Init method signature for MinimalAbstractedAccount is correctly implemented, ensuring that initialization can access environmental context.
  • 48-54: The update to the Authenticate method to include appmodule.Environment and to emit an event upon authentication is correctly implemented. This enhances the method's functionality by integrating event emission and ensuring error handling is in place.
  • 59-59: The addition of appmodule.Environment to the QueryAuthenticateMethods method signature is correctly implemented, aligning with the new requirement for methods to access the environment context.
x/accounts/internal/implementation/context_test.go (1)
  • 35-36: The creation of env appmodule.Environment and its inclusion in the impl.Execute function call within TestMakeAccountContext is correctly implemented. This ensures that the test accurately reflects the new requirement for environment context in execution.
x/accounts/account_test.go (3)
  • 30-30: Adding appmodule.Environment as a parameter in RegisterInitHandler is correctly implemented, ensuring that initialization handlers can access environmental context. This is crucial for the new event emission functionality.
  • 38-48: > 📝 NOTE

This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [41-77]

The modifications in RegisterExecuteHandlers to include appmodule.Environment in the function signatures are correctly implemented. This ensures that execute handlers have access to the environment, which is essential for the intended functionality.

  • 74-96: > 📝 NOTE

This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [83-111]

The changes in RegisterQueryHandlers to include appmodule.Environment in the function signatures are correctly implemented. This adjustment allows query handlers to utilize environmental context, aligning with the new requirements.

x/accounts/internal/implementation/api_builder.go (3)
  • 27-27: The addition of appmodule.Environment to the handler function signature in InitBuilder is correctly implemented. This change ensures that initialization handlers can interact with the environment context.
  • 54-54: Updating the handlers map in ExecuteBuilder to include appmodule.Environment in function signatures is correctly implemented. This allows execution handlers to utilize environmental context, which is essential for the new functionality.
  • 101-101: The use of appmodule.Environment in the QueryBuilder through the ExecuteBuilder instance is a clever design choice, ensuring that query handlers also have access to the environment. This maintains consistency across the implementation.
x/accounts/testing/counter/counter.go (5)
  • 10-10: The addition of "cosmossdk.io/core/appmodule" import is necessary for utilizing the appmodule.Environment parameter in function signatures. This change aligns with the PR's objective to integrate event emission functionality by leveraging the environment context.
  • 55-55: Adding the env appmodule.Environment parameter to the Init function signature is a crucial change for incorporating the environment context into the account initialization process. This allows the function to interact with the broader application environment, which is essential for the new event emission feature. However, it's important to ensure that all calls to this function are updated to include the new parameter.
  • 68-68: The modification to include env appmodule.Environment in the IncreaseCounter function signature is appropriate for the feature being implemented. It ensures that event emission can be contextually aware of the environment. Similar to the Init function, verify that all invocations of IncreaseCounter have been updated accordingly.
  • 91-91: Incorporating the env appmodule.Environment parameter into the QueryCounter function is consistent with the overall goal of enhancing the module's interactivity and monitoring capabilities. This change allows the function to leverage the application's environment for event emission or other environment-specific logic.
  • 101-101: The addition of env appmodule.Environment to the TestDependencies function signature is a good practice for testing the module's interaction with the application environment. This ensures that the testing framework can simulate different environmental contexts, which is valuable for thorough testing of the event emission functionality.
x/accounts/internal/implementation/implementation.go (4)
  • 11-11: The addition of "cosmossdk.io/core/appmodule" import is necessary for utilizing the appmodule.Environment parameter in function signatures within the Implementation struct. This change is consistent with the PR's objective to enhance the module's capabilities by integrating the environment context.
  • 115-115: Adding the env appmodule.Environment parameter to the Init function within the Implementation struct is a significant change that aligns with the PR's goal of integrating the environment context into the module's operations. This modification allows the Init function to access and interact with the broader application environment, which is crucial for the new event emission functionality.
  • 117-117: The inclusion of env appmodule.Environment in the Execute function signature is appropriate and necessary for the feature being implemented. It ensures that the execution process can be contextually aware of the environment, which is essential for event emission and other environment-specific logic.
  • 119-119: Incorporating the env appmodule.Environment parameter into the Query function is consistent with the overall goal of enhancing the module's interactivity and monitoring capabilities. This change allows the function to leverage the application's environment for event emission or other environment-specific logic.
x/accounts/accountstd/exports.go (4)
  • 9-9: The import statement for cosmossdk.io/core/appmodule is correctly added and follows Go conventions.
  • 38-38: The addition of env appmodule.Environment to the function signature of RegisterExecuteHandler aligns with the PR's objectives. Ensure all calls to this function are updated accordingly.
  • 46-46: The addition of env appmodule.Environment to the function signature of RegisterQueryHandler is appropriate. Verify that all invocations of this function have been updated to include the new parameter.
  • 54-54: Including env appmodule.Environment in the function signature of RegisterInitHandler is consistent with the PR's goal. Confirm that all calls to this function are adjusted to pass the new parameter.
x/accounts/defaults/base/account.go (5)
  • 16-16: The import statement for cosmossdk.io/core/appmodule is correctly added, following Go conventions.
  • 58-58: The inclusion of _ appmodule.Environment in the Init function signature aligns with the PR's objectives. If the environment parameter is intended for future use, consider documenting its purpose or implementing its usage now.
  • 62-62: Including _ appmodule.Environment in the SwapPubKey function signature is consistent with the PR's goals. As with Init, if the environment parameter is planned for future use, its intended purpose should be documented or implemented.
  • 79-79: The addition of _ appmodule.Environment to the Authenticate function signature is appropriate. Again, if the environment parameter is to be used in the future, consider documenting its intended use or implementing it now.
  • 199-199: The inclusion of _ appmodule.Environment in the QuerySequence function signature aligns with the PR's objectives. As with other functions, if the environment parameter is intended for future use, its purpose should be documented or implemented.
x/accounts/keeper.go (3)
  • 176-176: The inclusion of k.environment in the call to impl.Init within the init function correctly aligns with the PR's objectives. Ensure that the impl.Init function properly utilizes the environment parameter.
  • 237-237: Passing k.environment to impl.Execute in the Execute function is correctly implemented. Verify that the impl.Execute function makes appropriate use of the environment parameter.
  • 262-262: Including k.environment in the call to impl.Query within the Query function aligns with the PR's objectives. Ensure that the impl.Query function properly utilizes the environment parameter.

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.

Review Status

Actionable comments generated: 0

Configuration used: .coderabbit.yml

Commits Files that changed from the base of the PR and between 150c8a8 and e0579f5811bde2be3fa5b11a46d524896e662260.
Files selected for processing (1)
  • x/accounts/keeper.go (3 hunks)
Files skipped from review as they are similar to previous changes (1)
  • x/accounts/keeper.go

@sontrinh16
Copy link
Member

sontrinh16 commented Mar 4, 2024

question why dont we just pass the the event service into the Dependencies in the account creator function like here

@tac0turtle
Copy link
Member Author

tac0turtle commented Mar 4, 2024

ah i can do that. wasnt aware of the deps struct

hmm this seems to put it on the app dev to set it. i think its cleaner like the current approach

@sontrinh16
Copy link
Member

ah i can do that. wasnt aware of the deps struct

hmm this seems to put it on the app dev to set it. i think its cleaner like the current approach

seem like accounts Keeper struct already have appmodule Enviroment field, you just need to pass event service to the MakeAccountsMap which will pass down to the Dependencies. So app dev dont have to set it. ref

@tac0turtle
Copy link
Member Author

tac0turtle commented Mar 4, 2024

ah i can do that. wasnt aware of the deps struct
hmm this seems to put it on the app dev to set it. i think its cleaner like the current approach

seem like accounts Keeper struct already have appmodule Enviroment field, you just need to pass event service to the MakeAccountsMap which will pass down to the Dependencies. So app dev dont have to set it. ref

seems i have to go this way, i will amend

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.

Review Status

Actionable comments generated: 0

Configuration used: .coderabbit.yml

Commits Files that changed from the base of the PR and between 150c8a8 and acc67c9.
Files selected for processing (6)
  • go.work.example (1 hunks)
  • x/accounts/defaults/base/account.go (5 hunks)
  • x/accounts/internal/implementation/context.go (2 hunks)
  • x/accounts/internal/implementation/implementation.go (5 hunks)
  • x/accounts/keeper.go (4 hunks)
  • x/accounts/testing/counter/counter.go (6 hunks)
Files skipped from review as they are similar to previous changes (4)
  • x/accounts/defaults/base/account.go
  • x/accounts/internal/implementation/implementation.go
  • x/accounts/keeper.go
  • x/accounts/testing/counter/counter.go
Additional comments: 9
go.work.example (1)
  • 3-3: The update of the Go toolchain version from go1.22.0 to go1.22 is correct and aligns with Go versioning practices.
x/accounts/internal/implementation/context.go (8)
  • 5-10: > 📝 NOTE

This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [11-13]

The definition of AccountStatePrefix using collections.NewPrefix(255) is correct and follows best practices for defining a unique prefix for account state storage. This ensures that account data is properly namespaced within the module's storage.

  • 5-10: > 📝 NOTE

This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [15-22]

The type definitions for ModuleExecUntypedFunc, ModuleExecFunc, and ModuleQueryFunc are clear and well-defined. They provide a strong typing for module execution and query functions, which enhances code readability and maintainability.

  • 5-10: > 📝 NOTE

This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [24-39]

The contextValue struct is well-structured and encapsulates all necessary information for account execution context. However, ensure that sensitive information, such as sender and whoami addresses, is handled securely throughout the codebase to prevent any potential security issues.

  • 5-10: > 📝 NOTE

This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [41-48]

The functions addCtx and getCtx for adding and retrieving contextValue from a context.Context are correctly implemented. They follow best practices for context management in Go by using context.WithValue and type assertion.

  • 5-10: > 📝 NOTE

This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [50-69]

The MakeAccountContext function is crucial for creating a new account execution context. It correctly initializes a contextValue struct with all necessary fields and adds it to the provided context. Ensure that the storeSvc parameter is validated before use to prevent any potential issues with uninitialized or invalid store services.

  • 5-10: > 📝 NOTE

This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [71-76]

The makeAccountStore function correctly creates a prefixed store for the account using the account number. This approach ensures that each account's state is isolated and easily accessible. The use of binary.BigEndian.PutUint64 for prefix generation is appropriate for ensuring a consistent byte representation across different platforms.

  • 5-10: > 📝 NOTE

This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [78-109]

The functions ExecModuleUntyped, ExecModule, and QueryModule provide mechanisms for executing and querying module messages. They are well-implemented, leveraging the contextValue struct to access necessary context information. Ensure that error handling is robust and that any errors returned by moduleExecUntyped, moduleExec, and moduleQuery are appropriately handled and logged.

Verification successful

The review comment concerning the functions ExecModuleUntyped, ExecModule, and QueryModule and their error handling has been verified. The implementation of these functions in context.go demonstrates that errors from lower-level calls are appropriately returned to the caller, adhering to Go's error handling conventions. This approach allows callers to handle errors flexibly, including logging them if necessary. Test cases in context_test.go and account_test.go further illustrate how these errors can be handled in practice. Based on the provided script output and analysis, the error handling mechanism for these functions appears to be robust and well-implemented.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Search for error handling patterns in the usage of `ExecModuleUntyped`, `ExecModule`, and `QueryModule`.
rg --type go 'ExecModuleUntyped|ExecModule|QueryModule'

Length of output: 90494

* 5-10: > 📝 **NOTE** > This review was outside the diff hunks, and no overlapping diff hunk was found. Original lines [111-122]

Utility functions like openKVStore, Sender, Whoami, and Funds provide convenient access to the account execution context's fields. These functions are correctly implemented and follow best practices for encapsulation and data access within the context.

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.

Review Status

Actionable comments generated: 0

Configuration used: .coderabbit.yml

Commits Files that changed from the base of the PR and between acc67c9 and 9e86b45.
Files selected for processing (6)
  • x/accounts/defaults/base/account.go (1 hunks)
  • x/accounts/internal/implementation/api_builder_test.go (1 hunks)
  • x/accounts/internal/implementation/implementation.go (4 hunks)
  • x/accounts/keeper.go (1 hunks)
  • x/accounts/testing/account_abstraction/minimal.go (4 hunks)
  • x/accounts/testing/counter/counter.go (1 hunks)
Files skipped from review as they are similar to previous changes (6)
  • x/accounts/defaults/base/account.go
  • x/accounts/internal/implementation/api_builder_test.go
  • x/accounts/internal/implementation/implementation.go
  • x/accounts/keeper.go
  • x/accounts/testing/account_abstraction/minimal.go
  • x/accounts/testing/counter/counter.go

@tac0turtle tac0turtle changed the title feature: add event emission to accounts module feature(x/accounts): add event emission to accounts module Mar 4, 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.

Review Status

Actionable comments generated: 0

Configuration used: .coderabbit.yml

Commits Files that changed from the base of the PR and between 9e86b45 and 1b4104a.
Files selected for processing (3)
  • x/accounts/internal/implementation/context.go (2 hunks)
  • x/accounts/internal/implementation/implementation.go (4 hunks)
  • x/accounts/keeper.go (1 hunks)
Files skipped from review as they are similar to previous changes (3)
  • x/accounts/internal/implementation/context.go
  • x/accounts/internal/implementation/implementation.go
  • x/accounts/keeper.go

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.

Review Status

Actionable comments generated: 0

Configuration used: .coderabbit.yml

Commits Files that changed from the base of the PR and between 1b4104a and e476edf.
Files selected for processing (1)
  • x/accounts/keeper.go (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • x/accounts/keeper.go

@likhita-809 likhita-809 changed the title feature(x/accounts): add event emission to accounts module feat(x/accounts): add event emission to accounts module Mar 5, 2024
Copy link
Contributor

@likhita-809 likhita-809 left a comment

Choose a reason for hiding this comment

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

lgtm

@tac0turtle tac0turtle added this pull request to the merge queue Mar 5, 2024
Merged via the queue into main with commit 0d3f4a8 Mar 5, 2024
61 of 63 checks passed
@tac0turtle tac0turtle deleted the marko/17687 branch March 5, 2024 11:27
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(accounts): Add event emission
4 participants