太空牛 (太空牛) security report
SecureChain Radar AI scanned the verified 太空牛 contract on BSC. The review found no unrestricted mint, blacklist, proxy upgrade, or selfdestruct path in the supplied source. Key risks are conditional: a zero owner may leave pool transfers locked if migration is incomplete, tax rates are not bounded to 100%, and external dividend and tax-processor contracts can affect transfer availability and accumulated tax-token custody. Slither was not run, and live liquidity or market conditions are not assessed.
The source does not show an unrestricted mint, blacklist, proxy upgrade function, selfdestruct path, or obvious direct wallet-drain function. Material risks remain: a zero owner can permanently prevent migration if the token is still in BondingCurve state; initialization permits taxes above 100%, which can make pool transfers revert during enforcement; and external dividend and tax-processor contracts can materially affect transfers and tax-token custody.
Trust score: 57/100. Source verified: Yes. Chain: bsc. Contract: 0xdf2c3dd78d76863a32a2f209ffb3ed4286db7777.
This report was last modified on 2026-09-29 and contains 4 material findings.
high finding: Renounced owner can permanently lock pool transfers if migration is incomplete
While the pool state is BondingCurve, every transfer involving any configured pool reverts. Only the owner can call startMigration and finalizeMigration. GoPlus reports owner_address as the zero address, so if the deployed token remains in BondingCurve, no account can advance it to a tradable migration state.
Evidence: FlapTaxTokenV3._transfer requires !pools[from] && !pools[to] in PoolState.BondingCurve. startMigration() and finalizeMigration() are both onlyOwner. Supplied GoPlus evidence reports owner_address="0x0000000000000000000000000000000000000000" and owner_balance=0.
Recommendation: Verify the deployed state() and poolState values. Complete and verify migration before renouncing ownership, or add an explicitly governed recovery path that cannot arbitrarily change token balances or tax settings.
medium finding: Initialization permits taxes above 100%, creating a conditional transfer lock
buyTax and sellTax are accepted as uint16 values without an upper-bound check. During tax enforcement, _taxedTransfer calculates amount - tax. A rate above 10000 basis points makes this subtraction revert for positive transfers involving a pool, potentially blocking buys or sells for the entire tax period.
Evidence: initialize() assigns params.buyTax and params.sellTax directly to poolState without requiring either value <= 10000. _getTaxWithPoolState computes amount * rate / 10000, and _taxedTransfer executes uint256 remainingAmount = amount - tax. The supplied GoPlus tax fields are blank, so the deployed rates were not independently confirmed here.
Recommendation: Enforce buyTax <= 10000 and sellTax <= 10000 during initialization, and test pool transfers across all configured states before deployment.
medium finding: External dividend callback can halt ordinary token transfers
When dividendContract is configured, every transfer involving a non-excluded wallet calls dividendContract.setShare. Any revert from that external call is propagated as DividendShareUpdateFailed, causing the token transfer itself to revert. A broken, incompatible, or intentionally reverting dividend contract can therefore freeze wallet-to-wallet transfers.
Evidence: _afterTokenTransfer() calls IDividend(dividendContract).setShare(from, balanceOf(from)) and setShare(to, balanceOf(to)) without tolerating failure; each catch block reverts. dividendContract is supplied during initialize and is not changeable through the exposed token ABI.
Recommendation: Use a trusted, audited dividend implementation and consider isolating share-accounting failures from ERC20 transfers, or provide a controlled, transparent mechanism to disable or replace a failed dividend integration.
medium finding: TaxProcessor has custody over accumulated tax tokens through unlimited allowance
The token grants taxProcessor a maximum ERC20 allowance and delegates processing of all accrued tax tokens to it. A compromised or incorrectly configured processor can pull the token contract's tax balance. If processing fails, the fallback explicitly transfers the entire remaining token balance to taxProcessor, rather than retaining or recovering it.
Evidence: _processTax() approves taxProcessor for type(uint256).max when needed, then calls processTaxTokens(taxAmount). On failure, it executes _plainTransfer(address(this), taxProcessor, remainingBalance). taxProcessor is configured during initialize and has no exposed replacement function.
Recommendation: Audit and immutably bind the TaxProcessor configuration where possible, limit approvals to the required amount, use a narrowly scoped processor interface, and replace the failure fallback with a recoverable escrow or governance-controlled procedure.