B7
42
N31
G54
19
O68
Live on Solana Mainnet

Beach Bingo.

The first fully on-chain bingo game built for Solana. Compete in live 8-player races, challenge yourself in solo modes, or join marathon pots that last for hours. Every ball drawn is provably fair via Switchboard VRF. Your wallet. Your winnings. No middleman.

v1.5.0 / Build 108 / Solana Seeker · Mainnet
B7
◕ Featured Draw
Tidal Rush
75balls
Per game
8max
Players
0%
Custodian
VRF
Fair random
Inside the app

See what
awaits.

Lobby
Join live games instantly. Real SOL on the line.
💎

Invest in Beach Bingo

Join our seed round. Building the future of on-chain gaming on Solana.

View Deck →
Your Profile

Wallet in.
Stats out.

Connect your Solana wallet to view your in-game stats, check your .skr domain, and verify your Seeker Genesis Token perks.

No middleware. Every ticket, win, and shell is read directly from the chain.

  • Seed Vault · Phantom · any Solana wallet
  • .skr reverse lookup on mainnet
  • Genesis Token perks auto-applied
◕  Mainnet  ✦  Genesis
Disconnect
tidewalker.skr
7nP4···sR8q
128
Tickets played
37
Wins
28.9%
Win rate
Genesis Holder Active
20% fee discount · Seeker rooms · Daily free card
◕ Streak: 7 days · Tier: Tide Chaser · 4,210 shells
What makes it different

Built on Solana.
Fully on-chain.

01

On-chain Logic

Every ball draw, ticket, and payout lives in a Solana program. No servers, no house, no custodians.

02

Provably Fair

Ball sequences derived from Switchboard VRF randomness. Verify every game on-chain.

03

Flash Games

6-minute Flash rooms, 55-minute Standard rooms, and 6-hour Marathon modes for every play style.

04

Solo Modes

Three solo challenges: Tidal Rush, Pattern Cascade, and Buried Treasure — each with unique mechanics.

05

Multi-Token

Pay in SOL, USDC, JUP, or SKR. SKR holders get 15% fee discount via Token-2022 metadata.

06

Seeker Native

Built exclusively for Solana Seeker — the web3 phone with native Seed Vault, .skr domains, and SKR token integration.

Game modes

Five ways
to play.

01
Flash
8 players max. Winner takes all. Ends fast — 6 minutes.
Multiplayer
02
Standard
Up to 8 players. Full 75-ball draw. The classic format.
Multiplayer
03
Marathon
Long-form room. Pot accumulates over 6 hours.
Multiplayer
04
Tidal Rush
Solo. Race the clock to complete Top Row or Diagonal.
Solo
05
Buried Treasure
Solo. Discover 13 hidden chests across your card.
Solo
Download

Get the
APK.

Built for Solana Seeker and Solana Mobile. Direct install via APK. Optimized for Seed Vault integration.

🔒  Download v1.5.0 b146
1.5.0
Version
b146
Build
35 MB
Size
Seeker
Optimized
Devnet
Network
Beta Access

Locked.
Unlock to install.

Connect your wallet — or enter an access code — to unlock the full download and complete changelog.

◎ Connect Wallet
— or —
What's new

Changelog

Live build history. Every shipped feature, fix, and security audit.

v1.5.0 Current
Build 146
Jun 2, 2026
Polish
Custom icons replace emoji: Solo modes, the leaderboard medals and tabs, Daily Challenge stars, the shells balance, and every achievement badge now use crisp custom vector icons instead of emoji, for a cleaner and more consistent look across devices.
v1.5.0
Build 145
Jun 2, 2026
Fix
Profile and wallet no longer crash: opening your Profile or connecting / disconnecting your wallet could throw a "something went wrong" error. A shared pill and button component now render text safely, so these screens work again.
Fix
Shop recovers from a slow start: if the shop's on-chain config failed to load on the first try, it stayed empty with no retry. It now retries automatically so items reliably appear.
v1.5.0
Build 144
Jun 2, 2026
Fix
Daily Challenge claim when signed out: playing the Daily Challenge without a wallet now shows a clear "connect wallet to claim" prompt instead of a claim button that did nothing.
Fix
Tide Pool draws every ball: free practice was ending one ball early, so the final draw never landed. All 75 balls now play, so a last-ball win counts.
Polish
Create Room consistency: the $SKR discount banner now matches the rest of the screen and no longer selects a token that is still coming after mainnet.
v1.5.0
Build 143
Jun 2, 2026
New
Now running on Solana Devnet for open testing: the app connects to the network where the game program is live, so rooms, joins, and games work end to end. Use Devnet SOL to play. Real token balances still show from Mainnet.
Fix
Solo modes now match their games: mode names, win conditions, colors, and icons are unified across the Solo tab and each game, so descriptions are accurate everywhere (Tidal Rush now correctly says complete the top row).
Polish
Tournaments and UI cleanup: the full Tournaments screen with past results is now reachable from the Rooms tab, network labels reflect the active cluster, and a faint profile banner control is now readable.
v1.5.0
Build 142
Jun 2, 2026
Security
Theme purchases are now atomic: buying cosmetics checks and spends your shells in a single guarded step on the server, so rapid or repeated taps can never spend more shells than you have.
Fix
Music resumes automatically: background music now picks back up when you return to the app instead of staying silent after switching away.
Polish
Leaderboard refinements: the Friends tab now tells you when friends simply haven't ranked yet, the podium shows shell totals to match how the board is ranked, and the "your rank" hints are accurate.
v1.5.0
Build 141
Jun 2, 2026
New
Bonus shells now count: shells you earn from daily quests and play streaks are added to your balance and tier on your profile, where they were previously hidden.
New
Card themes save to your account: themes you buy now sync across devices and survive a reinstall. Buying a theme spends shells from your real balance.
New
Friends leaderboard: a new Friends tab ranks you against the people you follow, and the global board now loads from a fast server instead of scanning the chain on your phone.
Improve
"Own 3 cards" quest is claimable: the daily card-collection quest now pays out its shell reward, verified against your on-chain cards.
v1.5.0
Build 140
Jun 2, 2026
New
Progression is now server-verified — Win streaks, solo records, daily quests, and game stats are credited from your real on-chain results and sync across devices — not stored on your phone. Reinstall and reconnect: your progress follows your wallet.
Security
No more progress tampering — Quests and streaks are credited only from validated on-chain game events, and quest rewards are verified server-side before they pay out.
v1.5.0
Build 139
Jun 1, 2026
New
Friends now sync across devices — Your friends list lives on a secure backend instead of just your phone. Sign in once with your wallet (a quick signature, no password) and your friends follow you to any device, with live updates when you add or remove someone.
Security
Wallet-signed backend sessions — Social data is protected by row-level security tied to your wallet: only you can read or change your own friends. Sign-in uses a single-use challenge so signatures can't be replayed.
v1.5.0
Build 138
Jun 1, 2026
Improve
Shop token balance precheck — When buying upgrades or boards with USDC, JUP, or SKR, the shop now checks whether the player has sufficient balance before signing β€” showing "Insufficient USDC. Need 2.99, have 0.50." instead of a cryptic on-chain failure.
v1.5.0
Build 137
Jun 1, 2026
Improve
Balance updates after winning a multiplayer game — Claiming BINGO in a multiplayer game now immediately invalidates the token balance cache so the new pot amount shows in the profile/wallet display without waiting for the 20-second poll.
v1.5.0
Build 136
Jun 1, 2026
Improve
Token balances refresh after every spend (complete coverage) — All 10 transaction hooks now invalidate tokenBalances on success: joining a room, joining a tournament, starting/settling a solo game, shop purchases, Daily Ranked registration, and all challenge operations. Balance displays update immediately after any spend or receive.
v1.5.0
Build 135
Jun 1, 2026
Improve
Token balances refresh immediately after SOL/token spends — After joining a room, sending/cancelling/settling a challenge, buying from the shop, or registering for Daily Ranked, the token balance display now updates immediately instead of waiting for the 20-second poll.
v1.5.0
Build 134
Jun 1, 2026
Improve
Challenge settle invalidates profile — After settling a challenge and collecting the staked SOL, settleChallenge now invalidates the player profile cache so the profile screen reflects the updated stats immediately.
v1.5.0
Build 133
Jun 1, 2026
Improve
Solo session invalidated on settleuseSettleSolo now explicitly invalidates the solo session React Query cache on success, in addition to the WebSocket-driven update. Belt-and-suspenders ensures the result screen appears even if the WebSocket misses the event.
v1.5.0
Build 132
Jun 1, 2026
Fix
Card pack purchase token account precheck — When buying a card pack with USDC, JUP, or SKR, useBuyCardPack now verifies the payer's token account exists before sending the transaction, showing a clear error message instead of a cryptic on-chain failure.
Improve
Profile updates immediately after referral bonususeRegisterReferral now invalidates the profile cache on success so the +500 🐚 bonus shows in the profile immediately.
v1.5.0
Build 131
Jun 1, 2026
Fix
Daily Ranked uses Token-2022 for SKRuseDailyPool was deriving the player's SKR ATA using the standard SPL Token program, but SKR is a Token-2022 token. Fixed to use TOKEN_2022_PROGRAM_ID for ATA derivation, precheck, and transaction accounts.
v1.5.0
Build 130
Jun 1, 2026
Improve
Card pack purchase token precheck — When buying a card pack with USDC, JUP, or SKR, the hook now verifies the payer's token account exists before sending the transaction. Shows a clear error ("No USDC token account found") instead of a cryptic on-chain failure.
Improve
Profile refreshes immediately after referral bonususeRegisterReferral now invalidates the profile cache on success so the +500 🐚 bonus appears in the profile immediately instead of waiting for the 30-second poll.
v1.5.0
Build 129
Jun 1, 2026
Improve
Daily Ranked SKR balance precheck — Before sending the registration transaction, the hook now verifies the user has a SKR token account with sufficient balance and shows a clear error message instead of a cryptic on-chain failure.
v1.5.0
Build 128
Jun 1, 2026
Fix
Challenge room navigation broken (critical)acceptChallenge and joinChallengeRoom were returning the room's PDA (base58 string) instead of its numeric room ID. Navigating to /game?roomId=<pda> caused BigInt(pda) to throw, breaking the entire game screen for challenge matches. Also fixed the ChallengeResultSection lookup in the game screen which was comparing PDA vs numeric ID (always false).
v1.5.0
Build 127
Jun 1, 2026
Improve
Share text includes win amount (solo game) — Completing the share text improvement from b126, the "Share Text" button in solo win overlays now includes the payout amount and token. Message rephrased from "played ... and won" to "won {amount} {token} playing ...".
v1.5.0
Build 126
Jun 1, 2026
Improve
Share text includes win amount — The "SHARE TEXT" button after a multiplayer win now includes the pot amount and token in the message. Previously it only mentioned the game type.
v1.5.0
Build 125
Jun 1, 2026
Fix
Removed unused import in join screen — After removing the duplicate join_success SFX call from join.tsx, the now-unused playSfxEvent import was also cleaned up. Unused playSfxEvent import in useRevealChest similarly removed.
v1.5.0
Build 124
Jun 1, 2026
Improve
Real-time player list updates in waiting roomuseRoomPlayers now subscribes to the room account via WebSocket. New players joining the waiting room now appear in the player list immediately.
Fix
Double chest-open and join-success SFXuseRevealChest.onSuccess was playing chest_open in addition to useSoloGame's callback. join.tsx was playing join_success in addition to useJoinRoom.onSuccess. Both duplicates removed.
v1.5.0
Build 123
Jun 1, 2026
Improve
Solo game session state updates instantlyuseSoloSession now subscribes to the session account via WebSocket, matching the pattern established for useRoom in b122. VRF fulfillment and settle confirmation now propagate instantly instead of waiting up to 2 seconds.
v1.5.0
Build 122
Jun 1, 2026
Improve
Room state updates now instant via WebSocketuseRoom now subscribes to the room account change event in addition to polling every 10 seconds. Game-state transitions (waiting room filling, game starting, settlement) now propagate to the UI immediately instead of waiting up to 10 seconds.
v1.5.0
Build 121
Jun 1, 2026
Fix
Auto-dauber button shows correct status — When auto-dauber is active, the bingo status button now shows "AUTO-DAUBING..." instead of "MARK CALLED CELLS", which was confusing since no manual marking is needed.
Fix
Bingo cell shadow uses daub color — The shadow glow around daubed cells in the multiplayer board now matches the active card theme's daub color instead of always glowing gold.
v1.5.0
Build 120
Jun 1, 2026
Feature
Card theme fully applied to multiplayer board — The card theme's daubColor now applies to the multiplayer bingo board cell text color and shadow. Previously only solo modes and daily challenge honored the card theme selection.
Fix
Auto-dauber button label — When auto-dauber is active, the bingo status button now reads "AUTO-DAUBING..." instead of "MARK CALLED CELLS" (which incorrectly implies manual marking is needed).
v1.5.0
Build 119
Jun 1, 2026
Feature
Card theme applies to multiplayer game board — The card theme (daub color) selected by the user now visually applies to the multiplayer bingo board. Previously useCardTheme was loaded in the game screen but BingoBoard hardcoded t.gold for marked cells. Now the theme's daubColor is threaded through.
v1.5.0
Build 118
Jun 1, 2026
Improve
GameHeader uses proper StyleSheet import — Replaced the unusual require('react-native').StyleSheet.create({"{...}"} pattern with a standard ES import and removed redundant as const casts. No runtime behavior change.
v1.5.0
Build 117
Jun 1, 2026
Improve
Removed unnecessary TypeScript casts — All t={"{t as any}"} and theme={"{t as any}"} pattern eliminated from game, shop, profile, and more screens. All components correctly type t: TropColors, so the casts were pure noise. TypeScript still passes with 0 errors.
v1.5.0
Build 116
Jun 1, 2026
Fix
Wasted activity feed fetch on pull-to-refresh removed — The Lobby was importing useActivityFeed and calling refetchFeed() on every pull-to-refresh even though the activity feed UI component was never rendered anywhere. Removed the dead import and the unnecessary API call.
Fix
Shop fonts now use theme tokensShopHeader, CardPackSection, UpgradesSection, and ConnectWalletSheet replaced all inline Montserrat-Bold / Montserrat-Regular strings with t.fUI / t.fUIReg theme tokens.
Improve
Shared TLD parser instance in friends utilityutils/friends.ts was creating its own TldParser. Switched to the shared singleton from utils/tldParser.ts to avoid duplicate caches.
v1.5.0
Build 115
Jun 1, 2026
Fix
Lobby pull-to-refresh no longer fires unused activity feed fetch — Removed the orphaned useActivityFeed hook from the Lobby. The ActivityFeedSection component was never rendered, so each pull-to-refresh was firing a Helius API call for data that was never displayed.
Fix
Shop text now uses theme font tokensShopHeader, CardPackSection, UpgradesSection, and ConnectWalletSheet all had inline Montserrat-Bold / Montserrat-Regular strings. Now use t.fUI / t.fUIReg theme tokens.
v1.5.0
Build 114
Jun 1, 2026
Fix
Riptide lives sync with display animation — Riptide lives and danger cell highlights now use displayIdx (the client animation counter) to match timerMarks, ensuring lives decrease in sync with the ball reveal animation instead of computing from the raw on-chain count.
Improve
Deduplicated TLD parser instanceutils/friends.ts was creating its own TldParser instance instead of using the shared one. All .skr domain lookups now share a single cached instance.
v1.5.0
Build 113
Jun 1, 2026
Fix
Riptide lives and danger mask (critical) — Riptide mode was comparing raw 0-based ball sequence indices against 1-based card numbers. Lives always showed 3 and the danger cell highlights never lit up. Fixed by converting ball indices to 1-based numbers before comparing with card values.
Fix
Double ball-draw SFX removed — Each called ball was playing the draw sound twice (once in useBallDraw, once in the game screen effect). Removed the duplicate call from the game screen.
Fix
Lucky Aura auto-activate on game entry — The activation effect ran before AsyncStorage loaded the charge count, so Lucky Aura never auto-started. Fixed with correct reactive deps and a one-shot guard.
Fix
Profile not refreshed after card pack purchaseuseBuyCardPack invalidated the wrong React Query key. Profile card count now refreshes immediately after buying packs.
v1.5.0
Build 112
Jun 1, 2026
Fix
Double ball-draw SFX — Each ball was triggering the draw sound twice: once in useBallDraw (account subscription) and once in the game screen effect. Removed the duplicate. Haptics remain.
Fix
Lucky Aura auto-activate timing — The auto-activate effect ran once on mount before AsyncStorage had loaded the charge count, so Lucky Aura never activated automatically on game entry. Fixed with correct deps ([count, active]) and a one-shot ref guard.
Fix
Profile not refreshing after card pack purchaseuseBuyCardPack was invalidating playerProfile but the actual cache key is ['profile', wallet]. Profile card count now updates immediately after a pack purchase.
Fix
Token symbol fonts on win card and room cardWinShareCard and RoomCard coin symbol text now use the theme font token instead of hardcoded Montserrat-Bold.
v1.5.0
Build 111
Jun 1, 2026
Fix
Room list refresh after join/create — Corrected React Query cache key mismatch: useJoinRoom and useCreateRoom were invalidating rooms but the actual cache key is allRooms. The room list now updates immediately after joining or creating a room.
v1.5.0
Build 110
Jun 1, 2026
Fix
Room list cache invalidation — After joining or creating a room, the room list now immediately reflects the updated state. Previously useJoinRoom and useCreateRoom invalidated the wrong React Query key (rooms vs the actual allRooms key), so the list only refreshed after the 10-second auto-poll interval.
Fix
PowerUpBar shell count — In-game PowerUpBar now reads the player's real on-chain shell balance instead of a hardcoded 0, so the "Buy · 50 🐚" affordability label is accurate.
Fix
Game screen bingo count — Players panel no longer shows "0 bingos" hardcoded. Displays the actual winner count once the first bingo is claimed.
Fix
Spectator TideMeter layout — The tide progress bar was rendering inline between the header and scroll content (18px wide column mid-screen). Moved to an absolute right-edge overlay, matching the game screen.
Fix
Shells Roadmap earn row — "Win Daily Challenge" row was incorrectly showing +500 shells (the 3-star max) instead of +50 shells (the completion reward).
v1.5.0
Build 109
Jun 1, 2026
Fix
Onboarding navigation after wallet connect — After approving MWA in Seed Vault during onboarding, the app now automatically navigates to the main lobby. Previously the user stayed stuck on the onboarding screen and had to manually press "Browse First" to proceed.
Fix
Helius RPC active in build — EXPO_PUBLIC_HELIUS_API_KEY was missing from the build environment, causing the app to fall back to the public Solana RPC which blocks getProgramAccounts. Rooms now load reliably. All on-chain reads use Helius mainnet.
Improve
Native font embedding — Cinzel-Bold and all Montserrat variants (Regular, SemiBold, Bold, ExtraBold) added to the expo-font plugin so they are bundled as native Android assets, eliminating cold-start font flash.
v1.5.0
Build 108
May 31, 2026
Fix
Leaderboard N+1 RPC fix (M-13) — Lifted SKR name resolution out of individual player rows into a single bulk query in the parent. Eliminates 50+ simultaneous RPC calls per leaderboard render.
Fix
Challenge filter efficiency (M-11) — useChallenge now uses memcmp-filtered program account queries instead of fetching the full challenge list and filtering client-side.
Fix
DailyRankedBanner confirmation (M-14) — Registration confirmation now fires after the transaction resolves, not optimistically before it.
Fix
Onboarding wallet guard (M-8) — connect() is now wrapped in try/catch. If no Solana wallet is installed, users see a clear Alert rather than an empty MWA picker.
Improve
SKR room tooltip (U-L1) — Tapping the "SOON" badge on the SKR room option now shows a "Coming Soon" alert explaining it unlocks after mainnet launch.
v1.5.0
Build 107
May 31, 2026
Improve
Shop theme token cleanup (U-M17) — Replaced hardcoded rgba color literals in shop price rows and upgrade card visuals with theme token hex-alpha references. Shop row backgrounds, coin backgrounds, and the SKR discount badge now adapt automatically to future theme color changes.
Fix
Comprehensive audit pass complete — Final verification across all AUDIT_bugs.md and UIUX_AUDIT_MASTER.md items. All Critical, High, Medium, and Low audit findings have been resolved across builds b104 to b107. Confirmed zero outstanding code-fixable issues from the full audit.
v1.5.0
Build 106
May 31, 2026
Fix
Audio session released on app background (M-10) — Sound effects cache is now fully unloaded when the app moves to background, freeing the Android audio session. Sounds reload cleanly when the app returns to foreground.
Fix
Solo auto-mark null guard (L-8) — A missing null check in the ball sequence iterator could spuriously mark ball #1 if the sequence array was shorter than expected. Fixed with an explicit null guard before each mark.
Fix
Daily Ranked Banner no-flash registration (M-14) — After tapping ENTER in the daily pool, the button no longer flashes back to "ENTER" for 2-3 seconds while the on-chain confirmation propagates. Optimistic state holds the registered UI immediately.
Fix
Onboarding double-tap race fixed (L-2) — Fast tapping NEXT during the slide transition could corrupt the animation state. A transitioning guard now blocks new slide requests until the current animation fully completes.
Improve
Shells Roadmap: loading state + contrast + earn rows (U-M4, U-M5, U-M15) — A spinner now appears while shell data loads instead of showing 0. Low-contrast tier colors (Silver) updated to theme-adaptive tokens. "Win Daily Challenge: +500 shells" added to the earn section.
Improve
Profile balance loading state (U-M10) — SOL, USDC, and SKR balance cells now show "---" while the token balances query is in flight instead of displaying 0.
Improve
Tide Pool uses separate RNG seeds (M-12) — Card layout and ball draw sequence now use distinct seeds, eliminating the correlation that made practice games predictable.
Improve
Skeleton shimmer speed + theme tokens (U-L3, U-M6, U-L5) — Skeleton shimmer cycle reduced from 1400ms to 800ms for a modern feel. Room card avatar colors and featured badge now use theme tokens instead of hardcoded hex values.
Fix
Type safety: HeliusMyStats rename (L-11) — useMyHeliusStats now exports its stats type as HeliusMyStats, resolving a name collision with the differently-shaped MyStats from useMyStats.
v1.5.0
Build 105
May 31, 2026
New
Win celebration confetti — A 24-particle confetti burst fires the moment BINGO is claimed in multiplayer. Particles spread outward from screen center using trop-gold palette colors, then fade out. Built entirely with React Native's Animated API, no third-party package.
New
Tide Pool practice mode now reachable — Added a "Tide Pool β€” Free Practice" entry card to the Solo tab. Tapping it routes to the practice mode screen. No entry fee, no wallet required.
Fix
Wallet credential protection (H-8) — Credentials (auth token, stored public key) are no longer deleted when a background reauthorize call fails. Previously any reauth error wiped the session; now only an explicit Disconnect action clears credentials.
Fix
Connect retry race condition (H-9) — The wallet connect() function previously retried by calling itself recursively, creating a window where the connecting state briefly dropped and a second tap could start a parallel connection attempt. Replaced with a 3-attempt counted loop that keeps the guard active for the full retry sequence.
Fix
Solo VRF timeout messaging (H-7) — Added an explanatory subtext below the back button when a solo VRF session times out: "Your session timed out. Contact support if funds were deducted." Prevents user confusion about the session state.
Fix
Loading skeleton for bingo card (U-H3) — While the PlayerTicket account loads after joining, the card area now shows a "Loading your card..." label beneath the skeleton grid instead of 25 cells showing "0".
Fix
Shells Roadmap: fonts and genesis flag (U-H1, U-C2) — Every text element in the Shells Roadmap screen now has explicit font styling (VT323 for titles, Press Start 2P for tier labels, system mono for counts). Genesis holder flag was hardcoded false; now reads live from wallet identity, applying the correct 1.5x shell multiplier for SGT holders.
Fix
Profile PublicKey crash guard (H-12) — new PublicKey() is now wrapped in a useMemo with null check and try/catch, preventing an unhandled exception if the stored address is null or malformed.
v1.5.0
Build 104
May 31, 2026
New
On-chain player profile stats — PlayerProfile PDA expanded from 48 to 111 bytes with games_played, games_won, sol_wagered, shells, win_streak, best_streak, solo_played, and solo_won fields. Stats are now written on-chain by join_room, claim_bingo, and settle_solo. New players get a profile created automatically on their first action (init_if_needed).
New
Leaderboard rebuilt from profiles — Both the Players and Season leaderboards now read from playerProfile.all() instead of scanning every PlayerTicket. One RPC call instead of O(n tickets). Shells are stored on-chain as raw values; the SGT 1.5x multiplier is applied at display time.
New
Profile screen: on-chain stats priority — Wins, played, win streak, best streak, and shells now prefer on-chain profile data. Helius and AsyncStorage act as legacy fallbacks for accounts with pre-v1.6 history. A one-time migration banner explains the transition.
New
migrate_profile instruction — Players with pre-v1.6 profiles (48 bytes) can call migrate_profile to realloc their account to 111 bytes. Existing fields (owner, cards_owned, bump) are preserved; new stat fields zero-initialize.
Improve
Live profile refresh after game actions — join_room, claim_bingo, and settle_solo now invalidate the profile query cache so the profile tab reflects updated stats immediately after each action.
Improve
Devnet program upgrade — Program 47M2uL deployed with new instruction set (init_profile, migrate_profile) and expanded account layouts.