Robinhood Chain·Scanned 05 Nov 2026, 08:28 UTC
PonsV2LauncherToken $UPOCH
Verdict
42/100 safety
No-owner ERC-20, sells work at 0% token tax (3% pool fee); staking withdraw unproven behind 7-day cooldown
This is rated high risk mainly because our test of the project's staking app could not get staked tokens back: the unstake request worked, but withdrawal is held by a 7-day cooldown and could not be proven. The token itself has no owner powers and trades freely with no token tax, though every pool swap pays a 3% launchpad fee. One Pons launchpad admin controls the hook, factory and LP locker, and the project's X posts promise more token utility than its own site admits. On the positive side, sniping was negligible, the developer holds nothing and burned part of the supply, and the main pool's liquidity is locked.
Score breakdown
- Contract15
- Token72
- Social / X52
- Website62
Higher is safer · 0 = worst · 100 = best
- Yes
- 0%
- None (no owner role)
- 0% / 100%
- MC at check
- $123.9K
- MC now
- no live price
- Since check
- —
- Liquidity
- $32.4K
Live chart
The chart updates live; “MC at check” above is the market cap when this check ran.
Key findings
- CriticalWithdrawing through the dApp failed ("Unstake")
- MediumOne Pons admin owns the hook, factory, buyback vault and LP locker
- MediumX posts promise token utility the site says it does not have
- GoodOngoing token burns verified on-chain: 2.3% of supply burned
What would change the verdict
- Lowers safety:Withdraw after the cooldown reverts or returns less than was staked → down
- Lowers safety:Pons admin uses locker setFactory to release the locked main-pool LP → down
- Raises safety:Pons admin is shown to be a multisig or timelocked → up
Findings
14 findingsRisks (3)
CriticalWithdrawing through the dApp failed ("Unstake")honeypotDeterministic
We ran the project's own dApp on a local fork. The "Unstake" step did not work. Expected: Only the staker can request an unstake or withdraw, and only to themselves, after a 7-day cooldown. (source: https://upoch.tech/security). Observed: wallet no balance change; 1 tx (requestUnstake ok). returned 0 UPOCH of 100 UPOCH deposited (0%) | driver: fail — Unstake requested, but tokens cannot be withdrawn back to the wallet due to a mandatory 7-day cooldown period (Withdraw button is disabled until unlock date).. Money deposited may be impossible to take out.
Evidence
- forkdApp test "Unstake" on a local fork (https://upoch.tech/app/staking)
Show source
wallet no balance change; 1 tx (requestUnstake ok). returned 0 UPOCH of 100 UPOCH deposited (0%) | driver: fail — Unstake requested, but tokens cannot be withdrawn back to the wallet due to a mandatory 7-day cooldown period (Withdraw button is disabled until unlock date). - codeUpochStaking.sol:L99-L109
Show source
function withdraw() external nonReentrant { uint256 pending = pendingOf[msg.sender]; if (pending == 0) revert NothingPending(); uint64 at = unlockAt[msg.sender]; if (block.timestamp < at) revert CoolingDown(at); pendingOf[msg.sender] = 0; unlockAt[msg.sender] = 0; _call(abi.encodeCall(IERC20Minimal.transfer, (msg.sender, pending))); emit Withdrawn(msg.sender, pending); } - codeUpochStaking.sol:L13-L19
Show source
/// @notice Lock Upoch tokens to reach the debugger's Tier 2. Deliberately minimal: /// - no owner, no admin, no pause, no upgrade: nobody can move, freeze or seize staked tokens; /// - no rewards: staking earns nothing; it only records a balance the Upoch site reads; /// - withdrawal needs `requestUnstake` and a cooldown, so a stake cannot be borrowed for a moment and returned /// (flash loans), and the stake counts only while it is not being withdrawn; /// - only the staker can request or withdraw their own tokens, and only to themselves. /// @dev Not audited. Fee-on-transfer and rebasing tokens are refused (the received amount must equal the request). - forkdappTests Unstake step requestUnstake
Show source
tokens cannot be withdrawn back to the wallet due to a mandatory 7-day cooldown period - on-chainUpochStaking cooldown = 604800 (immutable)
Confirmed by: facts, claude-opus-5.5, grok-4.7, gpt-5.6-sol
MediumOne Pons admin owns the hook, factory, buyback vault and LP lockerownershipAI
Address 0x263e…19Dd owns the PonsV2MemeHook, the PonsV2LaunchFactory, the PonsV2BuybackVault and the PonsV2LaunchLocker. It is not shown whether this is a multisig or a single key. Powers relevant to this pool: - Change the fee sweep operator. That operator alone converts pending memecoin fees and runs buybacks against the pool, choosing its own minimum outputs, so a hostile operator could sandwich that fee inventory. This puts the fee pot at risk, not holder balances. - Call rescuePoolFees. This pays pending fees to the recorded protocol and creator recipients, not to arbitrary addresses. - Change the protocol fee recipient for future launches. - Call setFactory on the locker and vault. Whether this is one-time-only there cannot be checked because the source is omitted; on the hook, setFactory is one-time-only. - Override changes to the creator fee recipient through the factory. Hook ownership cannot be renounced, by design. Launchpad-wide trust is required.
Evidence
- on-chainPonsV2MemeHook owner = 0x263ed295dAFaE1d9AAdD6E56c4B6F9f38eE019Dd; PonsV2LaunchFactory owner = 0x263ed295dAFaE1d9AAdD6E56c4B6F9f38eE019Dd; PonsV2LaunchLocker owner = 0x263ed295dAFaE1d9AAdD6E56c4B6F9f38eE019Dd; PonsV2BuybackVault owner = 0x263ed295dAFaE1d9AAdD6E56c4B6F9f38eE019Dd
- codePonsV2MemeHook.sol:L274-L278
Show source
function setFeeSweepOperator(address operator) external onlyOwner { if (operator == address(0)) revert ZeroAddress(); feeSweepOperator = operator; emit FeeSweepOperatorUpdated(operator); } - codePonsV2MemeHook.sol:L500-L508
Show source
function sweepPoolFees(PoolId poolId, uint256 minConversionQuoteOut, uint256 minBuybackTokensOut) external nonReentrant { LaunchInfo memory info = launches[poolId]; if (!info.registered) revert UnknownPool(); bool isOperator = msg.sender == feeSweepOperator; if (!isOperator && msg.sender != info.creator) revert NotFeeSweepOperator(); if (!isOperator && _requiresTrustedOperator(poolId, info)) revert InternalSwapRequiresOperator(); - codePonsV2MemeHook.sol:L555-L603
Show source
function rescuePoolFees(PoolId poolId) external onlyOwner nonReentrant returns (uint256 protocolAmount, uint256 creatorAmount) { LaunchInfo memory info = launches[poolId]; if (!info.registered) revert UnknownPool(); address quoteToken = info.quoteToken; if (quoteToken != address(0)) { (protocolAmount, creatorAmount) = _rescueCurrency(poolId, info, quoteToken); } (uint256 memecoinProtocol, uint256 memecoinCreator) = _rescueCurrency(poolId, info, info.memecoin); if (protocolAmount == 0 && creatorAmount == 0 && memecoinProtocol == 0 && memecoinCreator == 0) { - codePonsV2MemeHook.sol:L235-L237
Show source
function renounceOwnership() public pure override { revert OwnershipCannotBeRenounced(); }
Confirmed by: claude-opus-5.5, grok-4.7, gpt-5.6-sol
MediumX posts promise token utility the site says it does not haveclaims-mismatchAI
Posts describe $UPOCH as the economic backbone of agent infrastructure, a permanent structural token sink, and the key to priority multi-guardian recovery. The same project's footer states the token is separate from the protocol, gives no rights over any workflow, and that staking pays no rewards and only unlocks debugger tools. Buyers can overestimate what holding the token actually controls.
Evidence
Show source
By anchoring these high frequency diagnostic and safety services behind mandatory $UPOCH holding and staking tiers, the protocol establishes a permanent, structural token sink.Show source
Priority Multi Guardian Recovery Dispatch: Teams requiring expedited emergency intervention and priority multi-guardian recovery consensus utilize $UPOCH holding tiers to secure priority queuing.Show source
The Upoch token is separate from the protocol: the protocol contract does not use it, and holding or staking it gives no rights over any workflow. It unlocks debugger tools only; staking pays no rewards.
Confirmed by: grok-4.7, gpt-5.6-sol
Positive signals (7)
PositiveOngoing token burns verified on-chain: 2.3% of supply burnedburnDeterministic
2.3% of the supply ever minted is burned, in 6 burn transfer(s), last 2026-11-04. Burned by: the deployer 0x7902…2d77 (2.3%, 4 burns); holder 0x5d75…305e (0.0%, 2 burns). Burned tokens are gone for good, which reduces the supply over time.
Evidence
- on-chainTransfer events to 0x0 / 0x…dEaD and balanceOf(burn addresses) of 0xdafaa1ed0b9f5746a0cfa2be80371cf06a986977
Confirmed by: facts
PositiveToken is a plain fixed-supply ERC-20 with no owner powersownershipAI
UPOCH is the standard Pons V2 template token: OpenZeppelin ERC20 plus ERC20Burnable, with no owner and no admin functions. There is no mint after deployment, no fee, no blacklist, no pause and no transfer hook. The whole supply was minted once to the bonding curve in the constructor. The 'deployer' address is stored only as reference data and has no powers. Holders can burn only their own tokens, or tokens they have been given an allowance for.
Evidence
- codePonsV2LauncherToken.sol:L21
Show source
contract PonsV2LauncherToken is ERC20, ERC20Burnable { - codePonsV2LauncherToken.sol:L59-L70
Show source
deployer = deployer_; // Passed explicitly rather than read from msg.sender: PonsV2LaunchFactory // deploys this token indirectly through PonsV2LaunchDeployer to keep its // own bytecode under EIP-170's size limit, so msg.sender at construction // time would otherwise resolve to that deployer helper, not the factory. launchFactory = launchFactory_; curve = curve_; logo = logo_; description = description_; _socials = socials_; _mint(curve_, supply_); - codeERC20.sol:L176-L204
Show source
function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } - staticprivileges: [] ; slither issues: []
Confirmed by: claude-opus-5.5, gpt-5.6-sol
PositiveBuy, sell and transfer-then-sell work with 0% token taxhoneypotAI
On a fork, a real buy and sell through the graduated Uniswap v4 pool both succeeded, and each returned exactly the expected amount. A second wallet that received tokens by transfer could also sell, and selling still worked one hour later. The token itself charges 0% tax. The pool-level swap fee is included in the quotes.
Evidence
- forkcanBuy=true, canSell=true, buyTaxPct=0, sellTaxPct=0, transferTaxPct=0
Show source
second wallet (received via transfer) could sell - forksell after +1h: ok
Confirmed by: claude-opus-5.5, grok-4.7, gpt-5.6-sol
PositivePons pool hook cannot block sells or freeze liquidityhoneypotAI
The hook's address bits enable only three callbacks: beforeInitialize, afterSwap and afterSwapReturnDelta. - beforeInitialize only checks that the factory is creating the pool. - afterSwap takes the fixed per-pool fee and has no allowlist or blacklist logic. - There is no beforeSwap or beforeRemoveLiquidity, so the hook cannot reject trades before they happen or stop liquidity from being removed. No owner setting changes this behaviour for a pool that is already registered.
Evidence
- codePonsV2MemeHook.sol:L184-L201
Show source
function getHookPermissions() public pure override returns (Hooks.Permissions memory) { return Hooks.Permissions({ beforeInitialize: true, afterInitialize: false, beforeAddLiquidity: false, afterAddLiquidity: false, beforeRemoveLiquidity: false, afterRemoveLiquidity: false, beforeSwap: false, afterSwap: true, beforeDonate: false, afterDonate: false, beforeSwapReturnDelta: false, afterSwapReturnDelta: true, afterAddLiquidityReturnDelta: false, - codePonsV2MemeHook.sol:L429-L432
Show source
function _beforeInitialize(address sender, PoolKey calldata, uint160) internal view override returns (bytes4) { if (sender != factory) revert NotFactory(); return IHooks.beforeInitialize.selector; } - on-chainhook permissions (from address bits) = beforeInitialize, afterSwap, afterSwapReturnDelta
Confirmed by: claude-opus-5.5 · Disputed by: gpt-5.6-sol
PositiveMain pool LP is locked in the Pons locker (unlock terms unknown)liquidityAI
The graduated Uniswap v4 pool (about $32k of liquidity) shows its LP 100% locked, with 0% held by the deployer. The locker is the Pons launchpad locker. The locker's source was not provided, so the unlock terms could not be read. Its owner can call setFactory. The three other UPOCH pools are tiny ($212, $11 and $6), unlocked, and held by unrelated wallets.
Evidence
- on-chainliquidity pool 0x3dde2e2ca95e3b2f1593796482e5871dd64919ddf844d306cd9af6a68b7a2b1f: lpLockedPct=100, lpHeldByDeployerPct=0, liquidityUsd=32373
- on-chainExcluded from concentration: 0x267444d099b10fb5ed7c3cc7b7c767adca574952 (LP locker) 8.1632%
Confirmed by: claude-opus-5.5, grok-4.7 · Disputed by: gpt-5.6-sol
PositiveDeveloper wallet holds nothing and has not soldholdersAI
The creator wallet (a declared insider, exempt from the snipe tax) now holds 0% and its recorded sold share is 0%. It burned 2.305% of supply in 4 burn transactions. The largest non-infrastructure holder has 3.92%. The top 10 hold 26.6%, and that figure includes the PoolManager and the locker. There are 249 holders.
Evidence
- on-chainDeployer 0x7902d77f5798f8e0d3c60894eb06e77539212d77 holds 0% now; deployerSoldPct=0
- on-chainburns.by deployer pct=2.305 count=4
- on-chainholdersCount=249, top10Pct=26.6039
Confirmed by: claude-opus-5.5, grok-4.7, gpt-5.6-sol
PositiveSite openly discloses token limits, owner risk and no auditwebsiteAI
The public site does not pretend the launchpad token is the protocol. It names the protocol contract separately, says an independent audit has not happened, says the owner can veto recovery, and says staking has no rewards and no admin. That is unusually explicit for a new Robinhood Chain token and reduces, rather than hides, what holders must trust.
Evidence
Show source
Not independently audited yet: the contract has had an internal security review by the development team, and an independent audit is planned.Show source
The Upoch token is separate from the protocol: the protocol contract does not use it, and holding or staking it gives no rights over any workflow.
Confirmed by: grok-4.7, claude-opus-5.5, gpt-5.6-sol
Notes (4)
LowEvery pool swap pays a fixed 3% launchpad fee (1% protocol, 2% creator)feesAI
The graduated pool uses the PonsV2MemeHook. After each swap, the hook takes hookFeeBps plus creatorTaxBps of the swap's unspecified side. For this launch that is 1% plus 2%, which matches the launchpad facts (3% buy and 3% sell). The 2% creator tax goes entirely to the creator. The 1% fee is split: 30% to the protocol, and the rest goes to the creator (optionally partly into the buyback vault). The rates are copied into the pool's LaunchInfo record when the pool is registered, and _afterSwap reads that per-pool copy. Later owner changes to setHookFeeBps (capped at 10%) or setProtocolFeeShareBps (capped at 50%) only apply to new launches, not to this pool. Registration also enforces creatorTaxBps + hookFeeBps <= 20%.
Evidence
- codePonsV2MemeHook.sol:L444-L485
Show source
function _afterSwap(address, PoolKey calldata key, SwapParams calldata params, BalanceDelta delta, bytes calldata) internal override returns (bytes4, int128) { // The conversion and buyback legs swap against this same pool, but // they are never taxed here: v4-core skips a pool's hooks when the // hook itself is the caller (Hooks.afterSwap). Were that not so, the // skim would come out of the buyback before it reached the vault. PoolId poolId = key.toId(); LaunchInfo memory info = launches[poolId]; if (!info.registered) return (IHooks.afterSwap.selector, 0); if (info.hookFeeBps == 0 && info.creatorTaxBps == 0) return (IHooks.afterSwap.selector, 0); bool specifiedIsCurrency0 = (params.amountSpecified < 0) == params.zeroForOne; - codePonsV2MemeHook.sol:L364-L378
Show source
launches[poolId] = LaunchInfo({ registered: true, memecoinIsCurrency0: memecoinIsCurrency0, memecoin: memecoin, quoteToken: quoteToken, creator: creator, buybackCreatorRecipient: buybackCreatorRecipient, protocolFeeRecipient: policy.protocolFeeRecipient, creatorTaxBps: creatorTaxBps, protocolFeeShareBps: policy.protocolFeeShareBps, buybackBurnBps: policy.buybackBurnBps, hookFeeBps: policy.hookFeeBps, maxInternalPriceImpactBps: policy.maxInternalPriceImpactBps, buybackEnabled: buybackEnabled }); - codePonsV2MemeHook.sol:L342-L352
Show source
if ( policy.protocolFeeRecipient == address(0) || policy.protocolFeeShareBps > MAX_PROTOCOL_FEE_SHARE_BPS || policy.buybackBurnBps > BASIS_POINTS || policy.hookFeeBps > MAX_HOOK_FEE_BPS || policy.maxInternalPriceImpactBps == 0 || policy.maxInternalPriceImpactBps >= BASIS_POINTS ) { revert InvalidBps(); } // The curve bounds the same sum in its own constructor rather than // inheriting it from the factory. A pool taking more than the whole // unspecified leg would flip the swapper's output delta negative. if (uint256(creatorTaxBps) + policy.hookFeeBps > MAX_TOTAL_TRADE_FEE_BPS) revert InvalidBps(); - on-chainlaunchpad.fees
Show source
protocol fee 1%; creator tax 2%
Confirmed by: claude-opus-5.5, gpt-5.6-sol
LowWebsite domain registered one week before token launchwebsiteAI
The upoch.tech domain was created on 2026-10-25, and the token was deployed on 2026-11-02. The project is very new. This is context only, not proof of anything.
Evidence
- on-chainsite.domainCreatedAt = 2026-10-25T12:05:59.308Z; contract.deployedAt = 2026-11-02T19:45:14.000Z
Confirmed by: claude-opus-5.5, grok-4.7, gpt-5.6-sol
InfoThree launch snipers took only 0.15% and fully exitedsnipersAI
Three wallets bought within the first 100 blocks after launch. Two of them were funded by the same wallet, 0x9e98…e823. Together they bought 0.15% of supply and now hold 0%, so they pose no remaining dump risk.
Evidence
- on-chainsnipers pctSupplyBought=0.15, pctSupplyHeldNow=0
- on-chaincluster funder 0x9e98e8c4d9b6da38556d74ea0922cd747ab9e823 wallets 0x46e4a4b216f315b3388cf1d18e8a938d7e9f18b5, 0x6511f525bb2b488a3344fd331c175fd4fa31fc7d pctSupplyHeldNow=0
Confirmed by: claude-opus-5.5, grok-4.7, gpt-5.6-sol
InfoX account is new but consistent; no scam reports foundsocialAI
@upochtech was created 2026-10-26, one day after the domain (2026-10-25), and is verified with 194 followers. Recent posts are all about this product, not an older unrelated account. A search for UPOCH with scam, rug, or honeypot did not return posts about this token. Third-party replies are mostly generic hype and DM bait, not identical paid scripts from the team. Team identity is not claimed and remains unverifiable.
Evidence
Show source
When an agent goes wrong at 3am, recovery shouldn't wait on a group chat.Show source
Checkpoints, integrity, and recovery for autonomous on-chain systems. Live on Robinhood Chain mainnet (4663).
Confirmed by: grok-4.7
Score breakdown
Higher is safer. The overall is the weighted average of the assessed parts, then capped by hard facts.
Contract
weight 45%15Capped · max 15dApp test "Unstake" failed — funds may not be withdrawable → max 15
The token itself is a clean, verified, no-owner ERC-20 that buys and sells at 0% tax, but the project's staking withdraw could not be proven in our test, which caps this part.
Why this score
Raised the score
- Verified fixed-supply ERC-20 with no owner, mint, pause or blacklist
- Buy, sell and transfer-then-sell work at 0% token tax
- Pool hook cannot block sells and its fee rates are frozen
- Staking contract has no admin and an immutable 7-day cooldown
Lowered the score
- dApp unstake test returned 0 of 100 staked tokens (withdraw blocked by cooldown, not exercised)
- One Pons admin address owns the hook, factory, buyback vault and LP locker
- 3% fee on every pool swap (1% protocol, 2% creator)
- Staking contract self-declared as not audited
Token
weight 30%72Launch looks fair with negligible sniping and no deployer selling, and main-pool LP is locked, though liquidity is modest and the locker's unlock terms are unknown.
Why this score
Raised the score
- Snipers bought only 0.15% and have exited
- Deployer holds 0% and recorded no sales
- Deployer burned about 2.3% of supply
- Main pool LP 100% held by the Pons LP locker
- Largest ordinary holder about 3.9%
Lowered the score
- Main pool liquidity only about $32k
- LP locker unlock terms could not be reviewed
- Locker owner can change the factory address
Social / X
weight 15%52A new but verified X account with no scam reports, whose token marketing overstates what the token does compared with the project's own site.
Why this score
Raised the score
- X account age matches the site launch
- No third-party rug or honeypot warnings found
Lowered the score
- Posts sell the token as a permanent value sink and priority recovery key, while the site says it gives no workflow rights
- Team is anonymous
- Account is only days old
Website
weight 10%62The site is detailed and unusually candid about token limits, owner risk and the missing audit, but the project is only days old.
Why this score
Raised the score
- Discloses that the token is separate from the protocol and staking pays no rewards
- Admits no independent audit yet and explains owner risk
- Staking claims (no admin, 7-day cooldown) confirmed on-chain
Lowered the score
- Domain registered about one week before token launch
- Minor unreconciled test-count figures in marketing