A small top-down farming game that shows how Enjin blockchain features fit into a real game loop. You log into a managed wallet, earn on-chain tokens by playing, see them in an in-game backpack, and burn or send them to another wallet — all driven by ordinary gameplay rather than a separate "wallet app".
It's built in Godot 4 and talks to the Enjin Platform sample game server over plain HTTP. The server owns a managed daemon wallet and submits the on-chain transactions, so the game itself only makes simple REST calls.
- Managed-wallet login — register/login with an email + password; the server returns a session token tied to a wallet the player never has to manage directly.
- Minting from gameplay — tilling soil occasionally turns up a collectible (a gold coin or a gem). Picking it up mints that token to your wallet on-chain, so a normal game action produces a real blockchain asset.
- Reading the wallet — the backpack lists the tokens your wallet actually holds, fetched live from the chain.
- Melting & transferring — burn a token, or send it to any other wallet address, straight from the backpack.
- A collection of token types — the game's collectibles (
gem_green,gold_coin,gold_coin_blue) belong to one on-chain collection; you stamp your server's collection id onto them once so the wallet view lines up.
Everything blockchain-related is optional: with no server running, the game is fully playable and the wallet features simply no-op.
- Godot 4.4+ (standard build; no .NET / Mono required).
- The Enjin Platform sample game server
(
enjin/platform-sample-game-server) running onhttp://localhost:3000(its default).
Follow the setup instructions in the server repository. On first run it creates
a managed daemon wallet and a Collection on-chain, persists them, and exposes
the collection id at GET /api/setup/collection-id.
godot4 --editor .(Or "Import" the folder from Godot's Project Manager.)
The three collectible definitions — resources/items/gem_green.tres,
gold_coin.tres, and gold_coin_blue.tres — ship with a placeholder
collection id (-1). Each needs your server's collection id before your
wallet's tokens line up in the backpack. Set it one of two ways:
Automatic (recommended). With the server running:
- Project → Tools → Stamp Collection ID onto EnjinItem Assets.
- Confirm the server URL (default
http://localhost:3000). - The tool reads
GET /api/setup/collection-idand writes it onto all three token assets.
Manual. Select each of the three .tres files in the FileSystem dock and
set the fields in the Inspector:
- Collection Id — your server's collection id (from
GET /api/setup/collection-id, or the server'sstate.json). Use the same value on all three. - Token Id — the token's id within that collection. The demo uses
1= Gold Coin,2= Gold Coin (Blue),3= Green Gem. Leave these unless your collection uses different ids; whatever you set here is the id the game mints / melts / transfers for that collectible.
You can also edit the collection_id = "…" and token_id = "…" lines in the
.tres files directly — they're plain text.
Run the project (F5). The flow is: loader → main menu (register/login) → farm.
| Input | Action |
|---|---|
| WASD / arrows | Move |
| Mouse + left click | Use the equipped item on the targeted tile / interact |
| Q / E or mouse wheel | Cycle the equipped item |
| Click a hotbar slot | Equip that slot |
| B (or the backpack icon, top-right) | Open the blockchain backpack |
| Click the market stall / warehouse | Open the market / warehouse panel |
| Menu button (top-right) | Settings (resolution, fullscreen, volume, login, quit) |
| Weather icons (under the clock) | Toggle sun / rain / thunder |
| F5 / F9 | Save / load (user://save.sav) |
| Esc | Close the open panel |
- Log in. Use the register/login form on the main menu (or the Menu → Settings panel in-game). The server registers-or-logs-in and hands back a session token; the game stores it and fetches your wallet.
- Earn a token. Equip the hoe and till soil. Tilling has a chance to reveal a coin or gem in the world — click it (or walk over it) to pick it up, which mints that token to your managed wallet.
- Check your wallet. Press B (or the backpack icon, top-right). The backpack reads your wallet's token balances from the chain and lists them.
- Melt or transfer. From the backpack, burn a token (melt) or paste a recipient wallet address and send it (transfer).
On-chain mint/melt/transfer wait for finalization server-side and can take 10–20+ seconds; the backpack's status line tells you while it refreshes.
The rest of the loop is ordinary farming: water planted crops with the can (crops only grow while watered), harvest with the basket, then sell produce and buy seeds at the market stall or stash/retrieve items at the warehouse. Walk into the house door to go inside.
If you're here to see how a game calls Enjin, these are the files to read:
| File | Role |
|---|---|
scripts/enjin/api/enjin_api_service.gd |
Thin REST client — one method per server endpoint |
scripts/enjin/core/enjin_manager.gd |
Session/auth state, wallet cache, mint/melt/transfer, the till-time token reveal |
scripts/enjin/data/ |
Plain data models for wallet/token responses |
scenes/ui/backpack_ui.tscn + scripts/enjin/ui/ |
The backpack: wallet token list with melt/transfer controls |
scenes/enjin/enjin_token.tscn |
The world pickup that triggers a mint |
resources/items/{gem_green,gold_coin,gold_coin_blue}.tres |
The token definitions (collection id stamped by the editor tool) |
addons/enjin_editor/ |
The "Stamp Collection ID" editor tool |
| Method | Path | Auth | Purpose |
|---|---|---|---|
| GET | /api/auth/health-check |
none | Liveness ping |
| POST | /api/auth/register |
none | Register-or-login; returns { token, email, wallet } |
| POST | /api/token/mint |
bearer | { tokenId, amount } |
| POST | /api/token/melt |
bearer | { tokenId, amount } |
| POST | /api/token/transfer |
bearer | { tokenId, amount, recipient } |
| GET | /api/wallet/get-tokens |
bearer | { account, tokenAccounts[] } |
| GET | /api/setup/collection-id |
none | Used by the editor tool |
Two harnesses exercise the server without playing the game:
scenes/debug_enjin.tscn— a button per REST endpoint.smoke/game_server/game_server_smoke.tscn— a scripted run through health → login → mint → melt → transfer with wallet dumps. Copysmoke_config.example.tres→smoke_config.tres(gitignored) and fill in credentials, or pass env vars. Headless / CI:
SMOKE_EMAIL=player@example.com SMOKE_PASSWORD=secret \
godot4 --headless --path . smoke/game_server/game_server_smoke.tscn -- --quit-after-smoke
echo $? # 0 = all steps passedexport_presets.cfg ships macOS / Windows / Linux presets (GL Compatibility
renderer, safe everywhere). Install export templates once via Editor → Manage
Export Templates, then e.g.:
godot4 --headless --path . --export-release "Linux" build/linux/platform-sample-game.x86_64build/ and export_credentials.cfg are gitignored, and the populated smoke
config is excluded from exports.