The FlapTaxTokenV3 contract implements an upgradeable ERC20 token with dynamic tax mechanisms and a multi-state pool system. The contract utilizes OpenZeppelin's upgradeable standards, ensuring a robust foundation. Key features include owner-controlled state transitions and an automated tax liquidation process involving external contracts. While the contract incorporates a reentrancy guard for its liquidation logic, significant risks stem from the high degree of owner control over critical parameters and external dependencies, as well as potential front-running opportunities related to tax liquidation. These factors contribute to an overall High risk level.

Early-stage security check — honeypot & rug-pull analysis
Is CSI888 a Scam?
Not verified
This record has not gone through deep verification and is not being monitored. The score is a dated snapshot — the token’s risk can change at any time.Own this token? Put it under verification →The FlapTaxTokenV3 contract implements an upgradeable ERC20 token with dynamic tax mechanisms and a multi-state pool system.
Read the full analysis- Proxy contract
- Non-standard proxy storage
- Top-10 concentration > 30%
- Liquidity < $10k
- Token age < 7 days
- 1 High finding(s) from audit
- 2 Medium finding(s) from audit
- 1 Low finding(s) from audit
Exact factors
- Proxy contract (upgradeable — admin can replace logic)
- Non-standard proxy storage (Etherscan-confirmed)
- Top-10 concentration > 30% (88.0% total → 38.6% effective; 5.8% in EOAs, 82.2% in contracts — moderate)
- Liquidity < $10k ($7,828 across 1 pairs — easily drained)
- Token age < 7 days (early, volatile)
- 1 High finding(s) from audit
- 2 Medium finding(s) from audit
- 1 Low finding(s) from audit
Each factor is an on-chain fact recorded at the time of this analysis. The score is computed from them by a deterministic function, so the same contract returns the same score for anyone who runs the audit. How scores are computed
Security Checklist
as of audit · Sep 4Holders
as of audit · Sep 4, 2026- Contractstreasury, vesting, bridge, staking82.2%
- Walletsanonymous holders, free to sell5.8%
- Everyone elsethe rest of the supply12.0%
How holder types affect the score
Share held by contracts — treasury, vesting, bridge or staking — is discounted against share held by wallets when the score is computed: a contract cannot decide to sell the way an anonymous holder can, though it can still be drained or voted to sell. Effective concentration is the figure the risk score is actually calculated from.
Holder balances as recorded by the audit of Sep 4, 2026
Liquidity
as of audit · Sep 4The risk score reads depth across every pair.
The LP tokens of the analysed pool are locked or burned.
Security Findings
HighExternal Call Trust and Potential for Malicious Tax Processor
The _liquidateTax function makes external calls to taxProcessor.processTax and dividendContract.distributeDividends. While a reentrancy guard (notLiquidating flag) is in place to prevent re-entry into the liquidation logic, these external contracts are critical dependencies. If taxProcessor or dividendContract are malicious or compromised, they could perform arbitrary actions, including draining the accumulated tax tokens held by the FlapTaxTokenV3 contract, or manipulating other aspects of the protocol. The taxProcessor and dividendContract addresses are set by the owner during initialization and cannot be changed.H-01
Issue
The _liquidateTax function makes external calls to taxProcessor.processTax and dividendContract.distributeDividends. While a reentrancy guard (notLiquidating flag) is in place to prevent re-entry into the liquidation logic, these external contracts are critical dependencies. If taxProcessor or dividendContract are malicious or compromised, they could perform arbitrary actions, including draining the accumulated tax tokens held by the FlapTaxTokenV3 contract, or manipulating other aspects of the protocol. The taxProcessor and dividendContract addresses are set by the owner during initialization and cannot be changed.
Fix
Thoroughly audit the taxProcessor and dividendContract contracts to ensure their security and trustworthiness. Consider implementing a mechanism to update these addresses (e.g., via governance or a timelock) in case of compromise, or ensure they are immutable and fully trusted and verified.
Status
Unresolved
MediumCentralization Risk via Owner Privileges
The startMigration and finalizeMigration functions, which control critical state transitions (BondingCurve -> Migrating -> TaxEnforcedAntiFarmer), are protected by the onlyOwner modifier. This grants the contract owner significant power to unilaterally change the token's operational state, impacting tax rates and transfer restrictions. While OwnableUpgradeable is a standard pattern, the extent of control over core token mechanics by a single entity represents a centralization risk.M-01
Issue
The startMigration and finalizeMigration functions, which control critical state transitions (BondingCurve -> Migrating -> TaxEnforcedAntiFarmer), are protected by the onlyOwner modifier. This grants the contract owner significant power to unilaterally change the token's operational state, impacting tax rates and transfer restrictions. While OwnableUpgradeable is a standard pattern, the extent of control over core token mechanics by a single entity represents a centralization risk.
Fix
Consider implementing a timelock for critical owner-controlled operations like state transitions to provide a delay for community review. Alternatively, explore a more decentralized governance mechanism (e.g., a DAO) for such sensitive actions.
Status
Unresolved
MediumPotential for Front-running or Sandwich Attacks on Liquidation
The _liquidateTax function is called at the beginning of every _transfer operation if the recipient (to) is the mainPool. If mainPool is a public DEX liquidity pool, and the conditions for tax liquidation are met (e.g., taxAmount >= currentPoolState.liquidationThreshold), a malicious actor could front-run a legitimate transfer to mainPool to trigger _liquidateTax. This could potentially allow manipulation of the liquidation process or profit from the resulting state changes, especially if the taxProcessor involves swaps or price-sensitive operations.M-02
Issue
The _liquidateTax function is called at the beginning of every _transfer operation if the recipient (to) is the mainPool. If mainPool is a public DEX liquidity pool, and the conditions for tax liquidation are met (e.g., taxAmount >= currentPoolState.liquidationThreshold), a malicious actor could front-run a legitimate transfer to mainPool to trigger _liquidateTax. This could potentially allow manipulation of the liquidation process or profit from the resulting state changes, especially if the taxProcessor involves swaps or price-sensitive operations.
Fix
Re-evaluate the trigger mechanism for _liquidateTax. Consider making it an onlyOwner function, or implementing a delay, a minimum time between liquidations, or a more robust threshold mechanism to prevent immediate exploitation via front-running. Ensure liqExpectedOutputAmount (if used by taxProcessor) is handled with slippage protection.
Status
Unresolved
LowLack of Emergency Pause Mechanism
The contract implements complex token transfer logic with dynamic tax rates and external interactions. In the event of an unforeseen bug, an exploit in a dependent contract, or a critical market event, there is no mechanism to pause token transfers or critical operations. This could lead to irreversible loss of funds or protocol instability before a fix can be deployed.L-01
Issue
The contract implements complex token transfer logic with dynamic tax rates and external interactions. In the event of an unforeseen bug, an exploit in a dependent contract, or a critical market event, there is no mechanism to pause token transfers or critical operations. This could lead to irreversible loss of funds or protocol instability before a fix can be deployed.
Fix
Implement OpenZeppelin's PausableUpgradeable module to allow the owner (or a designated role) to temporarily halt critical operations in an emergency. This provides a crucial safety net for rapid response to unforeseen issues.
Status
Unresolved
InfoSuboptimal Storage Packing for PackedPoolState
The PackedPoolState struct contains members of various sizes (uint8, uint16, bool, uint96, uint64, uint48). While Solidity attempts to pack variables to minimize storage slots, the current ordering may not be optimal. Reordering the members from largest to smallest (or grouping smaller types efficiently) could potentially reduce the number of storage slots used, leading to minor gas savings on read/write operations.I-01
PackedPoolStateIssue
The PackedPoolState struct contains members of various sizes (uint8, uint16, bool, uint96, uint64, uint48). While Solidity attempts to pack variables to minimize storage slots, the current ordering may not be optimal. Reordering the members from largest to smallest (or grouping smaller types efficiently) could potentially reduce the number of storage slots used, leading to minor gas savings on read/write operations.
Fix
Consider reordering the PackedPoolState struct members for optimal storage packing. For example, placing uint96, uint64, uint48 first, followed by uint16, uint16, uint8, bool could potentially reduce storage slot usage.
Status
Unresolved
InfoliqExpectedOutputAmount Variable is Unused
The state variable liqExpectedOutputAmount is declared and initialized during the initialize function but is not referenced or used anywhere within the provided FlapTaxTokenV3 contract code. If this variable is intended for use by an external contract (e.g., taxProcessor), its purpose should be clearly documented. If not, it represents unnecessary storage consumption.I-02
liqExpectedOutputAmount Variable is UnusedIssue
The state variable liqExpectedOutputAmount is declared and initialized during the initialize function but is not referenced or used anywhere within the provided FlapTaxTokenV3 contract code. If this variable is intended for use by an external contract (e.g., taxProcessor), its purpose should be clearly documented. If not, it represents unnecessary storage consumption.
Fix
Either integrate liqExpectedOutputAmount into the contract's logic or remove it to save gas and storage. If it's an external dependency, add comments explaining its intended use.
Status
Unresolved
InfoCorrect Use of _disableInitializers() in Constructor
The constructor correctly calls _disableInitializers(). This is a crucial security practice for upgradeable contracts, preventing the implementation contract from being initialized directly, which could lead to a 'state collision' or 'logic corruption' if the proxy later attempts to initialize it.I-03
_disableInitializers() in ConstructorIssue
The constructor correctly calls _disableInitializers(). This is a crucial security practice for upgradeable contracts, preventing the implementation contract from being initialized directly, which could lead to a 'state collision' or 'logic corruption' if the proxy later attempts to initialize it.
Fix
No action required. This is a best practice and correctly implemented.
Status
Resolved
Analysis
AI Copilotas of audit · Sep 4The contract implements a complex state machine for managing tax rates and token transfers, leveraging OpenZeppelin's ERC20 and Ownable upgradeable modules. The tax calculation and transfer logic are well-structured (7.2 Code Security). A reentrancy guard is present for the _liquidateTax function, which is a strength. However, the reliance on external taxProcessor and dividendContract introduces a significant trust assumption (7.6 External). Additionally, the _liquidateTax function, triggered by transfers to mainPool, could be susceptible to front-running (7.2 Code Security).
The contract's economic model revolves around dynamic buy/sell taxes and a liquidation mechanism that processes accumulated tax. The owner has significant control over critical state transitions (startMigration, finalizeMigration) and sets immutable external dependencies (taxProcessor, dividendContract) during initialization (7.5 Governance, 7.3 Access Control). This centralization introduces a medium governance risk, as a compromised owner key could manipulate the token's core economic behavior or direct funds to malicious external contracts (7.4 Economic).
The contract is designed as an upgradeable proxy using OpenZeppelin's Initializable pattern. The constructor correctly calls _disableInitializers() to prevent direct initialization of the implementation contract, which is a crucial security measure for UUPS proxies (7.7 Upgrades). The use of __ERC20_init, __ERC20Permit_init, and __Ownable_init ensures proper initialization of inherited upgradeable components. The overall upgradeability pattern appears sound.
It is highly recommended to conduct a thorough audit of the external taxProcessor and dividendContract to ensure their security and trustworthiness, as they represent critical dependencies.
Consider implementing a timelock or a more decentralized governance mechanism for critical owner-controlled functions and the ability to update external contract addresses. Additionally, evaluate the trigger conditions for _liquidateTax to mitigate potential front-running risks and consider adding a pause mechanism for emergency situations.
Contract & Record
Free for any token on the record. It links to this page and always shows the current score and the date it was checked.
- Sep 4, 202646Medium
- Aug 12, 202618Low
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Would You Like a More Detailed Audit of CSI888?
This token is brand new. Run a deeper AI-powered analysis of the contract code — free and instant.
Get Detailed Audit Is this your token? Publish your own audit on this page