ultratears
Unofficial native Windows port of Tears of the Kingdom 1.4.3 using static recompilation. Builds locally from the player's own extracted game dump; no game files included.
Play casual browser games, rank on checked leaderboards, and claim capped rewards on BOT Chain when a season is funded.
GamesSolidity · TypeScriptGitHub @Dotman-BeiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Klynt is a Web3 gaming hub on BOT Chain: play open-source browser games, rank on server-checked leaderboards, and claim capped rewards from an on-chain vault using signed authorisations.
Taken from the repository README
Loading the full README.
Read the full README ↗Casual browser games on BOT Chain. Play in your browser, rank on checked leaderboards, and claim capped rewards on BOT Chain once a season is funded.
Status: frontend, score service and reward vault built and tested; not yet deployed to BOT Chain
testnet (968). Rewards are off by default. The GGI token is not verified (see Klynt_PRD.md §9),
so the vault is built to pay any approved ERC-20 and is tested with KTP-TEST, testnet points with
no value.
DATABASE_URL. Tables are created on first use..env.example that you need: at least
NEXT_PUBLIC_KLYNT_API=/api and a random KLYNT_SESSION_SECRET; for rewards also
NEXT_PUBLIC_REWARD_VAULT, ATTESTOR_PRIVATE_KEY and REWARDS_ENABLED=true.NEXT_PUBLIC_KLYNT_API the site runs in Practice mode and the API answers 503.Requires Node 22 or newer. No database to install: locally the score service uses PGlite (Postgres compiled to WebAssembly) in .data/pglite; in production it uses DATABASE_URL (Neon).
npm install
cp .env.example .env.local # set KLYNT_SESSION_SECRET for anything beyond local dev
npm run dev # http://localhost:3000
| Command | What it does |
|---|---|
npm run dev | Development server |
npm run build / npm start | Production build and server |
npm test | Unit tests: score rules, sessions, ranking, sign-in |
npm run typecheck | TypeScript |
cd contracts && forge test | Vault tests: replay, expiry, recipients, signers, caps, pauses, admin access, fuzzed caps |
node --experimental-strip-types scripts/check-vault.ts | Server signatures against a deployed vault (see the file's header) |
node scripts/smoke-api.mjs [url] | End-to-end check of the API with a throwaway wallet. It writes test runs to the database it hits, so point it at a dev database only. |
Play page Score service (src/server, src/app/api)
game starts -> POST /api/sessions session ID, server clock starts
game over -> POST /api/sessions/:id/submit
checks: signed-in wallet owns the session, session unused,
length >= game minimum and <= 2 h, score <= ceiling for the length
<- accepted (with rank) or rejected (with the reason)
Leaderboard -> GET /api/leaderboard?game= best accepted score per wallet, ties to the earlier run
Games report scores through public/games/klynt-bridge.js, a same-origin postMessage bridge.
Rules live in src/server/rules.ts (version 1).
After an accepted run, the player can tap Record on BOT Chain. The server signs an EIP-712 record
(POST /api/scores/record) of that run: wallet, season, game, score, run ID and a one-hour expiry. The player
sends it to KlyntScoreboard (contracts/src/KlyntScoreboard.sol) and pays the gas, about 0.002 BOT.
The contract accepts each run once, only from the wallet that played it, keeps every wallet's best score per
game and season, and emits ScoreRecorded. The server marks the run recorded only after it finds that event
in the transaction (POST /api/scores/record/confirm). Nothing is paid out. Set NEXT_PUBLIC_SCOREBOARD
and ATTESTOR_PRIVATE_KEY to switch it on; deploy with forge script script/DeployScoreboard.s.sol.
End-to-end check: scripts/record-run-test.mjs.
accepted run (score >= game threshold, within the daily cap) -> earnings ledger (server)
Rewards page: Claim -> POST /api/rewards/authorize
server bundles unclaimed earnings, capped by the wallet's remaining on-chain cap
and the pool, signs an EIP-712 Claim with the attestor key
-> wallet sends KlyntRewardVault.claim(claim, signature)
vault checks signer, wallet = sender, token, expiry, unused nonce, pool, cap, pauses
-> POST /api/rewards/confirm server finds the Claimed event in the receipt, then records it
The vault (contracts/src/KlyntRewardVault.sol) only transfers tokens it was funded with. It never
mints. The owner can pause one season or everything, rotate or revoke attestor keys, and withdraw
unclaimed funds only after a season's claim window has closed. Ownership moves in two steps and can't
be renounced.
Needs a deployer wallet funded with testnet BOT (faucet.botchain.ai) and a separate attestor key. Keys go in the environment only, never in files in this repo.
cd contracts
export BOT_TESTNET_RPC=https://rpc.bohr.life
export DEPLOYER_PRIVATE_KEY=... # pays gas, becomes the owner
export ATTESTOR_ADDRESS=0x... # address of the server's ATTESTOR_PRIVATE_KEY
export SEASON_BUDGET=10000 # optional: create and fund Season 1 (testnet points)
forge script script/Deploy.s.sol --rpc-url bot_testnet --broadcast
Then set NEXT_PUBLIC_REWARD_VAULT, ATTESTOR_PRIVATE_KEY and REWARDS_ENABLED=true for the app.
Verify the source on the explorer (BOT Scan; confirm its verifier API before relying on
forge verify-contract), then set the matching sign-off flag. The readiness checklist on
/rewards only ticks items that are read from the chain or signed off in config.
viem.verifyMessage). Smart-contract wallets
(ERC-1271) are not supported yet.forge coverage does not run on this Windows setup (it can't resolve OpenZeppelin through
../node_modules); the tests name every revert path instead.NEXT_PUBLIC_ADMIN_WALLETS, but no
admin API exists yet; it must check the signed-in wallet server-side when it is added.| Game | Source | Licence | Klynt changes |
|---|---|---|---|
| Hextris | github.com/Hextris/hextris | GPL-3.0 | Ads, analytics and remote scripts removed; bridge added |
| Tower Blocks | codepen.io/ste-vg/pen/ppLQNW | MIT (CodePen, to confirm) | Old coin API removed; bridge added |
| Astray | github.com/wwwtyro/Astray | Public domain | Texture paths fixed; bridge added |
| Radius Raid | github.com/jackrugile/radius-raid-js13k | MIT | Not integrated yet |
| Coloron | github.com/greghub/coloron | Apache-2.0 | Not integrated yet |
scripts/vendor-games.mjs re-applies the Klynt changes to fresh upstream copies.
docs/FRONTEND.md is the source of truth for the interface.