Welcome to the Move Vulnerability Database (MVD) v3.0!
A comprehensive collection of vulnerability patterns in the Move ecosystem.
What's Inside
- Vulnerability Patterns - Categorized security issues with examples and severity ratings
- Appendix - Audit reports and protocol references
- Learning Resources - Curated materials for learning Move security
This resource consolidates 1000+ security vulnerabilities extracted from 200+ public Move audit reports across multiple firms and auditors. The database categorizes vulnerabilities into common patterns—from Input Validation and Business Logic flaws to Access Control and State Management issues—providing a central reference for developers, auditors, and security researchers to understand, recognize, and learn from real-world mistakes in Move codebases.
| Vulnerability Patterns | Findings |
|---|---|
| Business Logic | 296 |
| Input Validation | 170 |
| Calculation Errors | 148 |
| Coding Mistake | 76 |
| Access Control | 73 |
| State Management | 64 |
| Code Optimization | 43 |
| Denial of Service | 40 |
| Missing Functions | 37 |
| Data Inconsistency | 31 |
| Oracle Issues | 27 |
| Centralization Risk | 25 |
| Constant Definition | 21 |
| Cross-Implementation | 16 |
| Runtime/Development Issues | 15 |
| Missing Version Check | 12 |
| Gas-related Issues | 11 |
| Looping Issues | 10 |
| Front-running | 7 |
| Collision | 5 |
| Inflation Attacks | 5 |
| Documentation Mismatch | 3 |
| Signature Replay | 3 |
| Third-Party Risk | 2 |
| Race Condition | 1 |
| Total | 1141 |
Data sourced from public Move audit reports by the following auditors/firms:
| Audit Firm/Auditor | Report Links |
|---|---|
| OtterSec | Sampled Public Audit Reports (OtterSec Notion) |
| MoveBit | MoveBit — Sampled Audit Reports |
| MoveJay | MoveJay (Jayfromthe13th) |
| Zellic | Zellic Reports |
| Spearbit | Spearbit Reports |
| Cantina | Cantina Reports |
| Code4Arena | Code4Arena Reports |
| Certora | Certora Security Reports |
| Hacken | Hacken Audits |
| Pashov Audit Group | Pashov Audit Group — Audits |
| ExVul Security | ExVul Audits |
| Quantstamp | Quantstamp Reports |
| SlowMist | SlowMist Reports |
| Three Sigma | Three Sigma Reports |
| Asymptotic | Asymptotic Reports |
| Sherlock | Sherlock Reports |
Refer to the Appendix for the full list of reports and protocols.
⚠️ Disclaimer
All findings and summaries in this database are sourced from publicly available audit reports.
I do not own or claim ownership of any reports, documents, or content referenced here — all rights belong to their respective auditors, firms, and project teams.
This repository is an independent, educational, and non-commercial project created to help the community study and understand common vulnerability patterns in the Move ecosystem.
While I aim for accuracy, there may be typos, errors, broken links, or misattributed information.
If you spot any mistakes or missing details, please open an issue or reach out so I can correct them.
💬 Support & Contributions
If you'd like to learn more about the project or support future development, see the About section.
About the Move Vulnerability Database
The Move Vulnerability Database (MVD), maintained by Maverick Security Research, was created to support the growing field of Move security. The MVD aims to:
- Help developers identify and understand common coding mistakes.
- Provide security researchers, auditors, and bug hunters with patterns and examples to locate vulnerabilities in Move codebases.
The database consolidates findings from public audits, creating a central resource for the Move ecosystem to learn from real-world vulnerabilities.
💬 Support & Contributions
If you’ve found this database useful, consider supporting its continued development. Contributions help fund:
- Ongoing curation of Move ecosystem vulnerability data
- Updates to audit mappings
- Expansion into cross-chain vulnerability pattern analysis
Donation Addresses:
- Sui:
0xda0a78ad38da929d16676c7d64fe195cc4becd2985b68bdda7ab991187085614 - Ethereum:
0x5F672E842C15C7A9be40B93c9Eb4F78caE389cd1
Your support directly helps maintain and improve open-source security knowledge for the Web3 community.
Thank you,
— MoveMaverick
Vulnerability Patterns Overview
The table below presents the total number of findings for each vulnerability pattern across all analyzed contracts.
| Vulnerability Patterns | Findings |
|---|---|
| Business Logic | 296 |
| Input Validation | 170 |
| Calculation Errors | 148 |
| Coding Mistake | 76 |
| Access Control | 73 |
| State Management | 64 |
| Code Optimization | 43 |
| Denial of Service | 40 |
| Missing Functions | 37 |
| Data Inconsistency | 31 |
| Oracle Issues | 27 |
| Centralization Risk | 25 |
| Constant Definition | 21 |
| Cross-Implementation | 16 |
| Runtime/Development Issues | 15 |
| Missing Version Check | 12 |
| Gas-related Issues | 11 |
| Looping Issues | 10 |
| Front-running | 7 |
| Collision | 5 |
| Inflation Attacks | 5 |
| Documentation Mismatch | 3 |
| Signature Replay | 3 |
| Third-Party Risk | 2 |
| Race Condition | 1 |
| Total | 1141 |
As we can see, business logic vulnerabilities account for more than 25% of the database findings. Input validation was the second most common issue, followed by calculation errors.
Next, let's examine the vulnerability patterns in detail, broken down by severity.
| Vulnerability Patterns | C | H | M | L | Total |
|---|---|---|---|---|---|
| Business Logic | 21 | 58 | 89 | 128 | 296 |
| Input Validation | 16 | 29 | 34 | 91 | 170 |
| Calculation Errors | 13 | 28 | 61 | 46 | 148 |
| Coding Mistake | 0 | 0 | 0 | 76 | 76 |
| Access Control | 13 | 20 | 14 | 26 | 73 |
| State Management | 7 | 14 | 19 | 24 | 64 |
| Code Optimization | 0 | 0 | 0 | 43 | 43 |
| Denial of Service | 2 | 4 | 27 | 7 | 40 |
| Missing Functions | 1 | 3 | 15 | 18 | 37 |
| Data Inconsistency | 2 | 10 | 10 | 9 | 31 |
| Oracle Issues | 3 | 5 | 11 | 8 | 27 |
| Centralization Risk | 0 | 8 | 10 | 7 | 25 |
| Constant Definition | 3 | 2 | 5 | 11 | 21 |
| Cross-Implementation | 0 | 0 | 2 | 14 | 16 |
| Runtime/Development Issues | 0 | 0 | 10 | 5 | 15 |
| Missing Version Check | 0 | 2 | 1 | 9 | 12 |
| Gas-related Issues | 0 | 0 | 11 | 0 | 11 |
| Looping Issues | 0 | 3 | 3 | 4 | 10 |
| Front-running | 0 | 3 | 2 | 2 | 7 |
| Collision | 0 | 0 | 1 | 4 | 5 |
| Inflation Attacks | 0 | 0 | 1 | 4 | 5 |
| Documentation Mismatch | 0 | 0 | 0 | 3 | 3 |
| Signature Replay | 0 | 0 | 0 | 3 | 3 |
| Third-Party Risk | 0 | 0 | 0 | 2 | 2 |
| Race Condition | 0 | 0 | 0 | 1 | 1 |
| Total | 81 | 189 | 326 | 545 | 1141 |
Based on Criticals and Highs: Business Logic, Input Validation, Calculation Errors, Access Control, and State Management are the top 5 vulnerability classes.
Based on Mediums: Business Logic, Calculation Errors, and Input Validation are the top 3 most commonly found vulnerability patterns.
Coding Mistakes and Code Optimization were the most commonly found Low severity issues.
💡 Note
The Move Vulnerability Database provides a comprehensive overview of vulnerabilities observed across audited Move protocols and serves as a guide to understanding risk concentration. Readers are encouraged to use the data to draw their own conclusions, identify trends, and consider protocol context, design, and specific use cases when assessing potential vulnerabilities.
Access Control — Overview
Missing or flawed authorization checks allow unauthorized users to perform restricted actions.
| Access Control | Findings |
|---|---|
| Critical | 13 |
| High | 20 |
| Medium | 14 |
| Low | 26 |
| Total | 73 |
Critical Findings
take_stake_fee_coin is Public Without Access Control
Severity: Critical
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
The function take_stake_fee_coin is declared as public and allows direct withdrawal of AUM tokens from the fee pool. According to the comment, this helper is intended to be called only by protocol::app. However, because it is marked as public, any external module can call it directly to withdraw from manager.xaum_fee_pool without authorization.
Lack of Access Control
Severity: Critical
Ecosystem: Sui
Protocol: Aftermath Market Making
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
Critical access control flaw where a sensitive function is improperly exposed. Since it is not restricted to package-level visibility, an attacker can directly modify trade data and balances, potentially disrupting core protocol operations.
Preventing Minting via Front-Running Payload
Severity: Critical
Ecosystem: Sui
Protocol: Lombard Finance
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
The minting function is publicly accessible, allowing an attacker to front-run other users’ transactions. This enables malicious actors to manipulate minting order and potentially capture unfair rewards.
Access Control in common_config.move
Severity: Critical
Ecosystem: Unknown
Protocol: Project Z
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/Project-Z-Security-Audit-Report/blob/Wallet/audit.md
Report Date: 2024
Description:
The resource_signer function in common_config.move is crucial for generating, saving, and retrieving resource accounts, which are used for token storage in other modules. This function's unrestricted access poses a significant security risk.
Missing AC Check
Severity: Critical
Ecosystem: Binance Smart Chain
Protocol: AquaSwap
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/AuquaSwap-Audit-/blob/Wallet/Audit%20report.md
Report Date: 2024
Description:
The revoke_trade function does not make any assertion that the signer is the owner of the trade before being able to cancel the trade and transfer assets to the caller.
create_pool Function Is Lack Of Permission Checking
Severity: Critical
Ecosystem: Sui
Protocol: Dola
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The lack of permission checks on the create_pool function allows anyone to call the function to create a pool, which is inconsistent with the design of the protocol. At the same time, convert_pool_to_dola converts the pool's CoinType to dola_address, which can allow users to create the same pool at will, which can result in a fake deposit or withdraw message being delivered by the bridge.
Missing Permission Validation
Severity: Critical
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
The withdraw function lacks access control, allowing anyone to withdraw any amount from any address.
Function Visibility Error
Severity: Critical
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
The increase_supply_function and borrow_reserve_mul functions are public, allowing unauthorized users to modify storage data and manipulate return values, potentially breaking contract functionality.
Missing Test Comments
Severity: Critical
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
Test code is not properly restricted with #[test_only], allowing anyone to run these functions and gain admin privileges.
Missing MeterCapability Check
Severity: Critical
Ecosystem: Aptos
Protocol: Argo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
The MeterCap type is not unique in the add_meter_cap_usage and sub_meter_cap_usage functions. Anybody is able to create a GlobalMeter
Broken Liquidation Access Control
Severity: Critical
Ecosystem: Aptos
Protocol: Argo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Access control between argo_liquidate and argo_engine is enforced through the use of a LiquidateFeature capability. Unfortunately, this capability access control requirement is not enforced on liquidate_repay.
Critical Access Control Check
Severity: Critical
Ecosystem: Aptos
Protocol: Eternal Finance
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2023
Description:
In common_config.move, the resource_signer function is utilized to obtain the signer from the signer capability that is stored in the resource based on the provided seed. This function is employed by other modules to generate, save, and retrieve resource accounts. Since the created resource account is used to store tokens in other modules, it is crucial that only the protocol modules can access this function.
set_interest_updated Will Set Arbitrary Timestamp
Severity: Critical
Ecosystem: Sui
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
set_interest_updated is a public function that can be called by anyone to set the broker.interest_updated_at to any timestamp they want.
High Findings
Incorrect Permission Check in collect_position_reward
Severity: High
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description: The collect_position_reward function uses the wrong permission check. The function validates against an incorrect operation type, causing the access control system to evaluate the wrong permission set instead of the intended reward collection permissions.
Permissionless Order Fulfillment Before Penalty Period
Severity: High
Ecosystem: Sui
Protocol: Mayan Sui
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
The order fulfillment function lacks proper access control. The ownership check assert!(msg_driver == ctx.sender(), EInvalidDriver) is enforced only during the penalty period, allowing unauthorized users to fulfill orders outside this window.
Missing Owner Check
Severity: High
Ecosystem: Sui
Protocol: Aftermath Orderbook
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description:
Within account, create_stop_order_ticket generates a StopOrderTicket and transfers it to a specified recipient. During the creation process, it designates the user_address field of the ticket to tx_context::sender(ctx), reflecting the address of the initiating caller. Consequently, it transfers the ticket to a recipient without validating if the caller (tx_context::sender(ctx)) is the legitimate owner of the account_id within encrypted_details.
suifren_update_last_epoch_mixed allows users to bypass checks during the mix
Severity: High
Ecosystem: Sui
Protocol: Mysten Labs Sui
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
Since the function is public, users may set an arbitrary value for last_epoch_mixed and bypass the checks in capy_labs::mix.
Lack of UpgradeCap id checking
Severity: High
Ecosystem: Sui
Protocol: Dola
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The activate_governance function does not do a check on the source and type of the upgrade_cap, resulting in the user being able to pass in any module's UpgradeCap object to activate the governance.
create_proposal Has No Permission control
Severity: High
Ecosystem: Sui
Protocol: Dola
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
Any user being able to create a proposal and vote for their own proposal, and being able to get GovernanceCap after a successful call to vote_proposal, resulting in a malicious user being able to gain access to the protocol.
Variable Return Value in Public Function
Severity: High
Ecosystem: Sui
Protocol: Cetus Farming
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
The function borrow_mut_pool_share returns a mutable reference to a value, which refers to the key pool in manager.pool_shares. Consequently, the value corresponding to this key- pool_share , can be modified by anyone, leading to errors in the contract when calculating accumulate_pool_reward . And the function borrow_mut_clmm_position has the same issue.
Missing Permission Verification
Severity: High
Ecosystem: Sui
Protocol: Talofa Corporation
Auditor: MoveBit
Report Date: May 2023
Description:
These functions do not check caller permissions, and the Gear owner can change the parameter configuration of Gear and Skill.
threshold can’t be modified
Severity: High
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: Jun 2023
Description:
The value of threshold is set to 1 every time it is initialized, and there is no interface to modify the value of threshold, resulting in one person can control the entire MultiSignature, and anyone has the highest authority.
Incorrect Function Visibility
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
The add_investor and close functions are public, allowing anyone to modify the whitelist or close the campaign.
Incorrect Function Visibility
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
update_last_distribution_timestamp is public, allowing stakers to manipulate the timestamp and cause staker to not send penalties to receiver.
Security Level Constraint Can Be Circumvented
Severity: High
Ecosystem: Sui
Protocol: BucketV2
Auditor: Quantstamp
Report Date: Aug 2025
Description:
The update_position() function throws an error depending on the user's operation and the vault's security level. It is intended that if the user wants to deposit collateral, the user is allowed if the security level is 0 or 2; if the user wants to withdraw collateral, repay a debt, or borrow, the security level must be 0. However, it is possible to withdraw collateral, repay a debt, or borrow even if the security level is 2: the user simply needs to include a deposit amount with their call of update_position(). This way, the security level access control is circumvented.
The Distinction is Lacking When Setting Admin And treasury_address
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
Lacking differentiation between role types can result in a situation where the recipient of treasury_address calling the function claim_admin_previliges() can make themselves the admin, and vice versa. This role confusion might lead to significant losses in the contract.
Lack of Access Control
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The cancel_admin_previliges and cancel_treasury_previliges functions lack any form of access control. This implies that anyone can directly cancel any pending privileges.
Permission Conflict
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The presence of multiple simultaneous pending admin and treasury privileges can result in permission conflicts. For instance, if two pending admin privileges coexist, both have the ability to invoke the claim_admin_previliges function to acquire permissions. This scenario can lead to the loss of permissions for another admin, causing a conflict in permissions.
The Admin is Unable to Update the Liquidity Fee and Treasury Fee
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The swap_v2.set_dex_liquidity_fee() function is marked as public(friend), indicating that it is accessible to modules declared as "friends" of the current module.
However, in the protocol, only baptswap_v2::router_v2 is declared as a friend.
The issue arises because the router_v2 contract does not invoke the set_dex_liquidity_fee() method, preventing the protocol from updating the liquidity fee. The function ser_dex_treasury_fee() set_individual_token_team_fee() and set_individual_token_liquidity_fee() also face a similar issue.
Single-step Ownership Transfer Can be Dangerous
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
Single-step ownership transfer means that if a wrong address was passed when transferring ownership or admin rights it can mean that role is lost forever. If the admin permissions are given to the wrong address within this function, it will cause irreparable damage to the contract.
Set Functions Lack of Access Control
Severity: High
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
The set_tenant_pause and set_tenant_liquidation_fee_address functions have no access controls, allowing anyone to set arbitrary numbers, take the profits of interest rates, etc.
Anyone can reset initial price of pool
Severity: High
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
reset_init_price is a public function.
Public access to register_collateral can lock out CoinTypes from APD
Severity: High
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
Is public function, needs to be public(friend).
Medium Findings
Ineffective Revocation of Submitter Privileges
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description: The access control mechanism for submitters is flawed. The check within approve_token_transfer only verifies that a transacting address exists as a key in the submitters map, but completely ignores the associated boolean flag indicating if it is active. Consequently, a submitter whose privileges have been revoked (active = false) can still successfully call approve_token_transfer, defeating the revocation mechanism entirely.
Pool Griefing Possibility
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The deposit_reward_coins function is exposed as a public entrypoint without any access control, meaning any user can add rewards to any pool at any time before it expires. A malicious actor can exploit this by repeatedly depositing a minimal amount of reward tokens. Each small deposit is sufficient to extend the pool's end_timestamp, which in turn resets the three-month waiting period required for a treasury withdrawal. This can be used to perpetually postpone the treasury's ability to reclaim leftover funds, effectively locking them in the contract indefinitely and causing a denial of service on the treasury withdrawal functionality.
Authorization in xaum_indicator_core update functions
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
The xaum_indicator_core module exposes several update functions — including set_price_9dec, update_price_storage_external, and init_ema_values — that can be invoked publicly without any access control.
Rewarder Emissions On Pool Assets Drain LP Liquidity
Severity: Medium
Ecosystem: Supra Network
Protocol: DexLyn Smart Contract
Auditor: HackenProof Contest SRs
Report: https://hackenproof.com/reports/DEXLYNCA-102
Report Date: Oct 2025
Description:
A malicious rewarder authority can therefore emit rewards denominated in the pool asset and claim them, directly draining LP capital while accounting invariants mask the shortfall.
Lack of Whitelist Control in Flash Loans
Severity: Medium
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: Jun 2023
Description:
borrow_flash_loan function missing whitelist control, any borrower can initiate flash loan.
Missing Permission Verification in fund function
Severity: Medium
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
Anyone can call the fund function and fund campaign.
Wrong event access permission
Severity: Medium
Ecosystem: Sui
Protocol: Sui AMM Swap
Auditor: MoveBit
Report Date: Nov 2022
Description:
Emit functions are public and can be called by anyone, could pretend to successfully call add_liquidity/remove_liquidity/swap and may cause logic errors in the other code.
Direct Invocation Risk in unstake_tokens() and claim_rewards() Functions in stake Module
Severity: Medium
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
It's advisable for this function to also use a friend function to control its invocation.
Initialize Function Lacks Privilege Control
Severity: Medium
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
The initialize function can be called by any user and passed any parameter.
Bad validation condition for function caller
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description:
controller::add_reserve currently asserts the caller must be the @aries address, preventing calls from other addresses set in controller::init. Replace with assert_is_admin(signer::address_of(account)) for proper admin verification.
Function visibility issue
Severity: Medium
Ecosystem: Aptos
Protocol: Transit Finance
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Transit-Finance-Audit-Report.pdf
Report Date: Nov 2022
Description:
emit_event_swap in aggregator module, is public and anyone can call it.
Deploy contract without multi-sig
Severity: Medium
Ecosystem: Aptos
Protocol: Transit Finance
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Transit-Finance-Audit-Report.pdf
Report Date: Nov 2022
Description:
Doesn't use a multi-sig contract for deployment.
Deploy contract without multi-sig
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
Doesn't use a multi-sig contract for deployment.
Lack of AC in Metadata Setters
Severity: Medium
Ecosystem: Sui
Protocol: Recrd
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2024
Description:
This allows anyone to invoke these setter functions to modify the metadata fields, resulting in unauthorized changes.
Low Findings
execute_config_tx_internal should be public(package)
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
execute_config_tx_internal should be public(package).
A transaction cancelation can be proposed without having an approve cap
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
request_cancel_mpc_transaction, the comment seems to indicate that false should be true.
Anyone can create more vaults
Severity: Low
Ecosystem: Sui
Protocol: Bluefin RFQ
Auditor: Asymptotic
Report: https://bluefin.io/blog/doc/bluefin_rfq_audit.pdf
Report Date: Feb 2025
Description:
create_rfq_vault is public and does not take an admin cap, allowing anyone to create Vaults.
This is also contrary to the doc of the function: “cap: Immutable reference to admin cap to ensure the caller is the Admin of the protocol/”
Race Condition in Full Sail Distribution Initialization
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The init_fullsail_distribution_gauge function allows any user with a GaugeCap to set a pool's fullsail_distribution_gauger_id with their own gauge ID. While the function verifies that the pool ID matches the intended target, it fails to implement proper access control for the initialization action itself.
Since the number of GaugeCap is not limited and can be created by anyone holding a CreateCap, this introduces a race condition: the first GaugeCap owner who calls this function will gain privileged functionality over Full Sail distribution for that pool.
Unrestricted Access to Partner Fee Reception
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The receive_ref_fee function in the partner module is declared as public, allowing any user to add arbitrary coins to partner fee balances and trigger corresponding events. Malicious actors can manipulate partner accounting by emitting false events, compromising the reliability of the protocol's fee tracking system.
Unprotected Public Function Has Mutable Access to Shared State
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The public function is_allowed_coin accepts a mutable reference ( &mut GlobalConfig ) to the shared object GlobalConfig . Although the current implementation is read-only, its function signature is misleading and violates the principle of least privilege.
Users may arbitrarily decrease the remaining mixes of their SuiFrens
Severity: Low
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: Users may arbitrarily call decrease_remaining_mixes_by_one. Users may supply their SuiFrens and reduce the remaining mix in the object without minting a new SuiFrens. This function also does not check if the remaining_mix is set to None(), aborting the application.
Unrevokeable Minter Capability
Severity: Low
Ecosystem: Sui
Protocol: Ghost Ivy
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: The Havencompass admin issues MintCaps to minters to allow minting of new GameKeys.
public fun issue_mint_cap(_cap: &mut AdminCap, ctx: &mut TxContext): MintCap {
let mint_cap = MintCap {
id: object::new(ctx)
};
mint_cap
Issued MintCaps may only be burnt with the full cooperation of MintCap owners.
public fun burn_mintcap(mint_cap: MintCap) {
let MintCap { id } = mint_cap;
object::delete(id)
Thus, if a minter turns malicious due to cases such as wallet compromise, then admins would be unable to perform damage control by revoking mint permissions.
Visibility of burn And claim_specified_amount May Change To Private
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Finance Liquid Staking Derivative
Auditor: MoveBit
Report: https://movebit.xyz/reports/Aftermath-Finance-Liquid-Staking-Derivative-Audit-Report.pdf
Report Date: Nov 2023
Description:
In receipt.move both burn and claim_specified_amount function are declared as public friend function, however, neither lsd::staked_sui_vault_state nor lsd::staked_sui_vault call any of them directly.
Unnecessary friend Privileges
Severity: Low
Ecosystem: Sui
Protocol: Dola Protocol
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
Some functions in the boots.move module have unnecessary friend privileges, such as withdraw_boost_coin , mint_boost_coin , burn_boost_coin , etc., which are only used in this module, but are still given friend privileges, so it's recommended to remove them.
Missing entry in mint_entry and redeem_entry Functions
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
The functions mint_entry and redeem_entry are missing the entry keyword in their declarations. In the Move language, the entry keyword is used to define a function that can be called from outside of the module.
borrow_proposal_request Missing Permission Control
Severity: Low
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: June 2023
Description:
borrow_proposal_request does not add any permission restrictions, but the corresponding permission checks are done in the is_proposal_rejected and is_proposal_approved functions.
Incorrect Function Call Permissions
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
The function market::new() is only called in market.move, yet its visibility is public (friend).
Optimization of Function Visibility
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
The functions get_reserve_detail_mut_by_address() and get_reserve_detail_mut() return mutable objects. It is best not to set this type of function as a public function, as it may bring risks.
Incongruities in Role Management Checks
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
The role management verifications are flawed in multiple functions, resulting in improper access control and inconsistencies between the actual implementation and the documentation.
Flash Loan Accessibility Restriction
Severity: Low
Ecosystem: Aptos
Protocol: Meso Lending
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2024
Description:
In lending_pool, start_flashloan, and end_flashloan are marked as public(friend), implying they may only be called by other modules or addresses that are designated as friends of the module, not by external users directly. This restriction renders the flash loan functionality unusable to the general public, as they will be restricted from triggering these functions.
Limit Bypass Through Stake Coins Invocation
Severity: Low
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
stake_router provides two entry points to stake coins:
• stake_router::stake_coins- A permissionless staking endpoint. Takes inCoin
Accessibility Contradiction in the Utilization of swap_exact_x_to_y_direct() Function
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The function swap_exact_x_to_y_direct() is a friend function, yet it's only called within the current module and not in any other modules. Therefore, it behaves as a private function, which contradicts the intended access permissions for this function.The function swap_exact_y_to_x_direct() and update_pool() also suffers from the same issue.
Lack of #[test] Attribute
Severity: Low
Ecosystem: Aptos
Protocol: StreamFlow
Auditor: MoveBit
Report: https://movebit.xyz/reports/StreamFlow2-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
The init_module_test function is missing the test #[test] attribute tags, missing them would cause the function to be compiled into the program and, since the permissions are public, any user can call the function.
The Admin Lacks the Permission for the BurnExecuteCapability Capability
Severity: Low
Ecosystem: Aptos
Protocol: Merkle Trade Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Merkle-Trade-Smart-Contract-Audit-Report.pdf
Report Date: July 2023
Description:
The admin can only register the ExecuteCapability to other addresses, but the admin lacks permission for the burn ExecuteCapability capability. The following code only allows the executor candidate to burn the ExecuteCapability.
The function init_reward_container is missing caller constraints
Severity: Low
Ecosystem: Aptos
Protocol: Aries Market(Aptos)
Auditor: MoveBit
Report Date: Feb 2023
Description:
The function init_reward_container should only allow @aries calls, but there is no restriction here.
lp_account::retrieve_signer_cap should be a friend to liquidity_pool
Severity: Low
Ecosystem: Aptos
Protocol: LiquidSwap
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Pontem Liquidswap - Zellic Audit Report.pdf
Report Date: Nov 2022
Code Snippet: N/A
Description:
The function lp_account:)retrieve_signer_cap can currently be called by any module. If lp_account:)retrieve_signer_cap is called by a function other than liquidity_ pool:)initialize, then the initialization process of Liquidswap will be unable to move forward. Impact The initialization of Liquidswap can be griefed. This will make liquidswap inaccessible to any users.
default_reserve_interest_rate_strategy::set_reserve_interest_rate_strategy should be
declared as public(friend)
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The current implementation of set_reserve_interest_rate_strategy in the default_reserve_interest_rate_strategy module declares the function as public entry and allows any authed user to initialize or update the interest rate configuration of a reserve (existing or not) without any insurance if the reserve index has been already updated. The function should be declared as public(friend) and only the pool_configurator module should be allowed to call it.
EmergencyWithdrawal spoofing
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The create_pull_rewards_transfer_strategy function can be called by anyone to receive the PullRewardsTransferStrategy resource on the object given by the constructor_ref. This object can then be used in the other public function pull_rewards_transfer_strategy_emergency_withdrawal to spoof emergency withdrawals of the module. While one cannot impersonate the legitimate PullRewardsTransferStrategy with the real rewards_admin and rewards_vault, one can spoof other objects created by oneself and they will all emit the EmergencyWithdrawal of the module.
Allocation of Excessive Privileges to Listing Admin
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: OtterSec
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Ottersec Aave Aptos V3.1-V3.3 Report.pdf
Report Date: Aug 2025
Description:
The asset listing admin may arbitrarily modify reserve configurations via set_reserve_configuration_with_guard, effectively bypassing role separation and increasing governance risk.
Unauthorized initialization function
Severity: Low
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
The Yeap Finance protocol has multiple critical initialization functions that lack proper access control mechanisms, allowing any user to call these functions for system initialization. Attackers may control configuration objects to set malicious parameters.
Business Logic - Overview
Errors in core logic or assumptions that let users exploit intended protocol behavior.
| Business Logic | Findings |
|---|---|
| Critical | 21 |
| High | 58 |
| Medium | 89 |
| Low | 128 |
| Total | 296 |
Critical Findings
Missing assert in liquidate_col_x /liquidate_col_y
Severity: Critical
Ecosystem: Sui
Protocol: Kai Finance
Auditor: Asymptotic
Report: https://info.asymptotic.tech/kai-leverage-verification-report-6ec808dd2adc4b55a4e30f0512260a70
Report Date: Aug 2024
Description:
The missing assert allows using an incorrect configuration, which may allow attacks such as liquidating a valid position and taking the reward. It is not clear whether an attacker could create all required objects for the attack, but it is worth fixing nevertheless.
A liquidity provider can steal from pool via flash loan
Severity: Critical
Ecosystem: Sui
Protocol: Kai Finance
Auditor: Asymptotic
Report: https://info.asymptotic.tech/kai-leverage-verification-report-6ec808dd2adc4b55a4e30f0512260a70
Report Date: Aug 2024
Description:
A liquidity provider can drain a pool by getting a flash loan.
When repaying a flash loan, the underlying value of the shares is artificially increased. It should be increased by interest - interest_fee but it is increased by repay_amt - interest_fee . Once the underlying value is artificially increased, any withdrawal of liquidity will have its value inflated.
Profit Cap Bypass via Partial Position Closures Breaks Protocol Limitations
Severity: Critical
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
A critical issue exists in the profit cap enforcement mechanism for partial position closures. The protocol incorrectly calculates the maximum allowed profit using the full position collateral instead of the proportional collateral being withdrawn, allowing users to extract profits far exceeding the documented 900% limit.
The issue lies in the profit cap calculation logic within the execute_decrease_order_internal function. For partial closures, the protocol uses the entire position's collateral to determine the profit cap, rather than the proportional amount of collateral being withdrawn.
Pool Creation Logic Flaw Allows Single-Asset Liquidity to Generate Dual-Asset Rewards
Severity: Critical
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The Pools Protocol allows the creation of AMM pools where both tokens are identical (e.g., USDC/USDC, IOTA/IOTA), violating fundamental AMM principles. This occurs due to missing validation in the pool creation logic that should prevent same-token pairs. AMMs are designed to facilitate exchanges between different assets. Same-token pools are economically meaningless and create artificial liquidity that can be exploited for disproportionate rewards.
Missing Activation Epoch Check in Join
Severity: Critical
Ecosystem: Sui
Protocol: Walrus
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description: StakedWal in the withdrawal state only checks the withdraw_epoch, while the activation epoch check is missing. This oversight causes reward calculation issues and potential exploitation of the reward distribution mechanism.
New Users Can Get Rewarded Immediately
Severity: Critical
Ecosystem: Sui
Protocol: Dola
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description: The update_user_reward function calculates the delta_index between the user's last_update_reward_index and the reward_index in the pool. For new users, index_rewards_paid defaults to 0, allowing them to claim rewards from the entire reward_index range immediately, causing protocol reward losses.
Stealing of liquidity rewards in stability_pool
Severity: Critical
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
There is nothing to enforce that depositors of APD who are compensated from profitable liquidatable events actually deposited APD prior to the profitable liquidation event and hence exposure to loss. The protocol now requires providers to hold funds for 24 hours or incur a linear fee.
Riskless liquidation rewards in stability_pool
Severity: Critical
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
Because there is no timelock, attacker can liquidate themselves when it optimizes profit of the stability pool.
Redemption mechanism allows uncollateralized vaults to escape liquidation penalization
Severity: Critical
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
Within vault::redeem_collateral, in the event that collateral_usd < debt_usd and collateral_usd < remained_debt_coin prior to the call to repay_interal, and a remained_debt_coin > 0 after the call to repay_internal, the full collateral of the vault will be removed and an amount of debt equal to the collateral amount will be paid. However, the vault will hold a debt equal to debt_usd - collateral_usd.
Adversarial Order Eviction
Severity: Critical
Ecosystem: Aptos
Protocol: Econia
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Econia%20-%20Zellic%20Audit%20Report.pdf
Report Date: Jan 2023
Description:
An attacker can cause legitimate orders to be evicted from the structure, effectively cancelling them. The protocol does not take a fee when a user places a trade, and orders can be cancelled within the same transaction.
The Constant Product Rule is Compromised, Enabling Pool Draining
Severity: Critical
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
If a hacker exploits this mechanism using flash loans to repeatedly swap X for Y, the continuous reduction in k breaks the x * y = k formula. When the quantity of token Y in the pool becomes extremely low, indicating a significantly high value for token Y, a hacker can exploit this situation. With a minimal amount of token Y, the hacker can efficiently exchange for a substantial portion of token X from the pool.
update Function Will Reset The Broker
Severity: Critical
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In the broker.move , update function may be used to update some parameters of a broker. But currently, the update function will reset everything to 0, which destroys the broker. If any user deposits to this broker, then they will lose all their fund.
Improper Enqueue Implementation in Queue
Severity: Critical
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In the queue::enqueue function, there is an issue when inserting a new node. Attempting this after removing nodes will cause a new node to be created, but referenced incorrectly.
Tail Not Updating on Node Removal
Severity: Critical
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In the queue::remove function, the tail node is never updated. This means that whenever a lone root node or a tail node is removed, any subsequent procedures involving the tail node will be incorrect because the tail is not getting updated by this function.
Improper Splay Tree Node Removal
Severity: Critical
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In the splay_tree::remove_node function, there is an issue while removing the root node of the tree, having a right child to the min node of right sub-tree. This scenario leads to the de-referencing of the right child. This is because the left of its parent is set to sentinel without considering the right child of the min node in the right sub-tree This causes the child to lose its reference. Users could lose funds if their orders become inaccessible.
Improper Accumulator Updates
Severity: Critical
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2023
Description:
stake and unstake update parameters for thl coin rewards, which are also affected by the stake_amount. As a result, altering the stake amount may cause incorrect calculations of extra rewards.This vulnerability may be exploited by a malicious user who takes out a flash loan to significantly increase their stake_amount, enabling them to collect rewards for the newly added stake. stakeandunstakeshouldfirst update the accumulatorfor extra rewards usingclaim_extra_reward before modifying the stake amount. This can be achieved by creating a vector to store the names of all extra reward coins and using them in the claim function.
Improper Accumulator Updates
Severity: Critical
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
stake and unstake update parameters for thl coin rewards, which are also affected by the stake_amount. As a result, altering the stake amount may cause incorrect calculations of extra rewards. A malicious user may exploit this vulnerability and take out a flash loan to increase their stake_amount, enabling them to collect rewards for the newly added stake.
Logic Flaw in Time Check
Severity: Critical
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
is_block_flowback_end_time_ok is checking the condition incorrectly. If block_flowback_end_time is zero, the first condition ( block_flowback_end_time != 0 ) evaluates to false, and the function will never abort, as the second condition ( timestamp < block_flowback_end_time ) will also evaluate to false because timestamp::now_seconds will always be greater than or equal to zero.
Incorrect Issuance Value Recording
Severity: Critical
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
compliance_service::create_issuance_information explicitly sets value to zero rather than utilizing the _value parameter, which implies that all recorded issuances will have a value of zero instead of the actual issuance amount. Because every issuance is recorded with a value of zero, the issuance information stored in issuances_values will not accurately represent the actual amounts.
Incorrect Lock Removal Logic
Severity: Critical
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
remove_lock_record_for_investor in lock_manager is intended to swap the lock record at lock_index with the last lock in the investor’s lock list, then reduce the count of locks by one. However, the implementation incorrectly overwrites the lock at lock_index with itself, which implies that the last lock is removed instead of the one at lock_index .
Bypassing Funds Repayment via Double Upscaling
Severity: Critical
Ecosystem: Aptos
Protocol: Thala Swap + Math V2
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
The vulnerability arises from double upscaling during the repayment process in pay_flashloan when handling meta-stable pools. Specifically, pay_flashloan upscales balance_after_flashloan twice. When handling meta-stable pools the funds are multiplied by their value derived from an oracle. As a result the post-repayment invariant computation utilizes an incorrectly scaled value.
High Findings
User Fee And Reward Underflow Caused By pool.bin_manager.remove_bin()
Severity: High
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
When remove_liquidity() and close_position() remove a bin whose liquidity is 0, it deletes all data for that bin. However, that data includes rewards_growth_global , fee_a_growth_global , and fee_b_growth_global . Although these fields are deleted from the binManager 's bin, the corresponding entries in PositionManager — positions[id].stats for that bin_id — are not reset to 0 in remove_liquidity().
Absence of Verification for Reward Start Timestamp
Severity: High
Ecosystem: Sui
Protocol: Cetus CLMM
Auditor: OtterSec
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
In Cetus DLMM, rewards are expected to start on or after the REWARD_PERIOD_START_AT timestamp, which anchors all reward periods. Currently, pool::add_reward does not enforce this, allowing a reward to be scheduled with a start time before this timestamp.
Recommendation:
Enforce start_time >= REWARD_PERIOD_START_AT during reward addition in pool::add_reward and reward::add_reward .
An address can be associated with multiple vaults
Severity: High
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description: get_vault_id_by_address assumes that NetworkAddress can be in only one vault , but that is not checked by execute_config_add_vault or execute_config_vault_edit.
This allows an address to be inadvertently or maliciously be set into two different vaults — when approving configs, it is easy to miss that an address has been added somewhere in the past. This can easily lead to bypassing policies which black- or white- list vaults.
Redeem Fees Distort MDD Calculation, Bypassing Safety Mechanisms
Severity: High
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The vulnerability originates in the redeem function. The core issue is that withdrawal fees, while correctly deducted from the user's redemption amount, are not segregated from the main collateral vault. This leftover collateral artificially inflates the post-redemption share price of the remaining DXLP tokens. The DXLP share price is conceptually calculated as vault_balance / dxlp_supply.
Liquidation Blocked by Profit-Taking Cooldown
Severity: High
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The execute_exit_position function is responsible for closing a user's position for three reasons: take-profit (TP), stop-loss (SL), or liquidation. The contract also implements a "cooldown period" (cooldown_period_second), a configurable duration after a position's last interaction during which profitable exits are meant to be disabled to mitigate certain MEV strategies.
A logical flaw in the exit conditions allows the profit-taking cooldown to block liquidations incorrectly. If a position is eligible for liquidation but its pre-fee profit-and-loss (P&L) is positive, the cooldown logic will override the liquidation trigger, causing the transaction to fail. This allows underwater positions to remain open, posing a direct and accumulating risk to the solvency of the House LP, which must cover the eventual losses.
Leverage Clamp Can Push Open Interest Over the Pair Cap
Severity: High
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The execute_increase_order_internal function contains logic to automatically adjust a user's position size to ensure it complies with the pair's minimum and maximum leverage settings. This "leverage clamp" is applied after initial safety checks, including the check against the pair's maximum open interest (max_open_interest).
A check-then-act issue exists because the protocol validates an order's size_delta against the max_open_interest limit before the leverage clamp is applied. The subsequent clamp can then silently inflate the final position size beyond what was validated, allowing the total open interest for a pair to exceed its configured cap. This bypasses a critical risk management control and could lead to the House LP taking on more risk than intended, potentially threatening protocol solvency if exploited repeatedly.
The Committee is Static and Cannot be Rotated
Severity: High
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description: Due to a combination of checks in bridge.move and state-clearing logic in committee.move, the bridge committee can only be created once and can never be updated or rotated thereafter. This flaw permanently locks control of the bridge to the founding members, completely decoupling its security from the underlying economic stake of the mainnet. An old, low-stake committee could retain indefinite control over all bridged assets.
Token Supply Inflation via Improper Refund Logic in approve_token*_*transfer and claim_token
Severity: High
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description:
The bridge's refund mechanism, designed to return funds to a user after a failed cross-chain transfer, contains a critical flaw that leads to permanent token supply inflation. When a refund is processed on the IOTA chain, the system mints the user's original gross token amount, failing to account for the non-refundable fee that was deducted and paid out during the initial transfer request. Because more tokens are minted in the refund than were originally burned, each failed transaction inflates the circulating supply of the bridged asset, violating the fundamental 1-to-1 asset backing of the bridge.
Incorrect Balance Destruction Logic Poses Risk of Asset Loss
Severity: High
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the else branch of the liquidation function, the code unconditionally calls balance::destroy_zero(repay_balance) and balance::destroy_zero(revenue_balance), but these balances are not guaranteed to be zero at this point.
Loss of Funds Due to Invalid Gas Recipient
Severity: High
Ecosystem: Sui
Protocol: Mayan Sui
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description: The addr_dest parameter is not a real address and cannot receive funds, leading to loss of funds.
Repeated Invocation Resulting in Excessive Claims
Severity: High
Ecosystem: Sui
Protocol: Mysten Republic Security Token
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description: Users can invoke the claim function multiple times for the same entitlement, allowing them to drain more tokens than intended from the protocol.
Flawed Version Validation Check
Severity: High
Ecosystem: Sui
Protocol: Hop Aggregator
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description: The version validation check incorrectly compares config.version against itself, making the validation ineffective and potentially allowing incompatible versions to be used.
Missing Invariant Checks
Severity: High
Ecosystem: Sui
Protocol: Aftermath
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: The protocol does not verify that new_invariant is equal to or greater than old_invariant, which could lead to protocol state inconsistencies and potential value extraction.
Minting of Suifrens with Insufficient Mixing Limit
Severity: High
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: Due to a typo during mixing, the function uses the wrong mixing limit, potentially allowing users to mint Suifrens beyond the intended constraints.
Incorrect Domain Name Field Retrieval
Severity: High
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: The helper function for retrieving domain_names fields returns incorrect values under two circumstances: (1) when the domain is a normal domain, it returns an empty string for default_domain_name, and (2) when the domain is a subdomain of addr.reverse, it returns the default domain name without validation.
Cooldown Bypass
Severity: High
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description: An incorrect timestamp comparison allows users to bypass the cooldown period. The assertion assert!(current_time >= cooldown.cooldown_end || management.cooldown_duration == 0, EInvalidCooldown) uses the wrong comparison operator, allowing actions before the cooldown has expired.
Incorrect Function Logic in sub_total_staked_unsafe
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description: When both branch judgments in the sub_total_staked_unsafe function fall to else cases, last_total_staked is subtracted twice. This affects the value of get_ratio calculation, causing the ratio to become larger and subsequently impacting reward calculations.
Incorrect Sort Function Implementation
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description: The sorting logic of the sort_validators function is flawed, resulting in validators not being sorted according to vldr_prior size as intended.
Logic Flaw in minted_buck_amount
Severity: High
Ecosystem: Sui
Protocol: Bucket
Auditor: MoveBit
Report Date: Jun 2023
Description: There is a critical logic flaw in the calculation of minted_buck_amount that could lead to incorrect token minting amounts.
Wrong Use of new_participants_by_weight
Severity: High
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: Jun 2023
Description: The participants_by_weight vec_map incorrectly obtains keys from new_participants_by_weight instead of from participants_by_weight, leading to incorrect participant weight calculations.
Authentication Logic Error
Severity: High
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: Apr 2023
Description: The get_auction_max_size function lacks proper verification, and the remove_authorized_user logic is backwards—it checks if the user does not exist rather than if they exist, causing authentication failures.
Validating Errors When Adding to Whitelist
Severity: High
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: Apr 2023
Description: The assert statement is backwards when adding addresses to the whitelist in set_whitelist_address_config(), preventing new addresses from being added to the whitelist.
Receive Return Values in Incorrect Order
Severity: High
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: Apr 2023
Description: In the get_reserves function, return values are received in the wrong order, causing incorrect calculation of amounts during swapping and liquidity addition operations.
Inconsistent Token Ratios
Severity: High
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: Apr 2023
Description: When adding liquidity, the number of liquidity tokens should be calculated based on the ratio of added tokens to the pool. Currently, excess money is sent to the pool instead of being returned to the user.
LSP Value Should Be Greater Than 0
Severity: High
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: Apr 2023
Description: When adding liquidity, the number of liquidity tokens returned should be greater than 0, otherwise users cannot retrieve their tokens. A validation check needs to be added.
No Limit to Swap
Severity: High
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: Apr 2023
Description: Due to blockchain delays, the price when a swap is submitted may differ from what the user receives. A minimum min_out parameter should be implemented with a condition that the output must be greater than or equal to min_out.
Incorrect Protocol Fee Handling
Severity: High
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: Apr 2023
Description: If protocol fees are not withdrawn, they will be incorrectly withdrawn by users who add liquidity, leading to unfair fee distribution.
Random Design Flaws
Severity: High
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Mar 2023
Description: In random.move, when the seed parameter of functions seed and seed_rand is 0, all random numbers generated will be 0. This is used in skip_list, and if misused with a 0 seed, it will lead to an endless loop in the skip_list implementation.
Data Integrity and System Reliability Issue (Missing Data Check)
Severity: High
Ecosystem: Sui
Protocol: Studio Mirai
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/Studio-Miria-audit
Report Date: Feb 2025
Description: The protocol lacks validation to ensure that object IDs match during critical operations, potentially leading to data integrity issues and system reliability problems.
User can bypass MAX_EXPIRATION when extend expiration
Severity: High
Ecosystem: Initia
Protocol: Initia Move
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-01-initia-move
Report Date: Apr 2025
Description:
In the extend_expiration function, the validation for the duration is incorrect, allowing the user to bypass MAX_EXPIRATION.
Extending a domain’s expiration even after the grace period impacts domain buyers
Severity: High
Ecosystem: Initia
Protocol: Initia Move
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-01-initia-move
Report Date: Apr 2025
Description:
The name_service.move module allows users to register domain names. If anyone wants to register an already purchased domain, they can only do so once the expiration_date + grace_period for that domain has passed. The name_service.move module allows anyone to call extend_expiration for any domain, which is a feature (according to sponsors).
The main issue is that the extend_expiration() function allows users to extend the expiration of a domain even after the grace period has ended, which is unintended behavior.
As a result, users, multi-sig owners of the actual domain name, or attackers can frontrun and attempt to call extend_expiration() after the grace period has ended, even if other users are trying to buy the same domain name using register_domain().
This breaks a key invariant of the protocol, leading to genuine users being negatively impacted and experiencing a poor user experience.
Incorrect Slippage Check
Severity: High
Ecosystem: Aptos
Protocol: Hyperion Smart Contracts
Auditor: ExVul
Report Date: Apr 2025
Description:
Slippage protection logic has a backwards condition.
Liquidation logic allows the liquidator to liquidate more than it should
Severity: High
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3
Auditor: Spearbit
Report Date: June 2025
Description:
The Move codebase has incorrectly implemented a feature and will recalculate the debt when the userReserveDebtInBaseCurrency is lower than the totalDefaultLiquidatableDebtInBaseCurrency.
actual_collateral_to_liquidate is burned instead of actual_debt_to_liquidate
Severity: High
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3
Auditor: Certora
Report Date: Apr 2025
Description:
The liquidation_call() function contains an issue in the burn_debt_tokens() function call. It incorrectly passes actual_collateral_to_liquidate as the debt amount to burn, instead of actual_debt_to_liquidate.
This mismatch would lead to incorrect debt burning during liquidations, causing debt tokens to be either overly or insufficiently burned or a denial of service on the liquidation . The amount of debt being burned should correspond to the actual debt being liquidated, not the collateral amount.
Incorrect implementation of reverse iterator
Severity: High
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Laminar%20-%20Zellic%20Audit%20Report.pdf
Report Date: Oct 2022
Description:
The wrong node is checked.
Duplicate call in coin register
Severity: High
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Laminar%20-%20Zellic%20Audit%20Report.pdf
Report Date: Oct 2022
Description:
The register_staking_account calls coin::register twice.
Order checker functions use full order size rather than remaining order size
Severity: High
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Laminar%20-%20Zellic%20Audit%20Report.pdf
Report Date: Oct 2022
Description:
In book::can_bid_be_matched and book::can_ask_be_matched instead of adding remaining size of orders, it adds up full sizes of these orders. Change let bid_size = (order::get_size(bid) as u128); to let bid_size = (order::get_remaining_size(bid) as u128);
Incorrect Assertion in deposit_manager
Severity: High
Ecosystem: Aptos
Protocol: Echelon
Auditor: Zellic
Report Date: Jan 2025
Description:
There is an assertion that always fails. While the msg length is always greater than 65 bytes, taking the module of the length by 32 will always result in a value less than 32, making it impossible to equal 65.
There is No Slippage Protection During The Distribution of DEX Fees
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
During this exchange process, there is an absence of slippage protection.
Initializing fee_to As ZERO_ACCOUNT May Result In Transferring Fees to The Zero Address
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
In the init_module function, initializing fee_to as ZERO_ACCOUNT means that if the set_fee_to function is called to set a new address for fee reception, swap fees will be transferred to the zero address.
Token Extraction Mismatch in Fee Distribution Logic
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The function swap_v2.distribute_dex_fees() is used to ensure proper distribution of DEX fees, regardless of the input token. In the case where type_info::type_of
refund_entry Function Can Be Called Multiple Times
Severity: High
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
The refund_entry function did not update the user's status after the user was refunded resulting in the user being able to call refund_entry multiple times and reduce the value of total_bought at will. Also the withdraw_round function operator can be called multiple times.
Function Does't Return
Severity: High
Ecosystem: Aptos
Protocol: vibrantX
Auditor: MoveBit
Report: https://movebit.xyz/reports/vibrantX-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
When the token is not sorted before, the function will be recalled, and the execution of the previous function is not terminated, which will cause the code to be executed twice.
Config update error
Severity: High
Ecosystem: Aptos
Protocol: PatronusFi
Auditor: MoveBit
Report Date: Mar 2023
Description:
The update function should judge the new_cfg, if new_cfg exceeds limitations of assert, it would be set for the first time, and could not be set later.
Logical Error
Severity: High
Severity: High
Ecosystem: Aptos
Protocol: PatronusFi
Auditor: MoveBit
Report Date: Mar 2023
Description:
In vault.move, when borrow_cap.temporary is true, vault.paused will be verified as true then set to false, in the next if statement, vault.paused will already be paused and the contract will always panic.
Freeze Bridge with Invalid Sender
Severity: High
Ecosystem: Aptos
Protocol: LayerZero
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Sep 2022
Description:
Only the bridge UA is intended to send messages to the bridge contract. However, this behavior is not enforced at the relayer level. any UA can send messages to any other endpoint.
Amend Order Missing Refund
Severity: High
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In the book::amend_bid_order function, when a user tries to decrease the size of an order having the same price, the size of the order gets reduced silently without a refund. Users should be refunded when the size is reduced.
Deducting Vault Interest When Repaying Debt
Severity: High
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2023
Description:
In the protocol module, repay_internal is used to repay amounts borrowed from the vault. However, when repaying the borrowed amount, the interest should also be cleared in addition to the debt.Although the protocol uses fees::absorb_fee to calculate and absorb the repaid interest amount, this amount is not subtracted from the vault.interest. Consequently, a user is unable to clear the interest in their vault, even though it is absorbed from the repayment amount.
Improper Accumulator Updates In V2 Mode
Severity: High
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
The stake and unstake functions update the stake amount of the user. These functions also calculate the amount of rewards accrued until that time and store it, and then update the accumulator on the user pool. In the recent changes introducing v2 mode for farming, when v2 mode is enabled, the thl rewards for a user are not accrued in stake and unstake; this results in improper rewards for users.
Deducting Vault Interest When Repaying Debt
Severity: High
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
In the protocol module, repay_internalis used to repay amounts borrowedfrom the vault. In addition to the debt, clearing the interest should be done when repaying the borrowed amount. Although the protocol uses fees::absorb_fee to calculate and absorb the repaid interest amount, the protocol does not subtract this amount from vault.interest. Consequently, a user is unable to clear the interest in their vault, even though the protocol absorbs it from the repayment amount.
Removal Of Active Bin
Severity: High
Ecosystem: Aptos
Protocol: Pontem clmm
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2023
Description:
The vulnerability arises when a liquidity provider becomes the sole provider for a particular price range, i.e., the active bin. This situation may temporarily disrupt the swapping logic of the CLMM. In pool, swap_inner handles the swapping of assets between users, and when it attempts to access the data associated with the active bin utilizing its ID, it assumes that active_bin_id exists in the pool.bins table. However, if a liquidity provider is the only one providing liquidity for this particular active bin, it is possible that they decide to remove their liquidity from that bin. When a liquidity provider removes their liquidity from a bin, it triggers the burn logic, which removes the liquidity providers. This results in the bin being entirely removed from the pool.bins table, effectively erasing the active bin.
Bin Price Manipulation
Severity: High
Ecosystem: Aptos
Protocol: Pontem clmm
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2023
Description:
In this CLMM, there are multiple bins, each having its price range where users may add liquidity. This vulnerability allows a malicious user to manipulate the price of shares in a specific bin within the CLMM. This manipulation may be exploited to artificially inflate the price of shares in that bin to extremely high values, creating unfavorable conditions for other participants and potentially blocking or monopolizing that bin. The user may profit by burning the last share in the manipulated bin.
ThalaSwapV2
Severity: High
Ecosystem: Aptos
Protocol: ThalaSwapV2
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description:
The vulnerability concerns the lack of slippage checks within the entry functions in pool. Slippage parameters protect the protocol from accepting values that are drastically different from the current market conditions due to market volatility or large trades in the pool. This can result in inaccurate transactions within the pool, potentially affecting users unfairly.
Flaw in Full Transfer Checks
Severity: High
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
In compliance_service::pre_deposit_check_regulated , the get_force_full_transfer condition checks if full transfers are enforced when the transfer originates from the US. If this condition is true, the function immediately aborts the transfer with the error code EONLY_FULL_TRANSFER. If get_force_full_transfer is enabled and the transfer originates from the US, any transfer to the platform wallet is rejected, regardless of whether the transfer satisfies the required full transfer conditions. As a result, valid transactions may be blocked.
Incorrect Reward Initialization
Severity: High
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
The issue in the lending core farming module occurs when a user is accruing a specific reward for the first time. When a user first starts accruing a reward, their last_acc_rewards_per_share is set to pool_acc_reward_per_share . This is problematic, as users who had staked before the reward was introduced will not receive any rewards for the period between their staking and their first accrue_user_pool_reward call.
Missing Solvency Check
Severity: High
Ecosystem: Aptos
Protocol: Echleon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
isolated_lending::withdraw_internal lacks a check for bad debt, allowing users to withdraw supplied assets even if their position is underwater. This creates a vulnerability where users may extract value even though they are insolvent. If the borrowed value exceeds collateral, supply shares should not be withdrawable, as they may be needed to cover the shortfall.
kAPT Double Minting
Severity: High
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
rewards_manager::update_rewards calculation does not account for minting fees. When stake is added to a delegation pool, an add_stake fee is deducted if the validator being delegated to is producing rewards for that epoch. This fee is temporarily subtracted from the delegator’s active stake and is refunded in the next epoch. The protocol tracks this fee separately and allows the admin to collect it asynchronously. Despite this, the staked APTs are still marked as rewards by the update_rewards function, causing it to mint kAPT on their behalf. Later, when the admin collects these fees, kAPT is re-minted for the same amount, resulting in double-minting and an immediate depegging of kAPT .
Absence of Verification for Reward Start Timestamp
Severity: High
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: OtterSec
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
In Cetus DLMM, rewards are expected to start on or after the REWARD_PERIOD_START_AT timestamp, which anchors all reward periods. Currently, pool::add_reward does not enforce this, allowing a reward to be scheduled with a start time before this timestamp. When such a reward exists, reward_settle, which is called on every pool operation, will encounter invalid time intervals, breaking settlement calculations as reward_settle logic expects rewards to start on or after REWARD_PERIOD_START_AT. This results in a denial-of-service affecting multiple operations.
Medium Findings
Users are Not Paying Protocol Fees
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The open_position and add_liquidity functions correctly reflects the net amount of assets the user adds to the pool after paying the fees. However, this only records the increase in fees, without the actual transfer process.
Ref Fee Calculation Based on Protocol Fee Leads to Double Charging
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
There is a significant fee double-counting issue in the fee calculation logic of the swap operation.
Incorrect Fee Allocation Logic in Swap Operations Leads to Duplicate Protocol Fee Collection
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
A critical fee allocation error has been identified in the swap operation's fee handling logic. The issue arises from inconsistent fee processing between the bin level and the pool level.
Bin Level: accumulate_fee(fee_amount, 0) allocates the entire swap fee to liquidity providers. Pool Level: Simultaneously, the protocol fee is calculated and collected from the same fee. Result: The protocol fee is effectively double-charged, meaning an additional fee is levied on users.
Collect-Fee/Reward Pause Can Be Bypassed By Closing Positions
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The close_position function implicitly performs three actions at once: it removes liquidity, collects trading fees, and collects accrued rewards (the close certificate carries rewards that can be withdrawn later). However, close_position calls operation_check with only restriction::remove_kind() . Because operation_check only checks disable_remove for REMOVE and does not also check the collect toggles, a user can collect fees and rewards by closing their position even when the pool has collect operations paused (disable_collect_fee = true and/or disable_collect_reward = true).
Emergency Pause Ignored When Active Bin Is Empty
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
In pool.move, the reward_settle function checks pool.bin_manager.is_active_bin_empty(pool.active_id) before it checks pool.reward_manager.emergency_reward_pause() . This branch order makes the pause ineffective whenever the active bin is empty. In that case, the code calls rollover_refunds_into_remaining_time(accumulated_rewards, clk) and returns without ever consulting the emergency pause flag.
Incorrect Fee Rate Used in flash loan
Severity: Medium
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The flash loan function currently applies the pool’s swap fee rate when calculating flash loan fees, instead of the dedicated flash loan fee rate. By design, flash loan fee rate is initialized to zero when the pool is created, while swap fee rate is always set to a nonzero value. As a result, users are incorrectly charged swap fees for flash loans. Furthermore, the flash loan fee rate is hardcoded at pool creation and cannot be updated. This immutability makes the existence of a separate flash loan fee rate parameter largely redundant.
Handling Unopened Pools to Prevent User Interaction Failures
Severity: Medium
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
When a pool has not yet been opened (i.e., when admin::init_reward sets the start_time to a future timestamp), user interactions may cause pool.last_update_at to exceed effective_update_time . This results in an underflow protection error in the subtraction effective_update_time - pool.last_update_at within the sync_or_advance_epoch function, causing user interactions to fail.
Users can deposit before the pool is initialized
Severity: Medium
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
With default zeros on deployment, sync_or_advance_epoch early-returns and deposit still passes the “synced” check because last_update_at == reward_end_at which are both zero, allowing deposits before epoch_data is seeded.
Single epoch claim can target a not-yetcreated epoch id and abort
Severity: Medium
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The claim_reward_single_epoch can compute claim_epoch_id = last_claimed_epoch + 1 within the same epoch and immediately try to read epoch_data for that future epoch. If the next epoch hasn’t been finalized or created yet, this path aborts.
Type Order Validation Bypass in Pool Key Generation
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The new_pool_key function in the factory module contains a critical flaw in its type order validation logic. The issue occurs because the function modifies the comparison buffer (bytes_a) during processing but uses the modified length for validation checks, rather than the original length.
Reward Balance Segregation Missing in Global Vault
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description: The RewarderGlobalVault is implemented as a singleton for all pools, while each pool has its own RewarderManager that can handle up to 3 different coin types as rewards. The settle function is called separately for each pool and uses that pool's liquidity as a parameter, but incorrectly assumes the entire RewarderGlobalVault balance belongs to the calling pool. There are no checks to segregate or track reward balances per pool. When multiple pools use the same coin type for rewards, each pool's settlement calculation incorrectly uses the total vault balance, leading to reward calculation errors and potential over-distribution.
Unprotected Reserved Amount Changes During Vault Valuation
Severity: Medium
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The public entry function decrease_reserved_from_position modifies reserved amounts during execution but lacks an assertion check for locked market vaults during valuation. This oversight could corrupt vault valuations if the function runs during an active valuation process.
Inefficient Error Handling Architecture
Severity: Medium
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The current implementation of open_position and decrease_position functions employs an inefficient error handling pattern that propagates failures through multiple layers of the call stack. This approach: • Increases code complexity unnecessarily • Makes error tracking and debugging more difficult • Results in bloated logic flows
Unfair Fee Distribution for Failed Order Executions
Severity: Medium
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
In the current implementation, order parameters are checked during execution within execute_open_position_order and execute_decrease_position_order functions. Order executors receive fees even when order execution fails, while users must manually recover their collateral through clear_open_position_order.
Inflow addresses are checked by outflow filters
Severity: Medium
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description: check_allowed_amount_token does not filter for outflow in AllowedAmountToken::Any, unlike AllowedAmountToken::AmountToken and AllowedAmountToken::AmountTokenAgg.
This means inflow (non-outflow) addresses are checked against the allowed outflow. In practice, this leads to rules with inflows and AllowedAmountToken::Any failing unexpectedly. With more complex policies / with fall-through rules, this could allow vulnerabilities.
Leverage Boundary Invariant Conflicts with Actual Code Logic
Severity: Medium
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The Dexlyn perpetual DEX protocol has a leverage boundary calculation inconsistency that causes valid user positions to be unexpectedly rejected. Users who believe they are opening positions within the advertised 150x leverage limit experience transaction failures due to fees being deducted from collateral before leverage validation.
The protocol calculates leverage using effective collateral (user collateral minus fees) rather than provided , causing the actual leverage to exceed the 151x buffer limit even when users offer what appears to be adequate collateral for 150x leverage.
Blocklisted Status is Not Persistent Across Committee Rotations
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description: A committee member's blocklisted status is not persistent. If a committee rotation were possible, any previously blocklisted member would be automatically reinstated as a fully trusted member in the new committee. This flaw would force governance to re-apply blocklists for known bad actors after every single epoch, an operationally fragile and unrealistic security practice.
Initial Liqudity Price Manipulation
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The issue is located in the calculate_amount_for_liquidity_internal function. When a pool has zero liquidity (i.e., reservea 0 && reserveb 0), the function does not enforce any price ratio. It simply returns the amount_a_desired and amount_b_desired values provided by the user, setting them as the official starting price for the pool.
Malicious attacker can make messages sent through the bridge unfinalized
Severity: Medium
Ecosystem: Supra Chain
Protocol: Dexlyn Hyperlane
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-hyperlane-monorepo-dec2024/
Report Date: Dec 2024
Description:
It was identified that on the MOVE side the relayer directly calls handle_message in the recipient contract address and the recipient contract in turns calls handle_message of the mailbox for verification and validation. However, there is no way to assert in the mailbox that the message that is going to get verified was actually being called from the intended recipient contract or not.
As a consequence, a potential attacker is able to create a malicious contract, handling the call to handle_message, which will be called by him in the context of a completely correct message. The recipient is not verified - it may therefore be different than the intended message recipient.
Fee Manipulation via Improper LP Coin Split
Severity: Medium
Ecosystem: Sui
Protocol: Aftermath Market Making
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
New coin value can be set to 0, causing issues. When the UserLpCoin with a non-zero LP balance but zero provided_value_usd is introduced, although this UserLpCoin has no contribution to the provided_value_usd , it is still entitled to a withdrawal of funds based on its LP balance. This withdrawal bypasses the fee calculation mechanism, since the fees are determined by the profits derived from balance_to_withdraw and provided_value_usd .
Blocklist Validation Order Mismatch
Severity: Medium
Ecosystem: Sui
Protocol: Sui Bridge
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2024
Description:
Because it scans through vector, if stored out of order, then it may not find. In committee::execute_blocklist, the member_idx variable is not reset to zero at the beginning of each iteration of the outer while loop. Thus, if a blocklist contains Ethereum addresses in a different order than the order of committee members stored in self.members, the function may fail to find the corresponding committee member even though the member is present in the list.
Incorrect Function Call
Severity: Medium
Ecosystem: Sui
Protocol: Sui Axelar Gateway V2
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
Within estimate function, get_estimate is called rather than obtaining true balances.
Unsafe Role Removal
Severity: Medium
Ecosystem: Sui
Protocol: Cetus
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
Uses subtraction to remove roles, additional roles may be added or subtracted by removing an unset role.
Reward Accumulation During Inactive Time Period
Severity: Medium
Ecosystem: Sui
Protocol: Bluefin Spot
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2024
Description:
Rewards are account for during between previous reward time and new start time and also during inactive time.
Lack of Configurable Delay Setting in Timelock
Severity: Medium
Ecosystem: Sui
Protocol: Lombard Finance
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2024
Description:
Has feature to set delay, but within code uses hard-coded variable of MS_24_HOURS.
Arbitrary Delete Of Orders
Severity: Medium
Ecosystem: Sui
Protocol: Maven
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2023
Description:
In maven.move, any user can call execute_object_operation with the incorrect ASSET generic and pop the order from execution without properly executing it, as the precheck fails and returns false. This allows anyone to stop others from executing the object operations.
Minimum Stake Bypass in delegation_service
Severity: Medium
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
The Tortuga protocol operates on top of the delegation_service module which operates the pools and computes rewards for the validators and delegators. While most users will delegate indirectly through Tortuga (stake_router), validators can also receive direct delegations through the delegation_service API. Users who want to delegate directly can invoke delegation_service::delegate and provide an amount. Internally, this function ensures that the amount provided meets a minimum delegation amount (which is configurable by the pool owner). While this check ensures that the instantaneous delegation amount is above the required minimum, this limit is not imposed upon withdrawals. Therefore, a user can simply delegate some amount of stake higher than min_delegation_amount and then immediately withdraw a large portion to effectively bypass this limit.
Validators can Manipulate Commission Rates
Severity: Medium
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Registered validators can receive stake from the protocol or directly from individual delegators. Either way, a commission, set by the validator, must be paid. The protocol_commission must be smaller than current_commission, and both have to be smaller or equal to ManagedStakePool max_commission, which is set by the protocol in delegation_service::initialize. The issue is that validators have the ability to drastically increase the commission percentage at any given time. This allows a malicious validator to set a very small commission and later on increase it by a large margin. Given that the stakes are locked via lockup periods (30 days), the validator can profit from a large commission for a long period of time
Liquidate Minimum Debt Vaults
Severity: Medium
Ecosystem: Aptos
Protocol: Argo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Argo enforces a minimum debt threshold when repaying vaults. Unfortunately, liquidate_repay also enforces that the collateral ratio of the vault isn’t repaid fully. This means that vaults that are close to the minimum debt threshold cannot be liquidated.
Issue While Starting New Epoch In Farming
Severity: Medium
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
If an epoch ends earlier than epoch_end_seconds, the code sets farming.epoch_end_seconds to epoch_now. If the current epoch’s starting time is in the future and ending this epoch is attempted, farming.epoch_end_seconds is set to farming.epoch_start_seconds, which is the future time even though the epoch has ended immediately. Now, starting another epoch is impossible until we reach farming.epoch_start_seconds.
Minimum Stake Bypass
Severity: Medium
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
A user may delegate some amount of stake higher than min_delegation_amount, then immediately withdraw a large portion to effectively bypass this limit.
Validators Manipulating Commission Rates
Severity: Medium
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
This allows a malicious validator to set a very small commission and increase it by a large margin later on. Since 30-day lockup periods lock the stakes, the validator may profit from a large commission for a long time.
Reward Distribution Inconsistency
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
When updating the reward configuration with a new reward_per_day, the reward_per_share value, which represents the reward per share, should be adjusted to reflect the new configuration. However, the update_reward_config function fails to calculate the previous unclaimed rewards and update the farm.timestamp based on the old reward_per_day prior to updating the reward_per_share before applying the new configuration.
Potential Deposit Lockup
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
There is a potential vulnerability in the logic of deposit_coin_to_reserve. It prioritizes repaying existing loans with the repay_coin before utilizing it for minting liquidity provider tokens. The issue arises because some coins may not be allowed as collateral within the Aries Markets protocol. If the repay_coin is one such coin, it gets utilized for repayment first. But since the minted liquidity provider tokens represent the remaining deposit_coin (of the same type as repay_coin), adding them as collateral fails. Thus, even if repay_coin amount is enough to cover the entire loan, the call will fail, because it may not be utilized as collateral, rendering the user without standing debt and potential liquidation penalties.There is a potential vulnerability in the logic of deposit_coin_to_reserve. It prioritizes repaying existing loans with the repay_coin before utilizing it for minting liquidity provider tokens. The issue arises because some coins may not be allowed as collateral within the Aries Markets protocol. If the repay_coin is one such coin, it gets utilized for repayment first. But since the minted liquidity provider tokens represent the remaining deposit_coin (of the same type as repay_coin), adding them as collateral fails. Thus, even if repay_coin amount is enough to cover the entire loan, the call will fail, because it may not be utilized as collateral, rendering the user without standing debt and potential liquidation penalties.
Inconsistency in Swap Route Validation
Severity: Medium
Ecosystem: Aptos
Protocol: Echelon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
lending_leverage::loop_supply_x_borrow_y_fa , there is a pool_route and an associated asset_out_route . These define how the borrowed asset Y is swapped back to the supplied asset X via a multi-hop route. loop_supply_x_borrow_y_fa contains incorrect assertions that check the start of the swap route against the input token and the end against an un-utilized out_metadata parameter. This logic is reversed and unnecessary. The route should instead start with the borrowed token ( Y ) and end with the input token ( X ), since the goal is to loop borrowed assets back into the original collateral.
Lack of two-step ownership transfer
Severity: Medium
Ecosystem: Sui
Protocol: Matrixdock
Auditor: Zellic
Report Date: July 2025
Description:
The protocol lacks a two-step ownership transfer and validation of the new owner’s address; should include an address validity check.
Blacklist Logic Inconsistencies
Severity: Medium
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
The implementation of full/soft restrictions in sdeusd.move shows some inconsistencies that may allow bypasses of it.
Orphaned Rewards Captured by First Staker
Severity: Medium
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
Rewards can be distributed when no active stakers exist.
Incorrect Role Revocation Logic May Grant Unauthorized Roles
Severity: Medium
Ecosystem: Supra
Protocol: DexLyn Smart Contract
Auditor: HackenProof Contest SRs
Report: https://hackenproof.com/reports/DEXLYNCA-28
Report Date: Sep 2025
Description:
Revoking a role that doesn’t exist may grant permissions to another role.
Wrong Event Value
Severity: Medium
Ecosystem: Sui
Protocol: Dola
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
In the emit_reserve_stats function, the supply_index field incorrectly uses the return value of the get_borrow_index function, which is the same as the borrow_index , as the value of the event, which may cause confusion in analyzing the data off the chain. Also the UpdateUserRewardEvent event in the claim_reward function, old_reward_index and new_reward_index also use user_reward.last_update_reward_index as a value.
Valid Prizes Can Be Collected As Expired
Severity: Medium
Ecosystem: Sui
Protocol: Random-Vault
Auditor: MoveBit
Report: https://movebit.xyz/reports/Random-Vault-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
In the collect_expired_prize function, anyone can collect the prize that is over the round.end_time. This means, that if the time difference is large enough, the valid prize may be collected.
Incomplete Handling of Fully Repaid Loans in the Loan List
Severity: Medium
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: Jun 2023
Description:
Fully repaid loans remain in the loan list with zero amount, causing redundant computations and indicating missing loan list maintenance.
bottle_table might be out of order
Severity: Medium
Ecosystem: Sui
Protocol: Bucket Protocol
Auditor: MoveBit
Report Date: Jun 2023
Description:
In handle_redeem, if buck_input_amount is fully repaid for a part of Bottle, Bottle debt is 0. If it pushes to end of list, linked_table will be out of order.
Logical Loophole
Severity: Medium
Ecosystem: Sui
Protocol: Turbos Finance-TurboStar
Auditor: MoveBit
Report Date: May 2023
Description:
Sale_balance can be transferred to reduce raise goal, fund function to give more people an opportunity to participate in IDO.
proposal_request can be extracted at any time
Severity: Medium
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: Jun 2023
Description:
Missing check if proposal is approved or rejected, any user of MultiSignature can take away the request object in the proposal.
burn function Design flaw
Severity: Medium
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: Jun 2023
Description:
Missing check for amount = none, which may burn all coins. Change burn_request to first use coin::split to separate the coins in params according to amount.
approved_weight and reject_weight are not compared
Severity: Medium
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: Jun 2023
Description:
approved_weight and reject_weight are not compared, acknowledged as is optional.
Lack of Minimum Liquidity
Severity: Medium
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: Apr 2023
Description:
In the add_liquidity function, there is no min the first time adding liquidity. Add min liquidity and lock it in the pool.
Missing K Value Verification
Severity: Medium
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: Apr 2023
Description:
Missing check, after swap, the value of k should be greater than or equal to the previous value of k.
Lack of K-Value Check
Severity: Medium
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: Apr 2023
Description:
Missing check, after swap, the value of k should be greater than or equal to the previous value of k.
Lack of Minimum Liquidity Requirement
Severity: Medium
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: Apr 2023
Description:
In the add_liquidity function, there is no min the first time adding liquidity. Add min liquidity and lock it in the pool.
Incorrect Protocol Fee Handling
Severity: Medium
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: Apr 2023
Description:
If fee is not withdrawn, fee will be withdrawn by person who adds liquidity. This may also cause asset losses for some users who provide liquidity.
Missing K Check
Severity: Medium
Ecosystem: Sui
Protocol: Sui AMM Swap
Auditor: MoveBit
Report Date: Nov 2022
Description:
Missing check, after swap, the value of k should be greater than or equal to the previous value of k.
No minting of minimum liquidity
Severity: Medium
Ecosystem: Sui
Protocol: Sui AMM Swap
Auditor: MoveBit
Report Date: Nov 2022
Description:
In the function add_liquidity(), if it is the first injection of liquidity, the number of lp tokens obtained will be subtracted from the minimum liquidity value (MINIMAL_LIQUIDITY). The function of MINIMAL_LIQUIDITY is to limit the lower limit of lp supply, thereby reducing the unit price of lp token and increasing the attack cost of lp price manipulation.
This value is directly subtracted in the code, so the value of lp_supply does not increase, and this part should be mint and stored in an address instead of being directly subtracted.
Missing Key Validation in ReserveConfig
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description:
No check if liquidation_threshold > loan_to_value. If threshold is lower, asset can be liquidated immediately when borrowing amount is close to borrowing capacity, resulting in loss to user.
Unreasonable Repayment of Logic for Flash Loans
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description:
In the end_flash_loan() function within controller.move, when repayment is made for a flash loan, if the amount in coin_src exceeds the outstanding payment amount of the flash loan, the excess amount is used to repay other debts or make deposits. This is not a reasonable logic for flash loans.
Missing Reward Collection Check in burn_position Leads to Permanent Reward Loss
Severity: Medium
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The almm_pair::burn_position function allows users to completely destroy their liquidity positions without ensuring that accumulated rewards from the RewarderGlobalVault have been collected first. This function is designed to withdraw all liquidity from all bins in a position and destroy the position object, but it lacks a critical validation step to check if the position has unclaimed rewards from the rewarder system.
factory::revoke_protocol_fee_cap function is implemented incorrectly
Severity: Medium
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
When revoking protocol_fee_cap, instead of removing the cap from allowed_protocol_fee_cap vector, we remove the cap from the allowed_admin, which will result in preventing of removing protocol_fee_cap as the Id is not added into allowed_admin.
Last Holder Can’t Exit, Zero‑Supply Unstake Reverts
Severity: Medium
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
When a user burns the entire remaining supply of a Cabal LST ( sxINIT or Cabal LPT) via initiate_unstake, the follow‑up processing step always aborts with a divide‑by‑zero and the user can never exit.
get_cost_amount allows unlimited free domain registrations
Severity: Medium
Ecosystem: Initia
Protocol: Initia Move
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-01-initia-move
Report Date: Apr 2025
Description:
The get_cost_amount function unintentionally sets the price for domain names of length greater than or equal to 7 to zero. FREE_LENGTH is defined as 7. When the length of the domain name is greater than or equal to 7, the else branch is executed, setting the price_per_year to 0. While this behavior may be intentional to make longer domain names free, it opens the system to abuse.
The proposal expiration logic is incorrect
Severity: Medium
Ecosystem: Initia
Protocol: Initia Move
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-01-initia-move
Report Date: Apr 2025
Description:
The is_proposal_expired function uses incorrect comparison logic that causes proposals to be marked as expired when they should still be active, and vice versa. This is as a result of the reversed comparison operator in the expiration check. The impact of this bug is high because valid proposals are incorrectly marked as expired which prevents legitimate voting. Also the voting period enforcement is effectively reversed. This effectively creates a DoS because any multisig wallet created would be unable to execute proposals.
Missing Token Order and Identity Validation in LP Token
Severity: Medium
Ecosystem: Aptos
Protocol: Hyperion Smart Contracts
Auditor: ExVul
Report Date: Apr 2025
Description:
Two validation issues exist in the lp.move contract's LP token creation functions:
- Token Pair Order Issue in
get_pool_seedsFunction
The get_pool_seeds function generates seeds directly from token_a and token_b without sorting. This can create different LP tokens for the same pair in different orders, potentially splitting liquidity pools.
- Lack of Token Identity Check in LP Creation
The create_share_token function doesn't verify if token_a and token_b are the same, allowing creation of invalid single-token LP tokens.
Missing Tick Range Validation in Vault Creation
Severity: Medium
Ecosystem: Aptos
Protocol: Hyperion Smart Contracts
Auditor: ExVul
Report Date: Apr 2025
Description:
The create_vault function allows users to specify tick_lower and tick_upper without any validation. This leads to two critical problems:
Invalid Tick Order:
There is no check ensuring that tick_lower < tick_upper. This violates the core design of Uniswap V3-style tick ranges, potentially resulting in vaults that cannot function properly due to misconfigured tick boundaries.
Lack of Tick Bound Checks:
Neither tick_lower nor tick_upper are validated against the protocol's global minimum/maximum tick bounds. This may allow the creation of positions outside the valid price range supported by the underlying pool, which could cause failures in liquidity provisioning or swaps.
set_next_variable_borrow_index() used instead of set_next_scaled_variable_debt()
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Certora
Report Date: Apr 2025
Description:
In the function liquidation_logic::burn_debt_tokens() a call to set_next_variable_borrow_index() has been wrongly introduced in the place of set_next_scaled_variable_debt(). This approach fails to update the relevant variable next_scaled_variable_debt and falsely updates next_variable_borrow_index, leading to the total_variable_debt and consequently, the current_liquidity_rate and current_variable_borrow_rate being updated to much lower values than they should.
Health factor check is too low
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE v3.0.2
Auditor: Certora
Report Date: Apr 2025
Description:
validate_liquidation_call first checks if health_factor is less than 0.95e18, then again if health_factor is less than 1e18. The second check is redundant.
Retroactive windfall for first time users
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE V3
Auditor: Cantina Contest SRs
Report: https://cantina.xyz/code/ad445d42-9d39-4bcf-becb-0c6c8689b767/findings/192
Report Date: Jun 2025
Description:
In update_user_data, the code does:
if (!simple_map::contains_key(&reward_data.users_data, &user)) { simple_map::add(&mut reward_data.users_data, user, UserData { index: 0, accrued: 0 });}let (rewards_accrued, _) = calculate_rewards( user_balance, new_asset_index, (user_data.index as u256), asset_unit);
Because UserData.index is always initialized to 0, the very first call computes
rewards_accrued = user_balance * (new_asset_index – 0) / asset_unit
granting the newcomer the full cumulative rewards per token ever emitted. In Aave’s Solidity _updateUserAssetInternal, a fresh user’s stored index is immediately set to newAssetIndex and rewards are only calculated if their prior stake is nonzero, so first‐time participants never receive back-pay .
First-time users instantly drain the entire historical reward pool, diluting legitimate stakers and depleting treasury funds.
Partially filled APD redemptions always charge the full redemption fees
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
Because the variable redemption_fee_coin is not adjusted to account for partial redemptions, users who call vault::redeem_collateral are always charged full redemption fee.
Unable to unregister collateral CoinTypes
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
Collateral CoinTypes cannot be unregistered, and there’s no disincentive for borrowing against assets outside Thala’s risk framework. A freezing mechanism was added but requires further review.
Potentially incorrect implementation of multiple queue operations
Severity: Medium
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Coding mistakes in flow:queue. In the case index_to_remove is neither there is an assert, assert should also be there if index_to_remove is tail. queue::remove cannot handle length of 1 and in queue::in_next there is an assertion followed by an if and a second assert that will never fail.
Update the Reserves within the swap() Function
Severity: Medium
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
In the swap_exact_x_to_y_direct() function, the protocol swaps token X to token Y and subsequently calls update_reserves() to update the constant product. However, a best practice, as exemplified in the PancakeSwap code, is to call the update() function within the swap() function to handle the updates. This ensures that the reserves are consistently and efficiently updated during the swapping process.
Some View Function Logic Errors
Severity: Medium
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
The view function to get information about private_round is still retrieved from the ido_round field.
claim Function Can Be Called Multiple Times
Severity: Medium
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
Claim related functions can be called multiple times by the user.
Logic Error in Claim Function
Severity: Medium
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
The assertion function current_time > vesting_config.start causes the claim function to never reach the if branch of the vesting_config.start > current_time condition.
Insufficient Validation for amounts_out
Severity: Medium
Ecosystem: Aptos
Protocol: Cellena
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cellana-Smart-Contract-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
In the swap_route_entry function, the assertion at L130 only validates the last value in the amounts_out array, which is insufficient to verify that all values in the array are correct.
Incorrect Condition Statement
Severity: Medium
Ecosystem: Aptos
Protocol: Cellena
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cellana-Smart-Contract-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
In the optimal_liquidity_amounts function, the conditional statement if (amount_2 <= amount_2_desired) is always true. According to the context logic, the parameter amount_2 should be changed to amount_2_optimal.
Logic Design of The swap_route_entry Function
Severity: Medium
Ecosystem: Aptos
Protocol: Cellena
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cellana-Smart-Contract-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The swap_route_entry function first swaps the first token from the from_token array with the first token from the to_token array. Then, it swaps the resulting token with the second token from the to_token array, and so on. Finally, it transfers the token from the last swap to the recipient. The correct design should be to swap each token in the from_token array with the corresponding token in the to_token array.
Limit Orders Cannot Be Executed
Severity: Medium
Ecosystem: Aptos
Protocol: Merkle Trade Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Merkle-Trade-Smart-Contract-Audit-Report.pdf
Report Date: July 2023
Description:
The function execute_order() is used to execute an order. Inside the function, it checks if more than 30 seconds have passed since the order was created. If the condition is met, it cancels the order by calling cancel_order_internal(). However, if the order is a limit order, it means that the order has a specific price set by the trader at which they are willing to buy or sell the asset, if this timeout has elapsed, the order is considered expired.
view_broker Should Not Return False Bool Directly
Severity: Medium
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In broker.move, the view_broker is a function that reads the current state of the broker. However, instead of reading the bool values from the broker, several values directly return false. This will send wrong values for not only this view function but also other functions that call it, for example: borrow_with_ticket, lend_with_ticket, etc.
Fixed Slippage
Severity: Medium
Ecosystem: Aptos
Protocol: vibrantX
Auditor: MoveBit
Report: https://movebit.xyz/reports/vibrantX-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
Slippage protects users from losing tokens in some paris, but the fixed slippage settings can also lead to failed trades with high price volatility.
Wrong condition in assert
Severity: Medium
Ecosystem: Aptos
Protocol: Mokshya/Wapal Aptos NFT Mint
Auditor: MoveBit
Report Date: Mar 2023
Description:
In the update_candy function, the royalty_points_denominator judges the wrong condition here, which will never be able to update candy_data.royal_points_denominator.
Unverified public_sale_mint_time must be greater than presale_mint_time
Severity: Medium
Ecosystem: Aptos
Protocol: Mokshya/Wapal Aptos NFT Mint
Auditor: MoveBit
Report Date: Mar 2023
Description:
In candymachine::mint_from_merkle, public_sale_mint_time must be greater than presale_mint_time, but it is not verified when creating or modifying CandyMachine.
Business logic structure is too complex
Severity: Medium
Ecosystem: Aptos
Protocol: Transit Finance
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Transit-Finance-Audit-Report.pdf
Report Date: Nov 2022
Description:
batch_swap_five has 27 type parameters and 15 function parameters. Incovenient for code maintenance, user command line execution, and function call, gas consumption will also be higher.
Code readability needs to be improved in the get_intermediate_out_from_dex functions
Severity: Medium
Ecosystem: Aptos
Protocol: Transit Finance
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Transit-Finance-Audit-Report.pdf
Report Date: Nov 2022
Description:
Dex swap logic of six different branches can be split into six functions to improve readbility.
Common code should be encapsulated as a function to be called
Severity: Medium
Ecosystem: Aptos
Protocol: Transit Finance
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Transit-Finance-Audit-Report.pdf
Report Date: Nov 2022
Description:
batch_swap_three and batch_swap_five have roughly the same code except for the number of type parameters.
Excessive reliance on external dex contract calls and no way to control or suspend external dex
Severity: Medium
Ecosystem: Aptos
Protocol: Transit Finance
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Transit-Finance-Audit-Report.pdf
Report Date: Nov 2022
Description:
No security measures in external contract calls to get_intermediate_out_from_dex exist.
Wrong event type emitted
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
In create_pool, it emits CreatePoolEvent.coin_type_b with CoinTypeA.
The pool Coin Order Handle
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
In create_pool, you can create a pool with CoinA, CoinB and CoinB, CoinA. This will cause confusion. Force user to create pool with coins in order, by adding an assert.
Liquidate Minimum Debt Vaults
Severity: Medium
Ecosystem: OL Network
Protocol: StakeSphere
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/StakeSphere-stealth-/blob/Wallet/Audit.md
Report Date: Apr 2024
Description:
StakeSphere enforces a minimum debt threshold when repaying vaults. That being said, liquidate_repay also enforces that the collateral ratio of the vault isn’t repaid fully. This means that vaults that are close to the minimum debt threshold cannot be liquidated.
No Check for Account Registration
Severity: Medium
Ecosystem: Binance Smart Chain
Protocol: AquaSwap
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/AuquaSwap-Audit-/blob/Wallet/Audit%20report.md
Report Date: 2024
Description:
The execute_limit_order function fails to verify if the recipient account is registered to receive the quote coin, potentially blocking order execution.
Low Findings
Boundary Check for Minimum Borrow Amount
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In borrow_internal, the condition excludes the valid edge case where the borrow amount equals the minimum allowed value plus the fee.
One-way ownership transfer pattern is Unsafe
Severity: Low
Ecosystem: Supra Chain
Protocol: Dexlyn Hyperlane
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-hyperlane-monorepo-dec2024/
Report Date: Dec 2024
Description:
In router.move, mailbox.move, and multisig_ism.move, the ownership transfer pattern implemented in functions like transfer_ownership() uses a single-step process where ownership is directly transferred to a new address. If the new owner address is incorrectly specified (typo, wrong address format, etc.), ownership could be permanently lost with no way to recover.
In an edge case transfer will revert despite having sufficient funds
Severity: Low
Ecosystem: Supra Chain
Protocol: Dexlyn Hyperlane
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-hyperlane-monorepo-dec2024/
Report Date: Dec 2024
Description:
In move/igps/sources/igps.move, the pay_for_gas function's balance check uses a strict greater than (>) comparison instead of greater than or equal to (>=). This causes transactions to revert when a user has exactly the required amount:
assert!(coin::balance<AptosCoin>(account_address) > required_amount, ERROR_INSUFFICIENT_INTERCHAIN_GAS);
Transactions will fail even when users have exactly the required amount of funds to pay for interchain gas. While not a security vulnerability, this creates unnecessary friction and may confuse users who have allocated precisely the required amount.
Zero-Stake Period Leads to Reward Loss
Severity: Low
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
A vulnerability exists in the staking protocol's reward accumulation mechanism that causes permanent loss of rewards during periods when no users have staked tokens. The issue stems from the protocol's division-by-zero protection logic that returns zero accumulated rewards when total_staked 0, effectively discarding rewards that should be distributed to future stakers.
Bug in condition when checking we borrowed enough
Severity: Low
Ecosystem: Sui
Protocol: Kai Finance
Auditor: Asymptotic
Report: https://info.asymptotic.tech/kai-leverage-verification-report-6ec808dd2adc4b55a4e30f0512260a70
Report Date: Aug 2024
Description:
It checks for borrowed_x while the function refers to position y(github) . It is not critical because create_position rechecks correctly.
Incorrect treasury empty check
Severity: Low
Ecosystem: Sui
Protocol: Kai Finance
Auditor: Asymptotic
Report: https://info.asymptotic.tech/kai-leverage-verification-report-6ec808dd2adc4b55a4e30f0512260a70
Report Date: Aug 2024
Description:
The treasury check is incomplete in add_lend_facil (github). The condition should be registry.supply_x64() == 0 && registry.underlying_value_x64() == 0 .
create_pool is an example of the correct condition (github).
Not major because it is a function used by the owner of the pool — it just protects against silly mistakes.
Can delete non-empty action group
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
execute_config_delete_action_group, does not assert that the group is empty, like execute_config_user_delete_group and execute_config_address_book_delete_group
view_mpc_ready_signing_tx_signable is a getter/viewer so it shouldn't have any asserts
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
Can they be moved in process_module_action_result or create_module_action_result?
Cosmos transactions cannot be updated
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
In aeon-chains/sources/cosmos_module.move, prepare_signing doesn’t call add_transaction as it should, which means that prepare_signing_accelerate calls get_transaction_borrow_mut and fails.
Missing check in process_vault_module_changes
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
In custody/sources/vault.move, process_vault_module_changes should assert!(added_chain_state_data_id_opt.is_some(), EMissingChainState), like the existing assert!(updated_chain_state_data_id_opt.is_some(), EMissingChainState)
set_manager incorrectly logs old manager
Severity: Low
Ecosystem: Sui
Protocol: Bluefin RFQ
Auditor: Asymptotic
Report: https://bluefin.io/blog/doc/bluefin_rfq_audit.pdf
Report Date: Feb 2025
Description:
let old_manager = manager; actually records the new manager instead of the old one.
Incorrect Cooldown Check in withdraw Function
Severity: Low
Ecosystem: Sui
Protocol: SatLayer Sui
Auditor: Asymptotic
Report: https://info.asymptotic.tech/satlayer-audit
Report Date: Mar 2025
Description:
The withdraw function uses an incorrect comparison operator when validating if the cooldown period has passed. The current implementation uses a strict greater than (>) operator, which could lead to users being unable to withdraw their funds at the exact moment when the cooldown period expires.
Executed Orders Cleanup Missing
Severity: Low
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The functions clear_open_position_order and clear_decrease_position_order are the only ones that remove orders from market.orders bag. They handle order cancellation by users (requiring OrderCap) and return their fee and collateral. Users don't need to execute these functions and pay gas fees for already executed orders. As a result, executed orders—both successful and failed—remain permanently stored in market.orders without any cleanup mechanism.
Incorrect Collateral Sufficiency Check in update_emission
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The update_emission function in rewarder module checks collateral sufficiency using RewarderGlobalVault::balances instead of available_balance. Since balances includes already settled but unclaimed rewards, this validation is unreliable and could lead to insufficient actual collateral for new emissions.
The daily rewards calculation 86400 * (emission_rate >> 64) performs the shift before multiplication, leading to potential precision loss due to truncation of emission_rate.
The code uses hardcoded literals (86400) instead of named constants.
fetch_ticks Behavior Deviates from Other Fetch Functions
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The fetch_ticks function in the tick module behaves inconsistently compared to other fetch_* functions.
It skips the tick at tick_indexes[0] itself, starting from the next tick(include parameter in find_next function is set to false). This differs from other fetch functions, which typically include the starting element, and can lead to unexpected omissions or developer confusion.
Additionally, fetch_ticks function does not check the limit in the while loop condition, only inside the loop body. As a result, if the limit is set to zero, the loop still runs and continues fetching until the end of the list, since the break condition if (new_count == limit) is never satisfied. While a limit of zero could be interpreted as "fetch all", this behavior is not aligned with the comments or how limits are handled in similar functions.
repay_flash_swap Ignores partner_id
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
repay_flash_swap called after flash_swap_with_partner ignores the partner_id, but this is not an issue, because it checks that ref_rate == 0. Still, I would recommend to change the type of partner_id in FlashSwapReceipt to Optionsui::object::ID, and in repay_flash_swap check that it is None.
Pause bypass for reward updates
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The admin entry points uses a pause flag on VeMMT to freeze critical state changes during incidents. Functions that initialize a schedule or extend its duration explicitly check is_paused and abort when true. The emission returning function like update_pool_reward_emission lacks this guard and still calls into the pool to update rate and end-time accounting.
The get_user_claim_reward_amount overestimates claimable reward
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The read path computes the user’s claim by iterating epochs and calculating each epoch’s accrual from index deltas and vote power. For each epoch, it caps the computed value by the current pool balance. Because it does not model a running “remaining pool balance,” it may cap multiple epochs against the same balance snapshot and sum a total larger than the coin the pool can transfer atomically. Additionally, the view reads time-sensitive fields like current index or end-of-epoch markers without first calling the pool’s sync_or_advance_epoch sync routine, so the calculation can be stale within an epoch.
View helpers abort for unstaked ve-tokens
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The build_ve_token_data view builder composes a position object by pulling claimable rewards, last-claimed markers, and other reward fields via helpers that borrow the UserRe wardData dynamic field from the VeToken. That dynamic field exists only for staked tokens that have been deposited through deposit. The builder computes “staked or not” later in the flow using is_ve_staked, so the early attempt to borrow UserRewardData on an unstaked token aborts the view call. Read-only endpoints that rely on build_ve_token_data inherit the same failure mode.
Initialization Function Can be Called Multiple Times
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
The initialization function of the StakingPool can be invoked multiple times. Repeated initialization may result in the loss of user funds.
Incorrect Return Value in Binary Search for Optimal Swap Amount
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The get optimal swap amount for single sided liquidity function uses a binary search to find the swap amount that best matches the optimal token ratio. While the function correctly tracks the best ratio found during the search, it does not return the swap amount corresponding to this best ratio. Instead, it returns the value calculated for the next iteration, that never runs and may not be optimal. Additionally, the binary search logic can be optimized, as it runs in a loop with some redundant assignments and unnecessarily steps. Simplifying the logic and removing redundant operations would improve both code clarity and execution efficiency.
Incorrect Validation Order: check tick range Called Before Tick Order Check
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
In open position, check tick range is called before verify tick. However, check tick range assumes tick upper ¿ tick lower but does not check this.
Multiple Identical Pools Enable Liquidity Fragmentation
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The pool creation function allows multiple identical pools to be created for the same token pair, which can lead to liquidity fragmentation and user confusion. The current implementation only checks that the two token types are different (X != Y) but does not enforce canonical token ordering.
Incorrect Semantics for unblock(ALL) Operation
Severity: Low
Ecosystem: Sui
Protocol: Cetus CLMM
Auditor: Asymptotic
Report: https://drive.google.com/drive/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
The restriction system treats ALL as an independent role bit rather than a composite of all operation types. When unblock(entity, ALL) is called after specific operations were blocked, those specific blocks persist. The unblock function only removes the ALL bit, leaving individual operation bits intact. However, the is blocked function correctly checks: If ALL bit is set → return blocked OR if specific operation bit is set → return blocked
Incorrect Event Emission On Multiple Liquidity Additions To Active Bin
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The add_liquidity function calculates composition fees when a user adds liquidity to the pool's active bin. However, if a user provides the active bin's ID multiple times within a single call, a logic flaw causes the fees to be underreported in the emitted AddLiquidityEvent . The variables fee_a and fee_b , which track the fees paid, are overwritten in each loop iteration instead of being accumulated. This is possible because the function does not check to ensure the user only add liquidity to the active bin once in a call.
Add/Remove/Repay Liquidity Sequence Allows Flashloan Like Operation With No Cost
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The add-liquidity flow mints liquidity and updates ticks immediately, returning an AddLiquidityReceipt with the owed
amount_a and amount_b that must be repaid in the same transaction.
No guard is preventing a user from calling remove_liquidity on the same position before calling repay_add_liquidity .
This permits sourcing the repayment entirely from the pool itself within the same transaction (flashloan-like behavior), i.e.,
add_liquidity -> remove_liquidity ->
By Paying Swap Fees To Avoid Composition Fees From Unbalanced Liquidity During add_liquidity() And open_position()
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
Since users can utilize the already added liquidity for operations between add_liquidity() / open_position() and repay_add_liquidity() , when users need to add liquidity at an unbalanced amount_a/amount_b ratio in the active bin, they can pay swap fees through a certain method to avoid composition fees caused by unbalanced ratio.
fetch_bins() Fetches Bins From The Start Of BinGroup Instead Of The Start Bin ID
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The previous version of fetch_bins() would return limit consecutive existing bins in the pool starting from the start bin ID. However, in the current code, since the idx in fetch_bins() is calculated starting from 0, it returns limit consecutive existing bins in the pool starting from the first bin of the BinGroup where start resides.
Discussion On reward_refunded
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
During reward_settle() , if the emergency reward pause is activated, rewards are temporarily stored in the reward_refunded variable and will only be distributed once the active bin becomes empty. However, in a well-functioning pool, the active bin becoming empty is a very rare event. If this condition does not occur for along time, the funds stored in reward_refunded will remain locked in the contract and cannot be released.
Fee Sync Blocked By Reward Permission In update_position_fee_and_rewards
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
In pool.move, update_position_fee_and_rewards ties two unrelated permissions together by calling operation_check twice, once with COLLECT_FEE and once with COLLECT_REWARD , before doing any state updates: pool.operation_check(restriction::collect_fee_kind(), ...) pool.operation_check(restriction::collect_reward_kind(), ...) operation_check asserts the corresponding pool permission flags are not disabled. As a result, update_position_fee_and_rewards will revert if either disable_collect_fee or disable_collect_reward is true, even though the function only performs internal accounting updates and does not actually transfer assets. As a result, when rewards are paused ( disable_collect_reward = true) but fee collection is allowed ( disable_collect_fee = false), LPs cannot call update_position_fee_and_rewards due to the collect_reward check, so users cannot bring their position’s fee counters up to date and will collect stale/partial fees. This creates a potential unintended denial of fee withdrawals whenever rewards are paused.
Missing Token Pair Sorting in Pool Key Generation
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The new_pool_key function does not sort CoinTypeA and CoinTypeB before generating the pool key, which can lead to the creation of duplicate pools for the same token pair in different orders.
Missing Validation of Current Time vs End Time in create_partner
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
An incomplete time validation logic issue has been identified in the create_partner function within partner.move. Missing Validation: There is no check to ensure that end_time is greater than the current time. This allows the creation of a partner that has already expired at the moment of creation.
Improper Convergence Checks
Severity: Low
Ecosystem: Sui
Protocol: Aftermath
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
In the geometric_mean_calculations.move module within the following functions: calc_swap_fixed_in, calc_swap_fixed_out, calc_withdraw_fixed_amounts, and calc_deposit_fixed_amounts, the convergence between prev_t and t is checked after the while loop. However, this approach will properly execute because the t value is copied into the prev_t variable at the end of the loop.
Improper Token Weight Calculation
Severity: Low
Ecosystem: Sui
Protocol: Bucket
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description: get_token_weight in the tank module calculates the weight of the user’s deposit. Calculating the amount able to be withdrawn by the user uses this token weight. In this function, if the total calculated compound_stake of the user for the two scales is less than token.deposit_amount/constants::scale_factor() value, zero is returned. This results in unnecessarily reducing the user’s compounded stake.
Incorrect Key Check
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
obligation::lock is designed to lock the obligation functionality. Currently, the function invokes assert_reward_key_in_store, which is inconsistent with its intended purpose. Instead, assert_lock_key_in_store should be invoked, as the function should handle the locking of the obligation, not the rewards management.
Excessive Withdrawal Of Staked Amount
Severity: Low
Ecosystem: Sui
Protocol: Haedel LSD
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2023
Description: The issue stems from the existing implementation of get_split_amount, where a modest need_amount (e.g., 1 MIST) has the potential to trigger the withdrawal of the entire StakedSui, even if the total staked SUI amount is considerably high, instead of withdrawing only a portion of the staked amount as intended, and keeping the rest staked.
Non-Ascending Epoch Claims
Severity: Low
Ecosystem: Sui
Protocol: Haedel LSD
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2023
Description:
The issue is with regards to set_withdraw_time_limit, which grants administrators the ability to define the time limit for withdrawing staked tokens. To elaborate, should the administrator elevate the withdraw_time_limit to surpass the present timestamp calculated from the inception of the epoch, it may result in a scenario where a user generates two UnstakeTicket objects within the same epoch. In particular, if the timestamp (X) of the first ticket exceeds epoch_timestamp_ms + old_limit, and the timestamp (Y) of the second ticket falls below epoch_timestamp_ms + new_limit, the resultant EpochClaim for these two tickets will correspond to epochs E+2 and E+1, respectively. This creates a scenario where the epoch claims are in a non-ascending order, which is problematic as epoch claims should be in ascending order. This non-ascending order may disrupt the normal flow of epochbased operations.
Invalid Parameters
Severity: Low
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description: The issue is related to the fact that both stop_ride and resume_ride functions expect Driver and Rider objects to be passed as arguments at the same time. It should be impossible for the user to own both Driver and Rider objects.
Arrival Confirmation
Severity: Low
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Code: N/A
Description:
In its current implementation, the system allows a driver to start a ride without confirmation from the rider that they have arrived at the pickup point. This lack of confirmation can lead to potential issues such as miscommunication or misunderstandings between the rider and the driver, affecting the system’s overall customer experience and functionality.
Improper Fee Configuration
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Orderbook
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description: Fees could be negative, giving collateral to user instead of paying fees.
Rewards State Abort
Severity: Low
Ecosystem: Sui
Protocol: Suilend
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2024
Description: An edge case occurs when the length of the rewards vector in user_reward_manager is less than or equal to the current index i. This implies that there are fewer entries in the rewards vector than expected based on the iteration index. However, the if condition vector::length(&user_reward_manager.rewards) == i) only executes when the pool rewards is initialized. If the pool reward array is not contiguous, this could trigger an abort.
Ownership Transferring Not Tracked
Severity: Low
Ecosystem: Sui
Protocol: Sui Axelar(Gateway V2)
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description: There is an issue within process_commands in the Cross-Chain Gateway Protocol, specifically in the handling of ownership transfer calls (SELECTOR_TRANSFER_OPERATORSHIP). Currently, the function only records approved token transfer calls and does not record calls that transfer ownership. This omission opens up the possibility of relay attacks.
Potential Balance Misallocation
Severity: Low
Ecosystem: Sui
Protocol: Sui Axelar(Gateway V2)
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description: In get_transaction, the call to sweep is not explicitly enforced to occur after the call to swap. If the program calls SWAP_TYPE_SWEEP_DUST before SWAP_TYPE_DEEPBOOK_V2, or if there is no SWAP_TYPE_DEEPBOOK_V2 call at all, all balances of the base coin (which are supposed to be the remaining coins after the swap) will be stored in the coin_bag of the Squid router during sweep. As a result, if sweep is called before swap, all balances of coin T1 will be moved to the coin_bag of the Squid router, and neither the source nor the destination address will receive any coins. The finalize function includes a safeguard to ensure that the balance value (balance.value()) is greater than or equal to self.min_out. However, this safeguard is ineffective if min_out is set to zero.
Incorrect Whitelist Check
Severity: Low
Ecosystem: Sui
Protocol: Cetus
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description: config::check_token_and_min_trade_amount misuses the return value of find_token_and_min_trade_amount when require_check_token_white_list is true. The is_existed flag indicates the presence of the token in the whitelist. If it is true, the function should verify the minimum trade amount. Conversely, if is_existed is false, meaning the token is absent from the whitelist, the function should immediately return false.
Double Counting Rewards
Severity: Low
Ecosystem: Sui
Protocol: Turbos Finance
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description: When strategy_rewards_settle calls accumulate_rewarder_released for each rewarder, it updates the total_reward_released for the entire rewarder based on the current time and the elapsed time since the rewarder’s last_reward_time. The subsequent call to accumulate_strategy_reward also calculates elapsed time using the strategy’s last_reward_time, which may differ from the rewarder’s last_reward_time. Since accumulate_strategy_reward does not update the rewarder’s last_reward_time, the elapsed time it calculates may include a period already accounted for in the previous call to accumulate_rewarder_released. As a result, the total_reward_released for the rewarder may be incremented twice for the same elapsed period, effectively double-counting the reward.
Unhandled Proposal Removal
Severity: Low
Ecosystem: Sui
Protocol: Mysten Deepbook
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description: In governance::adjust_vote, when a proposal is removed by remove_lowest_proposal and a new proposal is subsequently created by the same account, certain issues may arise. After a proposal is removed, its ID becomes invalid in the self.proposals map. If the same account creates a new proposal, it may be assigned the same proposal_id; however, the vote count for this new proposal starts at zero.
Imbalance in LST Supply
Severity: Low
Ecosystem: Sui
Protocol: Solend Liquid Staking
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
Currently, create_lst_with_stake does not validate the relationship between the SUI, fungible_staked_sui, and lst_treasury_cap.total_supply values. The function only ensures that lst_treasury_cap.total_supply and the total staked SUI in the system are greater than zero.
The LST created should ideally represent a proportional claim on the underlying staked SUI assets. If there is no relationship between the total LST supply and the staked SUI, users may receive LST tokens that over- or under-represent the actual value of the staked assets. The misalignment between LST and staked SUI may result in incorrect pricing when users interact with the protocol.
Abort due to Failed Assertion Check
Severity: Low
Ecosystem: Sui
Protocol: Solend Liquid Staking
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
The assertion in mint within liquid_staking , while intended to maintain the balance between Liquid Staking Tokens ( LST ) and SUI, may abort under certain conditions. If old_lst_supply == 0 and old_sui_supply > 0 , the assertion will always fail. In this case, the conversion of the provided SUI amount to LST utilizing sui_amount_to_lst_amount will return the sui_amount itself.
Incorrect Price Boundary Checks
Severity: Low
Ecosystem: Sui
Protocol: Bluefin Spot
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2024
Description:
Utilizing >= and <= in the boundary checks is not appropriate, as allowing the price to hit the exact minimum or maximum boundaries will result in attempts to execute swaps that lead to invalid price states.
Incorrect Role Check
Severity: Low
Ecosystem: Sui
Protocol: Matrixdock
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Matrixdock XAUm - Zellic Audit Report.pdf
Report Date: July 2025
Description: In the revoke_set_revoker function, it checks if the sender is the operator. While all functions with the revoke_ prefix are only callable by the revoker, when setting the revoker, it would be more appropriate to check if the sender is the owner. This is because the operator is only responsible for operations related to minting and burning coins.
Improper Zero Mint Check
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Market Making
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description: In end_deposit_session, the check assert!(lp_to_mint != 0 only ensures that the lp_to_mint value, as calculated before the conversion to a fixed-point format ( to_balance ), is non-zero. However, the conversion process itself (specifically the call to ifixed::to_balance ) may still result in a minted amount of zero liquidity provider (LP) tokens, even if the value of lp_to_mint is non-zero prior to conversion.
Risk of Excess Recall Amount
Severity: Low
Ecosystem: Sui
Protocol: Solend Steamm
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
The logic in bank::recall may result in a situation where the amount_to_recall becomes greater than the available reserves due to the utilization of max(bank.min_token_block_size). The amount_to_recall is adjusted to ensure it is at least the size of bank.min_token_block_size. On recalling an amount smaller than the min_token_block_size , the function will automatically increase the recall amount to the minimum block size. The issue occurs if the available funds (the reserves in the bank) are not large enough to accommodate the adjusted amount_to_recall.
Bypassing Stake Threshold Check
Severity: Low
Ecosystem: Sui
Protocol: Mysten Walrus
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Mar 2025
Description:
ActiveSet::update does not enforce a minimum stake threshold ( set.threshold_stake ), unlike insert . This introduces a vulnerability where a user may manipulate their stake to gain a position in the active set below the required threshold.
For example, a user may stake an amount greater than set.threshold_stake, ensuring that their node is successfully inserted via ActiveSet::insert. If the active set is full, the node with the lowest stake is removed to accommodate the new entry. After successfully inserting, the user immediately calls ActiveSet::update to lower their stake below set.threshold_stake. As a result, the attacker secures a place in the active set without the required stake amount.
collect function Parameter Checking May Fail
Severity: Low
Ecosystem: Sui
Protocol: FlowX Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/FlowX-Final-Audit-Report.pdf
Report Date: May 2024
Description:
The collect function only allows the count_x_requested and count_y_requested to both be non-zero in order to pass the check_zero_amount function and if the user's position has only one token in it, he must be forced to pass one of them as an arbitrary value in order to call the collect function.
Lack of Events Emit
Severity: Low
Ecosystem: Sui
Protocol: FlowX Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/FlowX-Final-Audit-Report.pdf
Report Date: May 2024
Description:
The contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track sensitive actions or detect potential issues.
Missing Emit Event
Ecosystem: Sui
Protocol: Kuna Labs Yield Optimizer
Auditor: MoveBit
Report: https://movebit.xyz/reports/Yield-Optimizer-Final-Audit-Report.pdf
Report Date: Nov 2023
Description:
The smart contract lacks appropriate events for monitoring sensitive operations(such as managing assets and modifying key configs), which could make it difficult to track important actions or detect potential issues.
Unnecessary Parameter
Severity: Low
Ecosystem: Sui
Protocol: Cetus Farming Smart Contracts
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
In the collect_fee function, the parameters coin_a and coin_b are redundant. The return value after calling the clmm_pool::collect_fee function is the balance type, and there is no need to call the join function.
Incorrect Assert Location
Severity: Low
Ecosystem: Sui
Protocol: Cetus Farming Smart Contracts
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
Assert of the reward_balance and amount quantities are ineffective when placed after the split function, they should be placed before.
set_prize_rate Should Check If It Is New Rate
Severity: Low
Ecosystem: Sui
Protocol: Random-Vault
Auditor: MoveBit
Report: https://movebit.xyz/reports/Random-Vault-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
In config.move , there should be assertion to check that in set_prize_rate function, config.prize_rates != rates .
queryWinRate Does Not Handle User Withdrawed
Severity: Low
Ecosystem: Sui
Protocol: Random-Vault
Auditor: MoveBit
Report: https://movebit.xyz/reports/Random-Vault-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
In the design of the lottery.move once a user withdraws any amount in a round, he will not be able to participate in the lottery, which means he has a win rate of 0. However, the queryWinRate function, does not handle such a case but directly computes the win rate using its share. This will lead to confusion of the user and a poor user experience.
Possible Zero Token Minted in mint_market_coin Function
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
If balance_sheet.cash + balance_sheet.debt is greater than balance_sheet.market _coin_supply and underlying_amount is relatively small, resulting in a mint_amount of 0. This can lead to a situation where the user deposits funds (underlying_balance), but no MarketCoin shares are minted, resulting in the user not receiving any shares for their deposit.
Suggest Throw abort Instead Of Returning false
Severity: Low
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: June 2023
Description:
Among the multiple execute functions of the arca module, When the Proposal is not marked complete, it is recommended not to return false, but throw an exception abort at the end of the function, and no transaction will be generated.
get_auction_max_size Missing Check
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
In get_auction_max_size, there is no assertion added to the return value of calculate_max_loss_per_unit, assert!(i64::is_neg(&max_loss), E_INVALID_MAX_LOSS); other calls to calculate_max_loss_per_unit are added.
The Method for Obtaining coin_decimals is Incorrect
Severity: Low
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
In the init_reserve() function, coin_decimals should not be passed in as a parameter, but should be obtained through the CoinType.
Redundant assert Statements
Severity: Low
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: May 2023
Description:
The assert validation always passes when adding liquidity because its condition is the same as the previous if statement.
The Condition of the Assert is Incorrect
Severity: Low
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: May 2023
Description:
In the function swap_token_y(), the validation should be for amount > 0 instead of token_y_balance > 0. The same issue also exists in lines 315 and 466.
change_order Function Design Flaw
Severity: Low
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: May 2023
Description:
In the change_order function, if the TypeName of the two tokens to be processed is the same, an empty array will be pop_backed and an error will be reported. At the same time, an error will be reported when the TypeName of the two tokens is the same but the length is not equal.
K Value Check Condition Error
Severity: Low
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: May 2023
Description:
At the end of the swap function, the value of k in the pool will be limited to an increase, but this is for the case of handling fees. When fee_percent is set to 0, swap will not change the value of k in the pool, so when the limit k is increased, the handling fee Pools with a value of 0 cannot be swapped normally, and the condition of liquidity_before_swap < liquidity_after_swap should be changed to <=.
Function Logic Does Not Match the Annotation
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
When allow_collateral and allow_redeem are set to false, the value of the user's collateral is 0, which will prevent the user from withdrawing, borrowing, etc., and the comment means whether to allow the use of collateral to continue borrowing, and there is a conflict between the two.
Unchecked Return
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
Certain library functions such as coin::burn(), vec_map::remove(), table::remove(), bag::remove(), balance::join(), and balance::decrease_supply() have return values, but are not being properly utilized in the code. Similarly, functions such as market::init_market(), profile::add_profile(), market::add_reserve(), lending::deposit_with_repay(), reserve::repay(), and reserve::deposit_lp_co in() also have return values but are not being properly utilized when called. This could result in important return values not being checked, potentially leading to security vulnerabilities.
Incorrect Event Timestamp Parameter Setting
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
It was identified that within the reserve_status::emit_record_status() function, the record_timestamp parameter was constantly set to 0 when emitting an event.
Logic Repetition
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
The verification logic for positive and negative numbers in the function cmp is consistent.
Abort on Temporary Imbalance During Epoch Transition
Severity: Low
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
A strict assertion in update_rewards causes staking operations to fail during temporary imbalances between total kAPT and total staked APT.
Unnecessary Assertion Causes Protocol Lockup
Severity: Low
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
The ratio <= RATIO_MAX assertion in math::ratio can permanently lock protocol liquidity if the ratio naturally grows beyond the limit.
Protocol Insolvency via Validator Removal
Severity: Low
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
Removing validators may result in irretrievable stake, risking temporary protocol insolvency.
Buffer Vault Drainage Due to Unaccounted Staking Fees
Severity: Low
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
Unaccounted staking fees during delegation cause the buffer vault to burn more than it mints, gradually depleting its balance and risking protocol stability.
Faulty Withdrawal Logic
Severity: Low
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
delegation_manager::withdraw_stake assumes that withdrawn_amount is always greater than the minimum threshold, risking unexpected aborts if this condition is not met.
Flaw in Reward Withdrawal Logic
Severity: Low
Ecosystem: Aptos
Protocol: Echleon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
claim_reward_fa incorrectly utilizes fungible_asset::withdraw, preventing reward claims if the reward FA is dispatchable.
Premature Reward Claiming
Severity: Low
Ecosystem: Aptos
Protocol: Merkle Token
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2024
Description:
The vulnerability in claim_rewards arises from the fact that protocol rewards may be claimed for future epochs or even the current epoch. This is problematic because the rewards for these epochs, as well as the stake distribution, are not yet finalized. Since the total rewards and individual stakes are not finalized for future and current epochs, any claim made during these times may be based on incomplete or inaccurate data. Users may receive more or less than their fair share, resulting in an unfair distribution of rewards.
Permanent Loss Of Expired Rewards
Severity: Low
Ecosystem: Aptos
Protocol: Merkle Token
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2024
Description:
Currently, if rewards are not claimed within a 14-day period, they become inaccessible and may not be retrieved or re-utilized. claim_rewards contains a check that ensures rewards may only be claimed if they are within a 14-day window from their registration. If this period expires, the reward claim fails with the E_CLAIM_EXPIRED error. This rule is meant to ensure that rewards are claimed in a timely manner.
Improper Reward Distribution
Severity: Low
Ecosystem: Aptos
Protocol: TruFin
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
The delegation_pool transfers the add_stake_fees to the NULL_SHAREHOLDER and later returns them to the pool at the end of the epoch. This process occurs because the delegation pool does not distinguish between active and pending_active users, allowing both groups to receive rewards. To ensure active users get their rewards and pending_active users receive their add_stake_fees as rewards in the subsequent epoch, the system imposes add_stake_fees on users. In this protocol, add_stake_fees, which are distributed as rewards in the next epoch, are treated as stake within the same epoch, resulting in the minting of TruAPT. Consequently, users will receive extra rewards from others who are active in the subsequent epoch.
Inappropriate Unlock Amount
Severity: Low
Ecosystem: Aptos
Protocol: TruFin
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
internal_unlock unlocks the amount from the delegation pool and burns the equivalent TruAPT tokens. It creates an UnlockRequest for the user with the unstaked amount, which later facilitates the withdrawal of APT from the protocol. unstaked_apt represents the actual stake amount being unstaked from the delegation pool. Additionally, amount sometimes exceeds the unstaked amount, potentially disbursing more APT than intended. Therefore, it is advisable to utilize unstaked_apt to create the unlock request.
Improper Implementation Of Withdraw All
Severity: Low
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
A pool creator has the option to remove liquidity from the pool by specifying a percentage of liquidity to be removed in bps format. However, if the LBP is still ongoing, only a portion of the liquidity can be removed from the pool, with the entire liquidity only being removable once the LBP has concluded. This is implemented through a check of the remove_bps variable to see if it is equal to BPS_BASE. If this check evaluates as true, an assertion is made to ensure that the LBP has indeed ended before allowing for complete liquidity removal. This can be easily bypassed by passing in remove_bps = 9999 and calling the remove_liquidity multiple times. This removes all the liquidity from the pool even when the LBP has not ended.
Incorrect Variable
Severity: Low
Ecosystem: Aptos
Protocol: Steamflow
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Mar 2023
Description:
In protocol::create, validate_contract_params is utilized to validate the input parameters that are related to amounts. However, the calculate_end, which is responsible for calculating the end-time value used in validate_contract_params, is currently receiving the amount value rather than the amount_per_period value. As a result, calculate_end always returns the end-time value for only one period, which could potentially bypass the end < start + SEVENTY_YEARS_IN_SECS check in validate_contract_params.
Improper Path Validation And Usage
Severity: Low
Ecosystem: Aptos
Protocol: Eternal Finance
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2023
Description:
In pancake_dex_helper.move, the set_paths function sets a path to be used when reinvesting Cake rewards, verifying whether the path exists or not. When idx = 2, the function checks whether the path Cake -> AptosCoin -> X exists or not. However, in the get_lp_by_cake function, when path = 2, it uses the Cake -> AptosCoin -> Y path to convert the Cake rewards to Y token, which is inconsistent with the validations in the set_paths function. This inconsistency could potentially cause the get_lp_by_cake function to fail. When path = 2, the function attempts to convert Cake rewards from Cake -> AptosCoin -> Y, but this path may not exist.
Faulty Token Struct Comparison
Severity: Low
Ecosystem: Aptos
Protocol: Pancake Swap
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2022
Description:
In order to construct a deterministic ordering of two tokens in a swap pair, it is necessary to be able to compare them. The current implementation concatenates the address, module, and struct names into a vector and invokes compare_u8_vector. This implementation generates collisions for certain token structs that should not collide. For example, the following two structs would generate the same comparison string. Both structs generate the string: addressFOOBAR. The protocol will incorrectly reject this swap pair from being constructed.
SplayTree Inoperable Remove Functions
Severity: Low
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Functions remove_nodes_greater_than and remove_nodes_less_than don’t work if provided with values greater than the max node and lesser than the min node respectively. When the given scenario is met, the deletion of nodes will not occur.
Ensure Contract Upgrade Integrity
Severity: Low
Ecosystem: Aptos
Protocol: Wormhole Aptos
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In both wormhole and token-bridge, contract upgrade via governance is a two step process:
- A user invokescontract_upgrade::submit_vaawith a governance VAA that includes ahash of the intended upgrade code.
- A user invokescontract_upgrade::upgradewith the actualmodule code which subsequently invokes code::publish_package_txn to upgrade the contract. Both of these calls are permissionless (can be invoked by any user). Integrity is protected in the first call by verifying the guardian signatures on the VAA. Integrity is protected in the second call by ensuring the provided module code matches the hash. However, in the original implementation, we identified two issues that would allow an attacker to provide alternative module code that still matches the stored hash:
Serialized Metadata
A module upgrade package contains a list of code modules (vector<vector
Module Boundaries The original hash was computed by first concatenating the code modules and then taking the hash of the concatenated structure. However, this implementation does not properly validate module code boundaries. Specifically, moving N bytes of code from the end of one module to the start of another would not affect the hash:
It is unclear whether an attacker could exploit this collision to deploy a malformed version of the module. However, since the fix is simple, it is preferable to reduce the attack surface as much as possible.
The Necessity of Controlling Return Value Order in the token_reserves() Function
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The function token_reserves() adjusts the order of returned values by sorting currencies, which might not be necessary. As the order has already been adjusted before calling this function within the current contract, the if statement is executed every time. To prevent confusion, we believe that the control over the sequence should occur when receiving the return values of this function, rather than within the current function. We also compared this to PancakeSwap's code, which similarly does not control the sequence within the current function.
tp_percent Should Be Less Than or Equal to pair_info.maximum_profit
Severity: Low
Ecosystem: Aptos
Protocol: Merkle Trade Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Merkle-Trade-Smart-Contract-Audit-Report.pdf
Report Date: July 2023
Description:
The function execute_increase_order_internal() is responsible for executing an increase order in a trading pair. Inside the function, the stop-loss and take-profit prices of the position are updated based on the order's type and the specified conditions. If the order's take-profit trigger price and the maximum take-profit price are the same, the code will assign that value to the take-profit trigger price of the position. In other words, there is no preference for either value in this scenario, and they are considered equal. However, inside the update_position_tp_sl() , an assertion is made to validate that the calculated take-profit percentage is less than the maximum allowed profit percentage specified in the pair's information. The business logic of this function, update_position_tp_sl() , is different from execute_increase_order_internal() .
Vault Amount Checks Are Not Implemented In Every Operation
Severity: Low
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In super postion , the user can perform different operations such as borrow, redeem, repay . And each operation will affect the vault amount differently. However, some operations (repay, redeem) don't have vault checks before and after the operation. And the pre-vault amount calculations are not the same for the other. This would lower the security of the vault and cause misalignment in design.
The verification conditions of assert and if are repeated
Severity: Low
Ecosystem: Aptos
Protocol: Mokshya/Wapal Aptos NFT Mint Smart Contract
Auditor: MoveBit
Report Date: Mar 2023
Description:
In the function candymachine::mint_from_merkle, use assert to verify that is_whitelist_mint is true to continue to execute the code, and then repeat the judgment through if. In the function candymachine::update_candy , assert has been used to verify that publ ic_sale_mint_time >= now && presale_mint_time >= now, and the judgment is repeated through if below.
The assert judgment condition is inaccurate
Severity: Low
Ecosystem: Aptos
Protocol: Aries Market(Aptos)
Auditor: MoveBit
Report Date: Feb 2023
Description:
In the function validate_oracle_info , when sb_weight=0 , pyth_weight=U64_MAX , or sb_weight=U64_MAX , pyth_weight=0 , the assertion condition is not met, causing oracle verification to fail.
Inaccurate judgment on deposit and loan restrictions
Severity: Low
Ecosystem: Aptos
Protocol: Aries Market(Aptos)
Auditor: MoveBit
Report Date: Feb 2023
Description:
In the following functions, when determining whether the deposit and loan amount exceeds the limit, the numerical comparison is inaccurate, and the numerical value should be less than or equal to the limit, not less than.
Incorrect check for minimum order size
Severity: Low
Ecosystem: Aptos
Protocol: Econia
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Econia - Zellic Audit Report.pdf
Report Date: Jan 2023
Description:
After performing the order book match to attempt to fill a new limit order, the place_limit_order function returns early without placing an order for the remaining unfilled size only if the order is of type IMMEDIATE_OR_CANCEL or if the remaining order size is zero. This is incorrect, as the remaining order size can be lower than the minimum order size configured for the market.
The sendOFT function call can be blocked
Severity: Low
Ecosystem: Aptos
Protocol: Layer Zero OFT Wrapper
Auditor: Zellic
Report Date: Nov 2022
Description:
The contract owner can set any bps value of the variables defaultBps and the oftBps [_oft] in the range from 0 to the maximum BPS_DENOMINATOR inclusive. But during the sendOFT function call, the getAmountAndFees function will check that the final bps value is less than BPS_DENOMINATOR and revert the transaction if it equals or more.
Missing assertion checks for critical protocol parameters
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Dollar
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Thala Labs Move Dollar - Zellic Audit Report.pdf
Report Date: Oct 2022
Description:
There are no checks in place to enforce that params::set_params
The ascending insertion search fails to return the tail
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Dollar
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Thala Labs Move Dollar - Zellic Audit Report.pdf
Report Date: Oct 2022
Description:
The sorted_vaults::find_insert_position_ascending search algorithm fails to return the tail position.
Instances of none in VaultStore.vault
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Dollar
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Thala Labs Move Dollar - Zellic Audit Report.pdf
Report Date: Oct 2022
Description:
Calls to vault::close_vault leave the vault store with a none vault.
Emode LTV & LT invariants can be broken
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
Entering an emode category as a user should never be worse for the user's health. Therefore, functions like pool_configurator::set_emode_category check that the following reserve <>emode[reserve.emodeCategroy] invariant holds.
However, this invariant does not hold because not all functions that can change the reserve's / emode's LTV/LT enforce it.
set_user_emode health check always needs to be performed
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The emode_logic::set_user_emode function skips the health check when the user goes from noemode to new emode.
The idea is likely that if the following invariants hold, the health can only increase, and therefore set_user_emode cannot be used to turn a healthy user into an unhealthy user.
However, this invariant does not hold because of the finding "Emode LTV & LT invariants can be broken". The impact is that a healthy user can call set_user_emode and end up unhealthy after the call. This is bad for the user as they can be liquidated afterwards. In addition, having a programmatic way for turning any position liquidatable (under the right circumstances) in a single transaction poses security risks (f.i., see the Euler Finance hack analysis by Cyfrin) and protocol bad debt risk.
token_base events do not identify the token used
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The token_base module is used by all aTokens and vTokens to perform the base token actions like transfers. The emitted Transfer, Mint, Burn events do not identify the actual tokens these events were emitted for. The events are currently not useful for data processing because one can't identify if the Transfer was for aUSDC, aAPT, etc
init_reserves does not support yet the deployment of a reserve with preconfigured incentives_controllers
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The current implementation of pool_configurator::init_reserves does not include the input parameter incentives_controllers which is passed "empty" (option::none()) to the pool_token_logic::init_reserve. This means that every reserve will always be initialized with an empty incentive controller that needs to be configured later on.
"Same" events are defined multiple times across modules
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
In Aptos, events with the same names and struct fields that are defined in separate modules will be treated as separate events. This makes it hard to query for the event as the event needs to be queried across all modules it is defined in and the results must be merged. The proper approach is to have the event defined in a single module. Some events that represent a single event in Aave Solidity are defined across several modules in Aave Move.
token_base allows A/V token to de-sync the incentive controllers
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
When the reserve is deployed, the caller provides only one common (empty or not) incentive controller to be used for both the AToken and VariableDebtToken. The set_incentives_controller allows the caller to set a new (empty or not) incentives_controller for the single AToken or VariableDebtToken. This behavior allows the system to de-sync the tokens incentive controller that should be the same given the assumption used during the reserve's initialization. With the current logic, we could end up with: • A/V tokens are configured with different incentive controllers. • One of the two token have the incentive controller configured and the other not.
Side effects of deploying the AToken and VariableDebtToken as FungibleAsset
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
In the current implementation of the Aptos codebase both the AToken and VariableDebtToken are deployed as FungibleAsset. When the user mint AToken or VariableDebtToken, the receiving wallet is immediately frozen (see token_base.move?lines=260,265).
Updating/Fetching the reward's emission admin should not revert when there's no rewards_controller configured
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The rewards_controller attribute stored in the EmissionManagerData struct of the emission_- manager holds the value of the "current" rewards_controller configured. Such value could be not configured yet or simply set to option::none() to state the that there's no not a current reward controller in action. The emission admin of a reward is stored as an item of emission_admins: SmartTable<address, address> in the EmissionManagerData struct is not bound to the value of rewards_controller. The @aave_pool admin user should always be able to configure/update an emission admin for a reward, even if the rewards_controller has not been configured yet. The same should also be true for the getter function relative to the reward's emission admin.
rewards_controller module events are not tracking which rewards_controller_address has emitted them
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The rewards_controller module can be seen as a "factory" of rewards controllers. Almost all the functions take an arbitrary rewards_controller_address address as an input parameter to distinguish which reward controller is being used for the internal function logic.
Aave Core and Aave Reward use the same oracle's module
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
With the current implementation of the Aptos codebase, the oracle module maps both the prices of the assets used as Aave Protocol Core reserves and the one used as rewards of the Aave Periphery reward system.
rewards_controller::handle_action should never revert
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The handle_action function of the rewards_controller modules is called by the AToken or VariableDebtToken logic when the user mint/burn/transfer those tokens. Reverting during the execution of the handle_action function means that the above functions (in the AToken or VariableDebtToken context), that are crucial in the Aave Core logic, would break. If the incentives_controller attribute has not been configured (empty) or is misconfigured, the handle_action should just return early without tracking the user rewards and never revert.
Users near MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD can be fully liquidated by using multi liquidations
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
Aave 3.3 introduced new minimum position size thresholds that must exist after liquidations if the entire balance cannot be cleared. This is to prevent position sizes of small amounts that are not unprofitable to liquidate, for example, because of gas costs. • The MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD is currently set to 2000$. • The "dust value" is half of that, set to MIN_LEFTOVER_BASE = 1000$. The rules are as follows: • Full-liquidation: The max close factor is 50% of the user's total debt value (no full liquidation) if-and-only-if HF > 95% AND debt$ >= 2000$ AND collateral$ >= 2000$. Otherwise, the close factor is 100%. • Liquidation failures due to dust position sizes: Liquidation fails if both collateral and debt balances are non-zero after the liquidation and any of the balances is less than 1000$: collateral_left$ > 0 AND debt_left$ > 0 AND (collateral_left$ < 1000$ OR debt_left$ < 1000$).
Minimum position size post-liquidation checks can end up reverting legitimate liquidations
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
Aave 3.3 introduced new minimum position size thresholds that must exist after liquidations if the entire balance cannot be cleared. This is to prevent position sizes of small amounts that are not unprofitable to liquidate, for example, because of gas costs. • The MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD is currently set to 2000$. • The "dust value" is half of that, set to MIN_LEFTOVER_BASE = 1000$. The rules are as follows: • Full-liquidation: The max close factor is 50% of the user's total debt value (no full liquidation) if-and-only-if HF > 95% AND debt$ >= 2000$ AND collateral$ >= 2000$. Otherwise, the close factor is 100%. • Liquidation failures due to dust position sizes: Liquidation fails if both collateral and debt balances are non-zero after the liquidation and any of the balances is less than 1000$: collateral_left$ > 0 AND debt_left$ > 0 AND (collateral_left$ < 1000$ OR debt_left$ < 1000$).
AggregatedReserveData misses the virtual_underlying_balance and is_virtual_acc_active data attributes
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
The AggregatedReserveData struct in ui_pool_data_provider_v3 is missing two attributes that should be returned by the get_reserves_data function. These two values are: • virtual_underlying_balance which represents the underlying balance held in the AToken resource account. • is_virtual_acc_active reserve flag
Improper Event Emission Due to Variable Shadowing
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Certora
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Ottersec Aave Aptos V3.1-V3.3 Report.pdf
Report Date: Apr 2025
Description:
The pending_ltv_set variable is shadowed inside the if block, resulting in the emitted event always reporting a zero value instead of the actual LTV .
Hardcoded Dust Threshold in Swap Logic
Severity: Low
Ecosystem: Aptos
Protocol: Hyperionxyz Vaults
Auditor: ExVul
Report Date: Apr 2025
Description:
The threshold 10 used to decide whether to perform another swap (swap_deposit) is hardcoded. This doesn't account for the varying decimal places of different tokens, potentially leaving significant value as dust for some tokens or unnecessarily swapping for others.
Bypassing team_reward Limitation
Severity: Low
Ecosystem: Aptos
Protocol: TokimonsterAI
Auditor: ExVul
Report Date: May 2025
Description:
In the initialize function of TokimonsterRewarder, there is a constraint ensuring team_reward does not exceed 100. However, the set_override_team_rewards_for_token and add_user_reward_recipient functions lack similar limitations. If team_reward is set above 100, extract operations will fail due to insufficient funds, creating a potential vulnerability.
Invalid Address Replacement in replace_user_reward_recipient Function
Severity: Low
Ecosystem: Aptos
Protocol: TokimonsterAI
Auditor: ExVul
Report Date: May 2025
Description:
The replace_user_reward_recipient function in TokimonsterRewarder fails to verify whether old_recipient and recipient are the same. This allows for address - replacement operations that are, in reality, non - operational. Such actions result in unnecessary gas consumption and the generation of invalid event logs.
Incorrect Display of Bridge Info
Severity: Low
Ecosystem: Sui
Protocol: Mango
Auditor: ExVul
Report Date: July 2025
Description:
In the config.move file, the pair_list function constructs a list of pairs by iterating through pair_id using a while loop. However, it fails to account for special pairs that may have been created using the create_special_bridge_pair function, where the specified id can be greater than the current pair_id. As a result, those special pairs are omitted during iteration. Ultimately, this leads to an incomplete BridgeInfo being returned in the bridge_info function of bridge.move.
Existence check problem
Severity: Low
Ecosystem: Sui
Protocol: Mango
Auditor: ExVul
Report Date: July 2025
Description:
In the treasury.move file, the add_treasury_cap function does not check if the same type already exists in treasuries. If so, it will abort. The function directly adds to the ObjectBag without checking if the key already exists, which will cause an abort if the treasury type already exists.
Faulty logic allows duplicate custodian addition
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
In deusd_minting.move function add_custodian_address_internal(), the incorrect assertion logic fails to prevent duplicate custodian addresses from being added.
Unavailable view function
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
The cooldown_underlying_amount and cooldown_end_time functions take a UserCooldown and return its underlying_amount and cooldown_end fields. However, these two view functions are actually unusable because UserCooldown is a field within SdeUSDManagement, which cannot be directly accessed by external modules. Moreover, the module does not contain any function that returns a reference to UserCooldown. Therefore, these two functions cannot be used in practice.
Soft restriction bypass via token transfers
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
In the sdeusd.move function add_to_blacklist() function soft-restricted users are only blocked from direct staking but can receive sdeUSD tokens via transfers, bypassing the restriction entirely.
Cooldown timer reset causes user withdrawal delays
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
In deusd_lp_staking.move function unstake() , each unstake operation overwrites the cooldown timestamp for all cooling tokens, not just the newly unstaked amount. If you check this vulnerable code, it resets the timer for ALL cooling tokens.
Cooldown duration changes apply retroactively
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
In deusd_lp_staking.move function withdraw() , the cooldown duration is read from current parameters at withdrawal time, not locked when user unstakes. Admin can change cooldown periods mid-stream, affecting users who have already begun cooling down. Let's check this scenario: 1. User unstakes 1000 tokens when cooldown = 30 days. 2. User expects withdrawal on Day 30. 3. Admin updates cooldown to 60 days on Day 20. 4. User tries withdrawing on Day 30 → fails because assert!(current_time >= stake_data.cooldown_start_timestamp + params.cooldown, ECooldownNotOver); now requires 60 days. The root cause is that params.cooldown always reads current global setting, not the duration that was active when the user started cooldown.
Security Levels Lack Flexibility
Severity: Low
Ecosystem: Sui
Protocol: BalancerV2
Auditor: Quantstamp
Report Date: Aug 2025
Description:
The vault implements a three-level security system that provides insufficient granularity for emergency responses. Level 0 allows all operations, level 1 blocks everything, and level 2 blocks borrowing, repaying, and withdrawing while still allowing deposits and liquidations. This design may force administrators to disable critical functions unnecessarily.
pair::set_static_fee_parameters_internal updates volatility_accumulator to the new max value
Severity: Low
Ecosystem: Aptos
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
When updating the static fee parameters, we change a lot of variables including max_volatility_accumulator. After setting the new values, we change the volatility_accumulator to the new max_volatility_accumulator value, and we calculate the total_fees that will be accumulated at the max value. and making sure it do not exceeds MAX_TOTAL_FEE variable.
Insufficient vault balance validation in almm_rewarder::update_emission leads to overcommitted rewards and failed user claims
Severity: Low
Ecosystem: Aptos
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The almm_rewarder::update_emission function validates vault balance before updating emission rates but fails to account for unclaimed rewards already promised to users. The function checks total vault balance without subtracting rewards accumulated through both PositionReward.amount_owned and the time-weighted growth calculation, allowing the protocol to overcommit rewards beyond available collateral.
Incorrect value capture order in set_protocol_variable_share leads to misleading event data
Severity: Low
Ecosystem: Aptos
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The almm_pair::set_protocol_variable_share function updates the protocol variable share parameter but captures the old value after the parameter has already been modified. This causes the EventNewProtocolVariableFee event to emit identical values for both old_share and share fields.
Calculation Errors - Overview
Arithmetic mistakes like rounding, overflow, or precision loss impacting balances or rewards.
| Calculation Errors | Findings |
|---|---|
| Critical | 13 |
| High | 28 |
| Medium | 61 |
| Low | 46 |
| Total | 148 |
Critical Findings
max_liquidity_factor computation is incorrect
Severity: Critical
Ecosystem: Sui
Protocol: Kai Finance
Auditor: Asymptotic
Report: https://info.asymptotic.tech/kai-leverage-verification-report-6ec808dd2adc4b55a4e30f0512260a70
Report Date: Aug 2024
Description: This function calculates the maximum liquidation factor for a financial position based on its current margin level. The denominator computation for one case is incorrect: it uses current_margin_x64 instead of liq_margin_x64.
Arithmetic Overflow in Liquidity Pricing Causes Complete DOS
Severity: Critical
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description: An arithmetic overflow vulnerability has been identified in the protocol's core liquidity pricing mechanism. This vulnerability allows attackers to manipulate pool reserves using flash loans, creating conditions where any user attempting to add liquidity will trigger a mathematical overflow that crashes the entire liquidity provision system.
The vulnerability exists in a critical pricing function amm_utils::quote that calculates how much of one token should be received when providing another token for liquidity. The function performs mathematical calculations that can result in extremely large numbers, but it fails to validate whether these numbers are safe to use before converting them to the protocol's standard number format.
Incorrect token amount calculation during transfer
Severity: Critical
Ecosystem: Supra Chain
Protocol: Dexlyn Hyperlane
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-hyperlane-monorepo-dec2024/
Report Date: Dec 2024
Description:
In the transfer_remote and transfer_remote_with_gas functions of both hyper_coin_collateral.move and hyper_coin.move, there is an issue in the token amount calculation when source decimals are greater than destination decimals.
The code is incorrectly assigning the scaled-down data_amount directly to amount, resulting in users being charged less tokens than they should be on the source chain.
Share Price Manipulation
Severity: Critical
Ecosystem: Sui
Protocol: Bluefin Spot
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2024
Description: The bluefin_vault contract is vulnerable to rounding manipulation attacks due to improper handling of token-to-share conversion rates, allowing exploitation of precision errors in share valuation. Additionally, inconsistent conditions in the shares calculation logic may cause deposits to yield zero shares when vault balances are mismatched, leading to potential fund loss.
Interest Rate Calculation Error
Severity: Critical
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: Jul 2023
Description: The SECOND_PER_YEAR constant is sometimes incorrectly calculated with milliseconds, resulting in a value 1000 times larger than intended, causing significant interest rate miscalculations.
Numerical Precision Error
Severity: Critical
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description: In the repay function, the excess amount after repayment is returned through pool::withdraw, but excess_amount is not converted to decimal precision, causing incorrect amounts to be returned to users.
Flawed Validations Lead To Inaccuracies
Severity: Critical
Ecosystem: Sui
Protocol: Navi
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description: In validator.move, validation functions for lending operations use scaled balances (supply and borrow) in conjunction with unscaled amounts, leading to calculation inconsistencies and inaccuracies across multiple functions.
Improper Conversion
Severity: Critical
Ecosystem: Sui
Protocol: Bucket
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description: When repay_amount is greater than or equal to Bottle debt, the returned collateral is calculated as 1.1 times the debt amount. However, the debt amount is not adjusted based on the collateral token's decimals during conversion, resulting in improper collateral values (return_sui_amount).
Calculation Formula Error when Adding Liquidity
Severity: Critical
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: Apr 2023
Description: In the get_amount_for_add_liquidity function, the formula for obtaining the other token quantity through one token quantity is incorrect, directly affecting the liquidity addition functionality for users.
Incorrect Formula
Severity: Critical
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: The amount_to_refund calculation should also be divided by DecimalPrecision after being multiplied by it, preventing precision loss in refund amounts.
remove_liquidity does not call update_rewarder
Severity: Critical
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
remove_liquidity does not call update_rewarder which will cause reward cumulative error.
Broken Stable Curve Math
Severity: Critical
Ecosystem: Aptos
Protocol: Pontem (Liquidswap)
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Sep 2025
Description:
The liquidity_pool::compute_and_verify_lp_value function, checks if the lp value is the same before and after a swap. When dealing with a stable curve, the lp value before the swap, is calculated incorrectly.
Overflow In Calculating Delta B
Severity: Critical
Ecosystem: Sui
Protocol: Cetus
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2023
Description:
The function get_delta_b is used to calculate the amount_b for specified liquidity. However, its implementation relies on the assumption that themultiplication ofliquidityandsqrt_price_diff returns the value < 2**128 which does not require to be true.
High Findings
Incorrect Reward Emission Calculation
Severity: High
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
The current calculation for pool.reward_rate incorrectly subtracts total_reward_allocated from pool.reward.value() . Since pool.reward.value() already represents the current reward amount in the pool, this subtraction causes the subsequent pool.reward_rate to be smaller than intended when additional rewards are added.
Funding Rate Mechanism Abused to Systematically Drain Protocol Liquidity
Severity: High
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
Recommendation:
The fee model must be updated to account for all types of position modifications, preventing fee-free value extraction. Modify the fee calculation for decrease orders. When size_delta is zero, the exit_fee should be calculated based on a percentage of the collateral_delta. This ensures that withdrawing funds from a position always incurs a cost.
Incorrect Stable Swap Invariant Recalculation Leads to Incorrect Pricing
Severity: High
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The vulnerability exists in all four swap functions within the amm_router contract. After a swap is completed but before the function returns, the code explicitly calls a function to set a new invariant, fundamentally violating the mathematical basis of a stable swap. By recalculating D on every trade, the contract is not preserving the invariant; it is actively changing it. This action effectively "rebases" the entire pricing curve after each transaction based on the new post-swap reserves. This process introduces small but definite errors, causing the pool's value representation to "drift" away from its true state with each transaction.
Risk of Arithmetic Overflow
Severity: High
Ecosystem: Sui
Protocol: Aftermath Orderbook
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description: In ticks_per_lot_to_quote_per_base, a multiplication operation between ticks_per_lot and tick_size can overflow if the result exceeds the maximum representable value of a u64, resulting in an integer overflow vulnerability.
Fund Loss Due to Unchecked Conversion
Severity: High
Ecosystem: Sui
Protocol: Aftermath
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description: An incorrect calculation turns negative values into positive values, causing unexpected profit and fund loss. The conversion is not properly validated, leading to unintended financial outcomes.
Incorrect Price Calculation
Severity: High
Ecosystem: Sui
Protocol: Aftermath
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2023
Description: In math.move, the functions calc_oracle_price and calc_spot_price are intended to calculate the price of BASE coin in terms of QUOTE coin. However, calc_spot_price_fixed incorrectly computes the price of out-coin in terms of in-coin, inverting the intended calculation.
Inconsistent Assert Statement
Severity: High
Ecosystem: Sui
Protocol: Bluefin
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description: The request_profit_withdraw_from_vault function fails to account for vault.pending_profit_amount in its withdrawal validation, allowing the holding account to inflate pending profits and bypass balance checks. As a result, withdrawals can exceed the actual available profit, leading to potential fund misallocation or loss.
Round Up Shares
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description: By staking the minimum number of Sui repeatedly, due to rounding errors, users can receive more Cert tokens when unstaking than intended, effectively exploiting the protocol.
Precision Loss Results in Rewards being Left in the Contract and Unable to be Withdrawn
Severity: High
Ecosystem: Sui
Protocol: Cetus Farming
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description: The accumulate_pool_reward() function experiences two instances of precision loss: once when calculating rewards for each pool based on proportion, and again when calculating acc_per_share using pool_acc_reward/total_pool_share. This results in residual rewards that cannot be withdrawn after all users claim their rewards.
pending_reward Is Not Compatible
Severity: High
Ecosystem: Sui
Protocol: Cetus Farming
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description: In both add_liquidity_fix_coin and remove_liquidity functions, without the addition of pos_info.reward, the pending_reward calculation would be incorrect, causing major problems in reward distribution.
Erroneous Calculation Leads To Unfair Liquidation
Severity: High
Ecosystem: Sui
Protocol: Navi
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Jun 2023
Description: In logic.move, the calculate_max_liquidation function has calculation inaccuracies when retrieving max_liquidable_collateral and max_liquidable_debt. These calculation errors create exploitable opportunities for attackers to profit from improper liquidation scenarios.
Accuracy Loss
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: In the claim_rewards function, amount_to_claim is incorrectly calculated, potentially resulting in 0 or unclaimable funds. The calculation should multiply before dividing to reduce accuracy loss.
Incorrect Calculation in amount_to_claim in claim function
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: A calculation error in the condition for amount_to_claim in the claim function causes incorrect reward amounts to be claimed.
Overflow Risk in i64::sub
Severity: High
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: Apr 2023
Description: The i64::sub operation has an overflow risk, potentially causing unexpected behavior or contract failure.
Improper Reward Calculations in reward_distributor.move
Severity: High
Ecosystem: Unknown
Protocol: Project Zenith
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/Project-Z-Security-Audit-Report/blob/Wallet/audit.md
Report Date: Mar 2024
Description: The accumulated_gain function inaccurately calculates token earnings, neglecting contributions to subsequent scales, leading to incorrect reward distributions.
Incorrect next scaled variable debt update in liquidations leads to wrong interest rates
Severity: High
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report Date: June 2025
Description:
When liquidating and liquidation_logic::burn_debt_tokens is called, the debt_reserve_cache's scaled_variable_debt (debt token total supply) needs to be updated after the burn by setting it to the next_scaled_variable_debt variable.
However, the code currently sets the next borrow index (not scaled total supply) to the next_scaled_variable_debt value, which are different units, borrow index is in RAY (1e27), while next_scaled_variable_debt is in token units (usually 6-8 token decimals).
Dust amounts of high-value tokens can be stolen for profit due to rounding
Severity: High
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: June 2025
Description:
The mint and burn actions for the aToken and vToken use the same rounding direction to convert between (rebased) amounts and the scaled amounts, rounding "half-up":
let amount_scaled = wad_ray_math::ray_div(amount, index);
This can be abused to extract tokens from the protocol.
Users may lose all rewards because of the precision loss
Severity: High
Ecosystem: Aptos
Protocol: AAVE V3
Auditor: Cantina Contest SRs
Report: https://cantina.xyz/code/ad445d42-9d39-4bcf-becb-0c6c8689b767/findings/19
Report Date: May 2025
Description:
In function calculate_asset_index_internal, we will calculate the reward rate per scale amount for the latest time slot.
The formula we use is emission_per_second * time_delta * asset_unit / total_supply. Here the asset unit depends on the underlying asset's decimal. For example, if the underlying asset is USDC, then the asset_unit is 1e6. Here the asset_unit is used as the precision decimal.
The problem here is that the precision decimal is not enough, and the formula's result may be round down to 0. If the reward rate per scale amount is 0, then all users will lose their rewards.
Precision factor is not precise enough
Severity: High
Ecosystem: Aptos
Protocol: PancakeSwap
Auditor: Zellic
Report Date: Nov 2022
Description:
The precision_factor used to avoid division precision errors is not large enough to mitigate truncation to zero errors.
Potential overflow in the add_reward function
Severity: High
Ecosystem: Aptos
Protocol: PancakeSwap
Auditor: Zellic
Report Date: Nov 2022
Description:
In the add_rewards function there is an assert that may cause an overflow by multiplying two u64 values.
Updating Magnified Dividends Per Share during Unstaking is Incorrect
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
Wwhen users unstake, the protocol also updates the magnified dividends per share. The calculation involves adding ((amount as u128) * pool_info.precision_factor / (pool_info.staked_tokens as u128)) to the original per share x or per share y values.
This is incorrect, as it causes the pool_info.magnified_dividends_per_share_x or pool_info.magnified_dividends_per_share_y values to increase without actual rewards being distributed to the rewards pool.
When Calculating Fees for Token Info Y Only, There is An Incorrect Passing of rewards_coins
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
rewards_coins is extracted from metadata.balance_y, but when calling the update_pool() function, it passes these rewards coins to reward_x,causing confusion in calculation logic.
Unstrict Swap Invariant
Severity: High
Ecosystem: Aptos
Protocol: Pontem (Liquidswap)
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Sep 2022
Description:
When dealing with an uncorrelated curve, the program introduced an error by reporting an incorrect swap if the lp_value after the swap is strictly smaller than the lp_value before the swap. The swap should be valid only when the value after is greater than the value before. Otherwise, swapping would be able to exploit potential rounding errors, depending on the precision of the relevant curves.
Improper Calculation in Liquidation
Severity: High
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2022
Description:
In the else case of the liquidation function, the settle_share_amount should be calculated from the repay_amount using the get_share_amount_from_borrow_amount function. Instead, the repay amount is directly returned as the settle share amount.
Improper Reward Calculations
Severity: High
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2023
Description:
In the protocol module, accumulated_gain calculates the earnings of a token based solely on the scale of the snapshot. However, it is possible for a user’s amount to have participated in the distribution of the next scale as well. As a result, the failure to account for this may lead to incorrect calculations of token earnings.
Improper Reward Calculations
Severity: High
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
In the protocol module, accumulated_gain calculates the earnings of a token solely based on the scale of the snapshot. However, a user’s amount may have participated in the distribution of the subsequent scale as well. As a result, the failure to account for this may lead to incorrect calculations of token earnings.
Utilization Of Unsuitable Rounding Direction
Severity: High
Ecosystem: Aptos
Protocol: Meso Lending
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2024
Description:
When calculate_shares performs a floor rounding (rounding down) in share calculations in borrow_internal and withdraw , the user may end up with fewer debt shares than they are entitled to, resulting in them owing more assets than the value represented by their shares. As a result, users will effectively earn funds for free because they are receiving fewer debt shares for their borrowings. The pool’s total debt increases without the user receiving proportional debt shares.
Abort Due to Underflow in Difference Calculation
Severity: High
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
In get_compliance_transferable_tokens_deposit and get_compliance_transferable_tokens within compliance_service , difference is calculated as time - lock_time without first checking if time is greater than or equal to lock_time . If lock_time exceeds time , the subtraction operation ( time - lock_time ) will result in an underflow, causing the program to abort.
Medium Findings
Improper Rounding
Severity: Medium
Ecosystem: Sui
Protocol: Cetus CLMM
Auditor: OtterSec
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
The calculation of delta_liquidity_share in bin::increase_liquidity utilizes floor division, which may round down small values to zero. This implies that users depositing small token amounts may not receive any liquidity shares, effectively losing their deposited funds
Emission extension math can underflow
Severity: Medium
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The reward rate is recomputed from (pool.reward.value() - total_reward_allocated) which can become negative and underflow.
Missing Overflow Checks in Rate Type
Severity: Medium
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The Rate type's mathematical operations (addition, multiplication, and division) lack proper overflow checks for the input values. While the underlying u128 type with 18 decimal precision can handle the calculations without overflowing, the initial values (u8 or u16) may silently overflow during Rate mathematics without any revert.
This is particularly concerning because rate values are used directly in mathematical operations within the Decimal type without ever being converted back to their original types. This means any overflowed values will propagate through calculations without triggering any reverts.
Decimal Type Arithmetic Overflow Risk
Severity: Medium
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The Decimal type's mathematical operations (addition, multiplication, division) lack proper overflow checks for u64 arithmetic.
Arithmetic Overflow DoS in place_order and execute_order Functions due to Taker Fee
Severity: Medium
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description: The Dexlyn Perpetual DEX protocol contains a significant arithmetic overflow vulnerability in two key functions that handle fee calculations during order placement and execution. When fees exceed available collateral, the protocol crashes with subtraction overflow errors, leading to denial of service.
Extreme Amplification Parameter Can Lead to Potential Overflow
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The amm_entries::init_pool_stable function accepts extreme amplification_p values (up to u64::MAX) without upper bounds validation. While extreme amplification alone is safe, it enables overflow vulnerabilities when pools accumulate large balances over time. The combination of extreme amplification + large balances causes an arithmetic overflow in Newton-Raphson calculations, leading to transaction failures and potential DoS conditions.
The amm_entries::init_pool_stable function accepts a user-controlled amplification_p parameter without upper bounds validation (amm_entries.move).
Unsafe Numeric Cast in update_user*_*earnings Leads to Permanent Denial of Service and Locked Funds
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The update_user_earnings function unsafely casts a u128 reward calculation down to a u64 to store it in the user_stake.earned_reward field. If an overflow were to occur, it would revert any transaction that calls the function, including harvest and unstake. This constitutes a latent vulnerability that could lead to a permanent Denial of Service (DoS) for the affected user, making it impossible for them to withdraw their staked assets and causing a total loss of their deposit.
Potential Precision Loss in set_gr_indicators
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the set_gr_indicators function, the formula for calculating s_value — sValue = α × EMA120 + (1-α) × [β × EMA90 + (1-β) × SpotPrice] — is implemented using integer arithmetic with intermediate division steps. Specifically, the lines of code let inner = inner_num / scale; and let prelim: u128 = s_num / scale; perform division operations before the final calculation is complete. Each division operation discards the remainder, leading to a loss of precision. This accumulated precision error can cause inaccuracies in the final calculated oracle price, thereby compromising the correctness of protocols that rely on this price.
Flash-loan Fee Calculation Allows Zero Fee
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the borrow_flash_loan function, the fee is computed using floor division. Since u64::mul_div performs integer floor division, the result truncates toward zero. As a result, when amount is small enough (e.g., amount = 999), the computed fee becomes 0.
Miscalculation Due to Negative Withdrawal Amount
Severity: Medium
Ecosystem: Sui
Protocol: Aftermath
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
Negative p/l on a short position will cause amount_to_withdraw to be negative.
Risk of Negative Margin Calculation
Severity: Medium
Ecosystem: Sui
Protocol: Aftermath
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
May return negative margin causing issues in vault.
Assertion Failure Due to Rounding
Severity: Medium
Ecosystem: Sui
Protocol: Solend Steamm
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
Due to the presence of roundings during the conversion between cTokens and underlying tokens, the product of ctoken_amount and the deployed funds often exceeds the product of the bank’s total CTokens and recalled amount, failing the assertion check and resulting in frequent aborts.
Division by Zero in Committee Selection
Severity: Medium
Ecosystem: Sui
Protocol: Walrus Contracts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
In staking_inner::select_committee_and_calculate_votes, a division by zero may occur when calculating capacity_vote if weight is zero, as the calculation of capacity_vote divides the product of node_capacity and the number of shards with weight.
Abort via Large Node Capacity Value
Severity: Medium
Ecosystem: Sui
Protocol: Walrus Contracts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
Overflow in capacity_vote calculation caused by maliciously set node_capacity.
Utilization of Incorrect Commission Rate
Severity: Medium
Ecosystem: Sui
Protocol: Walrus Contracts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
The updated commission rate is intended for future epochs and not for the current epoch. Thus, it will result in an incorrect calculation of the operator’s commission.
Possible Overflow Due to Exceeding the Type Limit
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Republic Security Token
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
Specifically, when multiplying two large u64 values, such as self.total_funds and snapshot.address_balance(addr), the result may exceed the maximum value for u64, resulting in an overflow.
Fee Accounting Inconsistency
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Deepbook V3
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
When the user chooses to pay the fee in DEEP, deep_quantity is calculated from fee_quantity. However, if deep_quantity turns out to be 0, the fee may be incorrectly calculated in base or quote instead, resulting in the fee being paid in a way that does not match the user’s intention.
Share Price Inflation
Severity: Medium
Ecosystem: Sui
Protocol: BlueFin
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description:
In withdraw_from_vault, when a user withdraws funds, the share count vault.total_shares is appropriately reduced. However, a critical vulnerability arises as no corresponding adjustment occurs to vault_total_balance. Although vault_total_balance is calculated based on the current vault balance, it fails to account for the reduced shares resulting from the withdrawal. Consequently, the share price may experience temporary inflation, given that vault_total_balance remains unchanged despite the reduction in total shares.
Price Manipulation
Severity: Medium
Ecosystem: Sui
Protocol: Aftermath Orderbook
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description:
Currently, during the calculation of premium_twap and spread_twap, lip_max_book_index_spread confines the book_price within a range of plus five to negative five percent of the index_price. Nevertheless, it remains possible to influence the time-weighted average price by manipulating the mark_price within the same percentage range of the index_price.
Incorrectly Calculated Reward Period
Severity: Medium
Ecosystem: Sui
Protocol: Turbos
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
total_elapsed_time skipped if emission = 0.
Missing Tick Step Validation
Severity: Medium
Ecosystem: Sui
Protocol: Turbos
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
Overflow and abort since base_tick_step and limit_tick_step are user inputted.
Volume Overflow Risk
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Deepbook
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description:
Self-trading and flash loans can cause overflow.
Improper Order Quantity Calculation
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Deepbook
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description:
get_quantity_out and get_level2_range_and_ticks do not account for the remaining quantity of orders.
BigVector Size Overflow
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Deepbook
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description:
This is especially relevant due to the Sui Move runtime’s limitation on maximum object size, which is 256000 bytes. If the leaf objects in the BigVector exceed this limit, the Move runtime will throw an error, preventing the order book from functioning correctly.
Prevention of Pool Closure Due to Rounding
Severity: Medium
Ecosystem: Sui
Protocol: Hop Aggregator
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
max_amount_in and amount_out round down. Pool could remain in OPEN state, even though empty.
Withdrawals from staking pools may result in rounding errors, which results in lost rewards
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Labs Sui
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
Rounding down issue, if user attempts to withdraw small number of tokens, could round down to nothing.
Precision Loss In Redistribution
Severity: Medium
Ecosystem: Sui
Protocol: Bucket
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
Since the accumulators are not factored by some value, directly dividing the collateral and debt amounts with total stake leads to less precise rounded-down values, which the accumulators add and lead to imprecise accumulation.
Improper Tank Value Update
Severity: Medium
Ecosystem: Sui
Protocol: Bucket
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
start_s and start_g incorrectly updated.
Overflow In Calculation Of Delta A
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2023
Description:
The numberator value is not validated before running u256::shlw on it. As a result, the non-zero bytes might be removed, which leads to an incorrect calculation of the value.
Precision Loss Issue In Weighted Math
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2023
Description:
In the math module, the calculation of the amount taken in during a swap is based on the amount given out, the balances in the pool, and the weights of the assets. calc_in_given_out_internal is responsible for this calculation, which involves using log_exp_math::pow to perform the required exponentiation. log_exp_math::pow used by calc_in_given_out_internal is vulnerable to precision errors, which may return incorrect values. For instance, the function may incorrectly calculate 1.0000000002 ** 1 = 1.0. This precision issue can be exploited in calc_in_given_out_internal, leading to a return value of zero despite a non-zero amount_out value.
Improper Price Deviation Calculation Formula
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2023
Description:
get_price_diff_ is responsible for computing price deviation. However, to calculate the percentage of price deviation, the formula should be (diff(new_price, old_price) / old_price) * 100. The current implementation uses new_price as the denominator if new_price > old_price. Use b (old_price) as the denominator in both cases.
Including Interest In Vault CR Calculation
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2023
Description:
redeem_collateral and liquidate calculate the collateral ratio (CR) for a vault, however CR is calculated without considering the vault.interest, leading to the use of an incorrect CR value in other calculations.
Incorrect Withdraw Fee Calculation On Update
Severity: Medium
Ecosystem: Aptos
Protocol: Steamflow
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Mar 2023
Description:
In protocol::update, the change in the amount_per_period triggers an additional fee calculation using withdrawal_fees based on contract.start. However, using the start time for fee calculation results in the fee being recalculated for the period.
Improper Fee Amount Calculation With Zero Fees
Severity: Medium
Ecosystem: Aptos
Protocol: Steamflow
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Mar 2023
Description:
protocol::fee_amount is used to calculate the fee for a given amount using the input parameter fees as basis points (bps). However, the case of fees == 0 incorrectly returns the total amount as the fee. Instead, the function should check for fees == 10000 to return the total amount as the fee correctly.
Precision Loss Issue In Weighted Math
Severity: Medium
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
log_exp_math::pow used by calc_in_given_out_internal is vulnerable to precision errors, which may return incorrect values.
Improper Price Deviation Calculation Formula
Severity: Medium
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
get_price_diff_ is responsible for computing price deviation. However, to calculate the percentage of price deviation, the formula should be (diff(new_price, old_price) / old_price) * 100. The current implementation uses new_price as the denominator if new_price > old_price. Use b (old_price) as the denominator in both cases.
Including Interest In Vault CR Calculation
Severity: Medium
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
These functions do not account for the updated interest of the vault when calculating the CR. As a result, the CR is calculated without considering the vault.interest, leading to the use of an incorrect CR value in other calculations.
Incorrect Liquidity Calculation
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
The issue in get_borrow_rate may result in miscalculated utilization ratios and lower interest rates for borrowers than intended. The function currently calculates total_liquidity by adding the reserve_amount (unborrowed reserve funds) to the sum of total_borrowed and decimal::from_u128(total_cash), which is incorrect. The utilization ratio is calculated by dividing total_borrowed by total_liquidity. With the incorrect calculation, the total_liquidity is overestimated because the reserve_amount is added instead of subtracted, lowering the utilization ratio.
Removal Of Incorrect Debt Shares
Severity: Medium
Ecosystem: Aptos
Protocol: Meso Lending
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2023
Description:
In lending_pool, DUST_THRESHOLD is utilized to completely remove any position with remaining shares less than DUST_THRESHOLD. Consequently, when a user’s remaining debt shares fall below the DUST_THRESHOLD in repay, the function completely removes the user’s debt shares (as shown in the code snippet below). This removal effectively cancels any remaining debt the user has, resulting in a potential giveaway of free money, since the user no longer owes anything even though they might have an outstanding debt.
Interest Accrual Mismatch
Severity: Medium
Ecosystem: Aptos
Protocol: Meso Lending
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2023
Description:
If the user deposits the repayment into a different pool via deposit_internal, interest is not accrued for the repayment pool before the deposit is made, as highlighted in the code below. This results in an inconsistent state because, while the borrowing pool’s state is updated to reflect the most recent accrued interest, the repayment pool’s state may not reflect the most recent accrued interest since accrue_interest is not called for this pool in end_flashloan.
Inconsistency In Debt Repaid And Collateral Seized
Severity: Medium
Ecosystem: Aptos
Protocol: Meso Lending
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2023
Description:
During liquidation, the liquidator specifies the repayment amount to be repaid on behalf of the liquidatee, and a fungible asset of that amount is provided as an argument to repay. repay utilizes calculate_shares to determine the exact number of shares to repay, rounding down in cases of non-perfect division. As a result, the liquidatee’s debt reduction may be less than the original fungible asset amount ( repaid_amount ). However, all subsequent calculations rely on the repaid_amount variable to determine the number of shares transferred from the liquidatee to the liquidator.
Investor Limit Calculation Error
Severity: Medium
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
max_us_investors_percentage is not considered when calculating the U.S. investors’ limit. The U.S. investors’ limit is intended to restrict the percentage of U.S. investors relative to the total number of investors. Not incorporating the max_us_investors_percentage implies that the actual cap on U.S. investors may exceed the intended compliance threshold
Rounding Error in Delegation Pool
Severity: Medium
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
The majority of delegation_pool operations contain small rounding errors that affect delegators. When unlocking stake (undelegating) from a delegation pool, the amount unlocked may be slightly less than the requested amount. Similarly, during staking, users deposit a specific amount of APT in exchange for a calculated number of shares, but due to rounding during the conversion, the actual stake increase may be slightly less than the input amount. For example, a user may delegate x APT , but only x-1 APT is effectively staked.
The Value of 0 for Both States
Severity: Medium
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description:
When the result of a calculation is 0, the state of the returned sRate is negative, which may result in two states of 0, positive 0 and negative 0. The same problem exists for add and sub. The same applies to sdecimal.
Collateral may be insufficient when repaying
Severity: Medium
Ecosystem: Sui
Protocol: Bucket Protocol
Auditor: MoveBit
Report Date: Jun 2023
Description:
When calling record_repay_capped, amount of collateral calculated for repay may exceed collateral_amount. This results in bottle.collateral_amount is less than the returned amount of collateral return_sui_amount.
Incorrect Data in Event
Severity: Medium
Ecosystem: Sui
Protocol: Turbos Finance-TurboStar
Auditor: MoveBit
Report Date: May 2023
Description:
Calculation error in claim function, quantity is always 0.
Calculation Formula Error
Severity: Medium
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: Apr 2023
Description:
delivery_value_per_unit is expressed as delivery_price * o_token precision and then divides the precision of b_token. When L304 calculates delivery_value, the precision of b_token is divided, resulting in a logic error.
Timelock overflow in Default Maven struct
Severity: Medium
Ecosystem: Sui
Protocol: MSafe Maven
Auditor: MoveBit
Report Date: Apr 2023
Description:
If no other operations are created through operation, time lock = MAX_U64. If proposal is initiated at this time and approved, calling start_permission_recovery > order_timelock::start_timelock_order > timelock::new will cause an overflow and crash.
Sqrt function precision error
Severity: Medium
Ecosystem: Sui
Protocol: Sui AMM Swap
Auditor: MoveBit
Report Date: Nov 2022
Description:
Incorrect calculation on add_liquidity function. Lp tokens should be square root of the multiplication of two tokens, but current code takes the square first, then multiplying.
Calculation of reward and point May Be Inaccurate
Severity: Medium
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Mar 2023
Description:
pool::collect_reward, pool::calculate_and_update_rewards, and pool::calculate_and_update_points do not recaculate rewards except in some special cases. This can lead to inaccurate reward and point calculations.
Early withdrawal penalty bypass by chunking withdrawal amount
Severity: Medium
Ecosystem: Aptos
Protocol: Propbase
Auditor: Hacken
Report: https://hacken.io/audits/propbase/sca-propbase-staking-feb2024/
Report Date: Feb 2024
Description:
The Propbase protocol uses $PROPS token for staking operations. The protocol distributes staking rewards as $PROPS to stakeholders. In addition, admin of the protocol sets a penalty_rate during the pool creation. The penalty rate amount can be set between 1 and 50. The purpose of this variable is to penalize early withdrawals.
The penalty calculation can be seen at below:
let penalty = amount / 100 * stake_pool_config.penalty_rate;
Currently, there is no lower bound for withdraw amount in the code. Therefore, it is possible to chunk the total withdraw amount by 99 in order to bypass this penalty according to the formula above.
let penalty = 99 / 100 * stake_pool_config.penalty_rate (0-50);
penalty = 0;
As a result, it is possible to bypass the early withdrawal penalty due to this precision loss.
Incorrect Fee Calculation in Quoter Function Leads to Underestimated Input Amounts
Severity: Medium
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The almm_pair::get_swap_in function serves as a quoter function that calculates the required input amount for a given output amount in the ALMM protocol. This function is critical for frontend applications to provide accurate swap quotes and enable proper slippage calculations. The function iterates through bins to calculate the total input amount needed for a desired output. For each bin, it calculates amount_in_without_fee based on the bin's price and then adds the fee amount. However, the function incorrectly uses fee::get_fee_amount_from instead of fee::get_fee_amount for fee calculations.
Unstaking from LP pools will cause underflow and lock user funds
Severity: Medium
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
If the last pool is empty or with insufficient funds an underflow will occur.
The liquidator will incur a loss when performing liquidationCall
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE V3
Auditor: Cantina Contest SRs
Report: https://cantina.xyz/code/ad445d42-9d39-4bcf-becb-0c6c8689b767/findings/192
Report Date: Jun 2025
Description:
ccording to the Aave documentation, the liquidation_bonus must be above 100%.
However, the current calculations result in values below 100% :
(5 * math_utils::get_percentage_factor()) / 100*// (5 * 10000) / 100 = 500* (85 * math_utils::get_percentage_factor()) / 1000*// (85 * 10000) / 1000 = 850*
These values are far below the expected minimum of 10000 (which represents 100%). To be valid, the value must be greater than 10000.
Incorrect Calculation of share_proportion
Severity: Medium
Ecosystem: Aptos
Protocol: Echelon
Auditor: Zellic
Report Date: Jan 2025
Description:
asset_amounts * BPS_BASE / deposit_amounts will not properly calculate the percentage of the deposit. Currently, the number of users is divided by the total number of tokens, so the exact ratio is not calculated.
The operator can Evade The Fees When Loaning Assets
Severity: Medium
Ecosystem: Aptos
Protocol: Amnis
Auditor: MoveBit
Report: https://movebit.xyz/reports/Amnis-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
The function pegging.loan_apt() allows the operator to withdraw funds from the protocol, but a certain fee is required when returning the funds. The fee calculation is as follows: math64::mul_div(amount, pegging().loan_fee, BPS_MAX) According to the protocol configuration, we found that loan_fee is 10, and BPS_MAX is 10000. When amount * 10 < 10000 , users will not have to pay any fees. Therefore, the operator can repeatedly borrow 999 to avoid the fees. It is recommended to set a minimum loan amount or to check if the fee is 0, in which case borrowing assets should not be allowed.
Rounding Errors Handling Is Not Best Practice
Severity: Medium
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In both borrow and repay functions, a rounding handling increases amount by one. However, this brutal force method is not a good practice since it may add one extra layer to the rounding (if it is already rounded up).
Assert condition is not accurate
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Market
Auditor: MoveBit
Report Date: Mar 2023
Description:
In decimal.move, an assert is provided to prevent overflow, but the conditions are not strict and U64_MAX * U64_MAX does not equal U128_MAX.
Improper Rounding
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: OtterSec
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
The calculation of delta_liquidity_share in bin::increase_liquidity utilizes floor division, which may round down small values to zero. This implies that users depositing small token amounts may not receive any liquidity shares, effectively losing their deposited funds.
Arithmetic Precision Errors
Severity: Medium
Ecosystem: Binance Smart Chain
Protocol: AquaSwap
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/AuquaSwap-Audit-/blob/Wallet/Audit%20report.md
Report Date: 2024
Description:
The calculate_protocol_fees function rounds down to zero for small order sizes, allowing users to bypass fees.
Arithmetic Errors – Overflow
Severity: Medium
Ecosystem: Binance Smart Chain
Protocol: AquaSwap
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/AuquaSwap-Audit-/blob/Wallet/Audit%20report.md
Report Date: 2024
Description:
Susceptibility to overflow errors can cause denial of service in various functions.
Low Findings
Missing divisibility check for gr_amount in unstake
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the unstake function, if gr_amount % EXCHANGE_RATE != 0 , this division will truncate the remainder, causing slight mismatch between the actual burned GR/GY and redeemed XAUM. Potential rounding inconsistencies in accounting or event reporting.
Median Calculation Does Not Take Zero Amounts Into Account, Leading to Lower Prices
Severity: Low
Ecosystem: Sui
Protocol: RedStone
Auditor: Hacken
Report: https://hacken.io/audits/redstone/sca-redstone-finance-sui-connector-feb2025/
Report Date: Feb 2025
Description:
The calculate_median function does not properly handle zero values, which can skew the median calculation downward, leading to inaccurate price reporting.
Silent Truncation in safe_mul_div Functions Leads to Incorrect Calculations
Severity: Low
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The safe_math module provides a set of utility functions for common mathematical operations intended to be used throughout the protocol. The functions safe_mul_div and safe_mul_div_u128 are designed to perform multiplication and division ((x * y) / z) while avoiding intermediate overflows by casting the operands to the larger u256 type during the calculation. These functions are likely used in critical financial logic where precision and safety are paramount. The final as u64 cast is the source of the issue. The Move language specification dictates that this type of cast truncates the higher-order bits if the source value is larger than the destination type's maximum value. This leads to a slient failure which can cause inconsistent behaviour in the system.
Total Volume Overflow Risk in Volume Tracking
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The stats module uses u64 type for total_volume tracking, which presents a potential overflow risk for active pools. While the add_total_volume_internal function is not currently used during swaps, its future implementation could lead to transaction reverts due to overflow, effectively blocking swap operations in high-volume pools.
Inconsistent Fee Calculations in calculate_fees
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
split_fee function expects total_growth and growth_inside as call parameters for calculating, but total_liquidity and staked_liquidity are provided instead.
Additionally, first if statement inside calculate_fees function directly reads pool.fullsail_distribution_staked_liquidity instead of passed-in staked_liquidity parameter and split_fee lacks validation for total_growth != 0 before performing divisions.
Incorrect Overflow Handling in overflow add
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The overflow add function in integer-mate/math u256.move is meant to safely add two u256 values with wrapping. However, a precedence bug in the overflow branch causes an unintended underflow and immediate abort. When an overflow is detected, the function computes value2 - MAX U256 - value1 - 1, which causes an abort on the first subtraction due to underflow. The function is currently only used in oracle::transform, where overflow is not expected given typical input values, so this bug is unlikely to be triggered in practice. If the function is reused in other contexts or if the oracle logic changes, this bug could lead to unexpected aborts.
Potential Underflow in Observation Index Check
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The function oracle::try get observation checks if an index is out of bounds using if (index ¿ vector::length¡Observation¿(observations) - 1) If the observations vector is empty, this can cause an underflow, as subtracting 1 from zero. While the first observation is created during initialization (making this safe in practice), the check is non-idiomatic and could lead to issues if the initialization logic changes.
Incorrect Fee Calculation Due To Stale active_id In Swaps
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The swap_in_pool function calculates the variable fee for a swap based on the price volatility, which is measured by the distance between the current active_id and a stable index_reference . A logical flaw exists in how active_id is used within the swap loop, leading to an incorrect fee calculation for the first bin processed in a swap. The function uses pool.active_id at the beginning of each loop iteration to calculate the volatility and the corresponding fee. However, if there is a gap in liquidity (i.e., the bin at pool.active_id is empty), the swap will start at the next available liquidity bin. The function correctly identifies this starting bin, but it fails to update pool.active_id to this actual starting bin's ID before the first fee calculation. Instead, it uses the stale pool.active_id from before the swap began. Consequently, the fee for the first chunk of the swap is calculated using an incorrect price delta, often resulting in a lower fee than intended.
price_math::pow Does Not Handle Base = 1 as a Special Case
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
In the current implementation of price_math::pow , when the base is exactly 1.0 (represented as 1 << 64 in Q64.64 fixed-point format), the result is not guaranteed to be exactly 1.0 due to precision loss in the computation.
Underflow due to Uncapped Flow Limit
Severity: Low
Ecosystem: Sui
Protocol: Sui Axelar(Gateway V2)
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description: The set_flow_limit function allows setting the flow limit to any value, including the maximum value that can be stored in a u64. This is problematic because, with such a high limit, an overflow may occur in the assertion condition inside add_flow_out, which will cause the assertion check to fail and prevent transfers entirely. While the current system does not actively support setting arbitrary flow limits, a cap should be imposed nonetheless.
Possible Abort due to Underflow
Severity: Low
Ecosystem: Sui
Protocol: Fungible StakedSui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description: If total_sui_amount is less than fungible_staked_sui_data_principal_amount , this subtraction will result in a negative value, causing an underflow error and, consequently, an abortion.
Overestimation of Tokens Resulting in Oversupply
Severity: Low
Ecosystem: Sui
Protocol: Solend Steamm
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
pool_math::tokens_to_deposit attempts to calculate the optimal deposit amounts a_star (for token A) and b_star (for token B) based on the current reserve ratios while adhering to user-specified maximum constraints max_a and max_b. However, the approach may overestimate the required tokens under certain conditions. When calculating b_star, if max_a * reserve_b is not divisible by reserve_a , the returned values may include a dust amount. This implies that users may inadvertently attempt to supply more tokens than necessary to maintain the correct reserve balance.
Division by Zero Error
Severity: Low
Ecosystem: Sui
Protocol: Solend Steamm
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
In the current implementation, it is possible for the pool to have one of the reserves fully drained. In pool_math::tokens_to_deposit, the core logic calculates the amount of token B ( b_star ) a user should deposit based on the current ratio between the reserves of token A and token B. The function utilizes the safe_mul_div_up helper function to scale the deposit amounts accordingly. If reserve_a == 0, the division in safe_mul_div_up will attempt to divide by zero, resulting in an abort.
Similarly, lp_tokens_to_mint calculates the number of LP tokens to mint based on the user’s deposit relative to the pool’s existing reserves. If one of the reserves ( reserve_a and reserve_b is zero, it will result in division by zero in safe_mul_div.
Precision Loss in Calculation of Token X Amount
Severity: Low
Ecosystem: Sui
Protocol: Kuna Labs
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2025
Description:
When computing the amount of token X locked in the LP position for a given price and liquidity, position_model::x_by_liquidity_x64 performs the calculation by dividing before multiplying ( x_x64 = delta_l * (num / denom) ). This may result in a loss of precision when num < denom , resulting in (num / denom) to round down to zero. As a result, x_x64 becomes zero even if delta_l is large, incorrectly implying no X is in the position. This affects margin calculations, deleveraging, and liquidation logic.
Users Cannot Unstake Small Amounts In request_unstake_instant Due To Service Fee
Severity: Low
Ecosystem: Sui
Protocol: Haedel
Auditor: MoveBit
Report: https://movebit.xyz/reports/Haedal-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
In request_unstake_instant users can unstake any amount from the vault balance and there's some service fee being taken from users. However, this design will prohibit small amount unstakes.Since there are no min unstaking threshold, users can unstake as small as 1 mist. However, let's say if max_exchange_sui_amount = 10 mist, then take service_fee as the default one which is 90.
let fee_amount = ((max_exchange_sui_amount as u128) * (service_fee as u128) /
(FEE_DENOMINATOR as u128) as u64);
fee_amount = 10*90/1000 = 0. And this will fail the below assertion even though service_fee is certainly above 0.
Improve Precision With sqrt_u128
Severity: Low
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: May 2023
Description:
In Sui Framework, there are two kinds of inclusions, sqrt, and sqrt_u128 . When calculating share, multiplying two u64 can use sqrt_u128 to improve the accuracy.
Precision Loss
Severity: Low
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: May 2023
Description: Divide first and then multiply will lose precision in the operation.
Accuracy Loss
Severity: Low
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: May 2023
Description:
In the withdraw function, there is an accuracy loss in the calculation of lock.amount / 100 * pool.investment_lock_penalty, this calculation should be multiplied first and then divided.
Overflow Risk in Utility Functions
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
In the decimal.move the file, it was found that some multiplication and addition/subtraction operations were not being checked for overflow risk in some functions.
Inconsistent Scaling in Conversion Rate Calculation
Severity: Low
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
The math::ratio function applies inconsistent scaling in its conversion logic, leading to potential imbalances between kAPT and stkAPT.
Risk of Overpayment
Severity: Low
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
math::from_shares assigns a minimum of 1 share, even if the calculated amount is 0, leading to protocol overpayment during unstaking.
Incorrect Pool Balance Calculation
Severity: Low
Ecosystem: Aptos
Protocol: ThalaSwapV2
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description:
swap_exact_out_stable utilizes normalized balances ( pool_balances_normalized ) instead of actual balances ( pool_balances ) when checking available liquidity, resulting in incorrect calculations.
Incorrect Rounding Directions
Severity: Low
Ecosystem: Aptos
Protocol: TruFin
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
internal_unlock unlocks the amount from the delegation pool and burns the equivalent TruAPT tokens. It creates an UnlockRequest for the user with the unstaked amount, which later facilitates the withdrawal of APT from the protocol. amount represents the staker requested for unstaking from the delegation pool and allocated to the user, and truAPT_amount denotes the tokens taken from the user and burned. The protocol benefits from rounding down when calculating amount and rounding up when calculating truAPT_amount.
Unaccounted Rounding Errors in Restake Functionality
Severity: Low
Ecosystem: Aptos
Protocol: Amnis Finance
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
delegation_manager::restake calculates the amount of pending inactive stake to restake (restake_amount) based on the minimum between the remaining amount to restake (remain_amount) and the available pending inactive stake. However, it does not account for rounding errors originating from delegation_pool::reactivate_stake, leading to cases where the pool covers these losses.
Exemption of Users From Covering Rounding Errors
Severity: Low
Ecosystem: Aptos
Protocol: Amnis Finance
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
router::request_withdraw handles rounding errors that may occur during the unstaking process. However, instead of charging the user for the rounding error, the protocol currently pays for it by burning amAPT tokens from the treasury. By having the protocol cover rounding errors, users are relieved of the financial burden of these discrepancies. As a result, users may exploit the system.
Although small individually, rounding errors accumulate over time and can become a significant drain on the protocol’s resources if consistently subsidized. This behavior may deplete the treasury or introduce long-term imbalances in the token economy.
Improper Interest Accumulation Calculation
Severity: Low
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Code Snippet: N/A
Description:
In sync_interest_rate, the value of days_elapsed is derived by dividing seconds_elapsed by the number of seconds in a day. This calculation results in the truncation of any remaining seconds, which can cause the value of days_elapsed to be rounded down. As a result, if seconds_elapsed is equal to 1 day, 23 hours, and 59 minutes, the value of days_elapsed would be rounded down to 1. This causes the new interest index to be calculated for only 1 day, and the last updated timestamp would be incorrect by 23:59 hours. Consequently, the global interest index ratio and interest on vaults may be lower than expected.
Improper Withdrawal Fee Calculation Formula
Severity: Low
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
The withdrawal fee calculation is handled by withdraw_mod. To determine the withdrawal fee amount, the intended formula should utilize the (1 - (elapsed_time / withdrawal_fee_period)) * withdrawal_fee_max_ratio formula, which is designed to proportionally decrease the withdrawal fee over time. However, in the implemented formula, the cover_ratio is not subtracted from one when calculating the fee_ratio value. As a result, users who withdraw shortly after depositing may encounter almost zero withdrawal fees, while those who withdraw just before the withdrawal period may face maximum withdrawal fees.
Overflow In Calculation Of Sqrt Price
Severity: Low
Ecosystem: Aptos
Protocol: Cetus
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2023
Description:
The numberator calculation in get_next_sqrt_price_a_up does not check if the u256::shlw operation removes the non-zero bytes. There is a possibility that sqrt_price multiplied by liquidity will return a result large enough that a shift left by 64 bits will remove the non-zero bits.
Incorrect Repay Rounding
Severity: Low
Ecosystem: Aptos
Protocol: Argo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
The required USDA repaid is calculated in required_repay_amount_internal. This function should round up instead of down to properly round against the user. Otherwise, for small repayment amounts, it might be possible to further decrease the health of the vault.
Instant Unstake Fee Can Be Bypassed
Severity: Low
Ecosystem: Aptos
Protocol: Ditto
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Users can unstake their stAPT instantly or delayed. In order to unstake instantly, a fee, which is defined in the configuration parameter instant_unstake_fee_bps , is charged. The fee is computed using the utils::calculate_fee function:
This allows an attacker to pay no fees for small amounts, because the fee rounds down to zero. More specifically, whenever the amount < (BPS_DENOMINATOR / fee_bps), the fee can be avoided.
Residual Coin Unable to be Extracted
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
Due to precision loss, there is a persistent issue of residual coins in the RewardsPoolUserInfo that cannot be extracted. Every time the update_pool function is called during a transaction to distribute rewards from the rewards_pool to users staking and to update acc_token_per_share, the value of acc_token_per_share is rounded down due to precision loss. As a result, users are consistently unable to claim the full rewards_pool. However, the rewards_pool continues to accumulate in the RewardsPoolUserInfo. This means that with each transaction, if there is precision loss, the unrecoverable portion of the rewards_pool accumulates in the RewardsPoolUserInfo, making it unclaimable.
Computational Precision Loss
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
The formula in the code is square extraction first and then multiplication, which can be changed to multiplication first and then square extraction if there is no overflow, or the high-precision sqrt function can improve the accuracy.
Inaccuracy in liquidswap::stable_curve computations
Severity: Low
Ecosystem: Aptos
Protocol: LiquidSwap
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Pontem Liquidswap - Zellic Audit Report.pdf
Report Date: Nov 2022
Description:
Liquidswap provides peripheral modules for interacting with the protocol. The liquidswap::stable_curve module exposes helper functions for computing exchange amounts. Liquidity pools for correlated coins utilize a different curve. Specifically, if the reserves of two coins are x and y, then it maintains that c = x ^ 3 y + y ^ 3 x must increase across exchanges. To help compute quantities, the internal function stable_curve:)g et_y is used to find y given x and c.
Incorrect rounding behavior in router::get_coin_in_with_fees
Severity: Low
Ecosystem: Aptos
Protocol: LiquidSwap
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Pontem Liquidswap - Zellic Audit Report.pdf
Report Date: Nov 2022
Description:
In the function router::get_coin_in_with_fees, the result is rounded up incorrectly for both stable and uncorrelated curves, which can lead to an undue amount being paid in fees. The formula for rounding up integer division is (n - 1)/d + 1 for n > 0.
Implicit precision loss in stable_curve::lp_value
Severity: Low
Ecosystem: Aptos
Protocol: LiquidSwap
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Pontem Liquidswap - Zellic Audit Report.pdf
Report Date: Nov 2022
Description:
In stable_curve::lp_value, coins with more than eight decimals experience implicit precision loss. The current implementation returns the LP value scaled by (10 ^ 8) ^ 4 in order to maintain precision across division. However, this means that stable_curve::lp_value will return inaccurate values when coins have more decimals.
Wrong overflow check in percent_div
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The canonical overflow prevention check for the (value * PERCENTAGE_FACTOR + percentage / 2) / percentage computation should be corrected.
Unnecessary checks in wad_ray_math
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
Some checks in wad_ray_math.move‘ are unnecessary or simply always true.
Potential Overflow in u128 to u64 Conversion
Severity: Low
Ecosystem: Aptos
Protocol: Hyperionxyz Vaults
Auditor: ExVul
Report Date: Apr 2025
Description:
In the mint_to function within the lp.move contract, a u128 value is directly cast to u64 without any bounds checking. This may result in silent truncation or transaction aborts if amount > u64::MAX, which can occur in high-liquidity scenarios or incorrect mint calculations. Such overflows break value consistency and may cause minting fewer LP tokens than intended or runtime panics.
Integer Truncation Risk in LP Minting
Severity: Low
Ecosystem: Aptos
Protocol: Hyperionxyz Vaults
Auditor: ExVul
Report Date: Apr 2025
Description:
In the deposit_with_pair function of the vaults.move contract, the mint_amount is calculated as a u128 using the lp_mint_amount function.
However, it is later cast directly to u64 and added to vault.total_shares.
This direct cast risks integer truncation if mint_amount > u64::MAX, which can silently corrupt share accounting or cause overflows during subsequent additions.
Unnecessary calculations for old stakeholders
Severity: Low
Ecosystem: Aptos
Protocol: Propbase
Auditor: Hacken
Report: https://hacken.io/audits/propbase/sca-propbase-staking-feb2024/
Report Date: Feb 2024
Description:
The implement_unstake function currently lacks proper handling of important state variables when a user withdraws their entire stake. Specifically, the stake_pool_config.staked_addresses variable is not appropriately decreased in such instances. This oversight has implications for functions like calculate_required_rewards() and emergency_asset_distribution(), as they currently consider users with zero stakes in their calculations.
Users with low stake amounts cannot get any rewards due to precision loss
Severity: Low
Ecosystem: Aptos
Protocol: Propbase
Auditor: Hacken
Report: https://hacken.io/audits/propbase/sca-propbase-staking-feb2024/
Report Date: Feb 2024
Description:
The current implementation lacks a lower bound for the min_stake_amount, leading to potential issues for users with stakes lower than seconds_in_year. For instance, if a pool is created with a min_stake_amount of 1000000, there is a risk that the interest_per_rate calculation may consistently return zero due to precision loss.
Overflow Mitigations Removed in mul_div_rounded()
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Description:
To prevent overflows, the mul_div_rounded() function contained unsigned integer widenings (... as u128), which, however, have been removed during the code port. This could unnecessarily lead to overflows and failing calls where mul_div_rounded() is being used.
Division Overflow in Float and Double Arithmetic
Severity: Low
Ecosystem: Sui
Protocol: BalancerV2
Auditor: Quantstamp
Report Date: Aug 2025
Description:
The div() functions in both float and double modules can trigger runtime panics when dividing large values. The division performs (a.value * WAD) / b.value, which overflows when a.value * WAD exceeds the type's maximum value (u128 for float, u256 for double). This creates an overflow threshold of approximately u128::MAX / 10^9 for float operations.
Potential overflow risk in interest rate updates
Severity: Low
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
In the vault_snapshot module, the preview_accure_interest function is used to calculate the protocol's accumulated interest rate. When calculating the multiplier , the pow function is used for exponentiation. This implies that if the protocol's interest rate is not updated for an extended period, timeElapsed could become excessively large, causing the multiplier calculation to overflow and lead to an abort. This would prevent the protocol from performing normal interest rate updates, resulting in a Denial of Service (DoS).
bin::get_amounts is always rounding down
Severity: Low
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
When getting the maximum input amount for the user to be paid in order for a given output amount. we round the operation down and now Up in Bin::get_amount.
protocol fees calculations are rounded down not up
Severity: Low
Ecosystem: Aptos
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The Protocol uses TradeJoeV2 Order Book AMM. The fees are categorized into two. Base and variable. In tradeJoe calculating the baseFee is by multiplying by 1e10 (no division). And for variable_fee they are dividing by 100 but they add 99 to the numerator first. The fees in TradeJoe is e18 and the calculations ends of a number of 100e18 but they add 99 before dividing to 100. The reason for this is to Round Up the division. This is a comman pattern in Mathematics numerator * (divider - 1) / divider. which is used to end the divide of rounding Up and not Down. So that the calculations goes on behalf of the protocol.
In our implementation, we are not doing this. as even in base_fee we divide to 100 and for variable fee we divide but add 99 only instead of adding divider - 1 which will end up of the calculation rounding down not Up.
Centralization Risk - Overview
Single points of control (e.g., owner-only functions) that undermine decentralization or enable abuse.
| Centralization Risk | Findings |
|---|---|
| High | 8 |
| Medium | 10 |
| Low | 7 |
| Total | 25 |
High Findings
BKT Token Centralization Risk
Severity: High
Ecosystem: Sui
Protocol: Bucket
Auditor: MoveBit
Report Date: June 2023
Description:
The allocate_bkt function has too much authority and can be locked up by anyone, in any amount, and at any time, which creates a risk of centralization.
Recommendation:
Manage BktAdminCap with multi-signature account to mitigate the risk.
Centralization Risk (Aftermath Finance)
Severity: High
Ecosystem: Sui
Protocol: Aftermath Finance LSD
Auditor: MoveBit
Report: https://movebit.xyz/reports/Aftermath-Finance-Liquid-Staking-Derivative-Audit-Report.pdf
Report Date: Nov 2023
Description:
The admin account holds multiple powerful permissions. If compromised, an attacker could manipulate the protocol or its assets. See the full report for a detailed list of admin capabilities.
Centralization Risk (KunaLabs)
Severity: High
Ecosystem: Sui
Protocol: KunaLabs Yield Optimizer
Auditor: MoveBit
Report: https://movebit.xyz/reports/Yield-Optimizer-Final-Audit-Report.pdf
Report Date: Nov 2023
Description:
The admin account holds multiple powerful permissions. If compromised, an attacker could manipulate the protocol or its assets. See the full report for a detailed list of admin capabilities.
Centralization Risk (Scallop)
Severity: High
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: Jun 2023
Description:
The admin account holds multiple powerful permissions. If compromised, an attacker could manipulate the protocol or its assets. See the full report for a detailed list of admin capabilities.
Centralization Risk (Lucky Kat)
Severity: High
Ecosystem: Sui
Protocol: Lucky Kat
Auditor: MoveBit
Report Date: May 2023
Description:
There is a centralization risk with privileged accounts able to mint unlimited tokens and burn their token.
Recommendation:
Multi-signature accounts should be set as privileged accounts.
Centralization Risk (Suia)
Severity: High
Ecosystem: Sui
Protocol: Suia
Auditor: MoveBit
Report Date: May 2023
Description:
There is a centralization risk with privileged accounts able to mint unlimited tokens and burn their token.
Recommendation:
Multi-signature accounts should be set as privileged accounts.
Centralization Risk (Volo)
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description:
There are some risks of centralization in the contract, the admin can set the total_rewards of the NativePool, which will result in a change in the rate calculation of the contract.
Centralization Risk
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
Excessive admin privileges create a single point of failure; system security heavily depends on the admin’s integrity and key safety.
Medium Findings
Admin can re-initialize rewards multiple times
Severity: Medium
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The admin entrypoint that initializes rewards does not enforce a “one-time only” invariant. As a result, an authorized caller can invoke initialization repeatedly, resetting the pool’s reward timing markers and recomputing emission against a fresh start, which can corrupt accrual semantics and disrupt distribution.
GaugeCap Owner Can Block Fee Collection
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The GaugeCap owner possesses excessive privileges to permanently block fee collection for all position owners in the protocol by calling mark_position_staked.
Admin Privilege Abuse (Centralization Risk)
Severity: Medium
Ecosystem: Sui
Protocol: MoviePass Exchange -MSX Smart Contracts
Auditor: Certora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/03_02_2025_MoviePass_MSX-MR.pdf
Report Date: Feb 2025
Description:
Admin can control any user’s custodial pool, posing a serious risk if the admin account is compromised.
Oracle Centralization Risk
Severity: Medium
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: Apr 2023
Description:
All prices rely on typus_oracle::oracle; if its private key is compromised, attackers could manipulate prices. Mitigation: use a multisig-controlled oracle, verify return values, or integrate a trusted third-party oracle.
Centralization Risk
Severity: Medium
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
Multiple admin functions present centralization risk; acknowledged and mitigated by adopting a multi-sig wallet.
Centralization Risk
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description:
Single immutable admin account poses centralization risk; recommend replacing with a multi-sig account.
Excessive Priviledge Concentration
Severity: Medium
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
A single governance entity holds nearly unlimited permissions and can arbitrarily modify key protocol parameters, lacking effective checks and balances.
Excessive Administrator Privileges in update_team_reward Function
Severity: Medium
Ecosystem: Aptos
Protocol: TokimonsterAI
Auditor: ExVul
Report Date: May 2025
Description:
The update_team_reward function allows unrestricted admin control to change the team_reward parameter at any time.
Centralization Risk
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
Protocol managers can control oracle price, initialize vaults and CoinTypes used in protocol, and control the minimum collateralization ratio and redemption fees.
The admin account can freeze any user’s account
Severity: Medium
Ecosystem: Aptos
Protocol: AptoPad
Auditor: MoveBit
Report Date: Feb 2023
Description:
Admin can block withdrawals and transfers of APD coins, granting excessive control and creating a significant centralization risk.
Low Findings
Emergency State Allows Immediate Treasury Withdrawal Bypassing Time Restrictions
Severity: Low
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The emergency mechanism in the staking protocol allows treasury administrators to bypass the standard 3-month waiting period and immediately withdraw all reward tokens from active pools. This creates a potential for privileged users to drain reward funds before users can claim their earned rewards.
Function Optimization
Severity: Low
Ecosystem: Sui
Protocol: TurboStar Smart Contract
Auditor: MoveBit
Report Date: May 2023
Description:
The functions transfer_funds_to_self() and transfer_funds() have almost identical logic, with just the recipient address being different. To simplify the code, we can directly call the transfer_funds() from within the transfer_funds_to_self() and pass in the account owner’s address.
extract_balance Code Optimization
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
The function of the extract_balance function is to extract the number of coins from the coins vector, and the if condition in the first part of the while loop can be greater than or equal to simplify the logic.
Centralization Risks
Severity: Low
Ecosystem: Aptos
Protocol: PatronusFi
Auditor: MoveBit
Report Date: Mar 2023
Description:
The bank can offer a borrow capability to any address, same time a borrow capability can extract coins from the vault indefinitely.
Centralization risk in minimum delegation amount
Severity: Low
Ecosystem: Aptos
Protocol: Tortuga Liquid Staking
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Tortuga Liquid Staking - Zellic Audit Report.pdf
Report Date: Oct 2022
Description:
The set_min_delegation_amount function allows pool owners to set an arbitrary value for the minimum delegation amount without any constraints. So, a pool owner could set the value to the maximum u64, effectively making it impossible for anyone except the owner or protocol to delegate APT to a managed_stake_pool.
Centralized emergency withdrawal functionality
Severity: Low
Ecosystem: Aptos
Protocol: Propbase
Auditor: Hacken
Report: https://hacken.io/audits/propbase/sca-propbase-staking-feb2024/
Report Date: Feb 2024
Description:
In an emergency scenario, the staking contract is able to be stopped and emergency_asset_distribution() function helps return stakes and rewards to users. However, only owner is able to use this function. This means, users stop having control over their tokens if the owner stops the contract. The owner has nothing to gain from withholding user tokens. Nevertheless, users should always have control over their tokens.
Allowing the Protocol Admins to Pause Liquidation Operations Can Lead to Bad Debt
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Code: N/A
Description:
The protocol allows the administrator to pause different operations independently. One of these operations is liquidations. However, during high volatility, this can lead to huge amounts of bad debt piling up very quickly.
Cross Implementation - Overview
Inconsistencies between contract versions or mirrored implementations causing unexpected outcomes.
| Cross-Implementation | Findings |
|---|---|
| Medium | 2 |
| Low | 14 |
| Total | 16 |
Medium Findings
collector and AToken treasury incompatibilities
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE Periphery
Auditor: Spearbit
Report Date: Jun 2025
Description:
A few different design issues in the collector.move module compared to the Solidity contracts.
GHO is misconfigured in Aptos Deployment
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
Solidity vs Move design issues in interest rate strategy.
Low Findings
oracle_base::only_risk_or_pool_admin auth logic is wrong
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
By looking at the same function _onlyAssetListingOrPoolAdmins in the Solidity codebase, we can see that the users that should be able to call the function protected by this auth function are the ones with the role "asset listing admin" and "pool admin". On the Aptos implementation instead, we have that: • "Risk admin" are allowed. • "Asset listing admin" are not allowed.
price_cap_stable_adapter implementation is incompatible with the requirements
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The price_cap_stable_adapter should mimic the implementation of the PriceCapAdapterStable contract. The scope of such a contract is to cap the price of the USD pegged assets, and it's currently used in the Aave ecosystem when Aave needs to fetch the prices of tokens like USDC (and other USD pegged assets). This is, for example, the asset price source used for USDC in the AaveOracle contract deployed on Ethereum Mainnet: 0x736bf902680e68989886e9807cd7db4b3e015d3c. The current implementation and usage of price_cap_stable_adapter is incompatible with the requirements and needs and requires a full refactor of the logic and data structure.
ISOLATED_COLLATERAL_SUPPLIER_ROLE validate_automatic_use_as_collateral logic does not
work
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
In Aave's Solidity implementation, the validation_logic::validate_automatic_use_as_collateral function checks whether the msg.sender has the ISOLATED_COLLATERAL_SUPPLIER_ROLE. (As the logic contracts are delegatecalled, the msg.sender is for example the Pool contract). The purpose of the role is for migration contracts to be able to set collateral flags on behalf of users when dealing with isolated assets.
set_reserve_interest_rate_strategy should perform additional sanity checks on the input parameters
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The set_reserve_interest_rate_strategy logic is currently only performing a sanity check on the optimal_usage_ratio input parameter. Following the logic applied by DefaultReserveInterestRateStrategyV2, the set_reserve_interest_rate_- strategy should also implement the following required sanity checks: • optimal_usage_ratio <= MAX_OPTIMAL_POINT. • optimal_usage_ratio >= MIN_OPTIMAL_POINT. • variable_rate_slope1 <= variable_rate_slope2. • base_variable_borrow_rate + variable_rate_slope1 + variable_rate_slope2 <= MAX_BORROW_RATE. On solidity, the above constant values (used as lower/upper bounds) are defined as follows: • uint256 public constant MAX_BORROW_RATE = 1000_00;. • uint256 public constant MIN_OPTIMAL_POINT = 1_00;. • uint256 public constant MAX_OPTIMAL_POINT = 99_00;. Note that in Solidity, the above constant values are expressed in bps and must be converted into the format used by the Aptos implementation (RAY).
validate_flashloan_complex is not reverting when the list of assets have duplicates
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The validate_flashloan_complex is missing a sanity check introduced Aave v3.1.0 (see ValidationLogic.sol#L338-L340) that requires the uniqueness of the asset requested to be flashloaned. This check should be added to the Aptos implementation.
pool_configurator module should expose a getter function for the pending_ltv value of a reserve
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The pool_configurator module defines the pending_ltv in the Global Storage.
In the Solidity implementation, it's possible to fetch such information for a specific asset via the getPendingLtv(address asset) function. This feature is not available in the Aptos codebase and should be implemented.
finalize_transfer should use the scaled_amount and not amount
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The current implementation of pool_token_logic::finalize_transfer performs the transfer validation and user config updates if the amount is greater than zero. This logic has been correctly changed in the Aave Solidity Implementation (see SupplyLogic.sol#L191-L193) to not rely on the non-scaled amount but on the scaled one. While amount could be greater than zero (the one specified by the user), the transfer operation transfers from an account to another the scaled version of that amount, that could be equal to zero because of rounding down. To avoid any possible errors and unexpected behaviors, the Aptos implementation should be aligned to the Solidity one.
Aave Reward System Management, documentation and concerns(further review)
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
On Aave Protocol EVM, the Reward system is currently configured as follows: each reward has its own TransferStrategy which will transfer the rewards (depending on the strategy itself) from a specific REWARDS_- VAULT. From the research done by Spearbit for Aave Reward system on the Ethereum Mainnet, every configured reward uses the same deployed PullRewardsTransferStrategy that will pull from the same REWARDS_VAULT. The REWARDS_VAULT configured is the "ACI multisig address" 0xac140648435d03f784879cd789130F22Ef588Fcd, which in practice can be considered a Smart Wallet. We assume that, on Solidity, the ACI multisig will provide just the allowance needed by the PullRewardsTransferStrategy to correctly limit what an external source (like the strategy) can pull in case of a problem/hack. • Problem 1: lack of proper explanation and documentation relative to the rewards_vault: On the Aptos side, we only know what has been provided as a "dev comment" on top of the rewards_vault attribute itself.
Wrong bounds check in rewards_controller::update_reward_data
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The rewards_controller::update_reward_data function wants to assert that the new_index fits into 104 bits (to align with the Solidity implementation).
However, it performs a wrong bounds check, the MAX_U104 is 2 ** 104 - 1, not 2 ** 104.
default_reserve_interest_rate_strategy should be based on the logic from Solidity DefaultReserveInterestRateStrategyV2
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
The current implementation of aave_rate::default_reserve_interest_rate_strategy is based on the deprecated DefaultReserveInterestRateStrategy from Aave V3.0.2. Given that most of the Aptos code has been moved to Aave V3.3, the same upgrade should also apply to upgrade the logic of the interest rate strategy to the new DefaultReserveInterestRateStrategyV2.
validate_flashloan_simple misses a sanity check introduced by Aave V3.3
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
The validateFlashloanSimple function on Aave V3.3 reverts if the requested amount is greater than the aToken.totalSupply() (see ValidationLogic.sol#L357-L361).
This sanity check is not performed in the Aptos public fun validate_flashloan_simple.
validate_borrow misses a sanity check introduced by Aave V3.1
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
The Aave V3.1 release has introduced an additional sanity check on the borrow amount requested by the caller (see ValidationLogic.sol#L154-L158)
This sanity check is not performed in the Aptos validate_borrow function.
set_reserve_freeze does not revert when the reserve is already in the desired state
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
The current implementation of pool_configurator::set_reserve_freeze is not reverting when the state of the reserve is equal to the freeze input parameter. This issue has been already reported and addressed on the Aave Solidity Implementation codebase (see Cantinacontest-AaveV3.1 and should also be replicated on the Aptos codebase.
Full removal of the admin_controlled_ecosystem_reserve
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: Spearbit
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Spearbit Aave Aptos Core V3.1-V3.3 Report.pdf
Report Date: Jun 2025
Description:
By looking at the Aave V3.3 codebase in GitHub relative to the Treasury management, we can see that the "old" AdminControlledEcosystemReserve contract has been fully removed. From our own research, such a contract is not used anymore within the Aave ecosystem, and the removal from the codebase is validating our hypothesis. On every EVM chain, the AToken treasury is deployed as a Collector contract, and the REWARDS_ VAULT of the PullRewardsTransferStrategy contract is configured as the "ACI multisig address" 0xac140648435d03f784879cd789130F22Ef588Fcd. Given all these facts, we think that the aave_pool::admin_controlled_ecosystem_reserve should be fully removed from the Aave Aptos Implementation codebase.
Code Optimization - Overview
Enhancements to modules like removal of duplicate logic, unused functions, or dead code.
| Code Optimization | Findings |
|---|---|
| Low | 43 |
| Total | 43 |
Low Findings
get_coin_type are get_fee_coin_type are redundant
Severity: Low
Ecosystem: Sui
Protocol: Bluefin RFQ
Auditor: Asymptotic
Report: https://bluefin.io/blog/doc/bluefin_rfq_audit.pdf
Report Date: Feb 2025
Description:
Unless we are missing something, get_coin_type is actually idempotent. type_name::into_string just returns the name of the type, does not do any special conversion to ASCII. Further converting from UTF8 to bytes and back to UTF8 is redundant.
But assuming that it would actually do something, it would be potentially harmful: the point is to have a 1-to-1 connection between the coin type keys in Vault and the coin type included in the externally-signed Quote. If somehow two coins would transform to the same string via get_coin_type , this would allow an attacker to pay with a different coin type. Still, even this scenario is not possible as borrow_mut would fail with EFieldTypeMismatch.
Unnecessary public entry modifiers
Severity: Low
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
A function should be either public or entry, not both. An entry function can called from a PTB, but not from another module/package. An entry function can change it’s declaration on package upgrades. We recommend deciding on which functions should be called from other packages, which should be public, and the rest should be entry. If you want maximum flexibility, you can create entry functions that call directly the public functions, and call the entry functions from the transactions.
Redundant Code Duplication for Liquidity Calculations
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The codebase contains duplicate implementations of critical mathematical functions related to liquidity calculations. Specifically, there is a copy of get_amount_by_liquidity from the clmm_math module directly in the pool module. Additionally, there's a renamed copy of get_liquidity_by_amount (renamed to contain "from" instead of "by"). These duplications create unnecessary maintenance burden and increase the risk of inconsistencies between implementations.
Redundant Math Functions in full math u128 and math u128
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The full math u128 module contains several utility functions: • overflowing add / overflowing sub • wrapping add / wrapping sub • min / max These are also present in math u128, where they logically belong. However, only full math u128 is actively used throughout the codebase, while math u128 is not. This duplication increases maintenance overhead and the risk of inconsistencies.
Use of Magic Error Codes and Unused Error
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
Several modules use hardcoded numeric literals (””magic numbers””) as error codes in assert! statements, rather than referencing named error constants. This practice reduces code clarity and increases the risk of inconsistencies or accidental overlap with actual error codes: • slipppage check.move, lines 5, 7: assert!(arg1 ¡ pool::sqrt price¡T0, T1¿(arg0), 111); • storage/tick.move, line 132: assert!(liquidity gross after ¡= max liquidity, 99); • storage/pool.move, line 293: assert!(enabled, 999); • utils/bit math.move, lines 2, 47: assert!(value ¿ 0, 0); • utils/sqrt price math.move, lines 82, 91: assert!(current price ¿ 0 && liquidity ¿ 0, 4); • storage/tick bitmap.move, lines 7, 80: assert!(mmt v3::i32::abs u32(value) ¡ 256, 0); assert!(mmt v3::i32::abs u32(tick index) % tick spacing == 0, 0); Some of these values overlap with actual error codes defined in error.move. Additionally, the invalid amounts error code is defined but not used anywhere in the codebase.
Misleading and Non-Descriptive Naming Across Core Modules
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
Incorrect or misleading names for functions and parameters create significant risks during code review, auditing, and maintenance. They can lead to developer confusion, implementation errors, and make it extremely difficult to identify bugs or security vulnerabilities. Multiple parameters and variables in codebase are named completely differently from their actual use, creating significant confusion and maintainability risks.
Redundant Function Calls in wrap_unstake_ticket
Severity: Low
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description:
It has been observed that redundant function calls are made to retrieve parameters already available from the initialized UnstakeTicket struct. The functions get_value, get_unlock_epoch, and get_unstake_fee are called despite these values being accessible directly from the struct's initialization parameters.
Set the Deprecated Module friend
Severity: Low
Ecosystem: Sui
Protocol: Dola Protocol
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The lending_logic module sets up the deprecated lending_portal as a friend module, and also no functions from lending_logic are used in lending_v2.
Reward Distribution Can Be Refactored
Severity: Low
Ecosystem: Sui
Protocol: Cetus Farming Smart Contracts
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
In pool.move several functions use a while loop to update and calculate the pool rewards. For example, the one in add_liquidity_fix_coin is the same as the one in remove_liquidity.
Unused Function
Severity: Low
Ecosystem: Sui
Protocol: Cetus Farming Smart Contracts
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
The function borrow_mut_pool_share() is not utilized within the contract. Redundant functions like this may result in higher gas consumption during deployment and can impact the overall readability of the contract.
Code Optimization
Severity: Low
Ecosystem: Sui
Protocol: Fluidity
Auditor: MoveBit
Report: https://movebit.xyz/reports/Fluidity-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
There are statements in the contract that use Boolean variables to compare with Boolean values, such as global.paused == false, and it is recommended that just use the value of that field directly.
The Function’s Functionality Does Not Match its Naming
Severity: Low
Ecosystem: Sui
Protocol: TurboStar Smart Contract
Auditor: MoveBit
Report Date: May 2023
Description:
The function’s functionality does not match its naming. The actual function updates the time, but the function name implies that it adds time.
Gas Optimization
Severity: Low
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: June 2023
Description:
The if of L268 can be deleted, and then the loop can be changed to while, which can improve code readability and save gas.
Redundant Test Code
Severity: Low
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: June 2023
Description:
sources/multisig_example.move is the test code, it is recommended to delete it or move it to the test directory and add the test_only annotation.
Meaningless Code
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
ManagerCap is always created in some functions, but ManagerCap is not used anywhere, only it is finally destroyed and used.
Code Readability And Gas Optimization
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
The second borrow_mut can be replaced by the variable payoff_config above, which can improve readability and save gas, also set_strike can be modified like this.
Deposit Extra Code
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
In the deposit function, the amount has been limited to be greater than 0, and the value of balance and amount is asserted to be the same, so the return value of extract_balance will never be the zero_balance, and destroy_zero is not required.
extract_balance Update Error
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
After extract_balance is updated, if the extracted amount is insufficient and will abort inside the function, so there is no need to judge E_INSUFFICIENT_BALANCE outside the function, it is recommended to delete it.
Inconsistent Error Code Format in Assert Statements
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
The use of the integer value 0 as an error code in assert statements at line 257 of the file profile.move, line 189 of reserve_config.move, and lines 220-221 of controller.move violates the standard error code conventions. This inconsistency makes it difficult to convey accurate error information to users or developers.
Premature Assertion Checks
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
The assertion check at line 458 in lending.move can be moved to the top of the function to reduce gas expenditure.
Swap Gas Optimization
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
When the index of next_sqrt_price and pool's current_sqrt_price are equal, there is no need to update current_sqrt_price, they only need to update when they are not equal.
Redundant Functions
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description: The two functions contains and is_some_and_eq are logically the same.
Multiple Coin Object Support
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
Because each token of Sui is independent, it is recommended to support vector<Coin
Remaining TODO
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
There is still a part of TODO in the code, it is recommended to check whether the functions are complete.
Functions with Similar Functionality
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
Within fee_on_transfer.move , the functions get_info() and get_fee_on_transfer_info() serve the same purpose. The only difference lies in their visibility. get_fee_on_transfer_info() can entirely replace get_info(). Redundant code may lead to increased gas consumption and impact code readability.
Code Refactoring Suggestions in router_v2 Module
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
In the router_v2 module, lines 40, 54, 69, and 82 can be replaced with a function named assert_pair_is_created() , as they serve the same purpose. This change would enhance readability and understanding while reducing code duplication. Additionally, the code on line 55 is repeated across multiple functions and could be encapsulated into its function for reusability.
The Specification for Assert Statements
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The error codes in assert statements show a number of '1's. Best practice suggests using constants, ensuring different error code constants have distinct values.
Optimization through Consolidating claim_rewards() and unstake_tokens() Functions
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The functions claim_rewards() and unstake_tokens() within the stake module have almost identical code. Invoking unstake_tokens(sender, 0) within the claim_rewards() function achieves the same effect. Encapsulating the code within the unstake_tokens() function into a common function for caller use reduces redundant code and enhances readability and understanding.
Redundant Operations in the Code
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
In the function swap_v2.distribute_dex_fees(), it is unnecessary for the protocol to extract liquidity_fee_coins from metadata.balance_y and then immediately merge it back into metadata.balance_y.
Code Redundancy in The toggle_individual_token_liquidity_fee() Function
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The code below has redundant blocks of code for both branches where
type_info::type_of
Redundant Pair Creation Check in init_rewards_pool() Function
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The purpose of the function router_v2.create_rewards_pool () is to create a rewards pool for a pair of tokens (X, Y or Y, X).
After checking whether a pair of tokens (X, Y or Y, X) has been created using swap_v2.is_pair_created() and raising an error (E_PAIR_NOT_CREATED), the code proceeds to call swap_v2.init_rewards_pool() . However, within the init_rewards_pool() function, there is an additional check for the creation of the pair. This redundant pair creation check inside the init_rewards_pool function is unnecessary and duplicates the validation already performed in the calling function.
Unnecessary Boolean Comparison
Severity: Low
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
There are statements in the contract that use Boolean variables to compare with Boolean values, such as order_is_exist(order_id,buy_orders) == false , and it is recommended to just use that field's value directly.
Code Optimization
Severity: Low
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
There is a lot of duplicate code in the set* function associated with setting global variables, such as vesting_config.start = new_start_time or vesting_config.vesting_duration = new_duration_time, and the same code can be extracted to make the code more readable.
Deprecated Function can Still be Used
Severity: Low
Ecosystem: Aptos
Protocol: StreamFlow
Auditor: MoveBit
Report: https://movebit.xyz/reports/StreamFlow2-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
The comments of the collect_fees function indicate that this function has been deprecated and should not be used, but the function can still be called normally, which may cause unnecessary losses.
Redundant conditional statement
Severity: Low
Ecosystem: Aptos
Protocol: Mokshya/Wapal Aptos NFT Mint Smart Contract
Auditor: MoveBit
Report Date: Mar 2023
Description:
Whether to enter the if (nfts < 1024) statement in the function candymach ine::create_bit_mask has no effect on the values of full_buckets and remaining.
Assertions can be optimized
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
In the coin::destroy_zero function, it will be judged whether the balance of the coin is 0, and it will only be destroyed when it is 0, so there is no need to judge whether the value is 0 in the source code.
Too many repetitive codes
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
The two directories in the screenshot below have more than 90% of the same codes, the code maintenance is more troublesome.
Many TODOs in code
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
There are still many TODOs in code, such as spec files, work, and unit tests which should be completed.
pool:: add_liquidity_fix_coin & pool::add_liquidity have many duplicated codes
Severity: Low
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol(Aptos)
Auditor: MoveBit
Report Date: Jan 2023
Code Snippet: N/A
Description:
These two functions are very important to add liquidity, but they have 80% duplicated codes, which can be wrapped into a common function, and improve the code maintainability.
Gas cost is higher than other DEX
Severity: Low
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol(Aptos)
Auditor: MoveBit
Report Date: Jan 2023
Description:
We tested create_pool, add_liquidity and swap in module clmm_router, and we found the average gas consumption for these operations is 0.0n level. This is somehow higher than other AMM DEX. As a CLMM DEX, Cetus definitely will have higher gas, and we already found some gas-optimization issues which Cetus has already taken, but Cetus still should improve to reduce the gas.
The definition of the variable should be placed where it is used
Severity: Low
Ecosystem: Aptos
Protocol: Transit Finance
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Transit-Finance-Audit-Report.pdf
Report Date: Nov 2022
Description:
The function get_intermediate_out_from_dexs in the aggregator module defines let amount_in_value = coin::value(&x_in); at the beginning, but the amount_in_value is used only under the dex_type == AUX_DEX condition.
All comments starting with the first letter without capitalization
Severity: Low
Ecosystem: Aptos
Protocol: MoveDID
Auditor: MoveBit
Report Date: Nov 2022
Code Snippet: N/A
Description:
The codes have inconsistent comment style with Aptos Framework.
Identical log events
Severity: Low
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
There are multiple instances of identical event emission issues in the Yeap Finance protocol, which can make it difficult for off-chain systems to distinguish the operation functions that trigger the events, potentially leading to errors in off-chain business systems.
Coding Mistake - Overview
Missing events, typos, or other error code mishaps.
| Coding Mistake | Findings |
|---|---|
| Low | 76 |
| Total | 76 |
Low Findings
Unused variable
Severity: Low
Ecosystem: Supra Chain
Protocol: Dexlyn Hyperlane
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-hyperlane-monorepo-dec2024/
Report Date: Dec 2024
Description:
In move/synthetic-tokens/sources/hyper_coin.move and move/tokens/sources/hyper_coin_collateral.move, the State struct contains an unused vector field received_messages that stores message data but is never accessed or utilized in the contract logic.
ActionGroup, VaultConfig, and ModuleConfig have unwanted copy and drop
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
public struct ActionGroup has store { .. } instead of public struct ActionGroup has copy, drop, store { .. }. Same for public struct VaultConfig has store { .. } and public struct ModuleConfig has store { .. } .
Insecure Coin Metadata Object Handling
Severity: Low
Ecosystem: Sui
Protocol: SatLayer Sui
Auditor: Asymptotic
Report: https://info.asymptotic.tech/satlayer-audit
Report Date: Mar 2025
Description:
Coin metadata in the lbtc module is handled insecurely during initialization. The module uses transfer::public_share_object(meta) instead of transfer::public_freeze_object() when creating a new coin currency. This allows the coin metadata to remain mutable, which could lead to unauthorized modifications of the coin's properties.
Duplicate Error Codes Across Modules
Severity: Low
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
Multiple modules in the project (position.move, market.move, add_price.move, orders.move) are using overlapping error code values. This creates ambiguity when errors occur and makes it difficult to track and maintain the complete list of error codes across the system. The lack of unique error codes can lead to incorrect error handling and debugging challenges.
Incorrect Error Constant For Rebase Fee
Severity: Low
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
In the market.move contract, the deposit, withdraw, and swap functions check the rebase fee model but use an incorrectly named error constant. The assertion uses ERR_MISMATCHED_RESERVING_FEE_MODEL when validating the rebase fee model.
Incorrect Old Values Emitted in Update Events
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
Several configuration and pool update functions emit events that include both the old and new values of updated parameters. However, the old values emitted are incorrect because the new values are written to storage before the event is emitted. As a result, both old and new values in the event payload reflect the new state, misleading off-chain consumers and compromising auditability.
Overlapping Error Codes
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
Multiple modules define error codes with overlapping numeric values, leading to potential ambiguity. Error codes are typically defined sequentially, starting from 0 or 1.
This can lead to ambiguous error reporting and make debugging or on-chain analysis more difficult, as the origin of the error may be unclear.
Unnecessary Mutable Pool Parameter in get_position_amounts
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The get_position_amounts function declares a mutable reference to a Pool (&mut Pool<CoinTypeA, CoinTypeB>) but does not perform any modifications to this object during execution. It unnecessarily restricts concurrent access to the Pool object by other parts of the system.
Some errors are defined, but never used in the logic
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The error.move contains definitions of all errors used across the whole logic and modules of the solution. Few of them, however, are implemented, but never used in any of the flows described in the codebase. These are: • e_already_has_reward_data • e_invalid_max_bond_bonus
Missing Event in Airdrop
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
In Airdrop, deposit_tokens and set_airdrop_end_time are missing event logs.
Missing Event in DeedNft
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
In DeedNft, upgrade_version and set_version are missing events.
Lack of Events Emit
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: MoveBit
Report Date: Nov 2025
Description:
Some functions in the contract lacks appropriate events for monitoring operations, which could make it difficult to track sensitive actions or detect potential issues.
Variable Naming Errors in Code
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
frist_score_for_swap should be first_score_for_swap detal_liquidity should be delta_liquidity
Struct not shared
Severity: Low
Ecosystem: Sui
Protocol: Magma Finance
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Magma Finance - Zellic Audit Report.pdf
Report Date: Jan 2025
Description: The Voter and VotingEscrow objects are not properly shared after their creation. This prevents users from accessing these objects when attempting to create a lock and deposit to a gauge, as these operations require access to both the Voter and VotingEscrow objects.
Wrong check for claimable amount
Severity: Low
Ecosystem: Sui
Protocol: Magma Finance
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Magma Finance - Zellic Audit Report.pdf
Report Date: Jan 2025
Description: In the extract_claimable_for function, it checks if the claimable amount is greater than the DURATION. The DURATION is set to 7 * 86400, which is irrelevant to the claimable amount.
Unused Constants
Severity: Low
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description:
There are two unused constants EPOCH_DURATION and E_LIMIT_TOO_BIG in the native_pool module.
Duplicated Error Codes
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Finance Liquid Staking Derivative
Auditor: MoveBit
Report: https://movebit.xyz/reports/Aftermath-Finance-Liquid-Staking-Derivative-Audit-Report.pdf
Report Date: Nov 2023
Description:
In the staked_sui_vault.move, both error codes EVersionIncompatibility, EDeprecated are set to 0. Though they serve similar functionalities, the former one is used when "The admin calls migrate on an outdated package." and the latter is used when "One tries to call deprecated function." Thus, this could potentially lead to confusion when trying to distinguish between these two types of errors based on their codes.
Redundant Abilities of Event Object
Severity: Low
Ecosystem: Sui
Protocol: Kanalabs Aggregator Smart Contracts
Auditor: MoveBit
Report: https://movebit.xyz/reports/Kanalabs-aggregator-Smart-Contract-Final-Audit-Report.pdf
Report Date: Sep 2023
Description:
Only copy and drop abilities are needed for event objects, so the store is redundant.
Unused Constant
Severity: Low
Ecosystem: Sui
Protocol: Kanalabs Aggregator Smart Contracts
Auditor: MoveBit
Report: https://movebit.xyz/reports/Kanalabs-aggregator-Smart-Contract-Final-Audit-Report.pdf
Report Date: Sep 2023
Description:
The constant CETUX_DEX and TURBOS_DEX are not used in the contract.
Unused Private Function
Severity: Low
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description:
The private function burn_lp is not used.
Lack of Event
Severity: Low
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track important actions or detect potential issues. Such as: add_ new_vault , add_new_symbol , add_collateral_to_symbol , remove_collateral_from _symbol.
Unused Friend Function
Severity: Low
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description:
The friend functions new_referral and refresh_rebate_rate are not used.
Unused Constants
Severity: Low
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description:
The constants ERR_MISMATCHED_DECREASE_INTENTION and ERR_INVALID_DE CREASE_AMOUNT are not used.
Lack of Events Emit
Severity: Low
Ecosystem: Sui
Protocol: Dola Protocol
Auditor: MoveBit
Report: https://movebit.xyz/reports/Dola-Protocol-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track sensitive actions or detect potential issues.
Lack of Events Emit
Severity: Low
Ecosystem: Sui
Protocol: Fluidity
Auditor: MoveBit
Report: https://movebit.xyz/reports/Fluidity-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track sensitive actions or detect potential issues.
Unnecessary store Ability for Event Struct
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
The event structure in Sui needs to have the ability to copy and drop, and does not need the store ability.
Lack of Events Emit for the add_risk_model Function and add_interest_model
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
The function add_risk_model lacks events emitted after the new risk model is added. In the best practice, there should be events to notify users that the risk models have been changed. Otherwise, they may deposit according to the old risk model and be surprised. Also found in add_interest_model.
Incorrect Return Value
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
In the obligation_key_uid_mut and obligation_uid_mut functions, the return value should be mutable.
Unused Constant
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
Certain variables declared in the contract are not referenced or utilized in any of the contract's functions or logic. These unused variables add unnecessary complexity to the codebase and can potentially confuse developers or auditors trying to understand the contract's functionality.
Missing Emit Event
Severity: Low
Ecosystem: Sui
Protocol: Talofa
Auditor: MoveBit
Report Date: May 2023
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track important actions or detect potential issues.
Redundant Field Attributes in a Struct
Severity: Low
Ecosystem: Sui
Protocol: TurboStar Smart Contract
Auditor: MoveBit
Report Date: May 2023
Description:
The status field in the PreSale struct is not used.
Sensitive Operation Lacks Event
Severity: Low
Ecosystem: Sui
Protocol: TurboStar Smart Contract
Auditor: MoveBit
Report Date: May 2023
Description:
Some sensitive operations lack Event.
Incorrect Usage of Assert Error Code
Severity: Low
Ecosystem: Sui
Protocol: TurboStar Smart Contract
Auditor: MoveBit
Report Date: May 2023
Description:
The assert error code is used incorrectly. USER_MAX_CAP_REACHED was used instead of USER_MIN_CAP_REACHED.
Useless user Parameter
Severity: Low
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: June 2023
Description:
The parameter user in pending_proposals has no effect and cannot participate in user address filtering. It is recommended to remove it.
Unused Constant
Severity: Low
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: June 2023
Description:
There are unused constants in the code such as ERegistered, PROPOSAL_TYPE_MULTISIG_SETTING, it is recommended to delete them.
Unused Constant
Severity: Low
Ecosystem: Sui
Protocol: Suia
Auditor: MoveBit
Report Date: May 2023
Description:
The constants ENOT_ADMIN and EIINVALID_SUIA are not used in suia_capy.move.
Repeated Error Code
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
The error code constants E_INVALID_TIME_TYPE_INPUT and E_INVALID_OPTION_TYPE have the same value, but should be different.
There are Unused Fields in the Structure
Severity: Low
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
The users field in struct Storage is only modified in the entire contract and is not used for any other logic. Similarly, the is_isolated field in struct ReserveData also has the same issue. If these fields are not needed, it is recommended to remove them.
Unused Constants
Severity: Low
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description: There are unused constants in the contract. It is recommended to remove them.
Lacking Events
Severity: Low
Ecosystem: SuiProtocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track important actions or detect potential issues.
Unused Variable
Severity: Low
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: May 2023
Description:
The parameter ctx of the function update_pool() is not being utilized, which may result in warnings or unnecessary memory consumption.
Sensitive Operations Require Adding an Event
Severity: Low
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: May 2023
Description:
Sensitive operations require adding an event.
Incorrect Order of Variables
Severity: Low
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: May 2023
Description:
The function emit_liquidity_added_event() is called with parameters passed in the wrong order when adding liquidity. It should first be token_x_amount and then token_y_amount.
Lack of Vector Coin Support
Severity: Low
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: May 2023
Description:
Because of the object model of sui, the entry function can support the coin in the vector, thus supporting the transaction of multiple coins.
Missing Emit Events
Severity: Low
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: May 2023
Description:
It is recommended to throw an update event when fee_percent is updated.
Unnecessary store Ability
Severity: Low
Ecosystem: Sui
Protocol: MovEX
Auditor: MoveBit
Report Date: May 2023
Description:
The event structure in Sui needs to have the ability to copy and drop, and does not need the store ability.
Duplicated Seq Contexts Created in execute_admin_operation Function
Severity: Low
Ecosystem: Sui
Protocol: MSafe Maven
Auditor: MoveBit
Report Date: May 2023
Description:
In the execute_admin_operation function, two identical Seq contexts are created by order_context::new_seq_context(maven_id).
Incorrect Parameter Configuration
Severity: Low
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: May 2023
Description:
The description of the token is incorrect. It should not be SuiPad launchpad test token, but SuiPad launchpad token.
Unused Struct
Severity: Low
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: May 2023
Description:
The struct CampaignClosedEvent, RewardsClaimedEvent, InvestmentClaimedEvent are unused in campaign.move, RefundInvestmentEvent in vault.move.
Lack of Event
Severity: Low
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: May 2023
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track important actions or detect potential issues. For example: add_to_whitelist in the whitelist.move.
Misspelled Keywords
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
A misspelling error has been found in the code at line 69 of reserve_config.move where the keyword #[test_only] is misspelled as #[test_onlu]. This typing error can cause a failure in testing when executed.
Unused or Improperly Used Functions and Constants
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
Certain private functions such as oracle::get_oracle_price() and u128_math::approx_eq() are either unused or only used in test functions. Additionally, there are some empty init functions such as reserve_config::init() and profile::init(), as well as constants such as EORACLE_NO_DATA, EORACLE_PRICE_STALE , EORACLE_PRICES_DIVERGE, and U64_MAX that are not being used.
Unused Private Functions
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description: There is a private function remove_tick in the tick module that is not used.
Invalid Capability
Severity: Low
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
With the inclusion of the delegation_pool feature, several components require updates to facilitate its integration. However, validator_router::set_withdraw_signature and validator_router::verify_withdraw_signature_for_validator are missing the necessary modifications. When public validators sign up, they must provide their DelegationPoolOwnership capability by invoking delegation_pool::get_owned_pool_address. However, the current version incorrectly assumes aSharesDatacapability as proof of owning astake_pool, resulting in invalid validator sign-ups.
Unused Constant
Severity: Low
Ecosystem: Aptos
Protocol: Supra
Auditor: MoveBit
Report: https://movebit.xyz/reports/Supra-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Code Snippet: N/A
Description:
The constant EOWNER is not used in the contract.
Sensitive Operation Lacks Event
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
In the contract, some sensitive operations lack event listeners, making it difficult for external tracking of changes in related data within the contract. The functions affected by this issue include offer_admin_previliges(), cancel_admin_previliges(), claim_admin_previliges(), and set_dex_liquidity_fee(), among others.
Unused Private Function
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The function assert_pair_is_not_created() defined in module router_v2 is not used, which leads to increased gas consumption and reduces the readability and understandability of the code.
The FeeChangeEvent Structure is Not Being Utilized
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The FeeChangeEvent structure is intended to monitor changes in various fees, but it's not being utilized within the contract. As a result, there's an inability to promptly track changes in fees.
Unused Constant
Severity: Low
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The main consequence of the Unused Constants defect is the increase in gas costs during module deployment, leading to gas wastage.
Lack of Events Emit
Severity: Low
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track sensitive actions or detect potential issues.
Missing Events For Important Parameter Updates
Severity: Low
Ecosystem: Aptos
Protocol: StreamFlow
Auditor: MoveBit
Report: https://movebit.xyz/reports/StreamFlow2-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
We found that when important parameters are updated in the project, the function doesn't emit the update event, so we suggest emitting the emit event in time so as to notify the user or chain off programs.
Unused Event Should Be Removed
Severity: Low
Ecosystem: Aptos
Protocol: StreamFlow
Auditor: MoveBit
Report: https://movebit.xyz/reports/StreamFlow2-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
There are unused events that may be removed, such as EscrowInitEvent.
Underutilized Constant EID_INVALID in Pegging Module
Severity: Low
Ecosystem: Aptos
Protocol: Amnis
Auditor: MoveBit
Report: https://movebit.xyz/reports/Amnis-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
The constant EID_INVALID in the pegging module is not utilized, potentially impacting code readability and causing unnecessary gas consumption.
Lack of Events Emit
Severity: Low
Ecosystem: Aptos
Protocol: vibrantX
Auditor: MoveBit
Report: https://movebit.xyz/reports/vibrantX-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
The smart contract lacks appropriate events for monitoring sensitive operations, which could make it difficult to track sensitive actions or detect potential issues.
Inappropriate borrow
Severity: Low
Ecosystem: Aptos
Protocol: Mokshya/Wapal Aptos NFT Mint Smart Contract
Auditor: MoveBit
Report Date: Mar 2023
Description:
In the function candymachine::mint_script , the resource CandyMachine is obtained through borrow_global_mut , but there is no need to modify CandyMachine in this function. Using borrow_global_mut may be risky, and the function candymachine::mi nt_from_merkle also has this problem. The same problem is similar to using table_with_le ngth::borrow_mut in the function candymachine::bucket_table::borrow .
The code specification is not uniform
Severity: Low
Ecosystem: Aptos
Protocol: Aries Market(Aptos)
Auditor: MoveBit
Report Date: Feb 2023
Description:
The calling methods of the two iterable_table::contains in the function remove_collateral_profile are inconsistent, one of which lacks the generic parameters, and the error code of assert should be defined as a constant EPROFILE_NO_BORROWED_RESERVE.
Assertion error code is incorrect
Severity: Low
Ecosystem: Aptos
Protocol: Aries Market(Aptos)
Auditor: MoveBit
Report Date: Feb 2023
Description:
There is an assertion in the function profile::new whether addr owns Profiles, but the returned error code is EPROFILE_ALREADY_EXIST, which should be EPROFILE_NOT_EXIST.
Wrong error code throw function
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
The code uses permission_denied to throw error codes. Different errors are thrown in different ways in the source code. Therefore, it is recommended to use invalid_argument for parameter errors.
TODO labels still remain in the code
Severity: Low
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol(Aptos)
Auditor: MoveBit
Report Date: Jan 2023
Description:
There are some TODO labels in clmm_math.move , all the left TODO labels are about tests. TODO often means work is not finished or possibility of defects. If we're not sure about the codes, we should write more tests to ensure the codes work correctly.
Missing ;
Severity: Low
Ecosystem: Aptos
Protocol: MoveDID
Auditor: MoveBit
Report Date: Nov 2022
Description:
The set_sign_and_updated_at function is missing a semicolon at the end of the function. This function does not have a return value, adding a semicolon would make it more readable.
Unused Function
Severity: Low
Ecosystem: Aptos
Protocol: MoveDID
Auditor: MoveBit
Report Date: Nov 2022
Description:
This function is not an entry function and has not been called. Add a comment if you plan to use this afterward, otherwise, delete it.
get_oracle_base_currency view function is acquiring a mutable reference to the Global Storage
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The get_oracle_base_currency function is declared as a view function and should not acquire a mutable reference to the global storage.
Missing Event Emit
Severity: Low
Ecosystem: Sui
Protocol: Volo
Auditor: Hacken
Report: https://hacken.io/audits/volo/sca-volo-liquid-staking-aug2023/
Report Date: Sep 2023
Description:
The functions are considered to perform valuable configuration changes, which users should be notified about.
Unused Variables/Structs
Severity: Low
Ecosystem: Sui
Protocol: Volo
Auditor: Hacken
Report: https://hacken.io/audits/volo/sca-volo-liquid-staking-aug2023/
Report Date: Sep 2023
Description:
Unused variables and structs should be removed from the contracts. Although unused variables and structs are allowed in Move and do not pose a direct security issue, it is best practice to avoid them as they can cause an increase in computations (and unnecessary Gas consumption) and decrease the code readability.
Lack of Account Registration Check for Coin
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Description:
Different functions in the isolated_lending::isolated_lending module work with Move Coin. However, they miss proper registration for the coin before calling the coin::deposit function.
missing emiting EventOpenBinStepPreset when bin is removed via factory::remove_preset function
Severity: Low
Ecosystem: Aptos
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
When set bin status to either opened or closed we emit EventOpenBinStepPreset event for the bin information and its new status. The main function used to close bins is factory::close_bin_step_preset, which already emit this event when closing. There is another execution which will lead to closing of the bin where in case of removing the Present totally and the bin is opened we close it. but in that case we are not emiting EventOpenBinStepPreset event for that bined to be closed.
Collision - Overview
Collision vulnerabilities occur when different components accidentally share the same identifier or storage location (names, keys, types), causing unintended overwrites, state corruption, or unexpected behavior.
| Collision | Findings |
|---|---|
| Medium | 1 |
| Low | 4 |
| Total | 5 |
Medium Findings
Allocation ID Collision Enables Beneficiary Hijacking
Severity: Medium
Ecosystem: Sui
Protocol: Magna Airlock
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Magna Airlock - Zellic Audit Report.pdf
Report Date: Nov 2025
Description:
DistributionState is keyed only by allocation_id, not by the unique leaf content. If two merkle leaves share the same allocation_id, they share the same beneficiary. The first withdrawal for a given allocation_id permanently locks the beneficiary address, and subsequent withdrawals with different leaves but the same ID will use that locked beneficiary. If two users have different leaves but both have an allocation_id == 999, whoever withdraws first becomes the beneficiary for both allocations.
Low Findings
Token ID Collision Allows State Corruption
Severity: Low
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description:
The add_new_token function lacks a validation to ensure that a new token_id is unique before it's assigned to a token. An administrator could inadvertently (or maliciously) assign an already-used token_id to a new token. This would overwrite the entry in the id_token_type_map, causing the contract's state to become inconsistent. As a result, the previously registered token becomes "orphaned" and unmanageable through ID-based functions, while functions relying on this mapping for validation will behave incorrectly.
Denial of Service via Hash Collision
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Certora
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Ottersec Aave Aptos V3.1-V3.3 Report.pdf
Report Date: Apr 2025
Description:
The SmartTable is vulnerable to a hash denial-of-service attack, where malicious users may overload a specific bucket, creating aborts and denying access to legitimate users with colliding keys.
Token Name Collision
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Code: N/A
Description:
The two functions new_reward<RewardCoin> and new_reward_fa are used to register different tokens for reward payments. Under the hood, both of these functions call new_reward_for_farming_internal with the asset name. However, this can be problematic in the case of a name collision between an FA and a coin.
Possible Object Account Address Collision
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Code: N/A
Description:
Different object accounts, such as JumpInterestRateModel, MarketLiquidationThreshold, MarketLiquidationIncentive, MarketLiquidationPauseFlag, CoinInfo, and FungibleAssetInfo, in various places are moved to global storage with the same market_signer object identifier. However, objects should be isolated to different accounts; otherwise, modifications to one object within an account can influence the entire collection.
Constant Definition - Overview
Hardcoded constants or misconfigured parameters leading to misbehavior or rigid protocol design.
| Constant Definition | Findings |
|---|---|
| Critical | 3 |
| High | 2 |
| Medium | 5 |
| Low | 11 |
| Total | 21 |
Critical Findings
Hardcoded Token Type Mismatches with Generic Parameter May Lead to Asset Loss
Severity: Critical
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description: The function repay is defined as a generic function repay
Faulty Constant Definition
Severity: Critical
Ecosystem: Sui
Protocol: Bluefin Spot
Auditor: OtterSec
Report: https://www.notion.so/a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2024
Description:
The MAX_u64 constant is incorrectly defined as 0xFFFFFFFFFFFFFFF (15 characters) instead of 0xFFFFFFFFFFFFFFFF (16 characters). This omission causes errors in tick calculations by ignoring the most significant bit.
DefaultBidPercentage Misconfiguration
Severity: Critical
Ecosystem: Sui
Protocol: MoviePass Exchange
Auditor: Certora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/03_02_2025_MoviePass_MSX-MR.pdf
Report Date: Feb 2025
Description:
The DefaultBidPercentage constant is incorrectly set to 10_000 instead of 1_000_000, causing the maximum bid rate to be misconfigured and potentially allowing unexpected bid behaviors.
High Findings
Incorrect DAY_SECONDS Constant Breaks LP Token Withdrawal Security Model
Severity: High
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The DAY_SECONDS constant in house_lp.move is incorrectly set to 600 seconds (10 minutes) instead of 86400 seconds (24 hours), fundamentally breaking the intended 5-day LP token withdrawal security model.
Incorrect Variable Assignment
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
In is_whitelist_phase, the one_day constant is incorrectly set to 0 instead of 24*60*60*1000. This causes the calculation campaign.sale_start - one_day > clock::timestamp_ms(clock) to be incorrect, potentially allowing whitelist phase logic to fail.
Medium Findings
Fixed GUSD Pricing May Lead to Protocol Asset Loss
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
Pegging GUSD to a fixed price of $1 in the protocol could result in price misalignment.
Recommendation:
It is recommended to use the stablecoin’s actual market price for internal calculations to ensure that debt valuation aligns with real time market conditions.
nonce is Always 0
Severity: Medium
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
The nonce string value added to the signature in the buy function is always 0 and there is no place to change it. It is recommended not to use hard-coded.
Wrong value hardcoded in TOTAL_SUPPLY leads to too few minted tokens
Severity: Medium
Ecosystem: Sui
Protocol: Zesh AI
Auditor: Hacken
Report: https://hacken.io/audits/zesh-ai-layer/sca-zesh-ai-layer-zesh-coin-dec2024/
Report Date: Dec 2024
Description:
Harded coded token supply set to 1000 instead of 1 billion, as token uses 6 decimals. const TOTAL_SUPPLY: u64 = 1_000_000_000
Unused Constant
Severity: Medium
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
Certain variables not referenced or used in any of the contract.
MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD has outdated value
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: June 2025
Description:
Incorrect constant.
Low Findings
Magic number in MAX_BOND_UNBOND_AT constant
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The MAX_BOND_UNBOND_AT is set to 0xffff_ffff_ffff_ffff (u64 max) but this magic number isn't documented. Future developers might not understand its significance.
Excessive Validation Limits in GlobalConfig
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The global config module contains unreasonably high validation limits in the enable fee rate function: • fee rate limit allows up to 99.9999%, which is excessive and could enable abusive fee settings. • tick spacing limit allows up to 4,194,304, far beyond practical needs and could impact pool efficiency and gas costs. Additionally, the initial configuration and validation limits are hardcoded. Using literals directly in code instead of named constants makes maintenance harder and increases the risk of errors or inconsistencies.
Ambiguous Boundary Definition for active_id
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The active_id boundary check in create_pool_internal lacks clear design specification. Uses strict inequalities (gt/lt) excluding boundary values ±443636, but design intent is unclear - should boundaries be valid or invalid?
Minimum CToken Bounds
Severity: Low
Ecosystem: Sui
Protocol: Suilend
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2024
Description: The MIN_AVAILABLE_AMOUNT constant in reserve acts as a threshold to thwart specific rounding bug attacks by ensuring that a minimum amount of the underlying token may not be withdrawn or borrowed. However, this constant should also cover ctoken_supply, which is used to critically reinitialize the ctoken ratio.
Unused Module
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
dl_list_table module is not used.
Unused Return Value
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
The function position::increase_liquidity has a return value of type u128, but it is not used.
Unused Function
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
The method borrow_mut_tick_for_swap exists but is not used anywhere in the entire contract. It is also public, which poses a security risk.
Irregularity in Fee Comment Annotation
Severity: Low
Ecosystem: Aptos
Protocol: Echleon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
DEFAULT_ORIGINATION_FEE_BPS value (10) is mislabeled as 0.01% in the comment, though it actually represents 0.10%.
Inaccurate MAX_MSAFE_OWNERS_LIMIT
Severity: Low
Ecosystem: Aptos
Protocol: MSafe MVP Program
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description:
An additional nonce key is added in derive_multisig_auth_key. This means that the actual MAX_MSAFE_OWNERS_LIMIT should be one less than the Aptos enforced maximum of 32, or a total of 31.
Unused Constants Should Be Removed
Severity: Low
Ecosystem: Aptos
Protocol: StreamFlow
Auditor: MoveBit
Report: https://movebit.xyz/reports/StreamFlow2-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
There are unused constants that may be removed.
verify_platform Uses A Magic Number
Severity: Low
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In the verify_platform function, it checks that if the p.body.platform == 1 which means that if it's on Aptos. However, using a magic number is confusing and not easy to modify in the future.
Data Inconsistency - Overview
Desynchronized or outdated state across contracts or storage variables breaking protocol invariants.
| Data Inconsistency | Findings |
|---|---|
| Critical | 2 |
| High | 10 |
| Medium | 10 |
| Low | 9 |
| Total | 31 |
Critical Findings
Token Identifier Collision
Severity: Critical
Ecosystem: OL Network
Protocol: StakeSphere
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/StakeSphere-stealth-/blob/Wallet/Audit.md
Report Date: Apr 2024
Description:
The get_pool_address function generates a unique address for a liquidity pool linked to trading pairs of fungible assets. This function creates and returns an address that uniquely identifies the liquidity pool for the specified pair of tokens. Users have the liberty to construct an Object using any symbol of their choice, which offers a great deal of flexibility. This flexibility, however, can lead to the creation of Object instances that closely resemble other existing instances. This situation might lead to a seed collision, which could subsequently cause a collision in the generation of the pool address.
Improper Implementation Of Positions
Severity: Critical
Ecosystem: Aptos
Protocol: Eternal Finance
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2023
Description:
In the bank.move module, the Position struct is utilized to store collateral share amounts and debts on a position. However, there exists an inconsistency in the implementation of positions between the bank.move and pancake_dex_worker.move modules. The bank module assumes that a position can manage the collateral and debts of multiple coins, whereas the worker module assumes that a position can only hold the collateral and debts for one coin pair. This inconsistency could result in the loss of funds.
High Findings
Validation-Execution Leverage Buffer Mismatch Causing Unexpected Order Cancellations
Severity: High
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The Dexlyn perpetual trading contract contains a critical inconsistency in leverage buffer calculations that creates unpredictable order execution behavior. This vulnerability stems from different leverage tolerance values being used during order validation versus order execution, leading to orders that pass validation but fail unexpectedly during execution.
The contract implements two different leverage buffer calculations which creates a 10x difference in leverage tolerance between validation and execution phases.
Invalid Calculations; Data Consistency
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: Hacken
Report: https://hacken.io/audits/volo/sca-volo-liquid-staking-aug2023/
Report Date: Sep 2023
Description:
In the remove_stakes loop, the requested_amount is not updated after each withdrawal, potentially leading to over-withdrawals or inconsistent withdrawal tracking.
Requirements Violation; Data Consistency
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: Hacken
Report: https://hacken.io/audits/volo/sca-volo-liquid-staking-aug2023/
Report Date: Sep 2023
Description:
The sort_validators function fails to consistently sort validators by priority. Extremely large priority values are placed at the beginning or middle of the array unpredictably, violating the intended descending order requirement.
Inconsistent Handling of reward_fee
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Oct 2023
Description:
In the update_rewards function, the total_rewards set by the set_rewards_unsafe function includes reward_fee, but in line 581 of the unstake_amount_from_validators function sub_rewards_unsafe(self, rewards - reward_fee) subtracts reward_fee.
Inconsistent Deduction Logic in remove_stakes Function
Severity: High
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Oct 2023
Description:
In the remove_stakes function, when the condition of L184 is not satisfied, the logic of L188-L191 will be executed. The value of requested_amount should be changed to requested_amount - principal_value. If the value of requested_amount is not updated, the actual amount withdrawn will be greater than requested_amount.
deposit Does Not Update User's Share If He Deposits Multiple Times
Severity: High
Ecosystem: Sui
Protocol: Random-Vault
Auditor: MoveBit
Report: https://movebit.xyz/reports/Random-Vault-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
When a user deposits multiple times, the contract updates round.total_share but fails to update the individual user’s share, leading to incorrect share accounting and potential loss of rewards.
token.start_p is not updated
Severity: High
Ecosystem: Sui
Protocol: Bucket
Auditor: MoveBit
Report Date: June 2023
Description: After invoking claim_collateral, the start_p value remains unchanged. This can cause subsequent logic errors and inconsistencies in state-dependent calculations.
ReserveData not Updated
Severity: High
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description: In the execute_withdraw function, small remaining amounts after withdrawal are sent to the treasury, but the user’s asset data and reserve balance in ReserveData are not updated. This leads to calculation errors and data desynchronization across the protocol.
Position Rewarder Checkpoint is not updated when changing liquidity
Severity: High
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
When adjusting liquidity (inc/dec), only the global fee growth is checkpointed. However, reward growth from the reward manager is initialized only once at position creation via position_info_load_rewarder_growth_from_bin and never updated afterward, causing incomplete reward accounting.
LP unstaking only burns the shares but leaves the underlying tokens in the system, which distorts the shares-to-tokens ratio and leads to incorrect amounts being calculated during staking and unstaking
Severity: High
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
When a user unstakes LP tokens, the corresponding shares (Cabal tokens) are burned. However, the actual undelegation from the validator will occur only after a delay of up to 3 days. During this period, the shares are already burned, but the underlying tokens are still included in shares-to-token conversions.
Medium Findings
Missing Reward Release Update When Breaking from Settlement Loop
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
In the settle_rewards function, when the condition if (current_time < next_settle_at) is met, the function breaks from the inner loop without updating reward.reward_released with the accumulated reward. This leads to potential reward loss and state inconsistency.
Incomplete Handling of Staked Liquidity in Fullsail Distribution
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The pool maintains fullsail_distribution_staked_liquidity separately from total liquidity, creating a risk of desynchronization. Liquidity updates in the pool and staked liquidity changes are decoupled, allowing inconsistencies to arise between staking status and the underlying liquidity.
Inconsistent Balance Management in RewarderGlobalVault
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The RewarderGlobalVault maintains two separate balance tracking mechanisms: coin balances in a bag and logical balances in an available_balance table. The function emergent_withdraw bypasses the available_balance accounting by directly withdrawing from the coin balance, which will lead to reward collection failures for users.
TakeRevenueEvent May Not Match The Actual Transferred Amount
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the take_revenue logic, there is an inconsistency between the emitted event amount and the actual amount of tokens transferred.
Attacker Can Desynchronize Supply Snapshot During Same-Block Unstake, Reducing Everyone’s Rewards
Severity: Medium
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
An attacker holding Cabal LSTs (like sxINIT) can monitor the mempool for the manager’s voting_reward::snapshot() transaction. By submitting his own cabal::initiate_unstake transaction to execute in the same block (H) as the manager’s snapshot, the attacker can use two flaws: cabal_token::burn (called by their unstake) doesn’t update the supply snapshot for block H, leaving the recorded supply artificially high (pre-burn). cabal_token::check_snapshot skips recording the attacker’s own balance for block H. Later reward calculations use the stale high supply but retrieve the attacker’s now lower (post-burn) balance via fallback logic. This desynchronization causes the total calculated reward shares to be less than 100%, reducing the rewards paid out to all users for that cycle.
LP Redelegation Uses Inaccurate Internal Tracker Amount, Leading to Potential Failures or Orphaned Funds
Severity: Medium
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
The redelegate_lp function, called during validator changes for LP pools, uses the internal pool.amount tracker to specify the amount for MsgBeginRedelegate. This tracker can diverge from the actual staked amount due to unreflected rewards or slashing, potentially causing redelegation failures or leaving funds staked with the old validator.
Desynchronization of Cabal’s internal accounting with actual staked INIT amounts leads to over-minting of sxINIT tokens
Severity: Medium
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
The Cabal Protocol’s implementation of compound_xinit_pool_rewards fails to synchronize the protocol’s internal accounting (m_store.staked_amounts) with the actual amount of INIT tokens staked in the underlying Initia staking system. This creates a vulnerability where external events like slashing penalties or validator-initiated actions that reduce the staked amount are not reflected in Cabal’s internal state.
Loss of funds due to address mappings are not cleaned up after domain expiry
Severity: Medium
Ecosystem: Initia
Protocol: Initia Move
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-01-initia-move
Report Date: Apr 2025
Description:
The register_domain function doesn’t properly clean up old mappings (name_to_addr and addr_to_name) when a new user registers an expired domain. While it removes the old name_to_token mapping, it leaves the previous user’s address mappings.
Update magnified_dividends_per_share Values When staked_tokens Reaches Zero
Severity: Medium
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
When pool_info.staked_tokens reaches zero,the protocol fails to update pool_info.magnified_dividends_per_share_x and pool_info.magnified_dividends_per_share_y . This inconsistency results in a mismatch between the current state of pool_info and its initialized state.
Incorrect metadata used for deposit_stkapt function
Severity: Medium
Ecosystem: Aptos
Protocol: KoFi Finance
Auditor: MoveJay
Report: https://github.com/KofiFinance/audits/blob/main/Kofi%20Finance%20-%20Zenith%20Audit%20Report.pdf Report Date: Mar 2025
Description:
In the deposit_stkapt function, the code incorrectly uses kAPT_coin::metadata() instead of stkAPT_coin::metadata() when creating/accessing the fungible store for stkAPT tokens. This mismatch between token type and metadata will cause deposits to fail. The function is supposed to deposit stkAPT tokens but is using kAPT metadata to identify the store.
Low Findings
Position Display Object Inconsistencies
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The position module contains two separate functions (init and set_display) that independently create and transfer Display
Stale Position Fee Rate Metadata
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
Position objects store a fee rate field capturing the pool’s fee rate at creation time. This field becomes stale and misleading when administrators update the pool’s swap fee rate, as position metadata is never updated.
Inconsistency In Fee Rate Enforcement
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The function get_total_fee_rate enforces a cap only on the total_fee_rate , ensuring it does not exceed max_fee_rate , but returns the individual base_fee_rate and var_fee_rate values without applying any constraints. During swaps, fee calculations reference base_fee_rate() + step.bin_swap_var_fee_rate() as inputs for per-step fees, while actual bin swap operations are performed using the clamped total_fee_rate . This creates an inconsistency where displayed or derived component fee rates may differ from the effective, capped execution fee rate, especially if the sum of the base and variable rates exceeds the cap. This can result in confusion in fee reporting or analytics since the breakdown and the total fee applied may not align.
Event Log and State Inconsistency May Mislead Users
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
In the add_reward function, two independent parameters are used to represent the
reward amount:
reward_coin: Coin
Incorrect Data in Event
Severity: Low
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
In functions withdraw(), repay(), and liquidation_call(), the amount emitted in emit should represent the actual amount of funds withdrawn, repaid, or liquidated, rather than what the user inputs. Otherwise, it will send incorrect information to external event listeners.
Improper Implementation Of Mint Cap Check
Severity: Low
Ecosystem: Aptos
Protocol: Thala Labs
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Code Snippet: N/A
Description:
The number of MOD tokens to be minted in borrow is limited by the mint_cap parameter set by the protocol. This is enforced by checking if the newly minted amount along with the previous total debt exceeds the mint_cap. But in implementation, the amount considered in this check (amount) is different from the amount that is actually minted (total_amount = amount + fee_amount). This leads to the minting of MOD exceeding the amount set in the mint_cap parameter.
Inconsistent Results On Unmatched Decimals
Severity: Low
Ecosystem: Aptos
Protocol: Switchboard Aptos
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2022
Description:
SwitchboardDecimal can store a decimal value along with its decimals and sign. When a new decimal is initialized, it will be scaled to 9 decimals by default(MAX_DECIMALS), which is the maximum limit. All of the operations inside the math library assume that all the passed SwitchboardDecimal are scaled to MAX_DECIMALS. With the function, math::normalize scaling can be reversed; Thus, when an unscaled value is sent with a scaled value, the outcome is erroneous.
Users could lose not-yet accrued rewards when the distribution end is updated
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report Date: Jun 2025
Description:
The current implementation of set_emission_per_second is not executing update_reward_data(...) to update the (asset, reward) distribution before updating the Global Storage value for reward_data.distribution_end. Assuming that the distribution has not ended yet, If the new new_distribution_end is <= reward_data.last_update_timestamp all the users will lose amount of rewards that could have accrued in the delta seconds timestamp::now_seconds() - reward_data.last_update_timestamp. This happens because calculate_asset_index_internal will early return the "old" distribution index when last_update_timestamp >= distribution_end.
Interest rates not updated before liquidation
Severity: Low
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
In the liquidation module, users can liquidate insolvent users via the liquidate function. However, the protocol's global interest rate is not updated prior to liquidation. This could lead to interest not being accounted for when calculating user liabilities through preview_repay_shares , thereby impacting the accuracy of the liquidation operation.
Denial of Service (DoS) - Overview
Logic that can halt execution, lock funds, or make functions unusable.
| DoS | Findings |
|---|---|
| Critical | 1 |
| High | 4 |
| Medium | 27 |
| Low | 7 |
| Total | 39 |
Critical Findings
burn_from_bins_internal is subjected to DoS as we reset global liquidity when one bins liquidity goes to zero
Severity: Critical
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
When burning liquidity we call burn_from_bins_internal. and we reset the global liquidity parameter to zero in case the reserve for the bins goes to zero or the supply of that bin goes to zero. Resetting liquidity at this case is not needed, it is actually incorrect, as this variable indicates the total liquidity in all bins. so falling one bin to zero does not mean the global liquidity goes to zero. And the problem is not just incorrect view function. In case this occur and another LP wanted to burn frmo his position from another bin, and the bin still has liquidity we will go to the else block which will do self.liquidity - liquidity_delta so it will endup in underflow error, reverting the tx and preventing the burning. Even the first check enforces the liquidity difference to be too small. so most of further burning process will end up at else block results in underflow and reverting the tx.
Unbounded Execution - DOS
Severity: Critical
Ecosystem: Binance Smart Chain
Protocol: AquaSwap
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/AuquaSwap-Audit-/blob/Wallet/Audit%20report.md
Report Date: July 2025
Description:
These functions can lead to unbounded execution because they iterate over potentially large lists. An attacker could exploit this by registering a large number of orders, causing the functions to block and leading to denial-of-service (DOS).
High Findings
DXLP Ratio Manipulation and Denial of Service
Severity: High
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
The Dexlyn perpetual trading protocol contains a significant vulnerability in its House LP (DXLP) token system that allows attackers to manipulate the token ratio and extract value from legitimate users' deposits. This vulnerability combines ratio manipulation with a denial of service attack.
The vulnerability stems from two interconnected design flaws:
- No Minimum Deposit Protection: The
house_lp::depositfunction allows deposits as small as1 wei, enabling attackers to become the first depositor with minimal investment. - Unprotected Vault Inflation: The
pnl_deposit_to_lpfunction deposits trading losses into theHouseLPVaultwithout minting corresponding DXLP tokens, allowing vault inflation without supply increase.
Potential DoS Due to Improper Balance Splitting in the Liquidation
Severity: High
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
If the debt_to_burn exceeds the value of repay_balance (for example, when revenue_balance has a non-zero value), the balance::split operation will fail and cause a transaction panic. This renders the liquidation mechanism unusable under many normal conditions and may freeze funds involved in the liquidation.
NFT Token ID contains forbidden character by design which prevents any domain from being issued at all
Severity: High
Ecosystem: Initia
Protocol: Initia Move
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-01-initia-move
Report Date: Apr 2025
Description:
The usernames module allows for registering a domain. This happens in function register_domain. On registration, a NFT is minted to the buyer, with field Token ID in format domain:timestamp. However the : character is forbidden by underlying nft.move module which is also the reason why original unit tests fail. Due to this, the protocol cannot be used in its current state, because no NFTs can be currently minted, thus, no domains can be claimed. Hence, this is equivalent to a permanent DoS.
Excessive rewards allocations leads to DoS
Severity: High
Ecosystem: Aptos
Protocol: PancakeSwap
Auditor: Zellic
Report Date: Nov 2022
Description:
Certain conditions may lead users having to save funds by calling emergnecy_withdraw, forfeiting their rewards.
Medium Findings
DOS in claim_reward_single_epoch
Severity: Medium
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
When updating the reward epoch, both epoch_data.start_index and epoch_data.end_index are written with the same value.
When attempting to claim rewards for the next round (essentially trying to claim future rewards), since no relevant data has been written here (as the pool cannot update to future rewards at this point, there is no future reward data available), This results in empty data being retrieved, leading to a DoS.
Denial of service by flooding deposit with new coin types
Severity: Medium
Ecosystem: Sui
Protocol: Bluefin RFQ
Auditor: Asymptotic
Report: https://bluefin.io/blog/doc/bluefin_rfq_audit.pdf
Report Date: Feb 2025
Description:
There is no privilege check for depositing, and the deposit function auto-adds any coin type it encounters. An attacker could create many coin types, flooding the system and potentially increasing the supported coin types beyond what Sui accepts. This issue also undermines the concept of a coin type being “supported” by the Vault.
Potential DoS Caused by Unreasonable Fee Rates
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the update_fee_rate function, the administrator can set new redemption fee rates. However, this function lacks an upper limit check for new_fee_rate . If the administrator sets a new_fee_rate greater than or equal to 10000 (representing a 100% fee), the calculated fee in the redeem_gusd function will always be greater than or equal to the user's redemption amount. This will cause the assertion assert!(fee < amount, E_INVALID_FEE) in the redeem_gusd function to fail, making all redemption operations unsuccessful. This effectively blocks the core functionality of users redeeming GUSD for USDC and may result in trapped user funds.
DoS Due to Surpassing of Event Limit
Severity: Medium
Ecosystem: Sui
Protocol: Aftermath
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
The max_num_event_emit sets a restriction on how many events may be emitted at a time. A vault owner may intentionally place multiple pending orders across various clearing houses, thereby accumulating a large number of events to be processed. If the number of events exceeds 1024, it will block the force withdrawal process.
Denial of Service via Mint Limit Exhaustion
Severity: Medium
Ecosystem: Sui
Protocol: Lombard
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
Swapping small amount of wrapped token for native multiple times can cause DOS.
DoS due to Excessive Gas Consumption
Severity: Medium
Ecosystem: Sui
Protocol: Lombard
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
Large number of small orders through max_computation_budget, blocks legitimate orders.
DoS due to Excessive Gas Consumption
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Deepbook
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description:
Large number of small orders through max_computation_budget, blocks legitimate orders.
The owner of kiosk may block the user’s funds by calling set_allow_extension
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Labs Sui
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
The current implementation may disallow the use of this function by calling set_allow_extensions with allow_extensions set to false. This may result in the locking of users’ funds that were transferred to the extension.
Denial Of Service & Inefficient Gas Model
Severity: Medium
Ecosystem: Sui
Protocol: Volo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description:
native_pool can introduce a large number of validators with no upper limit causing other functions like sort to go through a large list of validators.
Unrestricted Validator Registration May Lead To DoS
Severity: Medium
Ecosystem: Aptos
Protocol: Ditto
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Validators can join the Ditto protocol by invoking ditto_staking::add_validator. When the validator whitelist is disabled, there are no restrictions on validator entry. Each new validator occupies space in the ValidatorState table and ValidatorLockupBuffer stored on the @ditto_staking account. Many of the computations that interact with validator state run linear time algorithms over these structures and therefore require gas usage roughly linear to the number of validators. A malicious user could register a large number of fake validators in order to increase the usage of the associated validator tables and therefore increase the computation requirement on all subsequent instructions. In the worst case, a malicious user may be able to register enough validators to hit the computation limit and therefore prevent the protocol from operating entirely.
Potential DOS in delegation_service Pool
Severity: Medium
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In delegation_service, there is a hard limit on the number of direct delegators a pool can have: MAX_NUMBER_OF_DELEGATIONS (currently 100). A malicious user could fill the delegator list with fake delegators, staking small amounts in order to prevent real delegators from staking. In conjunction with OS-TOR-ADV-00, an attacker could bypass the min_delegation_amount and leave dust amounts in the pool, effectively making this attack free.
Lame Coin DOS
Severity: Medium
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In the stake::register_staking_account function, a duplicate call occurs when a new user tries to register a Lame coin. This would fail in the second register call (duplicated call), as the coin is already registered under the user in the first register call. This would cause a Denial of Service, as the new user will not be able to create a staking account.
Reverse Iterator DOS
Severity: Medium
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
In the splay_tree::prev_node_idx function, the iterator traverses down to the left only when the left is not sentinel. In other cases, the check was made for the left node and matched against the right node. This will fail if the right node is a sentinel. The impact of having an improper iterator will make the order book inoperable; as these iterators are used across the order book to traverse and match the orders.
Remove Job DOS
Severity: Medium
Ecosystem: Aptos
Protocol: Switchboard
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2022
Description:
The function aggregator::remove_job skips the execution silently when the supplied job address doesn’t exist in aggregator_job_data. This should abort because when aggregator_remove_job_action::actuate calls this function and skips execution, the following call to decrement the job_ref_count will be reduced.The job_ref_count is used to keep track of number of references that a job has. So If a job gets added count increases and count decreases when removed. Abort if the supplied job doesn’t exist.
DOS While Removing Shares From Reserve
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2022
Description:
In profile.move, the try_subtract_profile_reward_share function checks whether the profile has a farm for that specific reserve type while subtracting shares from a profile farm. If a farm doesn’t exist, the reward for that reserve is created after the profile is created, so the function skips the subtraction of shares. This case is not handled while subtracting shares from the reserve farm in the reserve::try_remove_reserve_reward_share function. This leads to the subtraction of shares that were previously absent in the reserve.
Denial Of Service In Withdraw And Cancel
Severity: Medium
Ecosystem: Aptos
Protocol: Steamflow
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Mar 2023
Description:
In protocol, withdraw and cancel require transferring contract coins (X) to the recipient. If the recipient is not registered to the contract coin (X) and transfers are disabled, the amount becomes locked in the protocol. This may occur if the recipient’s address is lost or if the recipient’s address input is incorrect.
Denial Of Service While Vesting
Severity: Medium
Ecosystem: Aptos
Protocol: Thala
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
start_vesting in thl_vesting/farming_vesting.move initiates vesting when called by a user to begin vesting. It uses a smart table on vesting.claims to store the claims of the users. The length of the vesting.claims smart table is the claim ID for the current vesting. Claiming a claim removes the entry at the claim ID from the smart table, resulting in a decrease in the length of the smart table. Consequently, attempting to add a new claim causes a denial of service issue.
Potential Denial Of Service In Pool
Severity: Medium
Ecosystem: Aptos
Protocol: Tortuga
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
In delegation_service, there is a hard limit on the number of direct delegators a pool may have: MAX_NUMBER_OF_DELEGATIONS, which currently equals 100. A malicious user may fill the delegator list with fake delegators, staking small amounts to prevent real delegators from staking. In conjunction with OS-TOR-PRO-01, an attacker may bypass the min_delegation_amount and leave dust amounts in the pool, effectively making a free exploit.
DOS Due to Blocking of Primary Store Creation
Severity: Medium
Ecosystem: Aptos
Protocol: Echelon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
The vulnerability relates to the creation of a primary fungible asset store in new_reward_fa in the lending core (shown below) and isolated core farming modules. new_reward_fa tries to create a primary store for the asset at the package address utilizing create_primary_store , which does not check if a store already exists at the address before creating a new one.
Thus, primary_fungible_store::create_primary_store aborts if a primary store already exists at the address. As anyone may create a primary store at any address since it is permissionless, it enables an attacker to create a primary store for an asset at the package address. This action will block any subsequent attempts to add that address as a farming reward in both lending_core and isolated_lending farms.
Risk of Self-Dos
Severity: Medium
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description:
In line 199 of the remove_stakes function, it is necessary to deal with the situation that staked_sui_mut_ref - requested_amount is less than 1 Sui , otherwise it will cause self-dos.
Option params in CLI
Severity: Medium
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: Jun 2023
Description:
burn_request and update_metadata_request have Option type parameters. If these parameters cannot be passed in CLI, users cannot call functions, causing DOS on these functions.
DoS on Failed Transfer Operations on the Same Object
Severity: Medium
Ecosystem: Sui
Protocol: MSafe Maven
Auditor: MoveBit
Report Date: Apr 2023
Description:
Multiple transfer requests cause DoS as first transfer succeeds, other requests fail when execute_object_operation is called.
DoS from Privileged User where Permission has Single Signer Settings
Severity: Medium
Ecosystem: Sui
Protocol: MSafe Maven
Auditor: MoveBit
Report Date: Apr 2023
Description:
If proposer and approver are in same roles, the role only has one signer with the authority to vote on the propsal. This will cause execution queue to be blocked resulting in a DoS.
claim Function May Cause DOS Problems
Severity: Medium
Ecosystem: Aptos
Protocol: MoveGPT
Auditor: MoveBit
Report: https://movebit.xyz/reports/MoveGPT-Final-Audit-Report.pdf
Report Date: Apr 2024
Description:
In the claim function, when lock_amount is equal to round_config.balances, it will extract all the coins in round_config.balances , but by calculating the lock_amount may be less than round_config.balances, then the function will always fail when reaching the else branch to extract the lock_amount from balances.
Reentrancy Check in lock_staking::reentry_check Causes Concurrent INIT Deposit Failures (DOS)
Severity: Medium
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
The liquid staking protocol’s deposit_init_for_xinit function, which allows users to deposit INIT tokens to receive xINIT, is vulnerable to transaction failures when multiple users deposit concurrently in the same block. The function withdraws INIT tokens and delegates them to a validator via pool_router::add_stake, which triggers lock_staking::delegate. This, in turn, invokes reentry_check to prevent multiple delegations in the same block.
If a second user attempts to deposit in the same block as another, their transaction fails with error code 196618 (EREENTER), as reentry_check detects that the StakingAccount was already modified in the current block. This vulnerability disrupts users’ ability to participate in the protocol, particularly during periods of high transaction activity.
Unstaking calculates user share at request time, ignoring slashing — leading to DoS and unfair distribution
Severity: Medium
Ecosystem: Initia
Protocol: Cabal Liquid Staking
Auditor: Code4Arena Contest Security Researchers
Report: https://code4rena.com/reports/2025-04-cabal-liquid-staking-token
Report Date: May 2025
Description:
Users can stake both INIT and LP tokens into different validator pools by calling functions like deposit_init_for_xinit or stake_asset. To exit, users initiate an unstake via initiate_unstake, which starts an unbonding period. After this delay, they can claim their tokens through claim_unbonded_assets.
Behind the scenes, these staked assets are delegated to validators, and slashing may occur—meaning a portion of the delegated tokens could be penalized (burned). To stay accurate, the protocol uses pool_router::get_real_total_stakes to track the current delegated amount. However, the current unstaking flow doesn’t properly account for slashing events that may occur during the unbonding period.
DoS due Unbounded Rewards Map
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: OtterSec
Report Date: Aug 2025
Description:
The rewards_controller logic utilizes a SimpleMap to store users_data for each reward distribution. SimpleMap is implemented as a vector of key-value pairs, which implies that every insertion or lookup requires linear-time scanning of the vector. As this structure grows, its performance degrades, and operations that iterate over it may run out of gas. Specifically, in this case, every user is expected to maintain an entry in the map. As a result, the map is expected to grow indefinitely.
Since this is permissionless, a malicious actor may create many such entries by interacting with the pool repeatedly. Consequently, if the vector grows excessively, handle_action may start failing due to out-of-gas issues, as gas utilization for common operations such as mint, burn, supply, or liquidate may exceed the transaction limit, resulting in a denial-of-service scenario.
Low Findings
Unchecked Read in peel_u64_be Leads to Transaction Abort and Denial of Service
Severity: Low
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description:
The peel_u64_be function unconditionally attempts to read 8 bytes from the provided byte stream without first verifying that 8 bytes are available. A malicious actor can craft and submit a message with a truncated payload, causing the function to attempt a read past the buffer's end. This triggers a transaction abort, which can be exploited to create a Denial-of-Service (DoS) attack, preventing any valid messages of that type from being processed by the bridge.
The vulnerability lies in the implementation of peel_u64_be in message.move. The function contains a while loop that is hardcoded to execute exactly eight times to read eight bytes, but it does so without any bounds checking.
skew_factor Initialization to Zero Can Lead to Denial of Service
Severity: Low
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
Based on the funding fee formula provided in the documentation (Funding Rate = ... + (Market skew / Skew Factor) * ...), the calculate_funding_rate function will perform a division using skew_factor. Since the value is 0, this will trigger an arithmetic exception and revert the transaction.
Multiplication Overflow DOS
Severity: Low
Ecosystem: Aptos
Protocol: PancakeSwap IFO
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2022
Description:
In compute_release_amount, the vested_amount calculation involves multiplying together the total amount to be vested by the vested seconds.
For large quantities of tokens vested over a long period of time, this calculation might abort, causing the contract to abort. Note that this is recoverable once the tokens have fully vested. A similar issue can be found in harvest_pool when calculating the initial vesting percentages. This will only be an issue if a user attempts to vest more than u64:MAX / 100 tokens.
Forced Eviction Of Legit Orders
Severity: Low
Ecosystem: Aptos
Protocol: Econia
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2022
Description:
AVL queue evicts orders when the tree exceeds a CRITICAL_HEIGHT or, when the number of active nodes becomes equal to N_NODES_MAX, to prevent excessive gas costs for insertion and deletion. In theory, due to the limited orderbook capacity, an attacker can place enough orders to evict legitimate orders and then cancel these placed orders.
Pyth Deployment DOS
Severity: Low
Ecosystem: Aptos
Protocol: Pyth
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Similar to the issue we found in Wormhole, during initialization of the pyth module, it attempts to register an AptosCoin account in order to be able to receive fees:
However, coin::register is a one-time operation. If coin::register has previously been called on this address, this initialization code will abort and the wormhole program will be unable to initialize. While it is usually not possible to register coins for users you can not sign for, the Aptos framework provides a special mechanism to register AptosCoin for any user via aptos_account::create_account:
Therefore, with this mechanism an attacker could register AptosCoin for the wormhole program before deployment in order to prevent it from properly initializing.
Wormhole Deployment DOS
Severity: Low
Ecosystem: Aptos
Protocol: Wormhole Aptos
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
During initialization of the wormhole module, it attempts to register an AptosCoin account in order to be able to receive fees:
However, coin::register is a one-time operation. If coin::register has previously been called on this address, this initialization code will abort and the wormhole program will be unable to initialize. While it is usually not possible to register coins for users you can not sign for, the Aptos framework provides a special mechanism to register AptosCoin for any user via aptos_account::create_account:
Therefore, with this mechanism an attacker could register AptosCoin for the wormhole program before deployment in order to prevent it from properly initializing.
Potential Denial of Service Risk of DAP Module
Severity: Low
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
In yeap_oracle, the DAP module is primarily responsible for asset price routing, constructing a directed acyclic graph (DAG) to manage price conversion paths between different assets. However, operations within functions such as add_edge, get_common_ancestor, and get_paths all require traversing the entire path to detect cycles. This traversal has a time complexity of O(n). If the created paths become excessively long, it could lead to a Denial-ofService (DoS) risk.
Documentation Mismatch - Overview
Code that does not follow comments or documentation.
| Documentation Mismatch | Findings |
|---|---|
| Low | 3 |
| Total | 3 |
Low Findings
Calculation Formula Does Not Match The Comment
Severity: Low
Ecosystem: Aptos
Protocol: Cellana Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cellana-Smart-Contract-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The calculation formula in the current_rebase function comments is Rebase = weekly emission * (total veCELL voting power / total $CELL supply) ^ 3 , while the actual calculation formula performed by the function is Rebase = weekly emission * (total veCELL voting power / total $CELL supply) ^ 3 / 2.
The comments on functions are out of date
Severity: Low
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol(Aptos)
Auditor: MoveBit
Report Date: Jan 2023
Description:
Many function comments are out of date. For example, there is no argument named name in router::add_liquidity, router::add_liquidity_fix_token, router::remove_liquidity, and router::collect_rewarder.
Rewarding formula inconsistency between the documentation and the code
Severity: Low
Ecosystem: Aptos
Protocol: Propbase
Auditor: Hacken
Report: https://hacken.io/audits/propbase/sca-propbase-staking-feb2024/
Report Date: Feb 2024
Description:
During the security audit, a discrepancy was identified between the reward equation depicted in the staking diagram and the implementation in the apply_reward_formula function. To maintain a robust and consistent system, it is imperative that the specifications outlined in the whitepaper documentation precisely match the code. We recommend updating the staking diagram to accurately reflect the calculation performed by the code.
Front Running - Overview
Attackers exploit transaction ordering or mempool visibility to gain unfair advantage.
| Front-running | Findings |
|---|---|
| High | 3 |
| Medium | 2 |
| Low | 2 |
| Total | 7 |
High Findings
Frontrunning Matched Funds for Unfair Gains
Severity: High
Ecosystem: Aptos
Protocol: Emojicoin
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
There is potential for frontrunning when matching funds are allocated. This issue arises due to the way matched amounts are distributed. The emojicoin arena module features a mechanism where users may lock in a portion of their contribution to receive matched funds from the vault. An attacker may create a large number of pools with small amounts, increasing the likelihood that one of their pools is chosen during the crank scheduling. Before the crank selects a melee, the attacker may buy a large amount of their own token, driving up its price, inflating its value relative to other tokens in the pool. Consequently, if their pool is selected, they may then buy into the pool and swap out their tokens to capture the matched funds.
Wallet creation is vulnerable to front-running attacks
Severity: High
Ecosystem: Aptos
Protocol: Momentum Safe
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/MSafe%20-%20Zellic%20Audit%20Report.pdf
Report Date: Sep 2022
Description:
A malicious user can monitor the mempool for pending ini_wallet_creations transactions and block them by submitting transactions with a higher gas price that calls aptos_account::create_account(msafe_address). This is because msafe_address is directly readable from the mempool.
Potential front-running in orderbook create
Severity: High
Ecosystem: Aptos
Protocol: Laminar Markets
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Laminar%20-%20Zellic%20Audit%20Report.pdf
Report Date: Oct 2022
Description:
address and seed are trivial. Attacker can front-run book::create_orderbook by creating account at right address, causing a revert.
Medium Findings
Duplicate-order DoS via front-running deterministic order_id
Severity: Medium
Ecosystem: Sui
Protocol: Garden Move
Auditor: Zellic
Report Date: May 2025
Description:
order_id is publicly visible — initiate_on_behalf lets anyone set order_id without verifying initiator ownership, allowing attackers to replay the transaction (e.g., with amount = 1) to trigger a DuplicateOrder error for the legitimate request.
Front-Running Pair/Market Creation
Severity: Medium
Ecosystem: Aptos
Protocol: Echelon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
create_pair_with_jump_model in isolated_lending is responsible for creating a new lending pair with a jump interest rate model. However, it is vulnerable to front-running. An attacker may observe a pending pair creation and preemptively register their Aptos account to the to-be-created pair’s address before the pair is fully initialized. Similarly, in lending_core , create_market_with_jump_model_v2 , the market creation may be front-run with a call to register the Aptos account at the address of the market that it is going to be created, resulting in a denial-of-service scenario.
Low Findings
Front-Running Vulnerability in Liquidity Management
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The remove_liquidity function in the pool module lacks slippage protection mechanisms, making users vulnerable to front-running attacks that can result in substantial financial losses. Unlike add_liquidity which provides a two-step process allowing users to review amounts before committing, remove_liquidity executes immediately without any user-controlled protection parameters.
Attack Strategy: • Find large positions (>5% of pool liquidity) • Manipulate price to push victim's position out of range • Victim removes large liquidity, reducing pool depth • Exploit reduced liquidity for cheaper price restoration • Profit from asymmetric price impact before/after liquidity removal
The seed for minting does not update
Severity: Low
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: This field should update after every mint with a new value.
Gas Related Issues - Overview
Inefficient or unbounded gas use that increases costs or causes function failure.
| Gas-related Issues | Findings |
|---|---|
| Medium | 11 |
| Total | 11 |
Medium Findings
Dutch Gas Optimization
Severity: Medium
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: Apr 2023
Description:
Recommended to merge coins together, then transfer to fee_pool_address.
Gas Optimization
Severity: Medium
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Mar 2023
Description:
A while loop in position::is_empty can return false when the amount_owned of one of the vector elements is not 0. In addition, in the return value && expression, there is no check of position_info.points_owned==0. Suggestion: Return false when the amount_owned of one of the vector elements is not 0.
Momentum safe deployment is vulnerable to max_gas attacks
Severity: Medium
Ecosystem: Aptos
Protocol: Momentum Safe
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/MSafe%20-%20Zellic%20Audit%20Report.pdf
Report Date: Sep 2022
Description:
simple_map::borrow() uses a binary search algorithm that creates an opportunity for max_gas attacks.
Transactions can be blocked from max_gas attacks
Severity: Medium
Ecosystem: Aptos
Protocol: Momentum Safe
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/MSafe%20-%20Zellic%20Audit%20Report.pdf
Report Date: Sep 2022
Description:
Same underlying issue as above. An attacker could stuff the txn_book.pendings to the point where the compute costs of simple_map::borrow() exceed max_gas.
Distribution mechanism for liquidation rewards susceptible to max_gas
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs Move Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
Attacker could flood StabilityPool.deposits iterable table with accounts with zero APD deposited. This could lead to max_gas and the inabilty for stability pool depositors to be rewarded for risks taken in supporting the stability pool.
Low collateral positions can lead to max_gas
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs Move Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
An attacker could open many vaults with low collateral, setting the borrow amount to barely reach minimum collateralization rate. These positions would be placed near end of sorting vaults where collateral redemption begins and could lead to max_gas in vault::redeem_collateral, affecting the abiulity of users to exchange APD for collateral.
Accumulation of vaults can lead to max_gas via insertion algorithm
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs Move Dollar
Auditor: Zellic
Report Date: Oct 2022
Description:
No controls to prevent 0 collateral vaults from being made nor to remove them. Attacker could flood system with zero-collateral vaults using vault::open_vault or this could naturally occur depending on number of users in protocol with zero-collateral vaults that are never removed.
Some assertions can be optimized
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
Many assertions are not placed at the beginning of functions. It is recommended so they can fail fast and save gas.
utils::str optimization
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
utils::str currently uses a pre-defined map to convert a u8 to a char and inserts char into the index 0 of the string, very inefficient.
Position recalculation optimization
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
In collect_fee and collect_rewarder functions in pool module, there are duplicated codes to get the pool and position. The reason is get_position_tick_range can not borrow the Pool resource after the pool variable keeps a mutable reference to the Pool resource. This is a limitation of Move language to ensure security. We can solve this by introducing a helper function which uses a &Pool parameter to get the position tick range.
Sequential Search Leads To Gas Griefing
Severity: Medium
Ecosystem: Aptos
Protocol: MSafe
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description:
When confirming a Momentum Safe registration, the address is removed from the pending vector of the owner’s OwnerMomentumSafes using a linear search. As anyone can register Momentum Safes for the owner, this causes the pending vector to grow. Note that an attacker can register a Momentum Safe in O(1) time, but all future operations will cost O(n) for the victim. This asymptotic difference makes it a viable gas-griefing attack vector.
Low
Inflation Attacks - Overview
Manipulating token supply or pricing mechanisms to artificially inflate token value or circulation, leading to economic imbalance or devaluation.
| Inflation Attacks | Findings |
|---|---|
| Medium | 1 |
| Low | 4 |
| Total | 5 |
Medium Findings
Inflation Attack on Zero Total Stake
Severity: Medium
Ecosystem: Aptos
Protocol: Thala LSD
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
staking::stake_thAPT_v2 is susceptible to an inflation attack, which may allow the first depositor to exploit subsequent depositors by manipulating the exchange rate. This can be achieved by making an initial deposit, which would depeg the 1:1 initial ratio between the sthAPT_supply and the thAPT_staking amount due to the staking fee. After this point, the attacker can continue making progressively larger deposits into the pool, resulting in zero minted sthAPT, further inflating the price.
Low Findings
Reference Pool Manipulation
Severity: Low
Ecosystem: Sui
Protocol: Mysten Deepbook
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description: add_deep_price_point relies on a reference pool to obtain a mid_price, which is then used to update the deep price of a target pool. A potential vulnerability arises if the reference pool is unregistered or has an empty order book, allowing malicious actors to manipulate the mid_price. This manipulation could lead to the addition of incorrect deep price points to the target pool, significantly overvaluing or undervaluing the deep price. Such a situation could negatively impact traders and compromise the integrity of the pool.
No Reentrancy Guard on Swap
Severity: Low
Ecosystem: Sui
Protocol: Bluefin Spot
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2024
Description:
In pool, there is a lack of a reentrancy guard during flash swap operations, allowing potential reentrant calls to be made via other functions, which might result in the manipulation of the pool values.
Inconsistency in Maintaining One-to-One Peg
Severity: Low
Ecosystem: Aptos
Protocol: Thala LSD
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
The 1:1 peg between thAPT and staked APT may break due to the unrestricted burning burn_from_thapt, and while reconcile may mint thAPT to restore the peg, it also enables arbitrary supply manipulation.
Payouts round down
Severity: Low
Ecosystem: Aptos
Protocol: Tortuga Liquid Staking
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Tortuga Liquid Staking - Zellic Audit Report.pdf
Report Date: Oct 2022
Description:
It is possible to perform an economically impractical, griefing-style attack that abuses the rounding down behavior of mul_div in disperse_all_payouts to ensure only those with a relatively high number of shares can receive a payout:

If the reserve_balance is low enough, delegators with few shares would receive zero payout while delegators with many shares would receive some. Dust is refunded to the reserve at the end of disperse_all_payouts, meaning repeated, quick calls to disperse_all_payouts would result in only high-value delegators getting payouts. Impact Malicious, high-value delegators (i.e., those with many shares) could cause lowervalue delegators to not receive any payouts.
Input Validation - Overview
Missing or weak checks on user input leading to invalid or malicious state changes.
| Input Validation | Findings |
|---|---|
| Critical | 16 |
| High | 29 |
| Medium | 34 |
| Low | 91 |
| Total | 170 |
Critical Findings
Fake Openings Lead to Malicious Withdrawal of Pool Fees and Funds
Severity: Critical
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
If the user opens a position with very large values (only by passing parameters, without actually adding liquidity), the bin’s fee growth global will be inflated. The first user can then exploit the difference between the position’s fee growth entry and the inflated global value to drain funds from the pool.
Incorrect message signature verification parameters
Severity: Critical
Ecosystem: Supra Chain
Protocol: Dexlyn Hyperlane
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-hyperlane-monorepo-dec2024/
Report Date: Dec 2024
Description:
The code implementation uses an incorrect parameter combination in the signature verification process. The verify function in move/isms/sources/multisig_ism.move is using msg_utils::nonce(message) instead of the proper merkle_index when generating the signed digest bytes, which would cause signature validation to fail.
Additionally, the merkle_index was being extracted incorrectly as raw bytes rather than being properly converted to a u32 value.
Tolerance Check Bypass on Forced Withdrawal
Severity: Critical
Ecosystem: Sui
Protocol: Aftermath Market Making
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description: A malicious user may intentionally set min_expected_balance_out to an unrealistically high value that the vault cannot satisfy, effectively locking the withdrawal session. The user can then trigger a forced withdrawal, bypassing default constraints on withdrawal processing and resulting in vault losses. This feature also triggers market orders on all positions.
Absence of Generics Checking
Severity: Critical
Ecosystem: Binance Smart Chain
Protocol: AquaSwap
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/AuquaSwap-Audit-/blob/Wallet/Audit%20report.md
Report Date: July 2024
Description: The revoke_trade<BaseTokenType> function does not assert that the inputted generic type matches the base_type TypeInfo stored on the Trade resource. An attacker could drain liquidity from the AMM by placing a limit trade order, canceling it, and passing an incorrect token type.
Signature Length Validation
Severity: Critical
Ecosystem: Sui
Protocol: Bluefin
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description: Extra bytes in signature_bytes can alter the computed hash, leading to incorrect digest values and potentially causing incorrect validation if rewards have been previously claimed.
Missing UID Validation
Severity: Critical
Ecosystem: Sui
Protocol: Bluefin
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description: Missing validation of UIDs allows attackers to use invalid or forged BankV2 objects, potentially minting shares at lower price, resulting in a loss of funds.
Loss of Coin
Severity: Critical
Ecosystem: Sui
Protocol: Cetus
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description: The limit_order::repay_flash_loan function lacks a check to verify that the order_id in the receipt matches the ID of the limit order. An attacker can manipulate the order_id, resulting in loss of coins.
Loss Of Funds In Lending
Severity: Critical
Ecosystem: Sui
Protocol: Navi
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description: All functions in lending.move lack validation on the Coin Type, allowing attackers to use incorrect coin types and causing loss of funds through incorrect asset calculations.
Bid with Zero Input Causing DOS
Severity: Critical
Ecosystem: Sui
Protocol: MoviePass Exchange
Auditor: Cetora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/03_02_2025_MoviePass_MSX-MR.pdf
Report Date: Feb 2025
Description: A bid with a 0-value input can cause the entire dispersal phase to fail if the split(0) operation reverts. A single 0-value bid entering the disperse function can cause a denial-of-service by failing all subsequent withdrawals.
Missing Asset-Type Validation in repay_add_liquidity Allows Wrong Token Repayment
Severity: Critical
Ecosystem: Sui
Protocol: Dexlyn
Auditor: HackenProof
Report: https://hackenproof.com/audit-programs/dexlyn-smart-contract-audit-contest?tab=reports
Report Date: Sep 2025
Description: The repay_add_liquidity function accepts repayment with arbitrary fungible assets without verifying they are the pool's configured tokens. This allows attackers to provide wrong tokens and still satisfy liquidity repayment, corrupting pool reserves.
repay_flash_swap accepts arbitrary token types, enabling theft of pool assets
Severity: Critical
Ecosystem: Sui
Protocol: Dexlyn
Auditor: HackenProof
Report: https://hackenproof.com/audit-programs/dexlyn-smart-contract-audit-contest?tab=reports
Report Date: Sep 2025
Description: The repay_flash_swap function lacks token type validation, allowing the pool to accept repayment with arbitrary token types and enabling theft of real assets from the pool.
Unchecked reward asset during reward claim allows withdrawing the wrong token from pool reserves
Severity: Critical
Ecosystem: Sui
Protocol: Dexlyn
Auditor: HackenProof
Report: https://hackenproof.com/audit-programs/dexlyn-smart-contract-audit-contest?tab=reports
Report Date: Sep 2025
Description: The reward-claim function trusts a user-supplied asset_addr when transferring owed rewards instead of enforcing the configured rewarder asset for the given rewarder_index. An LP with accrued rewards can claim in asset A or B (or any fungible asset the pool holds), draining pool reserves by up to the owed amount per claim.
Lack of Validation for target_amount and tokens_to_sell in create_campaign
Severity: Critical
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: Missing validation for target_amount and tokens_to_sell can lead to 0 values due to precision issues, causing failure to claim tokens or locking assets indefinitely.
Function can't be called
Severity: Critical
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: The claim_refund function cannot be called because the parameter Vault<TI, TR> cannot be passed, preventing users from retrieving their tokens.
Function Parameter Error
Severity: Critical
Ecosystem: Sui
Protocol: Cetus Concentrated
Auditor: MoveBit
Report Date: Mar 2023
Description: The cross_by_swap function parameters are entered in the wrong order, causing the swap result to be calculated incorrectly due to the coding error.
Missing Type Check While Placing Order
Severity: Critical
Ecosystem: Aptos
Protocol: Econia
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2022
Description:
In the functions market::place_market_order and market::place_limit_order(), when placing an order, there is no type verification against the original market types. Usually, the market should only allow orders of the same type, but this check was not enforced while placing an order. This would allow attackers to use incorrect coin types against the market, transferring coins of an incorrect type.
High Findings
take_reward_from_close_position_cert() Can Use Rewards From Other Pools To Pay Rewards Of Position Certificate
Severity: High
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
When positionInfo is taken out in close_position() and stored in ClosePositionCert , it does not verify which pool the positionInfo comes from. Therefore, in take_reward_from_close_position_cert() , it is possible to pass in a different pool from the one used in close_position() and consume rewards from that pool to pay the rewards required by the ClosePositionCert.
check_merge_allowed Validation Can Be Bypassed
Severity: High
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
VeTokens created with BOND_MODE_MAX_BOND mode in different epochs can improperly pass the check_merge_allowed validation. For example, if a primary VeToken was created in epoch 1, its unbond_at would be set to epoch 210. If another VeToken created in epoch 3 (with unbond_at at epoch 212) attempts to merge with it, the validation at ve_token.move#163 would incorrectly allow the merge.
Missing Input Validation in Admin Functions
Severity: High
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
Several administrative functions in market.move and model.move lack proper input validation for critical parameters, which could affect system stability and functionality. While these functions are admin-only, incorrect parameter values could significantly impact market operations.
Missing Treasury Cap Validation in Vault Initialization
Severity: High
Ecosystem: Sui
Protocol: SatLayer Sui
Auditor: Asymptotic
Report: https://info.asymptotic.tech/satlayer-audit
Report Date: Mar 2025
Description: The initialize_vault function accepts a TreasuryCap<K> parameter for minting receipt tokens when users deposit tokens of type T into the vault. However, there is no validation to ensure that this treasury cap hasn't been previously used to mint tokens.
DeleteAccount does not but should check if account_id is used in some policy
Severity: High
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description: This may lead to policies which are more permissive than intended. For example, we could have a sequence of rules:
- For all vaults in an account, check some condition
- If the above fails, automatically approve
Now a deleted account could still have the above executed despite the account being deleted.
Duplicate Feed IDs in Data Packages Allow a Single Signer to Override Others
Severity: High
Ecosystem: Sui
Protocol: RedStone
Auditor: Hacken
Report: https://hacken.io/audits/redstone/sca-redstone-finance-sui-connector-feb2025/
Report Date: Feb 2025
Description:
The process_payload function does not enforce the uniqueness of feed_id values within a single data package. This allows a single signer to submit multiple values for the same feed ID, which can influence the oracle value. Since calculate_median aggregates values without verifying uniqueness per signer, an attacker who obtains valid signatures ahead of time can modify the oracle value.
Lack of Minimum Liquidity Constraint
Severity: High
Ecosystem: Sui
Protocol: Solend Steam
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description: Insufficient minimum liquidity may expose the protocol to inflation attacks, enabling malicious actors to manipulate the value of bToken. If bToken value exceeds a 1:1 ratio, burning bToken and increasing the underlying token amount can trigger zero mint on user deposits, causing losses.
Inconsistencies Due to Zero Share Amount Value
Severity: High
Ecosystem: Sui
Protocol: Mysten Walrus
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description: The staking_inner::request_withdraw_stake function does not explicitly prevent withdrawal requests with a share_amount of zero. This oversight allows malicious users to manipulate the staking pool's share-to-asset ratio by withdrawing a small principal or leaving it, potentially causing denial of service.
Unfair Rewards via Incorrect Supply Pool Instance
Severity: High
Ecosystem: Sui
Protocol: Kuna Labs
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2025
Description: If a user borrows from SupplyPool<X, SX0> to create a position, a malicious liquidator can exploit this by passing a different SupplyPool instance than the one used when the position was created, enabling extraction of extra rewards.
Trade Proof Bypass
Severity: High
Ecosystem: Sui
Protocol: Mysten Deepbook
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description: If balances_in and balances_out are equal, the trade proof can be bypassed, allowing invalid trades to be executed without proper validation.
Bypass of the id_leak_verifier stage of suiverifier may occur
Severity: High
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: Capabilities can be added during upgrades, potentially bypassing the id_leak_verifier stage of suiverifier, allowing unauthorized modifications to the protocol.
Pending Order Fee Tokens not Tied to Valid Tokens
Severity: High
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description: The fee token can be a fake coin minted by the attacker. When a pending order executor comes to execute the pending order, they receive the fake fee instead of the real token, causing losses to the executor.
May Be Wrong Parameters In flash function
Severity: High
Ecosystem: Sui
Protocol: FlowX Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/FlowX-Final-Audit-Report.pdf
Report Date: May 2024
Description: Multiple issues exist in the flash function: (1) if borrowed money exceeds existing pool funds, it automatically borrows the available amount instead of the requested amount; (2) the handling fee is calculated from user input rather than actual borrowed amount; (3) the FlashReceipt uses input parameters rather than actual output values, potentially causing repayment to fail with large losses.
Lack of Validation for the Generic Parameter CoinType
Severity: High
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: Jul 2023
Description: All functions in lending.move lack CoinType validation. Incorrect CoinType parameters cause incorrect asset calculations in Storage, potentially preventing the entire contract from functioning properly.
Lack of Validation for Campaign and Whitelist ID in invest function
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: The invest function lacks checks for campaign or whitelist ID, allowing users from one whitelist to participate in another campaign, bypassing access controls.
Lack of Validation for Funding Status in fund function
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: The fund function lacks a "fund already full" check, allowing multiple funding transactions. However, upon distribution, only a fixed amount can be distributed.
Lack of Parameter Check
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description: In the withdraw function, penalty calculation may exceed lock.amount, preventing users from withdrawing their stake coins.
Lack of Market Version Check
Severity: High
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description: The set_reserveconfig_obj function doesn't check for market version, which may result in incorrect market information being set or used.
Missing Market Checks
Severity: High
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description: The liquidate function may cause the market to not match the current profile due to missing validation checks.
PackMessage is not bound to token type
Severity: High
Ecosystem: Sui
Protocol: MiniMiners
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mini-Miners-Contract-Audit.pdf
Report Date: Apr 2023
Description: PackMessage only checks the number and not the token type, allowing users to exchange different coin types provided that the game ID has corresponding coin types available, enabling token swaps without proper validation.
Missing Zero Check for Added Liquidity
Severity: High
Ecosystem: Sui
Protocol: Sui AMM
Auditor: MoveBit
Report Date: Nov 2022
Description: The liquidity addition function does not check for adding zero liquidity, allowing users to lose their X and Y coins without receiving CoinLP<X,Y> tokens in return.
Incorrect Integer Parsing
Severity: High
Ecosystem: Aptos
Protocol: Echelon
Auditor: Zellic
Report Date: Apr 2025
Description:
The parse_deposit_payload function has a bug in how it handles integer-value parsing. Solidity stores integer values in big-endian format (most significant byte first, reading right to left). The from_bcs module parses integers in little-endian format (least significant byte first, reading left to right).
Nonexistent Token Pair
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
In the function swap_v2::swap_exact_fee_to_apt(), it attempts to retrieve information about <TokenPairMetadata<X, APT>>. However, under normal circumstances, such information doesn't exist unless created using the create_pair() function. Doing so would entail creating pairs for all tokens with APT, which clearly doesn't align with logic. <TokenPairReserve<X, APT>> faces a similar issue.
Token Extraction Mismatch in Fee Distribution Logic
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The function swap_v2.distribute_dex_fees() is used to ensure proper distribution of DEX fees, regardless of the input token. In the case where type_info::type_of
Unexpected Coin Value (Property 2 Not Hold)
Severity: High
Ecosystem: Aptos
Protocol: Liquidswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/Pontem-Liquidity-Swap-Formal-Verification-Audit-Report.pdf
Report Date: Apr 2024
Description:
The property 2 requires: The coin_x and coin_y of a pool should both be zero (at its initial state) or both be nonzero. The coin_x and coin_y after any operation should not be zero for a non-empty pool. swap_inner, mint, burn, flashloan, pay_flashloan function have violated this property.
Unexpected Coin Value (Property 2 Not Hold)
Severity: High
Ecosystem: Aptos
Protocol: Pontem
Auditor: MoveBit
Report: https://movebit.xyz/reports/Pontem-Liquidity-Swap-Formal-Verification-Audit-Report.pdf
Report Date: Apr 2024
Description:
The property 2 requires: The coin_x and coin_y of a pool should both be zero (at its initial state) or both be nonzero. The coin_x and coin_y after any operation should not be zero for a non-empty pool. swap_inner, mint, burn, flashloan, pay_flashloan function have violated this property.
Wrong Type Parameter
Severity: High
Ecosystem: Aptos
Protocol: vibrantX
Auditor: MoveBit
Report: https://movebit.xyz/reports/vibrantX-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
The type parameter Token4 received by the get_weighted_reserves function is not passed to the weighted_pool::pool_balances_and_weights function, and there is a duplicate of the type parameter Token, so make sure this is by design.
Disabling Withdrawals by Withdrawing Zero-Value FA
Severity: High
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
The ds_token module relies on an invariant that withdrawals must be coupled with deposits. The system tracks the number of active withdrawals utilizing the WithdrawCount resource, ensuring that multiple withdrawals will not coincide (as enforced by assert_withdraw_count ). However, via dispatchable_fungible_asset::withdraw , a user may withdraw a zero-value fungible asset (FA). Since this FA has a value of zero, it does not represent any meaningful asset transfer. Still, the WithdrawCount is incremented to reflect that a withdrawal has occurred.
Utilization of Proper Assertions for Wallet Creation
Severity: High
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
registry_service::add_wallet directly utilizes create_primary_store to create a new primary store for a specified wallet_addr . However, this function will fail if the address already has a primary store. Thus on calling add_wallet or add_wallet_by_investor , if the wallet already has a primary store it will not be added and the execution will fail. Additionally, there is an incorrect assertion in add_wallet_by_investor, which verifies if wallet_addr is a special wallet, unintentionally allowing only special wallets to be added. This behavior may expose the system to risks. The intended functionality, however, is to prevent the registration of special wallets. Therefore, the assertion should check that wallet_addr is not a special wallet. A similar assertion should also be added to add_wallet to prevent the registration of special wallets.
Medium Findings
Position Boundary Check Bypass Vulnerability
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
First, look at the new_open_position_cert function: Here, the position's lower_bin_id and upper_bin_id are indeed set correctly. Then look at the open_position_on_bin function: Here, it only checks whether bin_id is equal to next_bin_id , but does not check whether bin_id is within the range of position's lower_bin_id and upper_bin_id .
Dead Position Risk
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
When width == 0 in new_open_position_cert , a position with lower_bin_id > upper_bin_id is created. Later, in functions like remove_liquidity , the check in_bin_id.gte(position.lower_bin_id()) && max_bin_id.lte(position.upper_bin_id()) always fails. This leads to irreversible locked positions, permanently trapping user funds.
Missing Position-Pool Matching Validation in add_liquidity and remove_liquidity Functions
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
The add_liquidity and remove_liquidity functions in sources/pool.move lack validation to ensure that the provided position belongs to the specified pool.
The BOND_MODE_MAX_BOND lock creation is practically unusable due to mismatched checks
Severity: Medium
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The BOND_MODE_MAX_BOND creation path requires unbond_at == clock.timestamp_ms() + ve _mmt.vp_config().max_bond_epochs() * ve_mmt.ep_config().epoch_interval_ms(), while user creation requires is_epoch_start(unbond_at). Since “now” rarely equals an epoch start, valid inputs often fail. The helper view returns an unrounded timestamp, compounding the issue.
Missing Validation for tick_spacing in add_fee_tier
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The add_fee_tier function in config module does not validate the tick_spacing parameter, allowing callers to set arbitrarily large values.
A very large tick_spacing significantly reduces tick density across the price range. In concentrated liquidity models like CLMM, this results in extremely coarse or even absent liquidity across wide price intervals, leading to inefficient pricing and degraded trading performance.
Missing Referral and Fee Rate Validation
Severity: Medium
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The admin functions set_referral_rate and set_fee_config lack proper input validation for fee rates. While fee_rate has a 100% limit (which seems too high), referral rates are completely unlimited. This allows setting arbitrary referral rate percentages without bounds (e.g., above 100%), which may cause transactions to revert during position operations.
Additionally, setting referral rates higher than fee rates could negatively impact users who utilize the referral system.
Missing Input Validation for Position Orders
Severity: Medium
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The open_position and decrease_position functions lack essential input validation when creating orders. For example, users can create open orders with zero collateral or zero open_amount, while position decrease orders have no validation for decrease amounts or leverage limits. These missing validations allow the creation of meaningless orders that waste system resources and may lead to unexpected behavior during execution.
Maximum Position Collateral Validation Inconsistency
Severity: Medium
Ecosystem: Supra
Protocol: Dexlyn Perp DEX
Auditor: Hacken
Report: https://hacken.io/audits/dexlyn/sca-dexlyn-perp-dex-jul2025/
Report Date: Sep 2025
Description:
A significant validation inconsistency exists between the order placement and execution phases regarding maximum_position_collateral enforcement. While validation correctly checks total projected collateral against the limit, execution only validates the post-fee collateral delta, allowing positions to exceed configured maximums when governance parameters change between order placement and execution.
Mismatched Array Lengths in Admin Messages Can Lead to State Corruption or Denial of Service
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description:
The system relies on privileged, off-chain administrators to configure its core parameters, such as which tokens are supported and what routes are active. This is accomplished via signed messages created by the create_add_tokens_on_iota_message and create_add_routes_on_iota_message functions in the bridge::message module. These functions accept several parallel vectors of data (e.g., token_ids, token_type_names, token_prices) which are then encoded into a message payload. This message is subsequently processed on-chain by the execute_add_tokens_on_iota and execute_add_routes_on_iota functions, which decode the payload and update the bridge's state.
The message creation functions (create_add...) fail to validate that the parallel vectors provided as input have identical lengths. A malicious or mistaken administrator can therefore craft a syntactically valid message with mismatched array lengths (e.g., providing 3 token IDs but only 2 prices). When the bridge attempts to process this malformed message, the transaction will abort due to an out-of-bounds error, leading to a Denial-of-Service (DoS) that prevents any administrative updates. This could trap the bridge in a misconfigured or paused state indefinitely.
Artificially Low Asset Price Leads to Rate-Limiter Bypass
Severity: Medium
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description:
The notional_value<T>() is fetched directly from the treasury module. The issue is that the function for setting this price, update_asset_notional_price, does not validate its input. It is called by execute_update_asset_price in bridge.move, which is in turn only callable via a committee-signed execute_system_message. If the committee sets an artificially low price for a high-value asset, the hourly transfer limits for that asset become ineffective.
Manipulated Initial Data Package Can Skew Timestamp Validation
Severity: Medium
Ecosystem: Sui
Protocol: RedStone
Auditor: Hacken
Report: https://hacken.io/audits/redstone/sca-redstone-finance-sui-connector-feb2025/
Report Date: Feb 2025
Description: The process_payload function extracts the timestamp from the first package in parsed_payload after filtering packages by their feed ID and extracts these packages. However, the package_timestamp function uses the first package's timestamp for other packages in the payload. This creates a risk because an attacker can insert a fake initial package with an incorrect timestamp, bypassing proper validation.
Insufficient Validation of Price Source Independence
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the determine_price function , the code calculates the required number of secondary matches using:
let required_secondary_match_num = (secondary_price_feed_num + 1) / 2;
However, there is no check to ensure that required_secondary_match_num > 0 . Additionally, in the upper-level function confirm_price_update_request , there is no validation to ensure that the primary_price_update_request and secondary_price_update_request originate from distinct sources.
Lack of Validation for Price Value in get_price function
Severity: Medium
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
Missing 0 check can lead to incorrect calculations and impact other functions.
Parameter Check for Creating Dutch
Severity: Medium
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: Apr 2023
Description:
Parameters like decay_speed should not be zero, and time-related values must be logically consistent (e.g., start_ms < end_time_ms and end_time_ms should be greater than the current time).
Can Create Pools With Same Type
Severity: Medium
Ecosystem: Sui
Protocol: MovEx
Auditor: MoveBit
Report Date: Apr 2023
Description:
create_pool function doesn't check if pool type was already created which will lead to duplicate pools. Depth of each pool is not large enough and will cause slippage.
Create Pools with same Coin Type
Severity: Medium
Ecosystem: Sui
Protocol: MovEx
Auditor: MoveBit
Report Date: Apr 2023
Description:
You can create a pool with two of the same token.
Multiple related functions do not limit the empty Vector
Severity: Medium
Ecosystem: Sui
Protocol: Sui AMM swap
Auditor: MoveBit
Report Date: Nov 2022
Description:
The functions multi_add_liquidity, multi_remove_liquidity, and multi_swap first use the pop_back function for coins_in and lp_coin in the code to pop up the last element of the vector, but this does not judge that the length of the vector is 0.
Lack of Input Validation
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: Jun 2023
Description:
reserve_ratio is not checked to ensure it is not greater than 100 when updating reserve_config.
The addition of reserve is missing validation
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: Jun 2023
Description:
add_reserve lacks input validation — should include an assertion to prevent adding the same coin to the reserve. The client acknowledged this but deemed it a non-issue.
Validation is Required Before Deleting reserve_addr
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: Jun 2023
Description:
Check if reserve_addr exists, then proceed with delete.
ID occupied causes program termination
Severity: Medium
Ecosystem: Sui
Protocol: Mango
Auditor: ExVul
Report Date: July 2025
Description:
The new_bridge_pair funciton in config.move does not strictly enforce the relationship between the provided id and the internal pair_id counter.
strategy_type missing check
Severity: Medium
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
add_collateral and work functions both use strategy_type parameter to execute different logic. However, add_collateral lacks a check of strategy_type.
current_time not checked
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
In get_ref_fee_rate, current_time does not check it is the current time.
Missing tick in range check
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
get_sqrt_price_at_tick function does not check if tick is in range, some ticks out of range pass.
Create pool with two same CoinTypes
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
A pool can be created between CoinA and CoinA, which is redundant.
Missing Check for Sequence Number
Severity: Medium
Ecosystem: Sui
Protocol: Walrus Contracts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
While there is validation for the blob ID, there is no validation for the ending checkpoint sequence number. As a result, the value provided by a quorum-reaching node gets recorded in the state. If an incorrect number is entered, it causes a mismatch between the event blob being processed by the node and the on-chain tracking.
Exceeding Object Size Limit
Severity: Medium
Ecosystem: Sui
Protocol: Walrus Contracts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
In staking_pool, if the StorageNodeInfo.{name,network_address} field is set to an excessively long value by the node owner, it may contribute significantly to the total size of the StakingPool object. This may restrict the addition of new values to pending_shares_withdraw, thereby blocking stakers from making withdrawals.
Missing Commission Rate Check
Severity: Medium
Ecosystem: Sui
Protocol: Walrus Contracts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
There is no check to ensure that the commission rate is less than or equal to 10000, an ENotEnough error may occur in staking_pool::advance_epoch when the node becomes part of the committee.
Duplicate Entries
Severity: Medium
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description:
register_rider and register_driver allows the creation of multiple rider or driver objects with the same address, resulting in duplicate entries. Both register_rider and register_driver create a new rider or driver objects without checking whether an object with the same address already exists, resulting in multiple objects with the same address.
Signature Forgery
Severity: Medium
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description:
In the context of the drife_app::request_ride, the signature includes a parameter city: String after the address to allow the user to set the city name. However, this string may become any value, even to the operation name. Attacker can forge signature by manipulating this field.
Missing TransactionPayload Type Validation
Severity: Medium
Ecosystem: Aptos
Protocol: MSafe
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
The TransactionPayload struct contains the payload and its type. Aptos supports payloads of type: • WriteSet • Scripts • ModuleBundle • EntryFunction
The payload in theTransactionPayloadstruct can be any transaction type, not justEntryFunction. This assumption should be validated. For example, many internal functions such as register payload validation assume the layout of the TransactionPayload is a EntryFunction.
Missing Chain ID Validation
Severity: Medium
Ecosystem: Aptos
Protocol: MSafe
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Transactions can be replayed from one chain to another if this field isn’t properly validated. In the context of a multisig, the transaction can be added but will fail at execution. Nonetheless, this represents a potential UX risk and is worth remediating. Validate chain_id in the validate_txn_payload function.
Lack Of Check For Forbidden IDs
Severity: Medium
Ecosystem: Sui
Protocol: Maven
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2023
Description:
Update admin policy could be set to forbidden ID, ensure check beforehand.
Users may set a TTL value that does not follow the maximum TTL limit
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Labs Sui
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
Users may assign invalid TTL values to their domain names, enforce limit.
Low Findings
Missing Zero-address Validation for reward_address Before Transferring
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In several admin withdrawal functions, including: take_revenue, take_borrow_fee, and take_staking_fee. The code transfers fee/revenue tokens directly to admin_cap.reward_address without verifying that it is a valid (non-zero) address.
Missing Zero-amount Checks in Fund-handling Functions
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
Several functions related to fund operations—such as deposit_collateral , withdraw_collateral , borrow_flash_loan , repay_flash_loan , liquidate accept an amount parameter as input but do not verify that the value is greater than zero.
Missing Zero-amount Checks in redeem_gusd
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In redeem_gusd , the GUSD amount is converted to USDC. Currently, only amount_gusd > 0 is checked. For small amount_gusd (<1000), amount_usdc_before_fee becomes 0, but there is no check to prevent zero-value USDC.
Missing Debt Check Before Repayment
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
The repay function does not verify that the user has a positive outstanding debt before proceeding.
Missing Validation Checks in Allocation Deserialization
Severity: Low
Ecosystem: Sui
Protocol: Magna Airlock
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Magna Airlock - Zellic Audit Report.pdf
Report Date: Nov 2025
Description:
The deserialize_allocation() function performs BCS deserialization of allocation data without validating the integrity of the deserialized values. This creates multiple denial-of-service vectors that will manifest at withdrawal time rather than at merkle root creation time.
Missing validations:
- Calendar schedule: No check that unlock_timestamps and unlock_amounts arrays have equal length
- Interval schedule: No check that period_length > 0 or number_of_periods > 0
- Amount consistency: No check that allocation.amount matches sum of unlock amounts or piece amounts
- Array bounds: No maximum size limits on timestamps/amounts/pieces vectors
Missing Validation For Token Decimals
Severity: Low
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The register_pool function in the stake.move module allows users to register a new staking pool by providing the stake and reward tokens along with their corresponding decimal values. These decimal values are used to compute a scale factor for accurately calculating accumulated rewards.
Lack of Zero-Value Validation in update_route_limit() Allows Setting Invalid Rate Limits
Severity: Low
Ecosystem: IOTA Mainnet
Protocol: Echo Protocol Bridge
Auditor: Hacken
Report: https://hacken.io/audits/echo-protocol/sca-echo-protocol-bridge-iota-jul2025/
Report Date: Aug 2025
Description:
The bridge module enables bridging assets from an EVM to IOTA. To prevent abuse, it enforces a per-route hourly transfer rate limit. If a transfer exceeds this limit, it is rejected, and a TokenTransferLimitExceed event is emitted.
Smokescreen/log flooding on deposit
Severity: Low
Ecosystem: Sui
Protocol: Bluefin RFQ
Auditor: Asymptotic
Report: https://bluefin.io/blog/doc/bluefin_rfq_audit.pdf
Report Date: Feb 2025
Description:
There is no privilege check and no minimum amount for depositing, so an attacker could induce a very large number of Deposit events cheaply.
set_manager should also have a zero-address check
Severity: Low
Ecosystem: Sui
Protocol: Bluefin RFQ
Auditor: Asymptotic
Report: https://bluefin.io/blog/doc/bluefin_rfq_audit.pdf
Report Date: Feb 2025
Description:
create_rfq_vault check that the manager is not set to the zero address: assert!(manager != @0, EZeroAddress);
set_manager should also have this check.
Missing Withdrawal Time Validation
Severity: Low
Ecosystem: Sui
Protocol: SatLayer Sui
Auditor: Asymptotic
Report: https://info.asymptotic.tech/satlayer-audit
Report Date: Mar 2025
Description:
The withdrawal_time parameter, which defines the cooldown period between a withdrawal request and the actual withdrawal execution, lacks proper validation in both initialize_vault and update_withdrawal_time functions. Without appropriate bounds checking, the cooldown period could potentially be set to an unreasonably high value, effectively preventing users from accessing their funds for extended periods. Additionally, setting a zero cooldown period would make the two withdrawal functions call redundant, so consider to forbid zero cooldown as well.
Insufficient Fee Validation in Position Orders
Severity: Low
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The open_position and decrease_position functions accept fee coins as payment for order execution. While this fee is intended to incentivize executors to process orders, there are no validation checks to ensure the fee is sufficient or even non-zero. This creates a risk where orders with inadequate fees may remain permanently unexecuted in the orders list, as executors would have no economic incentive to process them if the fee is below their operational costs.
Missing Zero Value Check in decrease_reserved_from_position
Severity: Low
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The decrease_reserved_from_position function does not validate that the decrease_amount parameter is non-zero.
Missing Position Validation in Pool Module Functions
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The protocol implements the validate_pool_position function specifically to ensure a position belongs to the pool it's interacting with, but this validation is applied for add_liquidity_* functions only.
Version Validation in update_package_version
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The update_package_version function in the config module allows setting any value, including older or identical versions. This can lead to unintended downgrades or redundant updates, potentially causing compatibility or versioning issues.
Additionally, the lack of a public getter for package_version makes it difficult to verify the current version for external callers or before performing updates.
Missing Parameter Checks
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
During operations such as merge and extend in user_v1.move, it is advisable to add checks for the validity of user-input parameters. This prevents users from unnecessarily consuming gas due to incorrect parameters. extend() No validation that new_unbond_at is greater than old_unbond_at . merge() No validation that only one VeToken is staked between primary and merged.
Missing Input Validations in Swap Simulation Functions
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The compute swap result and get optimal swap amount for single sided liquidity functions do not check that pool::sqrt price(pool) != 0 or that sqrt price limit is within valid min/max and current price bounds. As a result, these functions may abort unexpectedly or return incorrect results if called with invalid inputs. Additionally, get optimal swap amount for single sided liquidity does not verify that the provided position actually belongs to the specified pool.
Missing Input Validation and Code Duplication in Liquidity Math
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The liquidity math module functions get liquidity for amounts and get amounts for liquidity do not validate that sqrt price lower ¡ sqrt price upper, which can result in incorrect calculations. Additionally, liquidity math::get amount x for liquidity and liquidity math::get amount y for liquidity contain identical logic to sqrt price math::get amount x delta and sqrt price math::get amount y delta respectively. The liquidity math versions are never called in the codebase.
Missing Pool Token Type Check
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: MoveBit
Report Date: Nov 2025
Description:
When creating a pool, the token type is not checked, which allows pools with the same token type to be created.
Missing Validation and Performance Optimization in add group if absent
Severity: Low
Ecosystem: Sui
Protocol: Cetus CLMM
Auditor: Asymptotic
Report: https://drive.google.com/drive/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
The function add group if absent accepts group index without validation and can create bins with IDs outside the valid range. The public wrapper in the pool module exposes this to external callers without additional checks. Additionally, for each new group, the function creates 16 bins by calling default bin → get price from id → pow(base, bin id) sixteen times. This performs 16 expensive exponential calculations.
No Bounds Validation in set min reward duration
Severity: Low
Ecosystem: Sui
Protocol: Cetus CLMM
Auditor: Asymptotic
Report: https://drive.google.com/drive/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
The function set min reward duration in the config module accepts any u64 value without validation. When min reward duration is set to a value near max u64, subsequent calls to add reward will abort as there is no such end time to calculate duration ≥ min reward duration. There is also no upper bound on reward duration in add reward, allowing managers to create reward periods spanning decades or centuries. This effectively locks reward tokens for impractically long periods, reducing capital efficiency and creating zombie rewards that will never realistically complete their emission schedule.
Missing Input Validation in bin id from score
Severity: Low
Ecosystem: Sui
Protocol: Cetus CLMM
Auditor: Asymptotic
Report: https://drive.google.com/drive/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
The public function bin id from score converts a score to a bin ID without validating the input, creating an asymmetry with its inverse function bin score which enforces strict validation.
Inconsistent Validation in pool::add reward
Severity: Low
Ecosystem: Sui
Protocol: Cetus CLMM
Auditor: Asymptotic
Report: https://drive.google.com/drive/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Nov 2025
Description:
The pool::add reward function is responsible for adding rewards to the pool, but it exhibits several inconsistencies. Managers (reward manager role) can bypass critical validations that non-managers must follow. This could lead to inconsistencies if manager actions deviate from expected standards. Start time validations differ between pool and reward manager levels, causing uncertainty about the correct requirements. Neither pool::add reward nor reward::add reward validates that the reward amount is greater than zero
Missing Validation for Length Consistency of bins amounts_a and amounts_b in add_liquidity
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
In the pool.move file, the add_liquidity function takes three vector parameters: bins, amounts_a, and amounts_b, and uses them within a loop. Unlike the open_position function, the add_liquidity function does not validate whether the lengths of these three vectors are consistent. The open_position function includes an explicit check.
Insert Range Check In Utils
Severity: Low
Ecosystem: Sui
Protocol: Maven
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2023
Description:
In utils.move, vector_slice should return the subslice of the vector, starting at the start index and ending at the end index. However, there is no check to ensure that end is higher than start; in this case, the function returns an empty vector.
Incorrect checks result in the absence of verification of the invariant
Severity: Low
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: In voting_power.move, check_invariants checks the enforcement of invariants after setting the voting power. However, the first if statement compares stake_i with itself instead of stake_j, not checking the invariant.
Insufficient checks for the order of genes
Severity: Low
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: definitions_from_bcs should ensure the correct order of genes. Otherwise, if definitions are set in an incorrect order, receiving parts of the value becomes impossible.
Erroneous checks allow the user to create an invalid discount code
Severity: Low
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
In remove_later::deserialize_discount_code, the current validation for the discount code rate during deserialization is incorrect, as it only checks if the rate is greater than zero or less than three characters. The intended validation should verify that the rate is greater than zero and less than three characters.
Lack of validation in setting and retrieving default domain names
Severity: Low
Ecosystem: Sui
Protocol: MystenLabs Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
In registry.move, set_default_domain_name sets the value of the new default_domain_name, however, several checks are missing.
- The function does not check if new_default_domain_name exists or if the sender is its owner.
- The function only permits modifying the default domain name setting for subdomains of addr.reverse, leaving the field empty for all other domains.
- The default domain name still points to the same domain if the owner changes.
- The default domain name should not be accessible through any other public functions. However, registry::get_name_record_all_fields returns the default domain name without validation.
Prevent Zero Unstaking
Severity: Low
Ecosystem: Sui
Protocol: Aftermath LSD
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description:
When a user requests to unstake in order to exchange AFSUI for SUI, a PendingUnstakeRecord is stored in StakedSuiVaultStateV1::pending_unstake_records. During epoch_was_changed, process_pending_unstake_requests calculates the SUI amount from the AFSUI amount in the record based on the exchange rate. Due to the access to the dynamic field, field_request_counter increases, which raises the reward to be sent to the caller from the crank incentive pool. Therefore, allowing unstake for a zero amount causes the protocol to consume the crank incentive reward pool without generating any fees. This enables a malicious user to extend the crank process and exhaust the crank incentive pool.
Rebalance Security Checks
Severity: Low
Ecosystem: Sui
Protocol: Volo
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description:
native_pool::rebalance does not include calls to the assert_version and when_not_paused functions.
Inconsistencies In Object Creation
Severity: Low
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description:
add_stop creates a Stop object with the duration parameter and appends it to the ride.stops vector. However, it lacks cross-checking against existing stops, specifically concerning values like stop_started or stop_ended. Without proper validation, there is a risk that these values might conflict with other stops, resulting in unintended consequences during fare calculation or ride management.
Inadvertent Locking Of Tokens In Incorrect Chain
Severity: Low
Ecosystem: Sui
Protocol: Sui Bridge
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description: target_chain could be one that doesn’t accept tokens, which can then be locked.
Payload Size Limitation
Severity: Low
Ecosystem: Sui
Protocol: Sui Bridge
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Description: Payloads under 64 bytes cause an invalid target address msg, causing unclaimable tokens on Ethereum chain.
Signature Approval Flaw
Severity: Low
Ecosystem: Sui
Protocol: Sui Axelar(Gateway V2)
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description: The threshold represents the minimum combined weight required from validators to approve a message. Each validator in the signer set has an associated weight, which signifies its voting power or influence. Thus, in validate_signatures, if the threshold is set to zero, any number of signatures—regardless of the validators’ weights—will be sufficient for approval.
Minting of Zero LST
Severity: Low
Ecosystem: Sui
Protocol: Solend Liquid Staking
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
It is theoretically possible for sui_amount_to_lst_amount to return zero when the calculated lst_amount is a very small fraction due to the supply ratio. The function computes the LST amount by dividing total_lst_supply * sui_amount by total_sui_supply . If the sui_amount is very small compared to total_sui_supply , the result of the division may round down to zero. This is problematic because it implies that the user effectively receives no tokens in exchange for their staked assets.
Misalignment of Token Metadata
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Market Making
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
The issue arises from incorrect parameter ordering when calling coin::create_currency within create_vault_cap . create_currency defines the expected order of parameters as [ symbol , name ]. However, create_vault_cap passes the name parameter in place of symbol and the symbol parameter instead of name. As a result, the shorthand symbol and full name are reversed during token creation. A mismatch in expected token metadata will create confusion among users and external programs interacting with the token affecting the operational integrity of the program.
Missing Validator Set Integrity Checks
Severity: Low
Ecosystem: Sui
Protocol: Lombard Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
The current implementation of assert_and_configure_validator_set in Consortium lacks critical checks, which may allow invalid validator keys. The function does not check for duplicate validator public keys. There is no validation to ensure that the validator keys are correct and that each validator’s public key is exactly 65 bytes long.
Possible Zero Token Minted in mint_market_coin Function
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
If balance_sheet.cash + balance_sheet.debt is greater than balance_sheet.market _coin_supply and underlying_amount is relatively small, resulting in a mint_amount of 0. This can lead to a situation where the user deposits funds (underlying_balance), but no MarketCoin shares are minted, resulting in the user not receiving any shares for their deposit.
Lack of Range Checks for the create_risk_model_change
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
The function create_risk_model_change lacks reasonable range checks for collateral_factor, liquidation_factor, liquidation_penalty, and liquidation_discount. Even in a trusted role system, there still exists the possibility of inputting typos and creating the wrong risk_model for the markets.
Missing start_time Parameter Check
Severity: Low
Ecosystem: Sui
Protocol: Bucket Protocol
Auditor: MoveBit
Report Date: June 2023
Description:
In the vesting_lock module, the new function creates VestingLock and lacks the check of start_time. It is recommended to ensure that start_time is greater than or equal to the current time.
compute_weight May Be 0
Severity: Low
Ecosystem: Sui
Protocol: Bucket Protocol
Auditor: MoveBit
Report Date: June 2023
Description:
In the calculation of the compute_weight function, the value of stake_amount may be less than MAX_LOCK_TIME/lock_time, resulting in a return value of 0, and the user has no benefit.
remaining_redemption_amount May Not Be 0
Severity: Low
Ecosystem: Sui
Protocol: Bucket Protocol
Auditor: MoveBit
Report Date: June 2023
Description:
In the handle_redeem function, if the buck_input_amount can repay all the bottles, it may cause the remaining_redemption_amount to remain and not equal to 0. The restriction of the assert may be too strict, or add another judgment to determine whether all the bottles have been repaid.
Parameter Validation is Missing When Creating a PreSale
Severity: Low
Ecosystem: Sui
Protocol: TurboStar Smart Contract
Auditor: MoveBit
Report Date: May 2023
Description:
In the function create_presale(), there is a lack of validation for the parameters start_time and end_time . The start_time should be greater than or equal to the current time and less than the end_time . The functions increment_endtime() and increment_starttime() also have the same issue.
create_payoff_configs Parameter Verification
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
The parameter of create_payoff_configs does not limit the number in the vector must be greater than 0, if it is all empty, it may cause inaccurate calculation when activate_->calculate_max_loss_per_unit.
remove_bid Does Not Judge Whether the Address Exists
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
When the remove_bid function is called, it is not judged whether the address of the bidder exists, and an error will be reported if it does not exist.
Withdrawal and Repayment Lack of Validation for Zero Amounts
Severity: Low
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
When using the repay() function to repay debts, if the current user does not have any debt, the current logic saves tokens to the pool and then takes them out of the pool. We believe this operation is meaningless and can cause more gas losses. We recommend using an assert function to validate and block this transaction. Similarly, when using the withdraw () function, validation for whether the withdrawable amount is zero is missing.
Parameter Limit
Severity: Low
Ecosystem: Sui
Protocol: KriyaDEX
Auditor: MoveBit
Report Date: May 2023
Description:
The parameters scaleX and scaleY of the function create_pool may pose a risk if they are freely inputted by the user.
Lack of Validation for name and uri Parameters in execute_meta_info Function
Severity: Low
Ecosystem: Sui
Protocol: MSafe Maven
Auditor: MoveBit
Report Date: May 2023
Description:
When modifying the name and uri fields of the Maven struct, it is necessary to validate the name and uri parameters. The execute_meta_info function modifies the name and uri fields but does not perform validation.
Lack of Validation for Existing Whitelist Member
Severity: Low
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: May 2023
Description:
In the method add_investor, there is no check for the existence of the added address. This may lead to adding the same address repeatedly.
Unchecked Vector
Severity: Low
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: May 2023
Description:
When creating a campaign, did not check if scheduled_times and scheduled_rewards meet the following requirements, the vector lengths are equal, the sum of scheduled_rewards is 100, and scheduled_times increments. In vault.move L108, when scheduled_times is longer than the length of Bscheduled_rewards , the array vault.scheduled_rewards will report an error in the loop.
Unverified Amounts Being Set to 0
Severity: Low
Ecosystem: Sui
Protocol: Aries Market (Sui)
Auditor: MoveBit
Report Date: June 2023
Description:
It was observed that the deposit, withdraw, borrow, and repay functions did not include any validation to verify whether the amounts being processed were equal to zero. Even though transactions could still proceed when the amounts were zero, subsequent operations would be irrelevant.
Lack check the existence of resources
Severity: Low
Ecosystem: Sui
Protocol: Mini Miners
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mini-Miners-Contract-Audit.pdf
Report Date: Apr 2023
Description:
Did not judge whether item_id exists before deleting.
List Structure Design Flaws
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
The list is a data structure in the form of a linked list. The storage node uses the dynamic field in the Sui to store the node. The dynamic_field in the Sui can not have multiple key-value pairs with the same key. When the same key is inserted, an error will be reported. Although In this project will not have the same key, the list data structure itself should determine whether the key exists.
Time Parameter Check
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
The start_time created and updated by create_partner may be smaller than the current time, and should be greater than or equal to the current time.
Unchecked Liquidation Parameters
Severity: Low
Ecosystem: Aptos
Protocol: Echleon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
The pair creation process lacks validation of critical risk parameter. Also, there is a lack of boundary checks on liquidation parameters during market creation, risking invalid market configurations that may disrupt liquidation behavior.
Insufficient Liquidation Incentive Check
Severity: Low
Ecosystem: Aptos
Protocol: Echleon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
market_enter_efficiency_mode fails to check if a market’s liquidation incentive is higher than the efficiency mode’s, allowing markets with weaker liquidation incentives to enter.
Bypassing Minimum Lock Duration
Severity: Low
Ecosystem: Aptos
Protocol: Thala Swap
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
increase_lock_amount_and_duration allows users to bypass the minimum lock duration by initially creating a small lock and later increasing it significantly, potentially circumventing the intended vesting period.
Utilization of Empty Investor ID
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
register_investor lacks a check to prevent empty string IDs, which may result in significant logical errors in the contract.
Invalid Threshold range
Severity: Low
Ecosystem: Aptos
Protocol: MSafe MVP Program
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description:
The threshold represents the minimum number of signatures required for authenticating a transaction. The Aptos multisig implementation validates that the threshold is not zero.
Ambiguity In Withdrawal Frequency Checks
Severity: Low
Ecosystem: Aptos
Protocol: Steamflow
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Mar 2023
Description:
protocol::create only ensures that withdrawl_frequency is above 30 but does not validate that withdrawl_frequency is above the contract.period value, unlike update.
Missing Length Validation Assertions for Vector-Type Parameters in the process_cluster Function
Severity: Low
Ecosystem: Aptos
Protocol: Supra
Auditor: MoveBit
Report: https://movebit.xyz/reports/Supra-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Code Snippet: N/A
Description:
It is essential to ensure that the lengths of all Vector-type parameters are consistent within the process_cluster function; otherwise, it may result in an abort. However, there is a lack of assertions for validating the lengths of Vector-type parameters.
Unexpected Pool Status (Property 6 Not Hold)
Severity: Low
Ecosystem: Aptos
Protocol: Liquidswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/Pontem-Liquidity-Swap-Formal-Verification-Audit-Report.pdf
Report Date: Apr 2024
Description:
The property 6 requires: Each step in the update_bin should correctly update the value of the bin and return the correct coin value/type. After minting, the pool.coin_x or pool.coin_y should rise. During the specification, we found the state of the pool.coin_x and pool.coin_y had been reassigned after the loop in the mint_bin function, and this reassign of the pool led to the violation of this property. These functions include: mint_bin, update_bin The reassigned pool shows the situation that, none of the coin_x and coin_y are increase after the mint.
Zero Fee Deposit for Small Amounts
Severity: Low
Ecosystem: Aptos
Protocol: Merkle Trade Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Merkle-Trade-Smart-Contract-Audit-Report.pdf
Report Date: July 2023
Description:
In the deposit() function, there is a possibility for users to deposit a very small amount that results in a fee of zero. This allows users to bypass paying any deposit fees. The function calculates the deposit fee based on the house_lp.deposit_fee percentage and the original amount deposited. If the amount is extremely small, the calculated fee may round down to zero. Consequently, the _amount variable will remain unchanged, and the user can deposit the entire amount without incurring any fee. This issue allows users to make deposits without paying the intended deposit fee, potentially leading to a loss of revenue for the system. The same issue for withdraw() function.
Check Sufficient lp Collectral
Severity: Low
Ecosystem: Aptos
Protocol: Merkle Trade Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Merkle-Trade-Smart-Contract-Audit-Report.pdf
Report Date: July 2023
Description:
It's a good practice to check that HouseLPVault has enough collateral to withdraw, otherwise, it will go deep down to the aptos_std::coin::extract to check the balance.
Deserialization Should Explicitly Check Data Length
Severity: Low
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In the deserialization methods: read_u8, read_u16, read_u32, read_u64, read_u128, and read_u256... , they do not check the length of bytes before consuming the data.
If the input's length is not enough, it will cause the function to panic.
Fee Rates Should Be Hard Capped Under 100%
Severity: Low
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In tenant.move , set_liquidation_fee_rate , set_interest_rate_fee_rate , set_stability_fee_rate can set arbitrary fee rates without limitation. If any of the fee rate is over 100%, then it'd become the total loss of the funds.
Lack check of parameter
Severity: Low
Ecosystem: Aptos
Protocol: PatronusFi
Auditor: MoveBit
Report Date: Mar 2023
Description:
There is no limit to the amount greater than 0, and there is no judgment that the balance of wcoin is greater than the parameter amount passed in.
Vault may already exist
Severity: Low
Ecosystem: Aptos
Protocol: PatronusFi
Auditor: MoveBit
Report Date: Mar 2023
Description:
When creating a vault, create_vault does not judge whether the vault under the bank address exists, or judges whether the token has been registered in wcoin::create.
There is no assert in the function to verify whether the amount is greater than 0
Severity: Low
Ecosystem: Aptos
Protocol: Aries Market(Aptos)
Auditor: MoveBit
Report Date: Feb 2023
Description:
It is not verified whether the amount is 0 before recharging. According to the code logic, it will be verified when the function profile::repay_profile is executed, which undoubtedly consumes excess Gas.
Lack of the check for coin amount
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
According to the parameters of the deposit function, the result of the share mint to the user in the calculation may be 0. When minting tokens, tokens with a value of 0 should not be minted.
TinyCoin has no check value upper limit
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
After the swap, there may be a situation where the value of TinyCoin is relatively large, which is not tiny enough, so causing some losses to users.
Tokens might not be registered
Severity: Low
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
In the kill function of the liquidswap_worker module, there is no check in advance on whether to register the BaseCoin token.
Invalid end_time argument of partner::create_partner may cause partner::get_ref_fee_rate to return incorrect fee rate
Severity: Low
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol(Aptos)
Auditor: MoveBit
Report Date: Jan 2023
Description:
partner::create_partner doesn't check whether the argument end_time is greater than now. It is used to initialize the PartnerMetadata.end_time .If the PartnerMetadata.end_time is less than now, and not updated by partner::update_time later, the partner would always get a zero fee rate returned by partner::get_ref_fee_rate , and thus the partner would never receive any partner fee.
Unchecked deposit amount
Severity: Low
Ecosystem: Aptos
Protocol: Echelon
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Echelon - Zellic Audit Report (January).pdf
Report Date: Jan 2025
Description:
The receive_deposit_batch function calls parse_deposit_payload to parse deposit payloads. While received_asset_amount represents the total sum of all depositor amounts, the parse_deposit_payload function lacks validation to ensure this sum matches the actual total deposit amount received.
Missing validation checks in set_params
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Dollar
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Thala Labs Move Dollar - Zellic Audit Report.pdf
Report Date: Oct 2022
Description:
Currently there are no validation checks in params::set_params to ensure that the following critical protocol parameters are not set to values that break the protocol.
Missing assertion checks for oracle initialization
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Dollar
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Thala Labs Move Dollar - Zellic Audit Report.pdf
Report Date: Oct 2022
Description:
There are no checks in place to enforce that oracle::set_price
batch_set_asset_feed_ids should revert when assets and feed_ids lengths are not the same
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The batch_set_asset_feed_ids is not checking if the length of the two input vectors assets and feed_ids matches. If feed_ids is bigger compared to assets, the function will not revert but will not configure all the feed_ids to an asset.
AToken/vToken factories functions work with tokens of the opposite type
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The token_base function is used as the shared module between aTokens and vTokens. To get a token's balance one can call the public functions on either the a_token_factory or variable_debt_token_factory modules. However, not all functions check if the token address parameter is indeed a token of the factory's type, for example: • A user can call variable_debt_token_factory::scaled_balance_of(owner, metadata_address=a_token) with an a_token address and receive the aToken balance, and vice versa for aToken factory and vToken parameters. This should not be valid and in the worst case, this can lead to exploits in integrators that don't perform further checks on the metadata_address (like interpreting a vToken address as an aToken collateral balance in a a_token_factory::scaled_balance(owner, metadata_address=vToken)).
coin_to_fa should revert if the user has not enough CoinType balance to perform the conversion
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The current sanity check performed by aave_pool::coin_migrator::coin_to_fa on the user balance is not correctly implementing the requirement to revert when the caller has not enough CoinType balance to perform the conversion of amount coins.
The function fetches the user's balance by calling coin::balance
Lack of lower and Upper bound in set_emission_per_second
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The set_emission_per_second function in the RewardsController module allows setting new emission rates for rewards without validating upper or lower bounds. This could lead to two potential issues:
- Setting extremely high emission rates could cause excessive rewards distribution and potential numerical overflow when calculating rewards.
- Setting extremely low (but non-zero) emission rates could lead to rewards that effectively round to zero, wasting gas on calculations that produce no meaningful rewards.
Missing Zero Amount Checks
Severity: Low
Ecosystem: Aptos
Protocol: Hyperionxyz Vaults
Auditor: ExVul
Report Date: Apr 2025
Description:
Functions like remove_as_pair and remove_as_single assert token_amount != 0, but deposits (deposit_with_pair, deposit_with_single) don't explicitly check for zero amount_a_desired/amount_b_desired or amount_in. While downstream calls might handle this, explicit checks can prevent wasted gas or unexpected behavior.
Missing Zero Liquidity Check
Severity: Low
Ecosystem: Aptos
Protocol: Hyperionxyz Vaults
Auditor: ExVul
Report Date: Apr 2025
Description:
In the close_position function, the logic directly calls pool_v3::remove_liquidity using the liquidity_amount retrieved from position_v3::get_liquidity. However, there is no check to ensure that liquidity_amount is non-zero. If the value is 0, calling remove_liquidity with zero liquidity may lead to unexpected behavior, wasted gas, or even reverts inside the remove_liquidity logic, depending on the pool implementation.
Should check if the amount_in is bigger than 0
Severity: Low
Ecosystem: Aptos
Protocol: Hyperionxyz Vaults
Auditor: ExVul
Report Date: Apr 2025
Description:
In the swap_liquidity_token_to_another function, there is no explicit check to ensure that amount_in is greater than zero before performing a withdrawal and initiating a swap.
Nonce expiration isn’t verified before removal
Severity: Low
Ecosystem: Sui
Protocol: Claynosaurz
Auditor: Certora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/04_18_2025_Claynosaurz_NFT.pdf
Report Date: Apr 2025
Code Snippet: N/A
Description:
registry::update_nonce_expiration_window() allows the admin to remove old nonces from the registry. However, the function doesn’t verify that the nonces have expired already and relies on the admin to check that. It might be best to double-check that programmatically and not only rely on the admin.
Bytes isn’t verified to be fully consumed by claim_boosterpack()
Severity: Low
Ecosystem: Sui
Protocol: Claynosaurz
Auditor: Certora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/04_18_2025_Claynosaurz_NFT.pdf
Report Date: Apr 2025
Description:
claim_boosterpack() decodes a bytes parameter which contains encoded data about the booster pack. However, it doesn’t verify the bytes were fully consumed by decoding (i.e. the bytes vec is empty after ‘peeling’ all the data). Meaning, the function might accept data that’s longer than expected and contains excess bytes at its end. This kind of data wasn’t signed to be used for claiming boosterpack and should be rejected by the function.
Missing role bounds check in has_role
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Code: N/A
Description:
The has_role function in sources/acl.move lacks role bounds validation, unlike other role functions. This inconsistency could cause runtime aborts if invalid role values (≥128) are passed. The issue may arise in future integrations where external contracts pass usercontrolled role parameters or during cross-contract calls with unvalidated inputs. Impact -> Runtime trxs abort instead of graceful error handling, leading to inconsistent API behavior.
The deposit function lacks asset support check
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
The deposit function allows anyone to send coins to management, mainly intended for the router to inject the tokens required for withdrawals after rebalancing.
Missing Input Validation
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Description:
The following functions lack proper input validation:
-
isolated_lending::isolated_lending:set_pair_collateral_dust_amount():collateral_dust_amountis unbound and may have any value between zero andMAX_U64.set_pair_supply_cap():supply_capneither has a lower nor an upper bound, allowing arbitrary caps, which may leave the pair temporarily in an inoperable state.set_pair_borrow_cap():borrow_capneither has a lower nor an upper bound, allowing arbitrary caps, which may leave the pair temporarily in an inoperable state.set_pair_jump_interest_rate_model(): All parameters are unbound and unchecked, with the exception ofutilization_kink_bps, which however may assume any values between zero andBPS_BASE.create_pair_internal():liquidation_incentive_bpsnot checked to be greater than or equal toBASE_BPSand smaller or equal toMAX_LIQUIDATION_INCENTIVE_BPS.collateral_dust_amountnot checked to be within a reasonable bound.base_rate_bpsnot checked to be withinBASE_BPS.multiplier_bpsnot checked to be withinBASE_BPS.jump_multiplier_bpsnot checked to be withinBASE_BPS.
-
lending::lending:set_market_jump_interest_rate_model():base_rate_bps,multiplier_bpsandjump_multiplier_bpsare not checked to be smaller thanBPS_BASEor otherwise reasonably bound.- It is not checked that
jump_multiplier_bps < multiplier_bps, leading to no jump in rates after the kink point. - It is not checked that
utilization_kink_bpsis a reasonable value. Especially, it is not checked thatutilization_kink_bps !== 0. Ifutilization_kink_bps === 0, it would causeborrow_interest_rateto divide by zero. This division by zero risk is particularly concerning as it would cause transaction failures for all operations that depend on interest rate calculations, including borrowing, supplying, and liquidations, potentially rendering markets unusable.
set_market_rate_limit_internal():window_max_qtynot checked to be non-zero or otherwise reasonably bound.deposit_reserve_fa(): Missing call tovalidate_fa_info().
MAX_LIQUIDATION_INCENTIVE_BPS Can Be Bypassed when Creating New Pairs
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Description:
When changing the liquidity incentive via set_pair_liquidation_incentive_bps(), it is constrained to be within 100% and MAX_LIQUIDATION_INCENTIVE_BPS (150%). However, when creating new pairs via create_pair_internal() no such checks exist, allowing potentially higher or lower values, given sufficiently low collateral factor values to pass the coverage checks.
Missing Input Validation
Severity: Low
Ecosystem: Sui
Protocol: BalancerV2
Auditor: Quantstamp
Report Date: Aug 2025
Description:
human error may lead to erroneous inputs that drive unexpected protocol behavior. As such, input validation is important to include in the code to prevent incorrect inputs from influencing the protocol.
Many of the inputs are integers, some of which are formatted as basis points (bps). In most cases, basis points should not exceed 10000 (i.e. 100%). However, inputs above this number are possible.
Unbounded values can be set in config
Severity: Low
Ecosystem: Aptos
Protocol: KoFi Finance
Auditor: Zenith
Report: https://github.com/KofiFinance/audits/blob/main/Kofi Finance - Zenith Audit Report.pdf
Report Date: Mar 2025
Description:
The set_min_withdrawal_amount_admin function allows setting the minimum withdrawal amount without any upper bound validation. This could lead to a denial of service if the admin accidentally sets an extremely high minimum withdrawal amount, effectively preventing users from making withdrawals.
Looping Issues - Overview
Unbounded loops or iteration over dynamic arrays leading to high gas costs or DoS.
| Looping Issues | Findings |
|---|---|
| Critical | 1 |
| High | 3 |
| Medium | 3 |
| Low | 4 |
| Total | 11 |
High Findings
Early Return in Signer Threshold Verification May Confirm Malicious Payloads
Severity: High
Ecosystem: Sui
Protocol: RedStone
Auditor: Hacken
Report: https://hacken.io/audits/redstone/sca-redstone-finance-sui-connector-feb2025/
Report Date: Feb 2025
Description: The verify_signer_count function is responsible for ensuring that the number of valid signers meets a predefined threshold before confirming a price update or other critical operation. However, the function contains an early return (return) within the loop, which terminates the verification process as soon as the threshold is met. This can introduce significant security risks, particularly in malicious payload injection scenarios.
Infinite Loop in handle_redeem
Severity: High
Ecosystem: Sui
Protocol: Bucket Protocol
Auditor: MoveBit
Report Date: July 2023
Description:
In the handle_redeem function, if the debt value is 0, the loop controlling the redemption process may not terminate as expected, leading to a potential infinite loop. This can cause transaction failures or denial-of-service conditions within the protocol.
Infinite Recursion in distribute_dex_fees() Leading to Transaction Failure
Severity: High
Ecosystem: Aptos
Protocol: Baptswap
Auditor: MoveBit
Report: https://movebit.xyz/reports/BAPTSWAP-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
The function swap_v2.distribute_dex_fees() aims to calculate and distribute DEX fees based on the type of input X. In this function, the protocol calls swap_exact_x_to_y_direct() to exchange X for APT and then transfers the obtained APT to the treasury. However, within the swap_exact_x_to_y_direct() function, the protocol again invokes distribute_dex_fees(). This recursive calling pattern leads to an infinite loop, resulting in an out-of-gas situation and a failed transaction.
Medium Findings
Presence Of Infinite Loop
Severity: Medium
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description:
If ride is less than three stops, continues to next iteration, but it does not increase causing infinite loop.
Multiple indexes can map to the same reserve
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE
Auditor: Certora
Report Date: Apr 2025
Description:
The function init_reserve() does not break when finding a valid index to use.
When adding a new reserve, the function first looks for an unused index in the current range (and increases the range of indexes if none were found). If an unused index was found, we map this index to the new reserve. However, we do not break from the loop, but continue looking for more unused indexes. If we find multiple such indexes, we will have multiple indexes mapping to the same reserve. (For multiple indices to be unused within the current range, drop_reserve() will have to be called twice between uses of init_reserve().)
This will then lead to counting the reserve multiple times when calling calculate_user_account_data(), which can lead to counting the same coin as collateral twice and taking debt against it, resulting in a loan worth more than its collateral.
For this to work, drop_reserve() will have to be called twice between uses of init_reserve().
Inefficient Assignment Within Loop in the process_cluster Function
Severity: Medium
Ecosystem: Aptos
Protocol: Supra
Auditor: MoveBit
Report: https://movebit.xyz/reports/Supra-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description:
It was identified that the assignment operation located at line 316 within the process_cluster function is unnecessarily repeated in every iteration of the loop. This will result in less efficient execution and increased gas consumption. It is recommended to move this assignment code to a position immediately before the loop, ensuring that the assignment is performed only once.
Low Findings
Missing increment of i
Severity: Low
Ecosystem: Sui
Protocol: Kai Finance
Auditor: Asymptotic
Report: https://info.asymptotic.tech/kai-leverage-verification-report-6ec808dd2adc4b55a4e30f0512260a70
Report Date: Aug 2024
Description:
The update_interest function while loop is missing an increment of i . We consider this a low-priority bug as it would most likely be caught in testing.
Debug logging left in reward loop increases gas and noise
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: Sherlock
Report Date: Nov 2025
Description:
The staking pool claim_reward prints multiple values like single_epoch_reward, epoch_id, pool.reward.value, and single_epoch_reward on each epoch iteration. This is a test-only convenience that should not ship in production reward paths.
Inflating reward_released Statistics
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
There is an accounting logic error in the inner loop of reward settlement that causes the total released rewards to be repeatedly accumulated.
DoS via Unbounded Loop
Severity: Low
Ecosystem: Aptos
Protocol: Thala Swap
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
claimable_internal has an unbounded loop that may result in excessive gas consumption and stuck funds if reward claims span many epochs, creating a denial-of-service scenario for users joining the protocol later.
Missing Functions - Overview
Essential management or recovery functions omitted, leaving the system unmaintainable or funds stuck.
| Missing Functions | Findings |
|---|---|
| Critical | 1 |
| High | 3 |
| Medium | 15 |
| Low | 18 |
| Total | 37 |
Critical Findings
Locked Fees in Vault Due to Lack of Withdraw Function
Severity: Critical
Ecosystem: Aptos
Protocol: Kofi Finance
Auditor: Zenith
Report: https://github.com/KofiFinance/audits/blob/main/Kofi%20Finance%20-%20Zenith%20Audit%20Report.pdf
Report Date: May 2025
Description:
The protocol implements a deposit fees function, but there is no corresponding withdraw fees function.
High Findings
Unable to Withdraw Flash Loan Fees
Severity: High
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: Jun 2023
Description:
The redeem function converts MarketCoin to Coin, but there is no implementation to extract or withdraw the associated fees.
Inability to Receive Unused Tokens
Severity: High
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
Users cannot reclaim any remaining tokens in fund.vault or in Vault.reward_balance after distribution. There is no mechanism to recover unused tokens, potentially resulting in locked or lost assets.
Unused friend Functions
Severity: High
Ecosystem: Aptos
Protocol: vibrantX
Auditor: MoveBit
Report: https://movebit.xyz/reports/vibrantX-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
The add_address function is not used in this module and the vibrantx_package_manager module does not set the friend module so the add_address function can't be called by anyone, thus causing the module function to be disabled.
Medium Findings
Accumulated but Unwithdrawable Refunded Rewards in reward_refunded
Severity: Medium
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: MoveBit
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
Although there is a getter function for reward_refunded, there is no corresponding withdrawal function.
Incomplete Fullsail Distribution Parameter Processing and Validation
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The fullsail distribution parameters and sync_fullsail_distribution_reward function in the pool module are incomplete and contains several critical issues: • sync_fullsail_distribution_reward directly modifies parameters without calling update_fullsail_distribution_growth_global_internal first, which should be called to ensure accumulated rewards are properly accounted for before parameter changes. Or at least function should check fullsail_distribution_last_updated equals current time. • fullsail_distribution_period_finish is stored but never used in any logic, despite being updated by sync_fullsail_distribution_reward function • sync function resets fullsail_distribution_rollover to 0 without incorporating it into new parameters (or at least sending an event), effectively discarding any unclaimed rewards from previous periods • sync_fullsail_distribution_reward accepts parameters without any validation allowing arbitrary values
Inability to Initialize Objects
Severity: Medium
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description:
Without the ability to properly initialize stops, users are limited in their ability to request rides with specific stop details. This, in turn, results in a compromise of the user experience and the system’s flexibility, as users may be unable to specify the stops they want when requesting a ride.
Incomplete Function About Protocol Fee
Severity: Medium
Ecosystem: Sui
Protocol: Haedel
Auditor: MoveBit
Report: https://movebit.xyz/reports/Haedal-Final-Audit-Report.pdf
Report Date: Dec 2023
Description:
Missing function for collecting protocol fees.
Lack of A Method to Add referrals in the Market
Severity: Medium
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description:
Can obtain rebates, but no way to add rebate users.
Unable to Remove Strategies
Severity: Medium
Ecosystem: Sui
Protocol: Kuna Labs Yield Optimizer Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Yield-Optimizer-Final-Audit-Report.pdf
Report Date: Nov 2023
Description:
remove_strategy function is not utilized in scallop_whusdce module, therefore strategies in the vault will not be removed.
Module Lacks Interface For Upgrades
Severity: Medium
Ecosystem: Sui
Protocol: Fluidity
Auditor: MoveBit
Report: https://movebit.xyz/reports/Fluidity-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The module uses a third-party contractual interface and lacks an interface for upgrading, which may result in the module not being able to be modified when the third-party interface function changes.
Missing Function to Remove Users from Whitelist
Severity: Medium
Ecosystem: Sui
Protocol: Turbos Finance-TurboStar
Auditor: MoveBit
Report Date: May 2023
Description:
There is a function to add users, but not one to remove them.
Add an interface to modify the controller of the multi-signature account
Severity: Medium
Ecosystem: Sui
Protocol: Sui AMM Swap
Auditor: MoveBit
Report Date: Nov 2022
Description:
Missing interface to change the controller.
Removal of Accrual Functions Before Protocol Changes Leading to Interest Distortion
Severity: Medium
Ecosystem: Initia
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Description:
The following functions used to accrue interest before changing protocol parameters. This ensure that up to the point of the changes all interest would be accumulated as per the previous configuration.
set_interest_fee_bps().set_pair_jump_interest_rate_model().
Removing the accrual functions would lead to distorted interests as pending interest accrual would assume the new values, which could lead to sudden unexpectedly high or low interest changes.
Missing Pause Control Functions in ALMM Pair Module Leads to Non-Functional Emergency Controls
Severity: Medium
Ecosystem: Sui
Protocol: MagmaDEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The magma_almm::almm_pair module has a broken pause mechanism. The AlmmPair struct includes a pause field that's initialized to false during pair creation, and critical functions like collect_fees, stake_in_magma_distribution, and collect_reward, etc. check this state with assert!(!self.pause, ErrPaused). However, there are no functions to actually pause or unpause the pair.
Missing update_position_fees in burn function
Severity: Medium
Ecosystem: Sui
Protocol: MagmaDEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
When changing the position liquidity either by adding/removing tokens, we always call update_position_fees. this is to make sure the . Position took the fees it deserves for that period. before changing his tokens. The function update_position_fees is called for all functions that changes the liquidity of position, this includes burn_position, raise_position_by_amounts_internal, shrink_position. But for burn, which is used to make a partial burning of the position, this function is missing.
Tokens cannot be withdrawn from admin_controlled_ecosystem_reserve.move
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report Date: June 2025
Description:
Fungible_assets is never written, so the function transfer_out() does nothing.
Incentives cannot be configured
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report Date: June 2025
Description:
rewards_controller.move does not contain functions to create RewardsConfigInput, therefore emissions_manager::configure_assets() can’t be executed.
pausable and current_pause_start Parameters cannot be Modified
Severity: Medium
Ecosystem: Aptos
Protocol: StreamFlow
Auditor: MoveBit
Report: https://movebit.xyz/reports/StreamFlow2-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
In the create function we can initialize the pausable and current_pause_start parameters, but there is no specific implementation of the pause method in the contract.
Low Findings
Unimplemented Auto Pause Feature
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
The Market struct defines the fields auto_pause_enabled and auto_pause_threshold, indicating that the protocol was designed with an automatic pause mechanism to handle extreme market conditions. However, no logic exists anywhere in the module's code to check whether the conditions defined by auto_pause_threshold have been triggered, nor is set_paused(self, true) automatically called when those conditions are met. This results in the complete absence of this functionality, giving users a false sense of security that the protocol has automatic risk controls in place, when in reality, this mechanism is not operational.
Inability To Withdraw Treasury Amount
Severity: Low
Ecosystem: Sui
Protocol: Navi
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description: Other functions like increase_treasury_balance and update_state exist to increase and update treasury balance. However, there is a missing function to withdraw_treasury amount. Therefore, funds become locked in the pool.
Inability to Withdraw Owner Fees
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Market Making
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
The vault allows for the collection of owner fees, however, it currently lacks a function to withdraw these accumulated fees, introducing operational inefficiencies. Without a withdrawal function, owner fees remain inaccessible, causing substantial funds to be locked in the contract over time as they accumulate, which negatively impacts the protocol’s revenue model.
Lack of Revoke Function
Severity: Low
Ecosystem: Sui
Protocol: Mysten Deepbook V3
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
DepositCap and WithdrawCap perform verification using only the balance_manager_id field, instead of checking the allowed list. However, TradeCap checks whether the cap ID is on the allowed list. As a result, it’s not possible to remove the cap using the existing revoke function.
Lack of Reverse Functionality
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
The contract currently supports the functionality of registering coins and collateral assets for the protocol. However, it lacks the ability to remove or unregister coins and collateral assets.
Missing Adapter Implementation in Supra Contract
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
The Supra contract lacks implementation for the adapter. Without the adapter, the contract cannot effectively communicate or interact with the external environment, limiting its functionality and interoperability.
Description Cannot Be Modified
Severity: Low
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol (Sui)
Auditor: MoveBit
Report Date: Apr 2023
Description:
The description of open_position is specified as an empty string when the position is created, it is not passed through function parameters, and there is no function that can modify the description in other functions of the position.
Lack of Unfreeze Functionality
Severity: Low
Ecosystem: Aptos
Protocol: Echleon
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
There is a lack of functionality to unfreeze coin stores after a freeze operation in echelon_coin.
Lack of Token Unfreeze Functionality
Severity: Low
Ecosystem: Aptos
Protocol: Thala LSD
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
freeze_thapt_coin_stores permanently freezes token stores without any method to unfreeze them.
Contract Configuration and Loan Validation Improvements
Severity: Low
Ecosystem: Aptos
Protocol: Amnis
Auditor: MoveBit
Report: https://movebit.xyz/reports/Amnis-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
Currently, there is no place in the contract to modify loan_fee. Should the ability to update loan_fee be allowed in the config_pegging() function? Additionally, the loan_apt() function checks that the treasury balance must be greater than the loan amount. Should it also allow equality, as a borrower might acquire the entire balance before invoking this function? The current validation may lead to confusion for borrowers attempting to loan their entire balance.
partner and fee_tier modules don't have any functions to remove partner and fee
Severity: Low
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol(Aptos)
Auditor: MoveBit
Report Date: Jan 2023
Description:
As time goes on, the partner and fee_tier may have a large number of partners and fee_tiers. For administration, may need a way to remove the unused partners and fee_tiers .
Locked redemption fees
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Dollar
Auditor: Zellic
Report: https://github.com/Zellic/publications/blob/master/Thala Labs Move Dollar - Zellic Audit Report.pdf
Report Date: Oct 2022
Code Snippet: N/A
Description:
Currently there is no way for the manager to retrieve fees stored in the FeeStore from calls made to manager::charge_redemption_fee; in vault::redeem_collateral;. Impact The owners of the protocol would be unable to retrieve redemption fees from the FeeStore.
emission_manager should expose a getter function to fetch the current rewards_controller
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Periphery
Auditor: Spearbit
Report:
Report Date: Jun 2025
Description:
The current implementation of the emission_manager modules does not expose a function which is the current rewards_controller in use. This piece of information will be important for both integrators and users when they need to interact via the dApp to claim their rewards.
Missing Pause Functionality in Vault Contract
Severity: Low
Ecosystem: Aptos
Protocol: Hyperionxyz Vaults
Auditor: ExVul
Report Date: Apr 2025
Description:
The Vault contract previously lacked a pause mechanism, which is a fundamental operational control in DeFi contracts. Without a paused flag and corresponding validation logic, administrators are unable to temporarily disable critical functions (e.g., deposit, withdraw) during emergencies, upgrades, or abnormal conditions.
Missing Functionality: Partial Withdrawals
Severity: Low
Ecosystem: Sui
Protocol: MoviePass Exchange - MSX Smart Contract
Auditor: Certora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/03_02_2025_MoviePass_MSX-MR.pdf
Report Date: Feb 2025
Description:
Both user and admin withdrawal functions (e.g., withdraw_custodial_pool and admin_withdraw_custodial_pool) currently withdraw the entire balance. Users who wish to withdraw only a portion of their funds must withdraw everything, then redeposit any funds they wish to keep. This may lead to increased transaction fees and reduced flexibility.
Missing the function to transfer the AdminCap object
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
The AdminCap is the protocol’s privilege credential. It is created in the init function and transferred to the sender.

However, the AdminCap object only has the key ability, which means it cannot be freely transferred via public_transfer outside the module. Moreover, there is no function within the module that allows the AdminCap holder to transfer ownership. This indicates that the functionality for owner transfer is missing.
Missing Global Pausability (All Pairs) Function for Quicker Reaction in Emergency
Severity: Low
Ecosystem: Aptos, Initia, and Movement
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Description:
The isolated lending pools, while can be individually paused, lack a global pausability function. Unlike the lending core module which supports global pause flag as well as individualized market paused flag. This may result in losing valuable time in case of a hack, since all pools would have to be iterated and paused individually.
Protocol only Supports Hard Liquidations
Severity: Low
Ecosystem: Sui
Protocol: BalancerV2
Auditor: Quantstamp
Report Date: Aug 2025
Code: N/A
Description:
The liquidation mechanism forces complete position closure regardless of how slightly a position breaches the minimum collateralization ratio. For example, a position at 149% collateralization faces total liquidation despite needing only minimal deleveraging to restore a 150% threshold. This all-or-nothing approach causes unnecessarily severe user losses and discourages efficient capital utilization near the collateralization boundaries.
The implementation allows liquidators to specify repayment amounts but always liquidates proportionally across the entire position rather than targeting a healthy collateralization ratio. This design may hold back users who are looking for optimized capital efficiency, since their position would be extremely risky.
Missing Version Check - Overview
Lack of validation for contract or dependency versions causing incompatibility or security regressions.
| Missing Version Check | Findings |
|---|---|
| High | 2 |
| Medium | 1 |
| Low | 9 |
| Total | 12 |
High Findings
Initialize Missing Version Checks
Severity: High
Ecosystem: Sui
Protocol: FlowX Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/FlowX-Final-Audit-Report.pdf
Report Date: May 2024
Description:
The old initialize function remains callable, allowing users to reinitialize the pool and potentially cause inconsistent or unintended system states.
Security Vulnerability in add_operator Function of config.move due to Missing Contract Version Check
Severity: High
Ecosystem: Sui
Protocol: Cetus Farming Smart Contracts
Auditor: MoveBit
Report: https://movebit.xyz/reports/Cetus-Farming-Smart-Contract-Final-Audit-Report.pdf
Report Date: Jan 2024
Description:
The add_operator function lacks a version check, allowing older contract versions to be called. This can reintroduce vulnerabilities or inconsistent logic from outdated deployments.
Low Findings
Missing checked_package_version Enforcement in Multiple Functions
Severity: Low
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
Several functions across the factory and pool modules are missing calls to checked_package_version, which is used to ensure compatibility and enforce upgrade safety in systems with upgradeable packages.
Omitting this check allows these functions to be called even when the package version is outdated or mismatched, potentially leading to unintended behavior, security vulnerabilities, or inconsistent state if the logic is changed in newer versions.
Insufficient Version Validation in Version Management
Severity: Low
Ecosystem: Sui
Protocol: Momentum CLMM
Auditor: Asymptotic
Report Date: Aug 2025
Description:
The upgrade minor and set version functions lack proper validation to ensure version updates follow a proper upgrade path. Both functions allow setting versions to any value, including the current version or even downgrading to older versions.
Non Atomic Upgrade And Migrate
Severity: Low
Ecosystem: Sui
Protocol: Wormhole
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2023
Description: During BatchTransaction, old and new modules can be performed simultaneously.
Lack of Version Check
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
All user-callable functions perform a version check to ensure they utilize the most recent module whenever the protocol undergoes an upgrade. However, the functions within accrue_interest.move do not include this version validation, which may allow them to execute in their previous versions even after a protocol upgrade.
Absence of Version Update Functionality
Severity: Low
Ecosystem: Sui
Protocol: Bluefin Spot
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2024
Description:
In config, there is no mechanism to update the protocol’s version during package upgrades. This limitation will pose significant issues when deploying new versions of the protocol, especially if breaking changes are introduced. The GlobalConfig structure contains a version field, which is intended to track the current version of the protocol. The VERSION constant is defined in the module, but there is no function to modify the version field of GlobalConfig after the initial setup.
Missing Version Checks in Admin Functions
Severity: Low
Ecosystem: Sui
Protocol: Mayan Sui
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
Currently, in mayan-swift, admin functions are missing version checks. In fee_manager::state, admin functions such as add_token_config , update_token_config, and update_fee_collector do not include any version checks, which implies that an administrator may utilize an older version of the contract to bypass restrictions that are enforced in newer versions. Similarly, version checks are not present in change_paused and add_pair_emitter in mayan_swift::state.
Lack of Validation for Version
Severity: Low
Ecosystem: Sui
Protocol: Volo
Auditor: MoveBit
Report: https://movebit.xyz/reports/Volo-Smart-Contract-Audit-Report.pdf
Report Date: Sep 2023
Description: The function update_validators does not check the version.
update_nonce_expiration_window() lacks version validation
Severity: Low
Ecosystem: Sui
Protocol: Claynosaurz
Auditor: Certora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/04_18_2025_Claynosaurz_NFT.pdf
Report Date: Apr 2025
Description:
The function update_nonce_expiration_window() doesn’t verify that the registry’s version matches the version of the module. This would allow calling the function also when a newer version is released.
Missing Package Version Validation in ALMM Pair Module
Severity: Low
Ecosystem: Aptos
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Code: N/A
Description:
The almm_pair module lacks package version validation in its public functions. While ALMM rewarder module use cfg.checked_package_version(), the ALMM pair module omits this validation entirely. Functions execute critical operations without verifying package version, allowing incompatible logic to run after upgrades.
Oracle Issues - Overview
Manipulation or inaccuracy of external data sources impacting on-chain decisions.
| Oracle Issues | Findings |
|---|---|
| Critical | 3 |
| High | 5 |
| Medium | 11 |
| Low | 8 |
| Total | 27 |
Critical Findings
Manipulatable Price Oracle
Severity: Critical
Ecosystem: Binance Smart Chain
Protocol: AquaSwap
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/AuquaSwap-Audit-/blob/Wallet/Audit%20report.md
Report Date: July 2024
Description:
The contract uses the ratio of the liquidity sizes of the tokens to determine the value of the liquidity token. This can be manipulated by an attacker to drain the pool.
Improper Oracle Calculations
Severity: Critical
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2022
Description:
Pyth price calculations in oracle.move are performed incorrectly. The price should be multiplied by, not divided by, the magnitude.
Missing Slippage Checks
Severity: Critical
Ecosystem: Aptos
Protocol: Eternal Finance
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2023
Description:
get_lp_by_cake does not properly perform slippage checks against an oracle price when swapping assets around.
High Findings
Lack of Oracle Usage Claims the System Vulnerable Against Depeg Risks
Severity: High
Ecosystem: IOTA Mainnet
Protocol: Pools Finance
Auditor: Hacken
Report: https://hacken.io/audits/pools-finance/sca-pools-finance-pools-contracts-may2025/
Report Date: June 2025
Description:
The protocol's stable pools utilize an amplified invariant (e.g., similar to Curve’s stableswap formula), which is optimized for assets that maintain a tight 1:1 peg, such as USDT, USDC, or DAI. The amplification parameter (commonly referred to as amplification_p) flattens the bonding curve near the equilibrium point, enabling large trades with minimal slippage — under the assumption that both assets remain closely pegged.
However, this model fails to protect liquidity providers and swappers during depeg events. When one asset in the pair (e.g., USDT in a USDT/USDC pool) depegs significantly from its expected $1 value, the protocol continues treating it as equal in value to the other asset. This leads to risk-free arbitrage opportunities for attackers, who can:
Swap the depegged (and less valuable) asset for the more valuable one at an artificially favorable 1:1 rate. Drain the pool of the sound asset, leaving only the depegged token behind. This behavior directly causes value loss to LPs and users who do not react quickly to the peg loss, especially when the depeg is severe or prolonged.
The vulnerability exists in the fundamental mathematical design of stable pools, specifically in how they calculate swap amounts during market stress.
Oracle Lacks Update Cycle Verification
Severity: High
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report: Navi Smart Contract Audit Report (MoveBit)
Report Date: July 2023
Description:
The oracle mechanism lacks verification of the update cycle. Specifically, there is no maximum interval period enforced when obtaining prices, allowing outdated price data to persist in the system. This can result in stale price feeds and inaccurate valuations.
Recommendation:
Implement a maximum time interval check for oracle updates and require regular price refreshes to ensure price data remains current.
Oracle Confidence Checks
Severity: High
Ecosystem: OL Network
Protocol: StakeSphere
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/StakeSphere-stealth-/blob/Wallet/Audit.md
Report Date: Feb 2025
Description:
High oracle confidence values suggest that there is disagreement among providers about the actual price. For instance, Pyth measures confidence as the difference between the 25th and 75th quartiles and the median price.
Recommendation:
Check the confidence of oracles.
Potential risk of manipulation of hyperion llp positions
Severity: High
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
In the health_check module, get_amount_by_liquidity must use the pool’s real-time price; otherwise, attackers can manipulate token amounts by performing large swaps within the same transaction.
Domain pricing relies on pool price, which can be manipulated
Severity: High
Ecosystem: Initia
Protocol: Initia Move
Auditor: Code4Arena Contest SRs
Report: https://code4rena.com/reports/2025-01-initia-move
Report Date: Apr 2025
Description:
Payment for domains (registration, extensions) relies on direct spot price from the Dex module which is directly related to pool reserves. This can be manipulated with a flash loan or a large amount deposit, resulting in: buying a domain in a lower price making other users overpay for their domains. Calculating the price based directly on a liquidity pool reserves is a well known insecure pattern.
Medium Findings
Third-party Dependency
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description:
PriceOracle for example is third-party risk.
Missing Validation While Updating Oracle Price
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description:
Lacks a check to prevent prices from being set to zero; should include an assertion enforcing price > 0.
Potential flaws in pyth price acquisition
Severity: Medium
Ecosystem: Aptos
Protocol: Yeap Finance
Auditor: SlowMist
Report Date: July 2025
Description:
Pyth is a “pull oracle.” This means if no user actively pulls and updates the price on-chain, the on-chain oracle might remain updated for extended periods, rendering the protocol’s Pyth price source unavailable.
Unconditional timestamp update in update_references allows volatility fee manipulation
Severity: Medium
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The almm_pair::update_references function is responsible for managing volatility-based fee parameters in the ALMM protocol. This function updates the volatility reference and index reference based on time elapsed since the last update, which directly affects the variable fee calculation used in swaps. The function contains a critical flaw where the time_of_last_update is unconditionally updated regardless of whether the volatility parameters are actually processed. This allows attackers to manipulate the fee mechanism by preventing the volatility reference from decaying naturally.
Failure to Check for Stale Price Oracle
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE v3.1-3.3 Core
Auditor: OtterSec
Report Date: Aug 2025
Description:
get_asset_price_internal does not validate for freshness of the data while retrieving prices from feeds.
Missing check stale price from Chainlink
Severity: Medium
Ecosystem: Aptos
Protocol: AAVE V3
Auditor: Cantina Contest SRs
Report: https://cantina.xyz/code/ad445d42-9d39-4bcf-becb-0c6c8689b767/findings/237
Report Date: June 2025
Description:
In AAVE's oracle module, we will try to fetch underlying asset's price from Oracle feed if there is not one custom price.
We will fetch the price via the interface chainlink::get_benchmark_value(benchmark) from the benchmark. According to Chainlink Aptos Doc, when we fetch the price from benchmark, we can fetch the price and the related timestamp from the benchmark.
The problem here is that we miss fetching the timestamp from the benchmark, and we don't check whether the price from Chainlink is staleness or not. If there is something wrong in Chainlink, the price don't update for a while, we may fetch stale price, this will cause we borrow/liquidate with one incorrect underlying price.
Missing oracle stale price check
Severity: Medium
Ecosystem: Aptos
Protocol: Thala Labs Aptos Dollar
Auditor: Zellic
Report Date: Feb 2023
Description:
The oracle lacks timestamps and stale-price checks. The project has switched to a tiered oracle framework, which requires a separate review.
Missing Check for Negative in get_switchboard_price() Function
Severity: Medium
Ecosystem: Aptos
Protocol: Merkle Trade Smart Contract
Auditor: MoveBit
Report: https://movebit.xyz/reports/Merkle-Trade-Smart-Contract-Audit-Report.pdf
Report Date: July 2023
Description:
The function get_switchboard_price() is used to retrieve the price and round confirmed timestamp from Switchboard. it is advised to include a check to ensure the negative is not true. If the negative value is true, it implies that there might be some problem with the price received from Oracle, potentially because the price is expired or has some error leading to potential issues.
Oracle max_deviation cannot be updated
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Market
Auditor: MoveBit
Report Date: Feb 2023
Description:
Oracle max_deviation cannot be updated in set_pyth_oracle and set_switchboard_oracle, the only way to change it is to unset the oracle and set it again.
Oracle Confidence Checks
Severity: Medium
Ecosystem: Aptos
Protocol: Argo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
High oracle confidence values indicate that providers disagree on the actual price. Pyth, for example, represents confidence as the difference between the 25/75th quartile and the median price. In this case, it’s safer to ignore the value than to use a potentially inaccurate value.
Risk of Borrowing Undervalued Collateral
Severity: Medium
Ecosystem: Aptos
Protocol: Echelon Staked LPT
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
In the current implementation, the staked LPT oracle may undervalue liquidity provider tokens. While this does not impact their utilization as collateral—effectively acting as a reduced collateral factor—it is critical to prevent borrowing of these undervalued assets. An undervalued oracle price only limits borrowing power, which is acceptable as long as borrowing is not permitted against such assets.
Low Findings
Improper Oracle Update
Severity: Low
Ecosystem: Sui
Protocol: Bluefin Spot
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2024
Description:
pool::update_pool_state is responsible for updating the state of the liquidity pool after a swap operation occurs. In the current code, oracle::update is called after the pool’s current_tick_index and current_sqrt_price have been updated based on the swap result. This timing will result in the recording of inaccurate and misleading data in the oracle regarding the pool’s state before the swap occurred, rendering the data inconsistent.
The Price in the Oracle Lacks Validation
Severity: Low
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
When setting the price in the oracle, it is not validated whether the price is equal to 0. If the price is set to 0, then the value of the token will also be 0, making the current ReserveData meaningless.
Underflow Due to Future-dated Oracle Timestamp
Severity: Low
Ecosystem: Aptos
Protocol: Thala Swap
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
The oracle price retrieval functions may fail due to underflow if the reported timestamp is greater than the current system timestamp due to network clock drift.
Chainlink returns raw benchmark price, misinterpreting negative prices
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The oracle.get_asset_price fetches the price from chainlink router's benchmark data. This benchmark is extracted from the raw report data and its price, which is a signed i192. However, the i192 is treated and returned as a raw u256 by chainlink.
Currently, Aave does not perform further checks on this returned u256 value. Misinterpreting a negative value as a large value would lead to having near-unlimited collateral value to borrow against.
Price returned by the Chainlink feed could be stale or replaced by an older price (compared to the previous one)
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The current implementation of the oracle::get_asset_price and oracle::get_assets_prices functions do not perform any sanity check on the staleness of the price. This absent of check is aligned with the corresponding implementation on the AaveOracle on the Solidity codebase. One key difference in the Aptos implementation for the Chainlink protocol is that they seem to allow the replacement of the latest "benchmark" (the price) with an updated benchmark that could be older (stale) compared to the current one returned by Chainlink. If you look at the logic of the fun perform_update function in the Chainlink registry module codebase, called by the on_report function when the price needs to be updated, you can see that the logic does not revert when the observation_timestamp of the report is equal or older compared to the current one used by the actual feed.
The logic will just emit the StaleReport event and replace the feed with the stale price.
The get_price_by_metadata Function Fails to Check Oracle Price Staleness
Severity: Low
Ecosystem: Initia
Protocol: Echelon Market
Auditor: Quantstamp
Report Date: Mar 2025
Code: N/A
Description:
The echelon_oracle::oracle::get_price_by_metadata function is a view function that retrieves the current price of an asset from the oracles and returns it. However, unlike other functions such as get_and_update_price_by_metadata, it does not ensure that the returned price is not stale.
Non-Deterministic Oracle Selection
Severity: Low
Ecosystem: Sui
Protocol: BalancerV2
Auditor: Quantstamp
Report Date: Aug 2025
Code: N/A
Description:
The oracle system allows users to select different subsets of price feeds to reach the weight threshold, enabling them to obtain multiple valid prices within the same transaction. While we did not identify a direct exploitation path in the current CDP and PSM modules (which only use prices for health checks and divergence thresholds), this non-deterministic design violates oracle best practices and could become exploitable if the protocol evolves. Furthermore, sophisticated users can currently pick a subset of oracles that is most advantageous to them.
No Protocol-Controlled Oracle Staleness Checks
Severity: Low
Ecosystem: Sui
Protocol: BalancerV2
Auditor: Quantstamp
Report Date: Aug 2025
Description:
The protocol delegates price freshness validation entirely to external price providers rather than enforcing its own staleness requirements. Currently, only Pyth is implemented as a price source, and the protocol relies on Pyth's internal staleness checks without the ability to configure acceptable price age limits. This dependency prevents the protocol from adjusting freshness requirements based on market conditions or risk parameters. Furthermore, price feed providers, such as Pyth, will panic if the price is outdated, leaving the protocol unable to revert to other oracle providers. The lack of protocol-level control also complicates adding new price sources with different staleness guarantees.
Signature Replay - Overview
Signature replay vulnerabilities occur when attackers reuse valid cryptographic signatures or messages to repeat or spoof authorized actions due to missing or flawed replay protections.
| Signature Replay | Findings |
|---|---|
| Low | 3 |
| Total | 3 |
Low Findings
Signature Replay
Severity: Low
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Code Snippet: N/A
Description:
In several functions, a signature is used to authorize and validate an action that permits users to execute specific operations only if authorized by the off-chain authority. However, in the current implementation of the signature mechanism, the same signed operation may be submitted and processed multiple times. Thus, if a malicious actor captures a valid signed transaction, they may utilize that to successfully execute that particular action repeatedly. This executes the same operation multiple times without any further demand for authentication.
Possibility of Signature Reuse
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Orderbook
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2024
Code: N/A
Description: There is a risk of cryptographic signature reuse in placing stop orders within clearing_house. Cryptographic signatures rely on a blend of order-specific details and a distinct random value termed salt, introducing unpredictability. Nonetheless, if the same salt is unintentionally or intentionally used again for generating signatures for diverse stop orders, it allows an observer to detect patterns and extract information about a user’s specific stop orders, potentially compromising their privacy.
claim_boosterpack() data signature isn’t typed
Severity: Low
Ecosystem: Sui
Protocol: Claynosaurz
Auditor: Certora
Report: https://github.com/Certora/SecurityReports/blob/main/Reports/2025/04_18_2025_Claynosaurz_NFT.pdf
Report Date: Apr 2025
Description:
The claim_boosterpack() function receives signed data (bytes and signature) that contains information about the boosterpack to be claimed. The signature isn’t ‘typed’ (like in EIP-712), this might allow an attacker to re-use data that was signed from the same address for other purposes (e.g. signing a Sui tx).
Third-Party Risk - Overview
Third-party risk vulnerabilities arise from reliance on external libraries, services, or integrations that may be compromised, misconfigured, or behave unexpectedly, introducing security or availability issues.
| Third-Party Risk | Findings |
|---|---|
| Low | 2 |
| Total | 2 |
Low Findings
Reliance on Thirdparty Library Files
Severity: Low
Ecosystem: Sui
Protocol: Talofa
Auditor: MoveBit
Report Date: May 2023
Description:
During the audit, it was observed that the contract incorporates a substantial number of external libraries in https://github.com/Origin-Byte/nft-protocol. These libraries, although not included in the scope of this audit, are essential for the proper functioning of the contract. It is assumed that you have already assessed and verified the security and reliability of these dependencies
Third-Party Dependency
Severity: Low
Ecosystem: Sui
Protocol: Scallop
Auditor: MoveBit
Report Date: June 2023
Description:
During the audit process, we discovered that the system relies on third-party services for certain functionalities, such as an oracle. However, please note that this audit does not cover the third-party dependencies, including the oracle. We assume that the data provided by the oracle is accurate and properly handled by the system.
Race Condition - Overview
Race conditions occur when concurrent or out-of-order operations allow conflicting updates that produce inconsistent state and enable exploits.
| Race Condition | Findings |
|---|---|
| Low | 1 |
| Total | 1 |
Low Findings
Possible Race Condition
Severity: Low
Ecosystem: Sui
Protocol: Haedel LSD
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Nov 2023
Description: The vulnerability originates from a potential race condition during the transition between epochs, which arises when a user executes claim_coinbefore the program approves the corresponding EpochClaim object for the current epoch. Thus, if the claiming occurs before the approval, claim_epoch_record may not decrease the value of ue.amount as expected because ue.approved will be set to false.
Runtime/Development Issues - Overview
Debug-only, test, or misconfigured deployment code reaching production.
| Runtime/Development Issues | Findings |
|---|---|
| Medium | 10 |
| Low | 5 |
| Total | 15 |
Medium Findings
Compile Failed
Severity: Medium
Ecosystem: Sui
Protocol: Mini Miners
Auditor: MoveBit
Report: Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mini-Miners-Contract-Audit.pdf
Report Date: Apr 2023
Description:
The project fails to compile because the Sui client version is outdated. The Move.toml and related dependencies require Sui client 0.29. To fix this, upgrade the Sui client to version 0.29 and adjust any paths or configurations accordingly.
Unbound Function
Severity: Medium
Ecosystem: Sui
Protocol: Mini Miners
Auditor: MoveBit
Report: Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mini-Miners-Contract-Audit.pdf
Report Date: Apr 2023
Description:
The project fails to compile because the Sui client version is outdated. The Move.toml and related dependencies require Sui client 0.29. To fix this, upgrade the Sui client to version 0.29 and adjust any paths or configurations accordingly.
Unit test cannot pass
Severity: Medium
Ecosystem: Sui
Protocol: Mini Miners
Auditor: MoveBit
Report: Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mini-Miners-Contract-Audit.pdf
Report Date: Apr 2023
Description:
A required module import is missing — test_import_nft() fails due to the absence of import std::hash
Compile error
Severity: Medium
Ecosystem: Aptos
Protocol: PatronusFi
Auditor: MoveBit
Report Date: Mar 2023
Description:
In vault.move, the withdraw_reserved_coins function has a return value that will always cause the project to fail to compile.
Unit Test Fails
Severity: Medium
Ecosystem: Aptos
Protocol: PatronusFi
Auditor: MoveBit
Report Date: Mar 2023
Description:
The unit test fails and cannot be executed, the package cannot be found due to an error.
Key generic type Map lacks ability constraints to copy + drop
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Market
Auditor: MoveBit
Report Date: Feb 2023
Description:
map.move will cause compilation errors.
Package upgrade policy risk
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Market
Auditor: MoveBit
Report Date: Feb 2023
Description:
In Move.toml, upgrade policy to immutable to ensure packages are more safe for users.
Dependency Management
Severity: Medium
Ecosystem: Aptos
Protocol: Mole
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mole-Aptos-Audit-Report.pdf
Report Date: Feb 2023
Description:
In Move.toml, modify to corresponding git commit version number.
Change the rev dependency to the git version number
Severity: Medium
Ecosystem: Aptos
Protocol: AptoPad
Auditor: MoveBit
Report Date: Feb 2023
Description:
In the Move.toml file, ensure latest version.
Dependency git rev should be a commit hash or a tag
Severity: Medium
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Jan 2023
Description:
Dependency git rev should be a commit hash or a tag instead of a branch for reproducability. the branch may be updated in the future which may cause build to fail.
Low Findings
Code Can't be Compiled Correctly
Severity: Low
Ecosystem: Sui
Protocol: Suia
Auditor: MoveBit
Report Date: May 2023
Description:
The suia_capy.move can not be compiled correctly with the local sui and sui-capybaras dependencies.
The unit test is throwing an error when executed
Severity: Low
Ecosystem: Sui
Protocol: MSafe Maven
Auditor: MoveBit
Report Date: May 2023
Description:
The clock::create_for_testing function in SUI has been modified to return a Clock object instead of a shared object. This change has caused the tests to fail when running with the latest version (0.32) of the Sui client.
simple_map::create Is Deprecated
Severity: Low
Ecosystem: Aptos
Protocol: Superposition
Auditor: MoveBit
Report: https://movebit.xyz/reports/Superposition-Final-Audit-Report.pdf
Report Date: Mar 2024
Description:
in many smart contract, simple_map::create is used, but it's a deprecated function, and simple_map::new should be used instead.
The project can not run unit test with latest aptos cli(v1.0.6)
Severity: Low
Ecosystem: Aptos
Protocol: Aries Market(Aptos)
Auditor: MoveBit
Report Date: Feb 2023
Description:
The latest aptos cli(v1.0.6) forces the unit test failure macro # [expected_failure(abort_code = 1)] to have a location parameter. The location parameter is used to specify the location of the failure. It's better to make it compatible and testable with the latest aptos cli for further maintenance.
Some test cases failed
Severity: Low
Ecosystem: Aptos
Protocol: Cetus Concentrated Liquidity Protocol(Aptos)
Auditor: MoveBit
Report Date: Jan 2023
Description:
While running the test cases, some failed in the pool module. For example, the test_swap case failed. In module clmm_math , the test_get_next_price_a_down should be renamed to test_get_next_price_b_down as it tests get_next_sqrt_price_b_down .
State Management - Overview
Improper updates, resets, or dependency on stale state causing protocol corruption or loss of sync.
| State Management | Findings |
|---|---|
| Critical | 7 |
| High | 14 |
| Medium | 19 |
| Low | 24 |
| Total | 64 |
Critical Findings
Arbitrary Lock Duration
Severity: Critical
Ecosystem: OL Network
Protocol: StakeWallet 2.0 by StakeSphere
Auditor: MoveJay
Report: https://github.com/Jayfromthe13th/OL-Audit/blob/Wallet/audit.md
Report Date: Apr 2024
Description:
The Lockbox module in the Slow Wallet v2.0 implementation allows users to lock assets for a specified period. However, a vulnerability exists where the DEFAULT LOCK DURATION constant is not enforced, allowing users to create lockboxes with arbitrary durations.
Improper Mint Limit Reset
Severity: Critical
Ecosystem: Sui
Protocol: Lombard Finance
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2024
Description:
The minting function incorrectly resets the remaining mint limit (left) during a new epoch, as it assigns the limit value directly instead of referencing it with *limit.
Outdated Variable VaultsValuation
Severity: Critical
Ecosystem: Sui
Protocol: ABEx Labs
Auditor: MoveBit
Report: https://movebit.xyz/reports/Abex-Smart-Contract-Audit-Report.pdf
Report Date: Aug 2023
Description:
When two VaultsValuation instances are created in a single transaction, only the first is updated during valuate_vault, leaving the second outdated. This allows a user to deposit again using stale valuation data, receiving excess LP tokens and potentially depleting protocol assets.
Lack of State Changes During Function Execution
Severity: Critical
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
The claim_refund function fails to update related state variables or mark the InvestCertificate as claimed, allowing users to reuse the same certificate multiple times to claim additional refunds.
Failure in Updating State Post Withdrawal
Severity: Critical
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
The withdraw_reserve_amount function in reserve_details is responsible for handling the withdrawal of a specified amount of reserve currency from the reserve. However, after completing the withdrawal, it fails to update the total_cash_available value stored in the ReserveDetails structure.
Insufficient Tracking of Flashloan Parameters
Severity: Critical
Ecosystem: Aptos
Protocol: ThalaSwapV2
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Aug 2024
Description:
In pool, the Flashloan structure contains a vector of unsigned 64-bit integers (u64) to represent the amounts of assets borrowed during the flash loan operation. However, the structure does not include any information about which specific assets were borrowed or from which pool the assets were borrowed. When a user initiates a flash loan, they borrow a specific amount of a particular asset from a liquidity pool. In a well-designed flash loan mechanism, the receipt of the flash loan should accurately record both the amount and the type of borrowed asset.
Absence of State Variable Update on Wallet Removal
Severity: Critical
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
In registry_service::remove_wallet , the failure to remove wallet_addr from the investor.wallets structure introduces a significant vulnerability. This results in inaccurate calculations in investor_wallet_balance_total , which, in turn, impacts various other functions in the project that depend on accurate wallet balances.
High Findings
Possible Market Valuation Manipulation
Severity: High
Ecosystem: Sui
Protocol: ZO Perps(Sudo)
Auditor: Asymptotic
Report: https://info.asymptotic.tech/sudo-audit-report
Report Date: Mar 2025
Description:
The market valuation process, which calculates values for both vaults and symbols, lacks proper synchronization controls. While the process tracks the number of vaults/symbols at initialization and verifies all items are processed during finalization, admin functions (add_new_vault/add_new_symbol) can modify the market structure during ongoing valuation.
Inability to End an Epoch
Severity: High
Ecosystem: Sui
Protocol: Sui Bridge
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2024
Description:
The register function allows a validator to register with a used public key (bridge_pubkey_bytes). When try_create_next_committee is called at the end of epoch, the function creates a new committee based on the registrations stored in member_registrations. When attempting to insert the members into the new_members mapping utilizing vec_map::insert, the insertion will fail if the public key already exists in the mapping. This prevents the system from creating a new committee even if enough stake is available. As a result, the committee is not updated properly, and an end of epoch would fail to attempt to create the committee.
Incorrect Flow Tracking
Severity: High
Ecosystem: Sui
Protocol: Sui Axelar(Gateway V2)
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
In the current implementation, the function utilizes self.flow_limit.add_flow_out(sui_amount, clock) to record the amount of tokens given out. This is inappropriate when the system is receiving tokens through an interchain transfer. Utilizing add_flow_out during a reception scenario inaccurately reflects the state of token flow. Instead of tracking tokens that are leaving the system, it should track tokens coming in.
Users Unable To Claim Surplus
Severity: High
Ecosystem: Sui
Protocol: Bucket
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
When the debt amount (repay_amount) is greater than or equal to the Bottle debt, after calculating the collateral amount to return, the bottle.collateral_amount subtracts from it and returns true.That signifies the clearing of all debt. Now, the Bottle is destroyable. However, simply destroying the Bottle deletes it from the Bottle table, which results in the user being unable to claim their surplus collateral amount from the Bottle.
Absence of Functionality
Severity: High
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description:
The update_driver_state function fails to set on_ride to false after a successful ride completion. Additionally, a driver can complete a ride even when on_ride is already false, causing inconsistent state tracking and availability errors.
Multiple Active Rides
Severity: High
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report: https://www.notion.so/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description:
A malicious user may call request_ride multiple times to accept multiple rides at once, resulting in situations where a single rider is associated with multiple active rides, disrupting the normal functioning of the ride-sharing service.
Missing State Validation
Severity: High
Ecosystem: Sui
Protocol: Navi
Auditor: MoveBit
Report Date: July 2023
Description:
Storage data can be modified in many public functions even when admin has suspended transactions.
Liquidation Remarking
Severity: High
Ecosystem: Aptos
Protocol: Argo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2022
Description:
Argo uses a descending auction system to process liquidations. When a vault is undercollateralized and eligible for liquidation, it becomes ”marked” and the descending auction begins. Unfortunately, this function does not ensure that the vault was not previously marked. As a result, a user attempting to prevent the liquidation of their vault can repeatedly mark their own vault to reset the descending auction.
Missing Snapshot Mechanism In Staking Module
Severity: High
Ecosystem: Aptos
Protocol: Merkle Token
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: July 2024
Description:
In staking, where voting power is derived from locked tokens, the absence of a snapshot mechanism to record past voting powers may result in critical issues affecting the integrity of voting processes. When a user unlocks their tokens via unlock , their voting power is effectively removed. Without a snapshot mechanism to preserve historical voting power, this removal retroactively impacts past voting records, invalidating previous votes or governance actions that depended on the user’s voting power.
Artificial Reduction of Investor Counts
Severity: High
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
There is an inconsistency in the way the system allows users to create zero-value fungible assets (FA) through fungible_asset::zero and deposit them via dispatchable_fungible_asset::deposit. A user with a zero FA balance may withdraw a zero-value FA and then deposit it, setting WithdrawCount.amount to zero.
Discrepancies in Updating Investor Count
Severity: High
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
In the existing implementation of compliance_service::record_burn (shown below), the function checks if the investor’s balance equals the value to be burned ( balance_who == (value as u64) ). However, it does not explicitly check if value is greater than zero before making this comparison or before adjusting the investor count. If value is zero, the condition will still evaluate to true, which will decrease the total investor count incorrectly, even though the investor was already inactive (with a zero balance) and should not have been counted.
Failure to Distribute Staking Rewards
Severity: High
Ecosystem: Aptos
Protocol: Kofi Finance Contacts
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2025
Description:
rewards_manager::update_rewards handles staking reward calculations and distributions during epoch changes. A manager fee is deducted, and the remaining APT rewards are minted as kAPT and deposited into the vault via the minting_manager::mint_to_vault function. However, while kAPT coins are successfully minted, the virtual_balance , which tracks deposited kAPT and determines the exchange rate, is not updated. This oversight permanently locks staking rewards, preventing distribution to stakers
Address mismatch in configuration data storage & retrieval#19
Severity: High
Ecosystem: Aptos
Protocol: AAVE V3
Auditor: Cantina Contest SRs
Report: https://cantina.xyz/code/ad445d42-9d39-4bcf-becb-0c6c8689b767/findings/19
Report Date: May 2025
Description:
The AAVE protocol has a fundamental address mismatch where configuration data is stored at one blockchain address (@aave_data) but all retrieval functions attempt to read from a completely different address (@aave_pool). This is equivalent to storing your house keys in one safe but always looking for them in a different safe.
Missing max_id in update in batch_add_addr
Severity: High
Ecosystem: Aptos
Protocol: MoveDID
Auditor: MoveBit
Report Date: Nov 2022
Description:
add_addr modifies max_id when adding the address, but batch_add_addr does not.
Medium Findings
Missing Gauge Liveness Verification
Severity: Medium
Ecosystem: Sui
Protocol: Full Sail CLMM
Auditor: Asymptotic
Report: https://info.asymptotic.tech/full-sail-clmm-audit
Report Date: May 2025
Description:
The check_gauge_cap and init_fullsail_distribution_gauge functions don't verify if a gauge is alive before using it. The GlobalConfig has an alive_gauges field and is_gauge_alive function to check gauge status. However, these checks are never performed, which means inactive gauges could still be used.
Additionally, the init_fullsail_distribution_gauge function fails to check package version and if the pool is paused.
Missing Healthy Check When Lock Obligation
Severity: Medium
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
However, this function did not check the obligation is healthy or not, user can lock their liquidatable obligation at no cost. Even there were a function to forcely unlock unhealthy obligation, but still malicious user can race this process by continously lock their unhealthy obligation.
Assets May be Locked in Proposals
Severity: Medium
Ecosystem: Sui
Protocol: Legend of Arcadia
Auditor: MoveBit
Report Date: Jun 2023
Description:
A proposal cannot be canceled until it reaches an approval or rejection threshold. Proposals can get stuck if MultiSignature participants are inactive and not voting, causing data or assets in the proposal to be locked.
Lack of Validation for Campaign Status in invest
Severity: Medium
Ecosystem: Sui
Protocol: SuiPad
Auditor: MoveBit
Report Date: Apr 2023
Description:
No validation for closed campaigns — users can invest in campaigns that are already closed, leading to confusion or incorrect token distribution.
No Pool Status Check
Severity: Medium
Ecosystem: Sui
Protocol: Cetus Concentrated Liquidity Protocol
Auditor: MoveBit
Report Date: Mar 2023
Description:
No suspension checks — functions like repay_flash_swap, repay_flash_swap_with_partner, update_pool_url, and update_fee_rate can still modify pool data even when the pool is suspended.
Owner’s address is not updated
Severity: Medium
Ecosystem: Sui
Protocol: Mini Miners
Auditor: MoveBit
Report: https://github.com/movebit/Sampled-Audit-Reports/blob/main/reports/Mini-Miners-Contract-Audit.pdf
Report Date: Apr 2023
Description:
info is a shared object, so ownership cannot be transferred through transfer, and after the change the ownership, the owner address in info is not updated, and the next assert will panic.
Reserve Interest Not Updated in Timely Manner
Severity: Medium
Ecosystem: Sui
Protocol: Aries Market
Auditor: MoveBit
Report Date: June 2023
Description:
Interest may become outdated for long-standing loans; recommend periodic updates to keep interest calculations synchronized.
Shared Global Vault Without Pool-Specific Balance Tracking Enables Cross-Pool Reward Drainage
Severity: Medium
Ecosystem: Sui
Protocol: Magma DEX
Auditor: Three Sigma
Report: https://cdn.sanity.io/files/qoqld077/staging/9566473c444a6cfd99c7a6556fa4857950b41de3.pdf
Report Date: July 2025
Description:
The ALMM protocol implements a reward system where all pools share a single RewarderGlobalVault instance, while each pool maintains its own RewarderManager for tracking reward emissions and growth. The critical flaw lies in the absence of pool-specific reward balance tracking within the global vault, allowing pools to withdraw rewards that were intended for other pools.
Epoch Mismatch in Storage Reclamation
Severity: Medium
Ecosystem: Sui
Protocol: Walrus
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
Epoch mismatch causes extend_blob to fail: decrease_storage_to_reclaim in storage_accounting attempts to reduce storage in the wrong epoch.
Risk of Compromising Snapshot Integrity
Severity: Medium
Ecosystem: Sui
Protocol: Mysten Republic Security Token
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
total_supply compromised during join. join allows two different tokens to be merged into one, potentially altering the balances and total supply of tokens mid-snapshot. If tokens that are part of the snapshot join with those that are, total_supply will no longer be equal to unlocked_sum + locked_sum.
Health Check Performed On Outdated State
Severity: Medium
Ecosystem: Sui
Protocol: Navi
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
The is_health assert in execute_withdraw and execute_borrow in logic.move depends on the user’s collateral and loan balances. However, these balances are not updated with update_state during health validation, potentially causing inaccuracies. This issue is particularly impactful during the liquidation process, as outdated collateral asset states may lead to exclusion from liquidation.
Improper Stake Update
Severity: Medium
Ecosystem: Sui
Protocol: Bucket
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: June 2023
Description:
In the handle_redeem function in bucket.move, when redeeming Bottles, the else case inside the while loop handles the last Bottle’s redemption. When the remaining redemption amount is less than the Bottle’s buck amount, the loop ends in the else case with a break and skips the call to bottle::update_stake_and_total_stake_by_debtor on the last Bottle. Needs bottle::update_stake_and_total_stake_by_debtor on break.
Restake Sui
Severity: Medium
Ecosystem: Sui
Protocol: Volo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description:
A vulnerability arises when a user creates an UnstakeTicket for a large stake. This may prevent the user from burning the ticket and reclaiming the staked SUI during the current epoch.
Include Pending In Unstake
Severity: Medium
Ecosystem: Sui
Protocol: Volo
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2023
Description:
native_pool::burn_ticket_non_entry employs native_pool::unstake_amount_from_validators to collect SUI for returns to the user. However, it does not consider the coins held in NativePool::pending.
Missing Timestamp Update
Severity: Medium
Ecosystem: Aptos
Protocol: Aries Markets
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: May 2024
Description:
When adding or removing rewards in the liquidity farming contract, the update_reward function is called to adjust the reward per share based on the elapsed time (time_diff). However, these functions currently do not update the farm.timestamp after invoking update_reward. Consequently, if subsequent reward distribution actions occur without updating the timestamp, the rewards for the same time period will be double-claimed.
Wallet Balance Misverification
Severity: Medium
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
ds_token::check_wallets_for_list checks the total token balance for an investor instead of the balance in each individual wallet. This implies that even if a wallet holds zero tokens, it will still be added tothe active wallet list if the investor’s total balance is non-zero. This discrepancy may allow an investor to create a large number of empty wallets that are added to the wallet tracking structures ( wallet_indexes and wallet_list ). Thus, an investor may create numerous dead wallets (wallets with a zero token balance), initiating a token transfer to each of these wallets with a value of zero.
Missing Bound Check on Lock Removal
Severity: Medium
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
When a lock is removed, it is not actually deleted from the SmartTable storing lock records. This renders the data accessible in the system even after it is supposedly removed. Since locks are not fully removed from the SmartTable , view functions may show locks that should have been deleted. Also, the lock_index is not validated to ensure it is within the bounds of the investor’s lock count. Thus, the lock_index values may be out of bounds, potentially attempting to delete nonexistent records. As a result, the same lock may be removed multiple times repeatedly, each time decreasing the lock count.
Failure to Clear Investor Attributes After Removal
Severity: Medium
Ecosystem: Aptos
Protocol: Aptos Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
In registry_service::remove_investor , when an investor is removed, only their main record in the investors table is deleted. Any associated data, such as compliance attributes, remains in the attributes table. If a new investor is later registered with the same ID as the removed investor, the system will inadvertently link the new investor to the old attributes, potentially allowing unintended access to privileges based on deleted investor’s attributes.
Failure to Convert to veTHL
Severity: Medium
Ecosystem: Aptos
Protocol: Thala LSD
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
When a user unlocks their veTHL via vetoken::unlock , the system resets the unlockable_epoch to zero. Additionally, if a user registers an account without locking veTHL , unlockable_epoch is also set to zero.
Low Findings
Scope of Paused Flag in Market
Severity: Low
Ecosystem: Sui
Protocol: Creek Finance
Auditor: MoveBit
Report: https://movebit.xyz/reports/Creek-Audit-Report-2025-12-30.pdf
Report Date: Dec 2025
Description:
In the current implementation of Market, The paused flag currently affects the following operations: borrow, deposit_collateral, borrow_flash_loan, repay, and withdraw_collateral. It does not affect mint_gusd and redeem_gusd.
Proposals get stuck in pending when criteria are changed during voting
Severity: Low
Ecosystem: Sui
Protocol: Aeon
Auditor: Asymptotic
Report: https://info.asymptotic.tech/aeon-audit-report#262c1aef2c7042b7816a0015ed4a0051
Report Date: Feb 2025
Description:
approve_proposal could result in the proposal being approved, rejected, but marked as still pending. A proposal can become rejected before the call to approve_proposal because of user deletion, or changes to the admin_quorum_threshold.
Worst case, this could lead to delays in rejecting proposals. The workaround from a user perspective would be to revote.
Missing Pause State Verification
Severity: Low
Ecosystem: Sui
Protocol: Momentum
Auditor: MoveBit
Report Date: Nov 2025
Description:
The sync_staking_pool and update_pool_reward_emission functions are public and do not verify whether the contract is paused.
initialize_reward And add_reward Can Be Executed When emergency_reward_pause
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
When emergency_reward_pause is set to true, operations related to the reward manager should be stopped, as mentioned in the comments. However, in the actual execution logic, this state is only checked in the reward_settle() function through a call to emergency_reward_pause(). Since initialize_reward() and add_reward() does not call the reward_settle function, they can still be executed when emergency_reward_pause is true, which violates the intended design.
Empty Bins Can Be Marked As Used
Severity: Low
Ecosystem: Sui
Protocol: Cetus DLMM
Auditor: CertiK
Report: https://drive.google.com/drive/u/0/folders/1d9nv3nJidsbQ0vDT8D1kEuR3rJzK2ULg
Report Date: Sep 2025
Description:
In pool.move, the open_position_on_bin function marks a bin as "used" through the add_bin_in_group_if_absent function without checking if the bin is empty or if both amount_a and amount_b are zeros. Therefore, an empty bin may be marked as "used". This might lead to unexpected corner cases in the project's operations.
Missing State Verification
Severity: Low
Ecosystem: Sui
Protocol: Drife Technologies
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Dec 2023
Description: driver_cancel_ride, rider_cancel_ride, and admin_cancel_ride lack the verification of the current ride state. This absence of state verification may result in a driver canceling a ride even after the rider has already canceled the same ride via rider_cancel_ride, or vice versa. This may allow rider or driver to falsely set the on_ride value to false. Additionally, an admin may cancel a ride at any point, regardless of its current state.
Transaction Failure due to Race Condition
Severity: Low
Ecosystem: Sui
Protocol: Recrd
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2024
Description: Before the buy transaction is completed the state of the seller changes from ON_SALE to RETAINED. However, due to the assertion needing seller == ON_SALE, transaction will always fail.
Improper Validator Management
Severity: Low
Ecosystem: Sui
Protocol: Solend Liquid Staking
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
In the current implementation of the protocol, there is no logic to remove validators from the list of validator_infos . It is possible to remove an existing validator, which will only mark it as inactive.
Failure to Update Last Used Timestamp of Vault Cap
Severity: Low
Ecosystem: Sui
Protocol: Aftermath Market Making
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Jan 2025
Description:
Due to the failure to update last_used_timestamp_ms after successfully modifying the vault parameters, the recorded last-used timestamp in the VaultOwnerCap remains unchanged, allowing additional updates to bypass the cool-down check. As a result, it will be possible to continuously update these parameters to extremely low or high values, destabilizing the system.
Lack of Synchronization Between Bank and LendingMarket
Severity: Low
Ecosystem: Sui
Protocol: Solend Steamm
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Feb 2025
Description:
The vulnerability arises from the lack of full integration between bank and LendingMarket features. It is possible for the LendingMarketOwnerCap to create additional ObligationOwnerCap instances. This implies that a new obligation may be created without requiring interaction with the Bank module, which should ideally have control over such state changes. Furthermore, claim_rewards_and_deposit allows for the claim of rewards and automatic deposit of CTokens , which increases the obligation’s CTokens balance. As this feature operates outside the control of bank, it will not account for these changes in its tracking system.
Failure to Update Default Group
Severity: Low
Ecosystem: Sui
Protocol: Mysten Republic Security Token
Auditor: OtterSec
Report:
https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Apr 2025
Description:
Within remove_address_from_group in group_holder_config , the specified address is removed from its current group (old group), and the address_info for the address is updated, setting its group_id to DEFAULT_GROUP. However, it does not add the address to the holders list of the default group in config.groups. By setting address_info.group_id to DEFAULT_GROUP, the function intends to reassign the address to the default group.
However, without updating the DEFAULT_GROUP in Group.holders, the reassignment will be incomplete. This will result in an inconsistency, as the address will appear to belong to the default group based on address_info, but it will not be listed as a holder within the actual DEFAULT_GROUP in config.groups.
Don't Transfer Zero Coin
Severity: Low
Ecosystem: Sui
Protocol: Fluidity
Auditor: MoveBit
Report: https://movebit.xyz/reports/Fluidity-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
After calling redeem , if redeemed_coin_amount is 0, the protocol will transfer zero coin to the user, which will lead to more useless objects under the address, it is recommended to call destroy_zero in the contract to destroy coin with a zero value.
pause and resume Functions Should Check States First
Severity: Low
Ecosystem: Sui
Protocol: Random-Vault
Auditor: MoveBit
Report: https://movebit.xyz/reports/Random-Vault-Final-Audit-Report.pdf
Report Date: Feb 2024
Description:
The lottery.move, pause, and resume functions are used in emergencies to pause the protocol and resume it. However, typically it should be checked if it's already paused or unpaused first. And the related event would be emitted as well.
The Value Of able_to_remove_bid May Be The Same
Severity: Low
Ecosystem: Sui
Protocol: Typus Finance
Auditor: MoveBit
Report Date: May 2023
Description:
When updating the value of able_to_remove_bid, it is not judged whether it is the same as the original value, resulting in the value of able_to_remove_bid not being updated. In this case, no event should be emitted.
Missing Last Modifier Update
Severity: Low
Ecosystem: Aptos
Protocol: Aptos Labs Securitize
Auditor: OtterSec
Report: https://ottersec.notion.site/Sampled-Public-Audit-Reports-a296e98838aa4fdb8f3b192663400772
Report Date: Oct 2024
Description:
set_attribute currently does not update the last_updated_by field in the investor’s record, which may result in outdated tracking of who last modified the investor’s attributes.
Collateral flag for liquidator can be overridden by cached user config when self liquidating
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
- The liquidation_logic::liquidation_call keeps a cached user_config_map for the violator throughout the function.
- In the middle of the function, the liquidate_a_token call can set the collateral flag to true of the liquidator (which is also the user when self-liquidating).
- Afterwards, burn_bad_debt ! burn_debt_token is called which users the cached user config user_config_map that does not have the collateral flag set. If outstanding_debt == 0, it turns off the borrowing for the reserve and sets the entire user config again - overwriting the collateral flag from liquidate_a_tokens.
update_state is not updating the cache
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The pool_logic::update_state function, which computes the new indexes, takes a &mut ReserveCache but does not update its timestamp. Functions that take a &mut ReserveCache should perform the code based on the values in the reserve cache and return an updated reserve cache.
Repaying with the AToken does not turn off the use-as-collateral flag when the user use the whole AToken balance
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
Users can repay their debt by using the corresponding AToken instead of the debt's underlying. If the user consumes the whole AToken balance and the AToken was used as collateral, the system should update the user's using_as_collateral flag to false for such asset. By not turning it to false, the system creates an inconsistency between the user's balance state and the config's state which could lead to unexpected behaviors given that such a flag is widely used both directly and indirectly across the protocol's logic.
Liquidation does not turn off the use-as-collateral flag when the liquidator seize the whole borrower's collateral
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
During the liquidation process, the liquidator could have seized the whole borrower's collateral. In such case, the protocol must update the borrower's user config and turn off the use-as-collateral flag for the collateral token. The Aptos codebase is not performing such operation that could lead to unexpected behavior for the borrower.
validate_set_use_reserve_as_collateral edge case handling
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Spearbit
Report Date: Jun 2025
Description:
The current implementation of the validate_set_use_reserve_as_collateral will always revert if the user_balance is equal to zero. There could be edge case scenarios where the protocol has failed to turn-off automatically (rounding down errors, logic errors and so on) the use-as-collateral flag for the asset in the user's config and the user would like to manually turn that flag to false.
LTV could be mistakenly reset due to missing set_reserve_freeze() check
Severity: Low
Ecosystem: Aptos
Protocol: AAVE v3.0.2 Core
Auditor: Certora
Report: https://github.com/aave/aptos-aave-v3/blob/main/audits/Certora Aave Aptos Core V3.0.2 Report.pdf
Report Date: Apr 2025
Description:
The function set_reserve_freeze() is not checking if freeze is different from the current frozen state, which could lead to resetting the current or pending ltv accidentally. set_reserve_freeze() is supposed to work as a toggle for freezing/unfreezing reserves. However, if we perform the same action twice, for example, unfreezing and then unfreezing again, the set_reserve_freeze() functionality goes beyond toggling and undermines the configuration set by the configure_reserve_as_collateral() function.
Underconfigured state is possible
Severity: Low
Ecosystem: Aptos
Protocol: Propbase
Auditor: Hacken
Report: https://hacken.io/audits/propbase/sca-propbase-staking-feb2024/
Report Date: Feb 2024
Description:
State resources such as StakePool, StakeApp, RewardPool are not initialized atomically. This means there is a possibility for the state to be underconfigured when it is being used. Setting/updating some of the fundamental fields is optional but the validity of the state is mandatory.
Incomplete storage cleanup on full withdrawal
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Description:
In the locked_funds.move function update_user_collateral_coin_types() when users
withdraw all tokens of a specific type, the tracking list is updated, but the underlying
BalanceStore
Ghost members in ACL causing potential storage bloat
Severity: Low
Ecosystem: Sui
Protocol: Elixir
Auditor: Pashov Audit Group
Report: https://github.com/pashov/audits/blob/master/team/pdf/Elixir-security-review_2025-08-17.pdf
Report Date: Aug 2025
Code: N/A
Description:
The bug occurs in remove_role and set_roles functions in acl.move, where members with all roles revoked (roles=0) remain in the roles_by_member LinkedTable without automatic removal, leading to accumulation of useless entries via repeated add/clear operations; this bloats storage and increases gas costs/iteration time in get_members , degrading performance over time.
Appendix: Move Protocols & Audit Reports
OtterSec Reports
- Cetus DLMM - Nov 2025
- Kuna Labs – Jun 2025
- Aptos ULN 301 – May 2025
- Kofi Finance Contacts – May 2025
- Thala Chainlink Oracle – May 2025
- Mysten Republic Security Token – Apr 2025
- Mysten Deepbook V3 – Apr 2025
- Echleon – Apr 2025
- Echleon Staked LPT – Apr 2025
- Mayan Sui – Feb 2025
- Solend Steam – Feb 2025
- Lombard Sui – Feb 2025
- Walrus Contracts – Feb 2025
- Thala LSD – Feb 2025
- Thala Deps – Feb 2025
- Emojicoin – Feb 2025
- Thala Swap + Math V2 – Jan 2025
- Aftermath Market Making – Jan 2025
- TruFin – May 2024
- Amnis Finance – May 2024
- Aries Markets – May 2024
- Sui Axelar Gateway V2 – May 2024
- Cetus – May 2024
- Turbos – May 2024
- First Digital – Jun 2024
- Mysten Deepbook – Aug 2024
- Fungible StakedSui – Aug 2024
- ThalaSwapV2 – Aug 2024
- Merkle Token – Jul 2024
- Merso Lending – Jul 2024
- Hop Aggregator – Oct 2024
- Solend Liquid Staking – Oct 2024
- Aptos Securitize – Oct 2024
- BlueFin Spot – Nov 2024
- Lombard Finance – Dec 2024
- Wormhole Sui Integration – Dec 2024
- Drife Technologies – Dec 2023
- Haedel LSD – Nov 2023
- Volo – Oct 2023
- Aftermath LSD – Oct 2023
- Tsunami GMX – Sep 2023
- Pontem clmm – Aug 2023
- Scallop – Jul 2023
- Navi – Jun 2023
- Bucket – Jun 2023
- Tortugal – Jun 2023
- Aries Market (Sui) – Jun 2023
- Thala – May 2023
- Aftermath – May 2023
- Wormhole Sui – May 2023
- Mysten Labs Sui (Rust and Move) – May 2023
- BlueJay – May 2023
- Ghost Ivy – May 2023
- Lucky Kat – May 2023
- Suia – May 2023
- Steamflow – Mar 2023
- Typus Finance – Apr 2023
- MovEX – Apr 2023
- KriyaDEX – Apr 2023
- MSafe Maven – Apr 2023
- SuiPad – Apr 2023
- Mini Miners – Apr 2023
- Mokshya/Wapal Aptos NFT Mint Smart – Mar 2023
- PatronusFi – Mar 2023
- Aries Market (Aptos) – Feb 2023
- Mole – Feb 2023
- AptoPad – Feb 2023
- Thala Labs – Feb 2023
- Wormhole NFT Aptos – Feb 2023
- Eternal Finance – Jan 2023
- Cetus – Jan 2023
- Pontem Harvest – Jan 2023
- PancakeSwap OFT – Dec 2022
- PancakeSwap IFO – Dec 2022
- Econia – Dec 2022
- Meeiro – Dec 2022
- Aries Markets – Nov 2022
- Swithboard Aptos – Nov 2022
- Pancake Swap – Nov 2022
- Laminar Markets – Oct 2022
- Argo – Oct 2022
- Tortuga – Oct 2022
- Ditto – Oct 2022
- Pyth – Oct 2022
- Wormhole Aptos – Oct 2022
- MSafe – Oct 2022
- LayerZero Aptos – Sep 2022
- Pontem (Liquidswap) – Sep 2022
MoveBit Reports
- Creek Finance – Dec 2025
- Momentum – Nov 2025
- Momentum CLMM – Nov 2025
- Cetus DLMM – Sep 2025
- FlowX Finance – May 08, 2024
- Liquidswap – Apr 20, 2024
- Pontem – Apr 20, 2024
- MoveGPT – Apr 11, 2024
- StreamFlow – Mar 26, 2024
- Superposition – Mar 26, 2024
- Amnis – Mar 14, 2024
- Cellana Smart Contract – Feb 20, 2024
- Dola Protocol – Feb 07, 2024
- Random-Vault – Feb 02, 2024
- Cetus Farming Smart Contracts – Jan 19, 2024
- vibrantX – Jan 08, 2024
- Baptswap – Dec 18, 2023
- Haedel – Dec 04, 2023
- Kuna Labs Yield Optimizer Smart Contract – Nov 15, 2023
- Aftermath Finance Liquid Staking Derivative – Nov 21, 2023
- Supra – Sep 10, 2023
- Volo – Sep 07, 2023
- Kanalabs aggregator Smart Contract – Sep 07, 2023
- Scallop – Jun 2023
- Bucket Protocol – Jun 2023
- Legend of Arcadia – Jun 2023
- Aries Market (Sui) – Jun 2023
- Navi – Jul 2023
- Talofa Corporation – May 2023
- Turbos Finance-TurboStar – May 2023
- Lucky Kat – May 2023
- Suia – May 2023
- Typus Finance – Apr 2023
- MovEX – Apr 2023
- KriyaDEX – Apr 2023
- MSafe Maven – Apr 2023
- SuiPad – Apr 2023
- Mini Miners – Apr 2023
- Merkle Trade Smart Contract – Jul 21, 2023
- Mokshya/Wapal Aptos NFT Mint Smart – Mar 2023
- PatronusFi – Mar 2023
- Cetus Concentrated Liquidity Protocol (Sui) – Mar 2023
- Aries Market (Aptos) – Feb 2023
- Mole – Feb 2023
- AptoPad – Feb 2023
- Cetus Concentrated Liquidity Protocol (Aptos) – Jan 2023
- Transit Finance – Nov 2022
- Sui AMM swap – Nov 2022
- MoveDID – Nov 2022
Zellic Reports
- Magna Finance – Nov, 2025
- Matrixdock – Jul 28, 2025
- Garden Move Deploy – Jun 4, 2025
- Cetus – Apr 11, 2025
- Magma Finance – Jan 31, 2025
- Echelon – Jan 16, 2025
- Econia – Jan 5, 2023
- Wormhole Aptos – Nov 29, 2022
- PancakeSwap Aptos – Nov 17, 2022
- LiquidSwap – Nov 3, 2022
- OFT – Nov 1, 2022
- Laminar Markets – Oct 26, 2022
- Tortuga Liquid Staking – Oct 21, 2022
- Aptos Dollar – Oct 7, 2022
- Momentum Safe – Sep 23, 2022
MoveJay Audit Reports
- Aave Core
- Aave Core v2
- Aave Periphery
- Navi
- Kofi Finance
- Poel
- Studio Mirai
- OL Network
- Dexlyn Bridge
- Project Z
- StakeSphere
- AquaSwap
- Thala
Hacken / HackenProof
- Dexlyn Perp DEX – Sep 2025
- Echo Protocol Bridge – Aug 2025
- Pools Finance – Jun 2025
- Hacken RedStone – Feb 2025
- Hacken S3Money – Jan 2025
- Hacken Dexlyn Hyperlane - Dec 2024
- Hacken Volo – Sep 2023
- Hacken Zesh AI – Dec 2024
- HackenProof DexLyn Smart Contract Audit Contest – Sep 2025
Asymptotic
- Cetus CLMM – Nov 2025
- Momentum CLMM – Aug 2025
- Full Sail CLMM – May 2025
- ZO Perps(Sudo) – Mar 2025
- SatLayer Sui – Mar 2025
- Aeon – Feb 2025
- Bluefin RFQ – Feb 2025
- Kai Finance – Aug 2024
ExVul
- Hyperion – Apr 2025
- TokinmonsterAI – May 2025
- Mango – Jul 2025
Protocol-specific Reports
- AAVE v3.0.2 Core Certora – Apr 2025
- AAVE v3.1-3.3 Core Certora – Apr 2025
- AAVE v3.1-3.3 Core OtterSec – Aug 2025
- AAVE v3.0.2 Core Spearbit – Jun 2025
- AAVE v3.1-3.3 Core Spearbit – Jun 2025
- AAVE v3.0.2 Periphery Spearbit – Jun 2025
Contests
- AAVE v3 Cantina Contest – May–Jun 2025
- Initia Cabal Liquid Staking Code4Arena Contest – May 2025
- Initia Move Code4Arena Contest – Apr 2025
Quantstamp
- Echelon Market – Mar 2025
- BucketV2 – Aug 2025
Sherlock
- Momentum VeMMT - Nov 2025
Pashov
- Elixir – Aug 2025
CertiK
- Cetus DLMM - Sep 2025
Zenith
- KoFi Finance - Mar 2025
SlowMist
- Yeap Finance – Jul 2025
Three Sigma
- Magma DEX – Jul 2025
Access the reports using the links below:
| Audit Firm/Auditor | Report Links |
|---|---|
| OtterSec | Sampled Public Audit Reports (OtterSec Notion) |
| MoveBit | MoveBit — Sampled Audit Reports |
| MoveJay | MoveJay (Jayfromthe13th) |
| Zellic | Zellic Reports |
| Spearbit | Spearbit Reports |
| Cantina | Cantina Reports |
| Code4Arena | Code4Arena Reports |
| Certora | Certora Security Reports |
| Hacken | Hacken Audits |
| Pashov Audit Group | Pashov Audit Group — Audits |
| ExVul Security | ExVul Audits |
| Quantstamp | Quantstamp Reports |
| SlowMist | SlowMist Reports |
| Three Sigma | Three Sigma Reports |
| Asymptotic | Asymptotic Reports |
| Sherlock | Sherlock Reports |
Sui Learning Resources
📖 Reading & Documentation
Whitepapers & Books
Articles
- Sui Move for EVM and SVM Developers: Part 1 - Mental Models - Adevar Labs
- How Sui Move Rethinks Flash Loan Security - Trail of Bits
- Move Fast & Break Things, Part 2: A Sui Security Primer - Zellic
- The Billion Dollar Bug: Finding and Fixing a Critical Issue in the Move Bytecode Verifier - Zellic
- Introducing Movetool: A Move Bytecode Disassembler - Zellic
- Sui Foundation Move Blogs - Sui Foundation
🔐 Security-Specific
- Understand Sui Security - Official Docs
- Sui MOVE Smart Contract Auditing Primer - SlowMist
🎥 Video Courses & Tutorials
- Introduction to Sui - Dacade
- Build On Sui Playlist - Sui Community
- Move on Sui Course - MoveBit
🎮 Interactive & Gamified
- Let's Move Sui - Mysten Labs
🛠️ Hands-On Practice
- Building a Dapp with React, Move, and zkLogin on Sui - Dacade
- Building with Sui DeepBook: A DeFi Tutorial - Dacade
- Master Sui Move, Build Beyond - Metaschool
- Move on Sui Course - RiseIn
Aptos Learning Resources
📖 Reading & Documentation
Whitepapers & Books
Articles
- Move Fast and Break Things Part 1 - Zellic
- Top 10 Aptos Move Bugs - Zellic
- Aptos Network Blogs - Aptos Network
🔐 Security-Specific
- Move Security Guidelines - Official Docs
🎮 Interactive & Gamified
Academic Research & General Move Resources
📚 Academic Journals
- A Comparative Study of Solidity and Sui Move
- A Systematic Classification of Vulnerabilities in MoveEVM Smart Contracts
- Deferred Objects to Enhance Smart Contract Programming with Optimistic Parallel Execution
📝 General Move Articles (CertiK Series)
- An Introduction to Move
- Formal Verification, the Move Language, and the Move Prover
- The Move Prover: Quality Assurance of Formal Verification
- Facebook's "Move" Programming Language vs Solidity and DeepSEA
Move for Solidity Developers Series