A motion-controlled multiplayer fishing game with ENS-subdomain fishes!
In recent years, fishing arcade machines have become increasingly popular in Malaysia. Every time we visit an arcade, the digital fishing pond machines are packed with people. These machines place a large digital pond in the center, surrounded by physical mock fishing rods that let players cast and reel as if they were fishing in real life. This immersive interaction reminded us of Nintendo’s Joy-Con controllers, which enable motion-based gameplay through built-in gyroscopes and accelerometers. Since modern mobile phones contain the same sensors, we saw an opportunity to use the phone itself as a motion controller for a fishing game.
We also noticed two shortcomings of traditional fishing arcade games: players do not truly own the fish they catch, and even rare fish provide no lasting rewards or value. This inspired us to rethink the experience through an on-chain lens.
ChainFish reimagines the fishing game by bringing the entire experience on-chain. Players join a shared virtual pond and control the game using motion gestures from their smartphone. Every fish in the pond is an on-chain asset: when caught, it is minted as an NFT and transferred to the player’s wallet. Each fish receives its own ENS subdomain, storing its name, description, stats, appearance, and identity entirely on-chain. Every fish also has its own wallet containing a randomly allocated USDC prize pool that the catcher can claim. Since each fish has a unique ENS identity, players can transfer ownership and track the full lifecycle of every fish. All fish are generated through an AI pipeline that assigns their names, lore, rarity, prize pool, and ENS metadata.
Even multiplayer state synchronization is “on-chain-inspired.” Traditional multiplayer games rely on a central authoritative server that processes inputs and broadcasts state updates, creating latency, bottlenecks, and ongoing backend costs. ChainFish uses Multisynq, a decentralized event-ordering network that removes the need for a central server. Each player runs deterministic game logic locally, while Multisynq orders inputs so all clients progress the game state identically. This event log effectively becomes a shared source of truth—similar to blockchain consensus—resulting in lower bandwidth, near-zero perceived latency, no single point of failure, and a fully decentralized approach to synchronizing multiplayer gameplay.
For fish generation, we run an AI-driven agent pipeline that constructs each fish as a fully on-chain identity. The pipeline first selects a species at random and retrieves a corresponding avatar template. It then generates a unique name, descriptive lore, rarity attributes, and a prize-pool value. Based on this value, the system creates a dedicated prize wallet for the fish and funds it with randomized USDC rewards. Once the fish’s attributes are ready, we create its ENS subdomain under our parent domain chainfish.eth. We do this by calling setSubnodeRecord on the ENS NameWrapper contract, specifying the parent node, the fish’s label, the owner, the resolver, and the appropriate Fuses and expiry values. The NameWrapper returns the computed node hash for the new subdomain. Using this node, we then call the resolver’s setRecord or record-specific setters (e.g., setText, setAddr, setContenthash) to store the fish’s avatar reference, descriptive metadata, and prize-wallet address directly on-chain. By running this generation pipeline in a loop, we can populate an entire pond with a complete set of fish identities—each represented as an ENS-wrapped subdomain with deterministic naming, immutable metadata, and verifiable on-chain records. This approach guarantees that every fish is a uniquely generated, ownable on-chain asset with its full identity anchored in ENS.
ChainFish leverages Multisynq to create and synchronize virtual fishing sessions for the pond. When a new session is generated, the game deploys a deterministic game state that includes all the AI-generated fish identities and their positions. Players can join the session by connecting their wallet and scanning a session-specific QR code, which registers them as participants. Multisynq then orders all player inputs—such as casting, reeling, and bucket actions—into a globally consistent event log. Each client runs the same deterministic game logic locally, consuming the ordered events to update the session state in real time. This ensures that all participants see the same evolving pond, all interactions are synchronized without a central server.
All of fisher characters and rods are modeled in Blender, the pond and environment in MagicaVoxel, and Three.js handles rendering and interactions, including motion controls, physics, and real-time multiplayer updates.

