The FlapTaxTokenV3 contract implements an upgradeable ERC20 token with dynamic taxation and liquidation mechanisms. The audit identified a critical denial of service vulnerability where external calls within the transfer logic can halt all token transfers. Medium risks include significant owner control over critical state transitions and potential for front-running on tax rate changes. The contract utilizes OpenZeppelin's upgradeable patterns effectively, ensuring upgrade safety. Recommendations focus on robust error handling for external interactions, decentralizing control where feasible, and optimizing gas efficiency.

Early-stage security check — honeypot & rug-pull analysis
Is SOCK 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 taxation and liquidation mechanisms.
Read the full analysis- Proxy contract
- Non-standard proxy storage
- Top-10 concentration > 20%
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- Liquidity < $50k
- LP top1 unlocked holder = 100.0%
- LP top3 unlocked holders = 100.0%
- Token age < 7 days
- 1 Critical 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 > 20% (44.4% total → 27.6% effective; 16.4% in EOAs, 28.0% in contracts — mild)
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- Liquidity < $50k ($19,480 across 1 pairs — thin market)
- LP top1 unlocked holder = 100.0% (independent LP — depth risk)
- LP top3 unlocked holders = 100.0% (independent LP — depth risk)
- Token age < 7 days (early, volatile)
- 1 Critical 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, staking28.0%
- Walletsanonymous holders, free to sell16.4%
- Everyone elsethe rest of the supply55.6%
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 not locked or burned, so whoever holds them can withdraw that liquidity.
0xddac…308cNo privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
CriticalDenial of Service (DoS) on All Transfers Due to Reverting External Calls
The _liquidateTax function is called at the beginning of every _transfer operation. This function contains external calls to ITaxProcessor(taxProcessor).processTax(...) and IDividend(dividendContract).distributeDividends(...). If either of these external calls reverts for any reason (e.g., misconfiguration, temporary issues in the external contract, or malicious action targeting the external contract), all subsequent _transfer calls will also revert, effectively halting all token transfers for all users. This constitutes a severe denial of service for the entire token functionality.C-01
Issue
The _liquidateTax function is called at the beginning of every _transfer operation. This function contains external calls to ITaxProcessor(taxProcessor).processTax(...) and IDividend(dividendContract).distributeDividends(...). If either of these external calls reverts for any reason (e.g., misconfiguration, temporary issues in the external contract, or malicious action targeting the external contract), all subsequent _transfer calls will also revert, effectively halting all token transfers for all users. This constitutes a severe denial of service for the entire token functionality.
Fix
Implement robust error handling for external calls within _liquidateTax. Consider using try/catch blocks to gracefully handle reverts without blocking core token transfers. Alternatively, decouple the tax liquidation process from the _transfer function. This could involve moving the liquidation logic to a separate, owner-callable function or a function that can be called by anyone but does not revert if external calls fail (e.g., by using a pull-based mechanism for tax processing or allow…
Status
Unresolved
MediumCentralization Risk with Owner-Controlled State Transitions
The OwnableUpgradeable pattern grants the contract owner significant control over critical state transitions. Functions like startMigration and finalizeMigration are onlyOwner and directly change the poolState, which dictates the token's taxation rules. While necessary for initial setup and migration, this centralized control allows the owner to unilaterally alter the token's economic behavior, potentially without sufficient community oversight or warning. The taxProcessor and dividendContract addresses are set during initialization and cannot be changed, but the owner's ability to trigger state changes that affect their interaction is significant.M-01
Issue
The OwnableUpgradeable pattern grants the contract owner significant control over critical state transitions. Functions like startMigration and finalizeMigration are onlyOwner and directly change the poolState, which dictates the token's taxation rules. While necessary for initial setup and migration, this centralized control allows the owner to unilaterally alter the token's economic behavior, potentially without sufficient community oversight or warning. The taxProcessor and dividendContract addresses are set during initialization and cannot be changed, but the owner's ability to trigger state changes that affect their interaction is significant.
Fix
For critical owner-controlled functions that significantly alter the token's economic model, consider implementing a timelock mechanism. This would introduce a delay between the owner initiating a change and it becoming effective, providing users and the community with time to react or exit if they disagree with the proposed changes. Additionally, review if any other critical parameters should be immutable or have a more decentralized update mechanism.
Status
Unresolved
MediumPotential for Front-running/MEV on Time-Based State Transitions
The _liquidateTax function modifies the poolState based on block.timestamp exceeding taxExpirationTime or antiFarmerExpirationTime. Specifically, it can transition the pool state from TaxEnforcedAntiFarmer to TaxEnforced or TaxFree. If the economic impact of these state changes (e.g., changes in tax rates) is significant, malicious actors or miners could front-run transactions to ensure their operations occur just before or after a state transition, potentially gaining an unfair advantage. While block.timestamp is a standard mechanism, its manipulability by miners within a small window is a known vector for MEV.M-02
Issue
The _liquidateTax function modifies the poolState based on block.timestamp exceeding taxExpirationTime or antiFarmerExpirationTime. Specifically, it can transition the pool state from TaxEnforcedAntiFarmer to TaxEnforced or TaxFree. If the economic impact of these state changes (e.g., changes in tax rates) is significant, malicious actors or miners could front-run transactions to ensure their operations occur just before or after a state transition, potentially gaining an unfair advantage. While block.timestamp is a standard mechanism, its manipulability by miners within a small window is a known vector for MEV.
Fix
While block.timestamp is commonly used, be aware of its limitations regarding precise timing and potential for MEV. If the economic implications of these state transitions are critical, consider if alternative mechanisms (e.g., a commit-reveal scheme, or requiring a specific block number instead of timestamp for critical changes) could mitigate front-running. Ensure that the economic model accounts for potential MEV around these state changes.
Status
Unresolved
LowPrecision Loss in Tax Calculation
The tax calculation (amount * rate) / 10000 uses integer division. For small amount values or small buyTaxRate/sellTaxRate values, this can result in a calculated tax of 0, even if a fractional tax should theoretically apply. For example, if amount is 100 and rate is 1 (representing 0.01%), the calculation (100 * 1) / 10000 yields 0. This means the protocol might collect slightly less tax than intended for small transactions.L-01
Issue
The tax calculation (amount * rate) / 10000 uses integer division. For small amount values or small buyTaxRate/sellTaxRate values, this can result in a calculated tax of 0, even if a fractional tax should theoretically apply. For example, if amount is 100 and rate is 1 (representing 0.01%), the calculation (100 * 1) / 10000 yields 0. This means the protocol might collect slightly less tax than intended for small transactions.
Fix
Acknowledge that integer division inherently causes precision loss. If this minor loss is acceptable for the protocol's economic model, no change is strictly necessary. If higher precision is desired for very small transactions or rates, consider using a higher precision fixed-point math library or adjusting the tax rate basis (e.g., using a denominator of 100_000 or 1_000_000 instead of 10_000) to allow for finer granularity in tax rates.
Status
Unresolved
InfoSuboptimal Storage Packing in PackedPoolState Struct
The PackedPoolState struct contains members of various sizes: uint8, uint16, bool, uint96, uint64, uint48. While Solidity attempts to pack variables into 32-byte storage slots, the current ordering may not be optimal. Reordering the members from largest to smallest (or grouping smaller types strategically) can reduce the number of storage slots used, thereby saving gas on state reads and writes.I-01
PackedPoolState StructIssue
The PackedPoolState struct contains members of various sizes: uint8, uint16, bool, uint96, uint64, uint48. While Solidity attempts to pack variables into 32-byte storage slots, the current ordering may not be optimal. Reordering the members from largest to smallest (or grouping smaller types strategically) can reduce the number of storage slots used, thereby saving gas on state reads and writes.
Fix
Reorder the PackedPoolState struct members to optimize storage packing. A more efficient order would typically place larger data types before smaller ones, for example: uint96 liquidationThreshold, uint64 taxExpirationTime, uint48 antiFarmerExpirationTime, uint16 buyTaxRate, uint16 sellTaxRate, uint8 state, bool notLiquidating. This could potentially reduce the number of storage slots from 3 to 1 or 2, leading to gas savings.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The contract demonstrates a well-structured architecture (7.1) using OpenZeppelin standards for ERC20 and upgradeability. However, a critical code security (7.2) vulnerability exists where external calls to taxProcessor and dividendContract within the _liquidateTax function, which is called on every transfer, can cause all token transfers to revert if these external calls fail. This represents a severe denial of service. Additionally, minor precision loss (7.2) in tax calculations due to integer division was noted, and struct packing (7.2) could be optimized for gas efficiency.
The contract's economic model (7.4) involves dynamic tax rates and state transitions (e.g., BondingCurve to TaxEnforcedAntiFarmer). Access control (7.3) is managed via OwnableUpgradeable, granting the owner significant power to initiate migration phases (startMigration, finalizeMigration) which alter the token's tax behavior. This centralization introduces a medium risk. Furthermore, state changes based on block.timestamp within _liquidateTax could be susceptible to front-running or MEV (7.4) if the economic impact of these transitions is substantial, potentially allowing actors to gain an advantage.
The contract is designed as an upgradeable proxy (7.7) using OpenZeppelin's Initializable and ERC20Upgradeable patterns. The constructor correctly calls _disableInitializers() to prevent re-initialization of the implementation contract. The initialize function uses the initializer modifier, ensuring it can only be called once. This setup adheres to standard upgradeability best practices, minimizing risks associated with upgrades.
Prioritize addressing the critical denial of service vulnerability by implementing robust error handling for external calls within the _liquidateTax function.
Consider moving tax processing to a separate, pull-based mechanism or an owner-triggered function to decouple it from core token transfers. Evaluate the economic impact of owner-controlled state transitions and explore options for decentralization or timelocks for critical parameters. Finally, optimize struct packing for gas efficiency and acknowledge the precision loss in tax calculations.
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, 202670High
- Sep 3, 202651Medium
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Would You Like a More Detailed Audit of SOCK?
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