2027 (2027) security report
Radar AI scanned the verified 2027 contract on BNB Smart Chain. Findings include delayed tax expiry, transfer-reverting dividend callbacks, and tax-processor custody risk.
The verified source does not expose an owner mint function, blacklist, proxy upgrade function, or explicit arbitrary fee setter after initialization. However, tax expiration is enforced only when a sell reaches the main pool, and dividend callbacks can make ordinary transfers revert if the configured dividend contract fails. Tax processing also relies on an initialization-selected external processor with an effectively unlimited token allowance.
Trust score: 56/100. Source verified: Yes. Chain: bsc. Contract: 0xd5e0ba2a6db0afa6f26bde38637ad1ae50f77777.
This report was last modified on 2026-11-04 and contains 3 material findings.
medium finding: Tax can remain active after its configured expiration until a main-pool sell occurs
Tax expiration and anti-farmer state transitions are evaluated inside _liquidateTax(), which is only entered for transfers whose recipient is mainPool. The tax calculation functions do not independently check block.timestamp. Consequently, after the configured expiration time, pool-related transfers can continue to incur the stored buy or sell tax until a qualifying sell triggers the state transition.
Evidence: In _transfer(), tax is calculated through _getTaxWithPoolState() whenever the state is TaxEnforcedAntiFarmer or TaxEnforced. That helper checks pool membership and tax rates but not block.timestamp. In _liquidateTax(), expiration handling is inside a condition requiring to == mainPool.
Recommendation: Make tax applicability depend directly on block.timestamp, or perform expiration transitions independently of a sell to mainPool. Add tests covering buys and transfers after both taxExpirationTime and antiFarmerExpirationTime without a preceding main-pool sell.
medium finding: Dividend callback failure can block ordinary token transfers
When dividendContract is nonzero, every transfer involving a non-excluded sender or recipient calls the external dividend contract's setShare function. Any failure is caught and converted into DividendShareUpdateFailed, reverting the entire token transfer. A broken, incompatible, or unavailable configured dividend contract can therefore create a broad transfer-availability failure.
Evidence: _afterTokenTransfer() calls IDividend(dividendContract).setShare(from, balanceOf(from)) and setShare(to, balanceOf(to)) for addresses not excluded by the contract, pool, or zero/dead-address checks. Each catch block executes revert DividendShareUpdateFailed(...). dividendContract is supplied through initialize() and there is no recovery or bypass function in the verified contract.
Recommendation: Avoid making core ERC-20 transfers depend on a reverting external callback. Use non-blocking share accounting, an explicit trusted-callback failure policy, or a pause-resistant fallback path; validate and safely recover the dividend configuration during deployment.
medium finding: Initialization-selected tax processor has powerful custody over collected taxes
The taxProcessor is set during initialization and cannot be changed through any exposed function. During liquidation, the token grants it an effectively unlimited allowance. If processing fails, the contract transfers its entire remaining token balance to taxProcessor, not merely a separately tracked amount. This creates a strong deployment and external-component trust dependency over collected tax tokens.
Evidence: initialize() assigns taxProcessor from params.taxProcessor. _processTax() approves type(uint256).max when the allowance is insufficient, then calls processTaxTokens(taxAmount). In the catch branch it reads balanceOf(address(this)) and sends that full balance to taxProcessor with _plainTransfer().
Recommendation: Use a validated immutable or governed processor, minimize allowances, transfer only the intended tax amount, and define a recoverable failure path that does not grant the processor custody of unrelated token balances. Review the processor implementation and its access controls before deployment.