# UGLY entry passes / v0.41.0

The main plaza UGLY pavilion now carries the pink UGLY LAB stamp, layered canopy, illuminated structural ribs, fin walls and an unobstructed arrival apron. Click/tap the stamp or use the nearby keyboard-accessible pink action. This opens the existing Lab in the same tab with a return path to UGLY.

Flow: Google account → verified wallet → explicit tester consent → Claim 1 tUGLY → wallet confirms a zero-value Robinhood TESTNET transaction → confirmed EntryClaimed event → Enter plaza. Identity proof is gas-free; claiming requires test ETH gas. No token approval, transferFrom, deposit, custodial wallet or server signer. Existing holders can skip claiming. Testnet resources: https://docs.robinhood.com/chain/connecting/ and https://docs.robinhood.com/chain/add-network-to-wallet/ .

Dispenser: 0x21D67cbB032408ab9d2d69F9030fA0a19B88ecE7 on chain 46630, source verified at https://explorer.testnet.chain.robinhood.com/address/0x21D67cbB032408ab9d2d69F9030fA0a19B88ecE7 . Fixed token: existing tUGLY 0x72ABCABf6c7833C16C531D5FE78865399e4AFFf6. No changes to the token or its supply cap. No mainnet functionality.

UglyEntryDispenser gives exactly 1 token once per address for its lifetime. It refills its reserve from the original token faucet (100 tokens per 24 hours) when empty. A failed refill reverts the entire claim, including the claimed marker. Initial live smoke claim leaves 99 passes available. Further batches depend on the faucet cooldown and global token cap. No admin, upgrades, approvals or ETH receiver. Public code and immutable contract are experimental, not independently audited.

This is NOT one claim per human: a person can create multiple wallets. Google verification is a game UI/admission prerequisite, not an onchain faucet restriction. Anyone can call the dispenser directly. Free test passes prove the integration, not scarcity or valuable whitelist eligibility. Production rewards need reviewed eligibility, signed campaign vouchers, per-account quotas, bot resistance, budget controls and recovery; no valuable-token deployment is implied.

Browser safeguards: fixed network/address/calldata/value, compare deployed runtime to public registry, match verified wallet, recheck network/account before send, simulate gas, check successful receipt and exact claim event. Wallet approval remains mandatory. Session storage remembers a pending transaction per address; retry polls it instead of sending twice. User rejection, chain mismatch, empty gas, cooldown/exhaustion and failed receipt do not grant access. No client success flag is trusted by the gate: existing server balance checks remain authoritative on entry and during play.

MetaMask domain warning remains unresolved. Testnet actions are the explicitly authorized exception; do not bypass alerts. Mainnet verification remains paused. No deployment key copied to Git or Vercel.

Validation: local EVM exact transfer/replay/cooldown rollback/mainnet rejection; client wrong-account/chain/runtime/replay/gas/cancellation/race/pending receipt tests; Chrome wallet-double claim UI plus real signature verifier, real 3D badge click and desktop/mobile screenshots; existing gate authorization tests. Live dedicated test-deployer claim tx: 0x5cb2aa203872d4f52f767f91adc27670a41b36131cff95496ec72bff09dbc804 (exact 1 tUGLY, no personal wallet). Browser wallet tests use a simulator; human MetaMask acceptance remains to be tested.

Scripts: build-ugly-entry.cjs, test-ugly-entry.cjs, deploy-ugly-entry.cjs (preview by default, refuses duplicate records), verify-ugly-entry-source.cjs, test-ugly-entry-live.cjs (read-only by default), test-ugly-claim.mjs, verify-ugly-claim-ui.mjs, verify-ugly-entrance.mjs. Isolated compiler/test tools are outside the repository.
