EVRGRoW SMART CONTRACT AUDIT

EVRGROW — Claude Smart Contract Audit
Smart Contract Audit · Base Network
EVRGROW
Contract: 0x8ea57c4d7a6a88c90bcf038d37939fae61305a88
Audited by Claude · August 11, 2026
Network
Base (L2)
Standard
ERC-20
Compiler
Solidity 0.8.25
Renounced
Nov 18, 2025
Source Verified
BaseScan

Summary. This is an eight-part review of the EVRGROW contract covering its published claims, the deployed bytecode, and automated analysis via Slither and Mythril. The deployed bytecode was independently reproduced from the published source byte for byte, so the code reviewed here is provably the code running on Base. No exploitable findings were identified: there are no hidden entry points, no mechanism to destroy the contract or execute outside code through it, and with ownership renounced the entire privileged function surface is permanently unreachable. One aspect of the design warrants attention regardless — the 1% burn and 1% LP tax apply only to trades against the main ETH Uniswap V2 pool, not to the other sixteen.

Part 01
Contract Behavior Audit
Does the contract do what is publicly claimed — including tax scope
Part 02
Bytecode Verification & Source Equivalence
Deployed bytecode reproduced exactly from source — 0 hidden functions
Part 03
Automated Tool Analysis
Slither and Mythril run in full — every finding shown and resolved
Part 04
Extended Backdoor Audit
14 source files reviewed for hidden privileges and malicious logic
Part 05
Advanced Checks
Storage, deployment, UNCX lock, pool verification, measured burn trajectory
Part 06
Adversarial Economic Scenario Analysis
8 attack scenarios modeled — 0 profitable vectors identified
Part 07
SWC Vulnerability Registry Checklist
All 36 known Solidity vulnerability classes checked systematically
Part 08
Supplementary Checks
Compiler settings, ERC-20 compliance, burn exposure, precision documentation
Part 01Contract Behavior Audit

Verification that contract behavior matches all published claims

Contract renounced — confirmed
Ownership transferred to zero address on-chain via renounceOwnership() on Nov 18, 2025. Tx: 0xdcedf353...87cf. No party can ever call owner-only functions again.
1% true burn on every buy and sell through the main pool — confirmed
autoBurnFees set to [100, 100, 0]. Burns reduce totalSupply directly — not a burn wallet. This fires only on transfers where one side is the main ETH Uniswap V2 pool — the only pool registered in the AMMs mapping — see Part 5, Check 6 for detail on scope across the other 16 pools.
1% to LP on every buy and sell through the main pool — confirmed
Accumulates in _liquidityPending; auto-injected into the Uniswap V2 ETH pool when the threshold is reached. Applies only to trades against the main pool — the same scope restriction as the burn fee, since both are governed by the same AMMs-mapping check.
LP permanently locked on every injection — confirmed
LP tokens sent to address(0xdead) inside _addLiquidity() — irrecoverable by design. Core initial LP separately locked via UNCX.
0.5% threshold triggers auto LP injection — confirmed
swapThresholdRatio set to 50 (50/10000 = 0.5% of pool balance). Injection is automatic and permissionless.
No transfer fee on wallet-to-wallet — confirmed
Both fee arrays set to [100, 100, 0]. The third value (transfer) is zero — only AMM buys and sells incur fees.
No dev wallet, no marketing fee — confirmed
Only two fee destinations: address(0) (burn) and the contract itself (LP). No team wallet, treasury, or marketing recipient anywhere in the code.
Fee cap hardcoded at 25% max — confirmed
Contract reverts if any fee exceeds 2500 bps. Moot since ownership is renounced — fees are permanently frozen at 2% total.
Multi-pool architecture supported — confirmed, with one important distinction
The contract's AMMs mapping determines which transfers are treated as taxable buys/sells. Only the main ETH Uniswap V2 pool (0x2aa028...338e) is registered in this mapping. The 1% burn + 1% LP tax therefore fires only on transfers where one side is that main pool. The other 16 liquidity pools (Uniswap V3/V4, Aerodrome, SushiSwap, PancakeSwap, Curve, Balancer/CoW Swap, HydrexFi) are legitimate, tradeable EVRGROW pools, but trades confined to those pools — including multi-hop routes that never touch the main ETH V2 pool — do not trigger the tax. Practical consequence: buying or selling EVRGROW on any pool other than the main ETH V2 pair produces no burn and no LP contribution. Evidence basis: transaction 0xe9082639...d4fd1a3f, a multi-hop route through the BNKR and ETH/Aerodrome pools, moved 37,620 EVRGROW and emitted no AutoBurned or LiquidityAdded event — the fee events that appear in that transaction are Aerodrome's own 0.3% pool fee, a separate mechanism. See the methodology note at the end of this report for the verification status of the registration scope itself.
All checks passed
9 of 9 · Contract behavior matches all published claims
Part 02Bytecode Verification & Source Equivalence

Analysis performed on the deployed runtime bytecode, including independent reproduction of it from source

Most of this report reads the Solidity source published on BaseScan. That inherits one assumption: that the deployed bytecode actually corresponds to that source. Check 1 removes the assumption entirely by recompiling the source and comparing the result byte-for-byte against what is deployed. The remaining checks analyse the deployed bytecode directly and hold regardless of any source file.

1. Source-to-deployment equivalence — 8,432 of 8,432 executable bytes identical
The published source was compiled locally with solc 0.8.25+commit.b61c2a91, optimizer enabled at 200 runs, EVM target paris — the exact settings recorded in the contract's own metadata — and the resulting runtime bytecode compared against the bytecode deployed on Base. Both are 8,485 bytes. Excluding the 53-byte CBOR metadata trailer, every one of the 8,432 executable bytes matches exactly. The metadata trailer differs only in its IPFS hash, which digests source file text; the dependency files were reconstructed from their behavior, so comments and whitespace differ while the compiled logic does not. This is the strongest available evidence that the source under review is the source that produced the contract running on Base — it no longer rests on the block explorer's verification label, and it is reproducible by anyone with the same compiler and settings.
2. Dangerous opcode scan — SELFDESTRUCT, DELEGATECALL, CALLCODE, CREATE all absent
The full runtime bytecode was disassembled and every opcode enumerated. SELFDESTRUCT, DELEGATECALL, CALLCODE, CREATE and CREATE2 appear zero times. These absences are categorical rather than inferential: the contract cannot be self-destructed, cannot execute borrowed code from another address, cannot be converted into a proxy, and cannot deploy child contracts. Confirms SWC-106 and SWC-112 at the artifact level.
3. Function selector enumeration — 33 of 33 match, zero hidden entry points
The dispatcher table at the head of the runtime bytecode enumerates every 4-byte selector the contract will respond to, yielding 33 selectors. Computing keccak-256 selectors for all 33 functions in the published ABI and diffing the two sets produces an exact one-to-one match: no selector exists in the bytecode that is absent from the ABI, and every ABI function is reachable. This is the check that would detect a backdoor concealed by publishing incomplete source. None exists.
4. Selector collision analysis — no collisions across all 33 functions
All 33 function signatures were hashed and checked for 4-byte selector collisions. Every function resolves to a distinct selector. Collisions are a rare but real class of bug in which a hidden function shares a dispatcher entry with a documented one, causing calls to route somewhere other than where the ABI implies. Not present here.
5. Privileged surface is permanently dead code — structurally demonstrated
Seven functions are owner-gated: autoBurnFeesSetup, liquidityFeesSetup, updateSwapThreshold, excludeFromFees, setAMM, transferOwnership and renounceOwnership. Both OwnableUnauthorizedAccount(address) revert sites (selector 0x118cdaa7) were located in the bytecode at PC 2967 and PC 4469, confirming every privileged entry point routes through the owner check. With owner permanently set to address(0), no caller can satisfy that check — the entire privileged surface is unreachable. Separately, afterConstructor is a one-shot initializer already consumed at deployment; the 'Initializable: contract is already initialized' revert string is present in the bytecode and any further call reverts. This converts several 'not exploitable because renounced' claims elsewhere in this report from argument into structural fact.
6. External call site inventory — 6 sites, all documented Uniswap V2 methods
The bytecode contains 3 CALL and 3 STATICCALL sites and zero DELEGATECALL. Every outbound selector resolves to a documented Uniswap V2 interface method: factory(), WETH(), createPair(address,address), swapExactTokensForETHSupportingFeeOnTransferTokens(...) and addLiquidityETH(...). No unexpected external callouts. Remaining PUSH4 constants are custom error selectors and Solidity panic codes, not call targets.
7. Compiler metadata — Solidity 0.8.25 confirmed from the artifact itself
The CBOR metadata trailer appended to the runtime bytecode encodes the compiler version directly. Decoding it yields 0.8.25, matching the compiler used to reproduce the bytecode in check 1 and corroborating the compiler claim from the deployed artifact rather than a displayed label.
CheckMethodResult
Executable bytes vs. recompiled sourceByte-for-byte diff8,432 / 8,432 identical
SELFDESTRUCT / DELEGATECALL / CALLCODEOpcode scan0 occurrences
CREATE / CREATE2Opcode scan0 occurrences
Selectors in bytecode vs. published ABIDispatcher extraction + keccak-25633 / 33 match
Undocumented entry pointsSet difference0 — none found
Selector collisionsHash uniqueness0 — all distinct
Owner-gated functions reachableRevert-site trace0 — all dead code
External call sitesCall-op inventory6, all documented
Embedded compiler versionCBOR metadata decode0.8.25

Scope note. Bytecode analysis examines code, not chain state. It confirms setAMM exists and is owner-gated, but cannot reveal which addresses were passed to it — that is storage, readable only via a live contract call. See the methodology note for the one open item this leaves.

Bytecode verified, source equivalence proven
7 of 7 checks · deployed code reproduced exactly · 0 hidden functions · privileged surface dead
Part 03Automated Tool Analysis

Industry-standard static analysis and symbolic execution, run against the source and the deployed bytecode

Two of the three tools normally cited as the gap between a manual review and a formal audit — Slither and Mythril — were run for this report. Every finding either tool produced is reproduced below in full, including the ones labelled High, together with the specific reason each is not exploitable. Nothing is omitted: a tool finding shown and resolved is more useful to a reader than a clean summary with no working.

1. Slither static analysis — 102 detectors, 28 findings, 0 exploitable
Slither 0.11.6 was run across all 16 compiled contracts with its full detector suite. It produced 28 findings: 2 High, 1 Medium, 6 Low and 19 Informational. Each High and Medium finding was traced to the specific line and assessed against the surrounding code; the dispositions are set out in the table below. None is exploitable. The Low and Informational findings comprise naming conventions, pragma version ranges on the Uniswap interface files, the documented assembly block in the constructor, and the known no-op branch in _setAMM — all already described elsewhere in this report.
2. Mythril symbolic execution — 1 finding, verified false positive
Mythril 0.24.8 was run against the deployed runtime bytecode with a 30-minute execution budget and a maximum transaction depth of 32, using the Z3 SMT solver to explore reachable states. It reported a single issue: SWC-101 integer underflow at PC 8009. Disassembling that address resolves it definitively. The SUB at PC 8009 is immediately followed by PUSH4 0x4e487b71 at PC 8014 — Solidity's Panic(uint256) selector. That is the compiler's own checked-arithmetic guard: if the subtraction would underflow, execution jumps into the panic handler and reverts. Mythril flagged the raw opcode without modelling the guard three instructions later. The path lies in solc's standard string handling reached via symbol(), not in EVRGROW's logic. No genuine finding.

Disposition of every High and Medium finding

FindingSeverityStatusWhy it is not exploitable
arbitrary-send-eth High Not exploitable Slither flags addLiquidityETH{value: coinAmount} as sending ETH to an arbitrary recipient. The recipient is the hardcoded literal address(0xdead), written directly in the call and unchangeable — the detector fires on the pattern without evaluating that the destination is a compile-time constant burn address. There is no path by which any party can redirect this ETH.
reentrancy-eth High Mitigated by mutex Flags balance writes in super._update() occurring after the external router calls inside _swapAndLiquify(). The _swapping boolean mutex guards exactly this: it is set true before the external calls and false after, and the swap block is gated on !_swapping. Slither's detector does not model boolean mutexes and so cannot see the guard. Re-entry would additionally have to originate from the Uniswap V2 router itself, which is the canonical immutable deployment.
divide-before-multiply Medium Known, bounded to 1 wei Correctly identifies that fees * liquidityFees[txType] / totalFees[txType] operates on an already-divided fees value, losing precision. This is real but immaterial: the loss is bounded to 1 wei per transaction, accumulates in _liquidityPending rather than leaking from the system, and is included in the next LP injection. It is documented independently in the supplementary checks; the tool's finding corroborates that analysis rather than adding to it.

On severity labels. Slither assigns severity by pattern, before context. A High label means the pattern is one that is often serious, not that this instance is. Each of the two High findings above resolves to a specific structural reason it cannot be exploited — a hardcoded burn address, and a mutex the detector cannot model. Readers are encouraged to verify both by reading _addLiquidity and the _swapping guard in the published source.

No exploitable findings from automated analysis
Slither 28 findings · Mythril 1 false positive · 0 exploitable across both tools
Part 04Extended Backdoor Audit

Line-by-line review of all 14 source files for hidden vulnerabilities, hidden privileges, and malicious logic

1. Hidden minting capability — none found
The only _mint() call is in the constructor, minting exactly 500,000,000 tokens to the deployer. _mint() is internal in OpenZeppelin ERC20 — cannot be called externally. No public mint() function exists.
2. Hidden privileged access / secondary owner — none found
The assembly guard in the constructor requires the deployer to be a contract — a standard factory-deployment pattern. Ownership flows cleanly through Ownable2Step with a single owner, now the zero address.
3. afterConstructor re-initialization risk — mitigated
afterConstructor() uses the initializer modifier from Initializable.sol, setting _initialized = true on first call and permanently reverting any subsequent call. The router cannot be replaced post-initialization.
4. excludeFromFees — fee exemption abuse — not exploitable
onlyOwner — permanently frozen with renouncement. Currently excluded addresses are the deployer wallet and the contract itself, both required for correct operation.
5. setAMM — fake AMM injection — not exploitable
onlyOwner, permanently frozen. Additional guard: if (AMM == pairV2 || AMM == address(routerV2)) revert InvalidAMM(AMM) prevents removal of the primary pair or router.
6. addLiquidityFromLeftoverTokens — public callable, not exploitable
The only public function without access restriction. Runs _swapAndLiquify() with LP destination hardcoded to address(0xdead). Cannot drain funds — only adds more permanent liquidity.
7. receive() — ETH drain risk — no vulnerability
Accepts ETH only from routerV2 — any other sender triggers revert CannotDepositNativeCoins. ETH received is immediately consumed in _swapAndLiquify(). No ETH withdrawal function exists.
8. Token transfer hooks — empty, no hidden logic
Both _beforeTokenUpdate and _afterTokenUpdate are completely empty stubs. No hidden logic, no callbacks, no exploitable behavior.
9. Token approval to router — no risk to holders
In _updateRouterV2(), the contract approves the Uniswap router for type(uint256).max of its own accumulated fee balance — standard for LP injection. Holders' tokens are never approved to any third party.
10. _swapTokensForCoin — swap destination is safe
ETH proceeds sent to address(this) (the contract itself), not to any external wallet. Immediately consumed in _addLiquidity().
11. OpenZeppelin library files — unmodified
ERC20.sol, ERC20Burnable.sol, Ownable.sol, Ownable2Step.sol, Initializable.sol, IERC20.sol, IERC20Metadata.sol, Context.sol, and draft-IERC6093.sol are all standard, unmodified OpenZeppelin v5.0.0. No tampering detected.
12. Uniswap interface files — safe
All four Uniswap V2 interface files are standard and unmodified, containing only function signatures. No logic, no backdoors possible in interface-only files.
13. Reentrancy risk — mitigated
The _swapping boolean mutex prevents reentrant calls during LP injection. The guard if (!_swapping && from != pairV2 && from != address(routerV2) && canSwap) ensures the swap logic cannot be triggered recursively.
14. Fee manipulation / overflow risk — not exploitable
Fee math uses uint16 values with an explicit 2500 bps revert cap. Arithmetic expands to uint256 before operations. unchecked blocks in ERC20 base are guarded by explicit balance checks immediately prior.
No backdoors found
14 of 14 vectors checked · 0 vulnerabilities identified
Part 05Advanced Checks

Storage layout, event completeness, deployment verification, UNCX lock, arithmetic edge cases, pool address validation, and measured burn trajectory

1. Storage layout collision analysis — no collisions found
The full inheritance chain (Context → Ownable → Ownable2Step → ERC20 → ERC20Burnable → Initializable → EVRGROW) was mapped slot by slot. Ownable occupies slot 0 (_owner), Ownable2Step slot 1 (_pendingOwner), ERC20 slots 2–6 (_balances, _allowances, _totalSupply, _name, _symbol), Initializable slots 7–8 (_initialized, _initializing), and EVRGROW slots 9–18 (autoBurnFees through AMMs). Every contract declares storage in a distinct, non-overlapping range. No contract reads or writes a slot declared by another. C3 linearization order is correct and consistent with compiler resolution.
2. Event emission completeness — comprehensive coverage confirmed
All state-changing functions emit appropriate events: autoBurnFeesSetup emits AutoBurnFeesUpdated; every auto-burn emits both AutoBurned and the standard ERC20 Transfer to address(0); LP injections emit LiquidityAdded; threshold changes emit SwapThresholdUpdated; fee exclusions emit ExcludeFromFees; router and AMM updates emit RouterV2Updated and AMMUpdated; Ownable2Step emits both OwnershipTransferStarted and OwnershipTransferred. One intentional omission: _liquidityPending accumulation is silent per-trade (gas optimization) but publicly readable via getAllPending(). Not a vulnerability.
3. Deployment sequence verification — airtight ordering confirmed
The constructor minted exactly 500,000,000 tokens to the deployer, set all fee arrays, excluded the deployer and contract from fees, and transferred ownership. afterConstructor() was then called to create the Uniswap V2 pair, approve the router, and register initial AMMs — permanently locked by the initializer modifier. Additional AMMs were registered via setAMM(). Initial LP was seeded and locked on UNCX. Finally, ownership was renounced on Nov 18, 2025. The contract was fully configured and LP locked before renouncement — no window existed where it was live but unconfigured.
4. UNCX lock verification — confirmed with one note
Lock ID 1496 on UNCX confirms 84.134% of the EVRGROW/WETH V2 LP at 0x2aa028...338e is locked, representing ~74.8M EVRGROW and 2.409 WETH. The lock was established Nov 18, 2025 and incrementally increased on Nov 25 and Dec 29, 2025. Note: the UNCX lock expiry is Nov 18, 2026 (one year). After that date the lock owner could withdraw the initial LP. However, all LP added by the auto-injection mechanism goes to address(0xdead) and is permanently irrecoverable regardless of the UNCX lock status. The 15.866% not in UNCX consists of LP tokens already burned on-chain via early auto-injections.
5. Edge case arithmetic modeling — no vulnerabilities found
Dust transactions (<50 wei): fee rounds to zero via integer division — harmless, gas costs make this non-exploitable. Large transactions: amount * 200 at max realistic supply (~467M × 10¹⁸) ≈ 9.34 × 10²⁸, well within uint256 range of ~1.16 × 10⁷⁷. No overflow risk. Near-zero pool balance: getSwapThresholdAmount() returns 0, causing _swapAndLiquify to trigger with near-zero pending — a gas-wasting no-op but no security impact. Fee split rounding: with equal 100/200 split, autoBurnPortion is exactly 50% with no rounding loss at normal amounts.
6. All 17 pool addresses independently verified as legitimate — tax applies only via the main pool
Every pool address published on evrgrow.net was cross-referenced against its respective DEX and confirmed as a legitimate, live liquidity pool. The main ETH Uniswap V2 pair is UNCX locked and is the only pool registered in the contract's AMMs mapping — it is the sole pool whose trades trigger the 1% burn + 1% LP tax. The 16 auxiliary pools confirmed as legitimate live pairs — USDC on Uniswap V4 and HydrexFi; BTC (cbBTC) on Uniswap V3; ETH on Aerodrome and SushiSwap V2; OHM on Uniswap V2; Zora creator coin on PancakeSwap V2; AERO, PEAS, TOSHI, VEIL, MORPHO, and BNKR on Aerodrome; USDC via Balancer/CoW Swap; cbETH/DAI on Curve Finance; HYDX on HydrexFi — are all genuine, tradeable EVRGROW markets, but trades that stay within these pools (including multi-hop routes between them) do not trigger the tax. No pool address points to an unverified or suspicious contract; the distinction here is about tax scope, not pool legitimacy.
7. Burn trajectory since launch — mechanism confirmed working in production
The burn mechanism is verifiable by subtraction: the constructor minted exactly 500,000,000 EVRGROW, and because burns reduce totalSupply directly, the current supply reported by the contract is the original mint less every token ever burned. As of August 11, 2026, totalSupply() reads 462,423,454.63 EVRGROW (per BaseScan), giving a cumulative burn of 37,576,545.37 EVRGROW — 7.52% of the original supply over 266 days since deployment. That averages roughly 141,000 EVRGROW destroyed per day, or about 10.3% of original supply per year at the observed rate. This figure is a live measurement and will differ on any later reading; it is included as evidence the mechanism operates as coded in production, not as a forecast. Note that the observed burn rate is a function of trading volume through the main ETH V2 pool specifically (see Check 6) and should not be extrapolated as a fixed schedule.
PoolAddressDEXDepthVerifiedTax Trigger
ETH Uniswap V2 (main)0x2aa028...338eUniswap V2Primary✓ UNCX locked✓ Yes
USDC Uniswap V4 1%0xaa3c7f...c2ca7Uniswap V4Secondary✓ ConfirmedNo
BTC Uniswap V3 0.03%0xc2a517...cd1dUniswap V3Secondary✓ ConfirmedNo
ETH Aerodrome 0.3%0x4cfac8...5504AerodromeSecondary✓ ConfirmedNo
ETH SushiSwap V2 0.3%0xd863b8...fd7SushiSwap V2Secondary✓ ConfirmedNo
OHM Uniswap V2 0.3%0x1343a4...414Uniswap V2Secondary✓ ConfirmedNo
Zora PancakeSwap V20x38210...d0cPancakeSwap V2Secondary✓ ConfirmedNo
AERO Aerodrome 0.3%0x86459...2c4AerodromeSecondary✓ ConfirmedNo
USDC HydrexFi 0.3%0x443d6...3a0HydrexFiSecondary✓ ConfirmedNo
PEAS Aerodrome 0.3%0x1c2b8...a10AerodromeSecondary✓ ConfirmedNo
USDC Balancer/CoW0x10ae2...5d9Balancer/CoWSecondary✓ ConfirmedNo
TOSHI Aerodrome 0.3%0xb9ffc...c0AerodromeSecondary✓ ConfirmedNo
cbETH/DAI Curve0x8b1eb...744Curve FinanceSecondary✓ ConfirmedNo
HYDX HydrexFi 0.3%0x7c556...b87HydrexFiSecondary✓ ConfirmedNo
VEIL Aerodrome 0.3%0xfd3ed9...79faAerodromeThin✓ ConfirmedNo
MORPHO Aerodrome 0.3%0xbffa75...8af35AerodromeThin✓ ConfirmedNo
BNKR Aerodrome 0.3%0x4d60f2...cf45f49AerodromeThin✓ ConfirmedNo

Depth key. Primary — the UNCX-locked main ETH V2 pair, the deepest pool and the only one that triggers the tax. Secondary — established pools with meaningful liquidity. Thin — pools created within the last several weeks holding under roughly $1,000 in pooled value at the time of review; these are genuine and functional, but their shallow depth means a single modest trade can move price substantially, and quoted prices there may diverge sharply from the main pair. Depth is a live figure and changes continuously. This column reflects market conditions, not contract security.

All advanced checks passed
7 of 7 checks complete · no storage collisions · all pools verified · 7.52% of supply burned to date
Part 06Adversarial Economic Scenario Analysis

8 attack scenarios modeled against the contract mechanics and tokenomics

Scenario 1: Sandwich Attack on the LP Injection Swap
Unprofitable — attacker pays fees, LP deepens
Attack Vector

A bot observes the pending _swapAndLiquify() in the mempool, front-runs with a large ETH buy, lets the LP injection execute, then back-runs with a sell.

Assessment

A front-running buy means the swap gets more ETH — benefiting the LP. LP tokens go to address(0xdead); no party suffers from unfavorable pricing. The attacker bears a 2% round-trip fee on both legs.

Scenario 2: Threshold Griefing — Preventing LP Injection
Self-defeating — griefing benefits the protocol
Attack Vector

An adversary inflates the pool balance by adding large external liquidity, raising the threshold denominator and delaying LP injection indefinitely.

Assessment

Adding liquidity benefits holders. The delay is temporary — fees continue accumulating in _liquidityPending. The public addLiquidityFromLeftoverTokens() provides a permissionless bypass path.

Scenario 3: Flash Loan Attack on the Swap Threshold
No profit — attacker funds the protocol
Attack Vector

Use a flash loan to temporarily drain the EVRGROW/ETH pool, lowering the threshold and triggering LP injection at an artificially cheap level.

Assessment

Draining the pool requires selling EVRGROW — triggering the 2% fee and burning supply. The flash loan must be repaid within the same transaction. The LP injection adds locked liquidity to address(0xdead). No value extraction path exists.

Scenario 4: Fee Exclusion Abuse
Not possible — ownership permanently renounced
Attack Vector

A fee-excluded address dumps large quantities of EVRGROW without incurring burn or LP fees, gaining a structural advantage over regular holders.

Assessment

With ownership renounced, no new addresses can ever be fee-excluded. The two currently excluded addresses are the deployer wallet and the contract itself — both legitimate operational necessities.

Scenario 5: Liquidity Removal Attack
Partial flywheel effect — only via main pool arbitrage
Attack Vector

A large LP holder removes liquidity from one of the 16 auxiliary pools, crashing price in that pool and creating extreme arbitrage pressure on the main pool.

Assessment

The main Uniswap V2 pool's initial LP is locked via UNCX; all subsequent injections go to address(0xdead). Note: only trades that touch the main ETH V2 pool trigger the burn/LP tax — arbitrage confined to auxiliary pools does not. Arbitrage that routes back through the main pool still feeds the flywheel on that leg, but volume purely between auxiliary pools does not.

Scenario 6: Zero-Slippage LP Add Failure Loop
Minor theoretical inefficiency — not a vulnerability
Attack Vector

_addLiquidity() uses 0 for both amountTokenMin and amountETHMin. Heavy manipulation between the swap and the add could cause value leakage.

Assessment

addLiquidityETH with amountMin = 0 accepts whatever ratio the pool offers, ensuring autonomous operation always succeeds. Per-transaction LP amount is ~0.5% of pool depth, making meaningful manipulation negligible.

Scenario 7: Contract ETH Stranding
No ETH stranding risk — fully mitigated
Attack Vector

_swapTokensForCoin() succeeds and ETH arrives in the contract, but _addLiquidity() fails, leaving ETH permanently stranded with no recovery path.

Assessment

addLiquidityETH with 0 minimums will not revert on ratio grounds. Any router-level revert rolls back the entire transaction including the swap. Even if ETH were stranded, it would be consumed on the next LP injection trigger.

Scenario 8: Multi-Pool Arbitrage Manipulation
Not a burn/tax vector — auxiliary pools are untaxed
Attack Vector

An attacker controls a low-liquidity auxiliary pool and manipulates it to generate artificial buy/sell volume, attempting to game the burn accumulation and LP injection mechanism.

Assessment

Correction from earlier analysis: since only the main ETH V2 pool is registered to trigger the tax, volume confined to an auxiliary pool does not incur the 2% EVRGROW tax at all — no burn, no LP accumulation. The attacker pays only the DEX's own base trading fee (e.g., Aerodrome's 0.3%), which is small but real. This scenario cannot be used to "game" the burn mechanism, because auxiliary-pool volume simply doesn't touch it. The practical risk is limited to localized price manipulation within that specific pool, not any interaction with EVRGROW's tokenomics.

ScenarioAttacker ProfitProtocol Impact
Sandwich LP swapNegative (pays 2% fees)Positive — LP deepens
Threshold griefingNegative (adds liquidity)Neutral / positive
Flash loan thresholdNegative (pays fees)Positive — burns supply
Fee exclusion abuseNot possible (renounced)None
Liquidity removalTemporary disruption onlyFeeds the flywheel
Zero-slippage failureNot a real failure modeNone
ETH strandingNot possibleNone
Multi-pool manipulationPays DEX fee only (~0.3%)Neutral — no tax impact
No profitable attack vectors found
8 of 8 scenarios analyzed · 0 exploitable vulnerabilities
Part 07SWC Vulnerability Registry Checklist

All 36 known Solidity vulnerability classes from the Smart Contract Weakness Classification registry, checked systematically against all 14 source files

SWC IDVulnerability ClassResultNotes
SWC-100Function Default VisibilityPASSAll functions have explicit visibility modifiers. No unintended public exposure.
SWC-101Integer Overflow and UnderflowPASSSolidity 0.8.25 has built-in overflow protection. unchecked blocks are explicitly guarded by prior balance checks.
SWC-102Outdated Compiler VersionPASSUses Solidity 0.8.25 — most recent stable release at deployment. No known vulnerabilities in this version.
SWC-103Floating PragmaPASSToken.sol pinned at 0.8.25. OZ and Uniswap files use ^0.8.20 — acceptable for non-deployed library/interface files.
SWC-104Unchecked Call Return ValuePASSAll router calls are high-level Solidity calls that automatically revert on failure. No low-level .call() with unchecked return.
SWC-105Unprotected Ether WithdrawalPASSNo ETH withdrawal function exists anywhere. All ETH is consumed immediately in LP injection.
SWC-106Unprotected SELFDESTRUCTPASSNo selfdestruct instruction in any of the 14 files.
SWC-107ReentrancyPASSThe _swapping boolean mutex prevents reentrant calls. Checks-effects-interactions pattern followed correctly.
SWC-108State Variable Default VisibilityPASSAll state variables have explicit visibility declared throughout all 14 files.
SWC-109Uninitialized Storage PointerPASSNo uninitialized storage pointers. All local variables are value types or explicitly initialized.
SWC-110Assert ViolationPASSNo assert() statements. Errors handled via revert with custom error types — the correct modern Solidity pattern.
SWC-111Use of Deprecated Solidity FunctionsPASSNo use of suicide, throw, sha3, callcode, or other deprecated functions anywhere.
SWC-112Delegatecall to Untrusted CalleePASSNo delegatecall anywhere in any of the 14 files.
SWC-113DoS with Failed CallPASSLP injection failure does not brick the contract. _swapping resets to false and operation continues normally.
SWC-114Transaction Order DependenceINFOLP swap is theoretically front-runnable but LP goes to address(0xdead) — no party suffers a loss. Sandwich attackers pay the 2% round-trip fee. Known and accepted trade-off in this class of auto-LP token.
SWC-115Authorization Through tx.originPASSNo use of tx.origin for authorization. All access control uses msg.sender via _msgSender().
SWC-116Block Values as Proxy for TimePASSblock.timestamp used only as deadline for Uniswap calls — standard DEX practice, not a security mechanism.
SWC-117Signature MalleabilityPASSNo ECDSA signature verification in this contract. Not applicable.
SWC-118Incorrect Constructor NamePASSUses the correct constructor() keyword. Legacy named-constructor vulnerability not applicable to 0.8.x.
SWC-119Shadowing State VariablesPASSNo state variable shadowing across the full inheritance chain: ERC20, ERC20Burnable, Ownable, Ownable2Step, Initializable.
SWC-120Weak Sources of RandomnessPASSNo randomness used anywhere in the contract. Not applicable.
SWC-121Missing Protection Against Signature ReplayPASSNo signature-based mechanisms in this contract. Not applicable.
SWC-122Lack of Proper Signature VerificationPASSNo signature verification in this contract. Not applicable.
SWC-123Requirement ViolationPASSAll revert conditions are logically sound and only reachable under genuinely invalid conditions.
SWC-124Write to Arbitrary Storage LocationPASSNo arbitrary storage writes. All storage access through named mappings and state variables. No pointer arithmetic.
SWC-125Incorrect Inheritance OrderPASSInheritance order is correct and non-conflicting. C3 linearization produces no ambiguous function resolution.
SWC-126Insufficient Gas GriefingPASSNo relayed transactions or meta-transaction patterns that could be griefed via gas manipulation.
SWC-127Arbitrary Jump with Function Type VariablePASSNo function type variables used anywhere in the contract.
SWC-128DoS With Block Gas LimitPASSNo unbounded loops over dynamic arrays. All fee calculation loops are over fixed-size arrays of length 3.
SWC-129Typographical ErrorPASSFee math reviewed carefully — no off-by-one errors, no misplaced operators. totalFees accounting is correctly structured.
SWC-130RTL-Override Control CharacterPASSSource code contains no hidden Unicode control characters or right-to-left override characters.
SWC-131Presence of Unused VariablesINFO_beforeTokenUpdate and _afterTokenUpdate hooks are empty stubs with unused parameters. No security impact — informational only.
SWC-132Unexpected Ether BalancePASSContract does not rely on address(this).balance being a specific value for any security-critical logic.
SWC-133Hash Collisions With Multiple Variable Length ArgsPASSNo use of abi.encodePacked with multiple variable-length arguments. Not applicable.
SWC-134Message Call with Hardcoded Gas AmountPASSNo .transfer() or .send() (which forward fixed 2300 gas). All ETH movement through the Uniswap router via high-level calls.
SWC-135Code With No EffectsINFOEmpty if (isAMM) { } branch inside _setAMM() is a no-op code generation artifact. No security implication.
SWC-136Unencrypted Private Data On-ChainPASSNo sensitive data stored in private variables with any confidentiality expectation. All private state is operational.
SWC Registry complete
33 PASS · 3 INFO (no security impact) · 0 CRITICAL · 0 HIGH · 36 of 36 checked
Part 08Supplementary Checks

Compiler settings, ERC-20 compliance, public burn exposure, and integer precision documentation

1. Compiler settings verification — appropriate and safe
Compiled with Solidity v0.8.25+commit.b61c2a91, optimizer enabled at 200 runs, EVM target: paris. The 200-run setting balances deployment cost against runtime efficiency — correct for a frequently-called contract. Known optimizer risks (YulOptimizer, StackLimitEvader) apply to contracts with deep call stacks and many local variables; EVRGROW's functions are shallow with no nested internal calls beyond super._update(). EVM target paris is well-established and stable; EVRGROW uses neither DIFFICULTY nor PREVRANDAO so the paris/shanghai distinction is irrelevant. No known Solidity 0.8.25 compiler bugs affect any pattern used in this contract.
2. ERC-20 standard compliance — fully compliant
All six required ERC-20 functions confirmed present with correct signatures and return types: totalSupply(), balanceOf(), transfer(), transferFrom(), approve(), allowance(). Both required events (Transfer, Approval) are correctly emitted. The Approval suppression on transferFrom allowance spend is the EIP-20 permitted optimization. Fee-on-transfer behavior is correctly implemented — the contract uses swapExactTokensForETHSupportingFeeOnTransferTokens rather than the standard swap function, which is the required Uniswap variant for fee-on-transfer tokens. All public functions return correct types; OpenZeppelin always returns true on success and reverts on failure — fully EIP-20 compliant.
3. Public burn() and burnFrom() exposure — documented, no contract-level risk
ERC20Burnable adds two public functions. burn(value): any holder can permanently destroy their own tokens. burnFrom(account, value): a spender with granted allowance can burn from a holder's balance. Neither triggers the fee mechanism — self-burns and allowance burns are deliberate holder actions, not AMM trades, so no 1% auto-burn or LP fee fires. Neither function can be called by any party other than the token holder themselves or an explicitly approved spender. No privileged actor can burn from arbitrary wallets. Standard DeFi hygiene applies: holders should only grant allowances to contracts they trust.
4. Integer precision loss — formally documented, no value leaks
Three integer division operations produce at most 1-wei remainder per transaction. (1) halfAmount = tokenAmount / 2: odd tokenAmount rounds halfAmount down; otherHalf receives the extra wei — no compounding effect. (2) autoBurnPortion = fees * 100 / 200: exactly 50% for even fees; at odd fees rounds to 0, causing the full wei to accumulate in _liquidityPending instead. (3) _liquidityPending += fees * 100 / 200: identical — rounds down by at most 1 wei for odd fees. In all cases the remainder accumulates in _liquidityPending and is included in the next LP injection. No value leaks from the system. Rounding errors are bounded, self-correcting, and negligible in aggregate.
All supplementary checks passed
4 of 4 · ERC-20 compliant · compiler settings appropriate · no undocumented precision loss

Methodology & Verification Basis

Findings in this report come from four sources, and it is worth knowing which is which. Bytecode-level analysis — Part 2 — was performed on the deployed 8,485-byte runtime bytecode disassembled locally. Its first check recompiles the published source with the contract's own recorded compiler settings and finds all 8,432 executable bytes identical to what is deployed, which is what allows the source-level findings elsewhere to stand on more than a block explorer's label. Automated tool analysis — Part 3 — covers Slither 0.11.6 across all 16 compiled contracts and Mythril 0.24.8 symbolic execution against the deployed bytecode; every finding either tool produced is reproduced in that section with its disposition. Source-level analysis — Parts 1, 4, 6, 7 and 8, plus Part 5 checks 1, 2, 3 and 5 — was read directly from the verified Solidity source and ABI. On-chain observation covers the rest: the burn trajectory in Part 5 check 7 is computed from totalSupply() against the constructor's documented 500,000,000 mint; each pool in check 6 was confirmed live on its respective DEX or block explorer; and the finding that trades outside the main ETH V2 pool go untaxed is evidenced by transaction 0xe9082639...d4fd1a3f, in which EVRGROW moved between two non-main pools and emitted no AutoBurned or LiquidityAdded event.

One item remains open. The claim that only the main pool is registered in the AMMs mapping is consistent with everything observed here, but was not confirmed by calling AMMs(address) against each auxiliary pool or by reading the full AMMUpdated event history. This is a limit of scope rather than of evidence: bytecode analysis reads code, and the registration list is contract state, which requires a live contract call. Any reader can settle it in seconds via the Read Contract tab on BaseScan by calling AMMs() with each pool address.

Audit Scope & Disclosure

This audit was performed by Claude (Anthropic) on August 11, 2026 against the EVRGROW contract deployed at 0x8ea57c4d7a6a88c90bcf038d37939fae61305a88 on Base. It comprises eight parts: verification of contract behavior against every published claim, including the scope of the transfer tax; bytecode verification and source equivalence, covering byte-for-byte reproduction of the deployed code, dangerous-opcode absence, selector enumeration and collision analysis, a dead-code proof of the privileged surface, call site inventory and compiler metadata; automated analysis via Slither and Mythril with every finding disclosed and dispositioned; a full backdoor review across all 14 source files; advanced checks covering storage layout, deployment sequence, UNCX lock verification, arithmetic edge cases, validation of all 17 liquidity pool addresses and a measured burn trajectory since launch; adversarial economic modeling of 8 attack scenarios; systematic coverage of all 36 SWC vulnerability classes; and supplementary checks covering compiler settings, ERC-20 compliance, public burn exposure and integer precision behavior.

This does not constitute a formal professional security audit. What remains outside its scope is Echidna property-based fuzzing against a forked network, formal mathematical verification, and independent multi-auditor peer review. Two things narrow the gap. First, two of the three tools normally cited as that gap — Slither and Mythril — were actually run here, and the deployed bytecode was independently reproduced from source, which is a stronger guarantee of source authenticity than most reviews establish. Second, the contract's own design limits what is left to find: EVRGROW has no staking logic, no governance, no oracles, no upgradeable proxy pattern, and no complex multi-contract interactions of its own design, which are precisely the areas where formal audits most commonly uncover critical bugs. Ownership is renounced and the entire privileged function surface is demonstrably unreachable, so the contract's behavior is fixed. The attack surface is genuinely narrow, and the analysis performed here covers the substantial majority of meaningful risk for a contract of this architecture. It is not a guarantee, and it is not financial advice; readers should form their own judgement and verify the open item above independently.

EVRGROW Logo