Skip to content

Feat/permissioned mtoken#194

Merged
dmytro-horbatenko merged 5 commits intomainfrom
feat/permissioned-mtoken
Apr 2, 2026
Merged

Feat/permissioned mtoken#194
dmytro-horbatenko merged 5 commits intomainfrom
feat/permissioned-mtoken

Conversation

@kostyamospan
Copy link
Copy Markdown
Collaborator

No description provided.

@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new capability for mTokens to enforce permissioned transfers through a 'greenlist' mechanism. This feature allows for greater control over who can hold and transfer specific mToken variants, enhancing compliance and security. The changes span new smart contracts, updates to role management, modifications to the contract deployment and generation tooling, and a robust suite of tests to ensure the integrity of the new permissioned token logic and its interactions with existing vault structures.

Highlights

  • Permissioned mToken Contract: Introduced a new abstract contract, mTokenPermissioned, which extends mToken and enforces a 'greenlist' for all token transfers. This means only addresses with the designated _greenlistedRole() can send or receive these tokens.
  • Greenlist Role Integration: The concept of a 'greenlisted' role has been integrated into the system's role management, allowing for explicit assignment and revocation of transfer permissions for permissioned mTokens.
  • Dynamic Contract Generation: Updated the contract generation scripts to allow for the dynamic creation of permissioned mTokens and greenlist-enabled deposit/redemption vaults based on user input during deployment. This includes adding an isPermissioned flag to mToken metadata.
  • Comprehensive Testing: Added extensive unit and integration tests for the mTokenPermissioned contract, covering various scenarios for transfer() and transferFrom() with different greenlist and blacklist statuses, as well as tests for deposit and redemption vaults interacting with these permissioned tokens.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a permissioned mToken contract, enhancing security by restricting token transfers to greenlisted users. It includes the contract implementation, a test contract, and updates to relevant configuration files to support the new feature. The code review focuses on correctness and security, particularly around the greenlisting mechanism.

Comment on lines +32 to +33
import "../../mToken${isPermissionedMToken ? 'Permissioned' : ''}.sol";
${isPermissionedMToken ? `import "./${contractNames.roles}.sol";` : ''}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

When isPermissionedMToken is true, the template imports both mTokenPermissioned.sol and ${contractNames.roles}.sol. However, when isPermissionedMToken is false, the template only imports mToken.sol. This could lead to inconsistencies in the generated code, especially if the generated contract relies on functionalities defined in ${contractNames.roles}.sol even when the permissioned token is not used. Consider adding a check to ensure that ${contractNames.roles}.sol is always imported when it is needed by the generated contract, regardless of the isPermissionedMToken value.

Suggested change
import "../../mToken${isPermissionedMToken ? 'Permissioned' : ''}.sol";
${isPermissionedMToken ? `import "./${contractNames.roles}.sol";` : ''}
import "../../mToken${isPermissionedMToken ? 'Permissioned' : ''}.sol";
import "./${contractNames.roles}.sol";

Comment on lines +40 to +42
contract ${contractNames.token} is mToken${
isPermissionedMToken ? `Permissioned, ${contractNames.roles}` : ''
} {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The template uses a ternary operator to conditionally extend the contract with Permissioned, ${contractNames.roles}. However, if isPermissionedMToken is false, the contract will only extend mToken. This could lead to inconsistencies in the generated code, especially if the generated contract relies on functionalities defined in Permissioned or ${contractNames.roles} even when the permissioned token is not used. Consider adding a check to ensure that Permissioned and ${contractNames.roles} are always extended when they are needed by the generated contract, regardless of the isPermissionedMToken value.

Suggested change
contract ${contractNames.token} is mToken${
isPermissionedMToken ? `Permissioned, ${contractNames.roles}` : ''
} {
contract ${contractNames.token} is mToken,
${isPermissionedMToken ? `Permissioned, ${contractNames.roles}` : ''} {

@dmytro-horbatenko dmytro-horbatenko merged commit d8822b4 into main Apr 2, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants