immortal fruit flies (IFF) security report
SecureChain AI scanned the verified IFF contract source and GoPlus evidence. No Critical or High-severity exploit was identified. Slither was skipped.
The project was AI scanned using independent source review and GoPlus evidence; Slither was skipped. The contract has no post-initialization public mint function and no owner-controlled tax setter, blacklist, pause, or proxy upgrade function in the reviewed source.
Trust score: 62/100. Source verified: Yes. Chain: bsc. Contract: 0x7c28942268bebd65012294b45266e5f7f5227777.
This report was last modified on 2026-09-29 and contains 3 material findings.
medium finding: Owner controls migration timing and can delay pool trading
The owner exclusively controls startMigration() and finalizeMigration(). While the token remains in BondingCurve state, any transfer involving a configured pool reverts. The owner can therefore delay migration indefinitely and determine when pool transfers become permitted and when tax enforcement begins.
Evidence: startMigration() and finalizeMigration() are both protected by onlyOwner. In _transfer(), BondingCurve state requires !pools[from] && !pools[to], preventing transfers to or from configured pools until the owner progresses the state machine.
Recommendation: Use a permissionless or time-bounded migration mechanism where practical, publish the expected migration schedule, and monitor ownership and PoolStateChanged events. Confirm that the owner is governed by a trusted multisig or timelock.
medium finding: Dividend callback failures can halt ordinary token transfers
When dividendContract is nonzero, every transfer involving a non-excluded sender or recipient calls dividendContract.setShare(). If either callback reverts, the entire token transfer reverts. A malfunctioning, incompatible, or unavailable dividend contract can therefore block buys, sells, and wallet transfers for affected accounts.
Evidence: _afterTokenTransfer() calls IDividend(dividendContract).setShare() for from and to and reverts with DividendShareUpdateFailed when the callback fails. dividendContract is assigned during initialize() and has no setter or recovery path in this contract.
Recommendation: Ensure the configured dividend contract is audited and operational before launch. Consider isolating share accounting from token transfers, using bounded failure handling, or adding a carefully governed recovery mechanism for a failed dividend integration.
medium finding: Tax liquidation depends on a trusted external processor and fallback sends all tax tokens to it
The token grants the configured taxProcessor an effectively unlimited allowance and delegates tax processing to it. If processing reverts, the fallback transfers the entire token contract balance, including accumulated tax tokens, directly to taxProcessor. This creates material custody and accounting risk if the processor is misconfigured, compromised, or intentionally nonfunctional.
Evidence: _processTax() approves taxProcessor for type(uint256).max when needed and calls processTaxTokens(). In the catch branch, it transfers balanceOf(address(this)) to taxProcessor using _plainTransfer(). taxProcessor is set during initialize() and cannot be changed by this contract.
Recommendation: Verify the deployed TaxProcessor implementation and its receiver configuration, monitor allowances and tax balances, and consider limiting approvals and implementing a safer failure destination or governance-controlled recovery process.