Audit · firm’s term: smart contract audit
Resonance Security reviewed Meta Pool (MetaPool) on 8 Aug 2025: 11 findings, 0 critical; 9 marked fixed, 2 open.
Trustblock does not review code.
Statuses are the security firm’s own, from its report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 0 | 0 |
| Medium | 0 | 0 | 0 |
| Low | 2 | 0 | 9 |
Throughout the source code there are multiple instances that lead to a dead end as unimplemented features and functionalities are explicitly reverted. These should be cleaned up to increase the quality of the code and decrease the bytecode stored on the blockchain.It should be noted that while some code might be used to maintain interoperability between other contracts on the blockchain, it may still increase smart contract size while not being entirely necessary, since the blockchain may revert nonetheless.
The function storage_unregister() returns misleading information whenever the user account that calls the function does not exist, i.e. returns true when no account was unregistered. This function should return false, or an error indicating that no such account was found on storage.Misleading information may lead to malformed decisions and subsequent actions by users, which may ultimately damage the trust in the protocol.
The events FtMint and FtBurn are not being emitted on all minting and burning actions. These events are missing from the functions stake_for_lockup(), unstake_all(), and unstake_from_lockup_shares().Emitted events are vital for transparency, efficiency, and usability in blockchain ecosystems, and, when available, should be used at all times as they enable off-chain users and applications to monitor, index, and respond to on-chain activity.
The smart contracts implement a Pausable functionality, however, it is not being used. Such functionality may be useful during emergencies and should be controlled by multi-signature wallets or decentralized autonomous organizations (DAO).
It was observed that throughout the protocol there are multiple instances of redundant code on several accounts:Variables and values related to testing environments;Deprecated variables and values;Reimplemented standard trait implementations;Redundant functions, e.g. withdraw_all() and withdraw_unstaked();These design patterns increase code complexity and do not maximize transaction gas and storage efficiency on the blockchain.
The function ft_metadata_set() is marked as read-only, however, it mutates the storage of the smart contract, specifically the LazyOption with storage key ftmd. This fact may create inconsistencies in the usage of the protocol by its users.
The following functions and modifiers were found to be unused within the system:RewardMeter::reset()assert_min_balance()apply_multiplier()Unused functions increase the complexity and readability of the smart contract's code and their inclusion should be discouraged whenever possible.
The following Rust crates are used as dependencies of the project and contain known vulnerabilities:paste (1.0.15). paste is unmaintained. For more information: [RUSTSEC-2024-0436](https://rustsec.org/advisories/RUSTSEC-2024-0436)wee_alloc (0.4.5). wee_alloc is unmaintained. For more information: [RUSTSEC-2022-0054](https://rustsec.org/advisories/RUSTSEC-2022-0054)borsh (0.7.2). Parsing borsh messages with ZST which are not-copy/clone is unsound. For more information: [RUSTSEC-2023-0033](https://rustsec.org/advisories/RUSTSEC-2023-0033)borsh (0.8.2). Parsing borsh messages with ZST which are not-copy/clone is unsound. For more information: [RUSTSEC-2023-0033](https://rustsec.org/advisories/RUSTSEC-2023-0033)It should also be noted that the NEAR SDK version 3.1.0 is also outdated and should be bumped to more recent versions to include the latest logical, performance, and security fixes.
When attempting to deposit and stake NEAR, the function deposit_and_stake() is called. This function internally calls internal_deposit() and then internal_stake_from_account(). The function internal_stake_from_account() stakes the available account deposit by amount, which may or may not be the same amount specified by the user (due to rounding on is_close()). This same amount is then used on nslp_try_internal_clearing(), which may be different from what was actually staked, by a maximum range difference of 0.001 NEAR.
The report names a repository or files. Open the report to see its scope.
18 projects reviewed · 25 reports · latest Aug 2025
See Resonance Security’s auditsSomething wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.
Tell us