CONTRACT ANALYSIS

PoolManager

Scanned October 17, 2026 · Check a different contract →

Code review

PoolManager

Ethereum · 0x00000000…3dE08A90
View source →
4
capabilities present
3
undetermined
7
checks run
Warn someone before they buy:Share on XShare on RedditShare on LinkedIn
🪤

How the owner could rug you

1 owner power found that could be used against holders. Each is a capability the code grants — not proof of intent.

🔴Anyone can mint new tokens
Yes · high

The caller can create arbitrary amounts of the token and assign them to any address, diluting all existing holders.

Code: function mint(address to, uint256 id, uint256 amount) external onlyWhenUnlocked { ... _mint(to, currency.toId(), amount); }

❔Trading can be blocked via lock
Undetermined

Code: modifier onlyWhenUnlocked() { if (!Lock.isUnlocked()) ManagerLocked.selector.revertWith(); _; } used on swap, modifyLiquidity, donate, take, settle, etc.

❔No address blacklist found
Undetermined

Code: No mapping or function that checks a blacklist before transfers is visible in the provided code.

❔LP fee can be changed by hook contract
Undetermined

Code: function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external { if (!key.fee.isDynamicFee() || msg.sender != address(key.hooks)) revert; ... _pools[id].setLPFee(newDynamicLPFee); }

❔No upgradeability mechanism detected
Undetermined

Code: The contract does not inherit from a proxy pattern and no upgrade function is visible in the excerpt.

❔No privileged withdraw function found
Undetermined

Code: The only withdraw‑like function is take(...), which has no access restriction beyond the lock, making it public rather than owner‑only.

❔Owner status unknown
Undetermined

Code: Constructor stores initialOwner in ProtocolFees, but no onlyOwner modifiers appear in the visible code.

This checks only what the code can do. It cannot see whether liquidity is locked, how concentrated holders are, or what the team intends — those need live on-chain data. Absence of these mechanisms is not proof a token is safe.

What this could cost you

How much money would you put into this? We'll show you what you could actually lose — in dollars, not just a scary word like "risk."

$

Enter an amount above to see it in real dollars instead of just labels.

Scope of this review

This contract's code is 88,888 characters (after removing comments and whitespace) — only the first 9,000 were analyzed, so parts of it were not examined. That's the real reason, not a vague size limit: 79,888 characters were cut off the end. The contract's own code was read first, so what was cut is mostly shared library code.

What the code allows

Public mint function
Present

Evidence: function mint(address to, uint256 id, uint256 amount) external onlyWhenUnlocked { ... _mint(to, ...); }

This allows: Allows creation of new token units after deployment, leading to possible dilution.

Operations gated by lock
Present

Evidence: modifier onlyWhenUnlocked() applied to swap, modifyLiquidity, donate, take, settle, clear, mint, burn, etc.

This allows: Transfers and liquidity actions are only possible when the contract lock is in the unlocked state.

LP fee applied on swaps
Present

Evidence: swap() calls _swap() which emits Swap with swapFee; updateDynamicLPFee can change the fee.

This allows: Fees affect the amount users receive on each trade.

Lock acts as a pause mechanism
Present

Evidence: onlyWhenUnlocked modifier reverts when Lock.isUnlocked() is false, effectively pausing guarded functions.

This allows: The contract can halt core operations if the lock remains locked.

No explicit owner‑only functions visible
Undetermined

Evidence: No function in the excerpt uses a modifier like onlyOwner or checks msg.sender against an owner variable.

This allows: If owner privileges exist elsewhere they could affect token control.

No proxy/upgrade pattern visible
Undetermined

Evidence: Contract inherits NoDelegateCall, ProtocolFees, ERC6909Claims, Extsload, Exttload but no upgrade function is shown.

This allows: Upgradeability would allow future changes to contract logic.

Owner variable set but not used in visible code
Undetermined

Evidence: constructor(address initialOwner) ProtocolFees(initialOwner) {} stores owner in ProtocolFees, but no checks are visible here.

This allows: Whether the owner still holds power influences control over the contract.

Worth reading yourself

  • ›modifier onlyWhenUnlocked() { if (!Lock.isUnlocked()) ManagerLocked.selector.revertWith(); _; }
  • ›function mint(address to, uint256 id, uint256 amount) external onlyWhenUnlocked { ... _mint(to, ...); }
  • ›function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external { if (!key.fee.isDynamicFee() || msg.sender != address(key.hooks)) revert; ... }

What this did not check

  • ›The source provided is truncated at 9000 characters; any code beyond the excerpt could introduce or remove mechanisms.
  • ›Liquidity lock status, holder concentration, and actual on‑chain balances are not visible in the source and were not checked.

Automated review of verified source only. Not an audit. Does not cover on-chain state, holder distribution, liquidity, or deployer behavior. It cannot tell you whether a token is safe or whether to buy it. Absence of a finding is not evidence that a contract is sound — it may mean the relevant code was not readable, not verified, or not reached.

Want more than the free read?

A real security researcher personally reads this contract's verified source — not an automated re-run of the free check.

What's checked

The same 7 owner-power categories as the free check — mint authority, ability to disable trading, blacklist power, mutable fees, upgradeability, privileged withdrawal, and whether ownership is still active — plus 4 categories the free tier doesn't cover: exact current fee values and where they're set, whether ownership itself can be transferred (and to whom), any hardcoded or owner-settable exceptions to fees/limits/blacklist, and external contracts this one calls out to and trusts.

How it's done

I read the contract's actual verified source directly — no token-window truncation, since a person isn't limited by an LLM's context size the way the free tier is. Every finding cites the specific function or modifier it comes from; if the code doesn't determine something, the report says so instead of guessing.

What you get

A written report emailed to you within 24 hours: a plain-English summary, every finding with its evidence, and what the review could not determine from source alone.

Disclaimer: this is a capability review of verified source code, not a formal security audit and not investment advice. It reports what the contract's owner/admin technically CAN do — it does not check on-chain state, liquidity depth, holder concentration, or deployer behavior, and it does not certify a contract as safe.

Building something that needs this programmatically?

By purchasing, you agree to our Terms of Service and Privacy Policy.

This is a surface read

It reports capabilities visible in source. It does not model economics, test exploit paths, or reason about how contracts interact. A real review does — with runnable proofs for anything it claims.

Request a security review →

Paid reviews go further than this free scan: every finding is signed, timestamped, and hash-chained into a record — self-scored 16/20 against an independent standard →