尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Two-outcome prediction pools for friends on BOT Chain: everyone stakes equal BOT, the creator settles, winners split the pot on-chain.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A simple, on-chain way for friends to put BOT behind a two-outcome prediction, settle the result, and split the pot transparently.
Someone asks the group chat "Will Maya finish the 5K on Saturday?". TrueUp turns that into a market with two sides, a fixed stake per person and a deadline. Everyone who joins sends exactly the same amount of native BOT to a smart contract. After the deadline the creator confirms what happened, and the winners each claim an equal share of the pot. If the creator never confirms, everyone takes their stake back.
Live on BOT Chain mainnet as a capped launch: real BOT, at most 1 BOT per person per market, on a contract that hasn't had an independent audit. Only stake what you can afford to lose.
| BOT mainnet (chain 677) | Bohr testnet (chain 968) | |
|---|---|---|
| Contract | 0xf30B37E224B7A6BfdC5ce5CD9f2f2805a9f945bE | 0xc46E080279C5d3637a41d5B30fF8bD0a24FF0B04 |
| Deployed | 2026-10-25, block 27946589 | 2026-10-20, block 27529370 |
| Stake cap | 1 BOT per person | 100 BOT per person |
| Source verified | yes | yes |
Both charge a protocol fee of 0.1% of settled pots (10 bps), with a 5% hard cap in the contract and nothing on refunds.
Friends make small bets all the time, and they settle them on trust and memory: who was in, for how much, who won, who still owes. Someone holds the money, or nobody does and half the group never pays.
TrueUp keeps the friendly part and moves the money part on-chain. The contract holds every stake from the moment someone joins, records who picked which side, and pays out by fixed rules. The shareable link is the whole distribution channel: paste it in Telegram, Discord, WhatsApp or X, and anyone can read the terms before connecting a wallet.
Create (question, two sides, stake, deadline) → share the link → friends pick a side and stake
↓ deadline: entries close
Creator confirms the result (once, within 72 h) → winners claim equal shares of the pot minus 0.1%
or
Nobody confirms within 72 h, or one side is empty → anyone opens refunds → everyone claims their stake back
floor((pot − fee) / winners). The rounding remainder (fewer wei than there are
winners) joins the fee balance, so no wei is ever stuck.contracts/ Solidity + Foundry. One escrow contract: src/TrueUp.sol
web/ Next.js 15, React 19, TypeScript, wagmi + viem. Reads the contract and its events directly.
docs/ FRONTEND.md, the design and interface spec
On-chain is the authority. The contract holds stakes, records positions and outcomes, captures the fee
rate per market, enforces deadlines, settlement and refund rules, and blocks double claims. It emits
MarketCreated, ParticipantJoined, MarketSettled, RefundsOpened, WinningsClaimed, StakeRefunded
and ProtocolFeeWithdrawn for indexing.
The frontend holds no money and no state of its own. It reads markets with getMarket, positions with
positionOf, and history from contract events, scanned in one-million-block windows. A write only shows as
done once its receipt confirms on BOT Chain. There is no backend: an indexer can be added later for speed
without changing the trust model.
Six routes: / home, /markets, /markets/[id] (the link you share), /create, /leaders,
/portfolio.
Requires Node 22+ and, for the contracts, Foundry.
cd web
cp .env.example .env.local # already points at the Bohr testnet deployment
npm install
npm run dev # http://localhost:3000
Use any EVM wallet (MetaMask, Rabby). The app asks to switch to Bohr testnet (chain 968, RPC
https://rpc.bohr.life) before every transaction. Get test BOT from the
faucet.
Development options in web/.env.local, both refused by production builds:
NEXT_PUBLIC_DATA_SOURCE=fixtures fills every screen with sample data for layout work, under a permanent
"Nothing here is on-chain" notice. Transactions are switched off.NEXT_PUBLIC_NETWORK=local runs against a local Anvil node. anvil, then
bash contracts/script/seed-local.sh, deploys the contract and leaves markets in every lifecycle state.cd contracts
forge build
forge test # 35 tests, including 1,000-run fuzzing of payouts and refunds
forge coverage --report summary # 100% of lines and functions in TrueUp.sol
The tests cover exact-stake and duplicate joins, late entries, creator-only one-time settlement, the settlement window, one-sided markets, permissionless timeout refunds, settled markets that can't refund and refunded markets that can't settle, fee capture and the cap, owner-only fee withdrawal, dust, value conservation and a reentrant double-claim attempt. contracts/README.md lists every rule the contract enforces.
Network settings were checked against the BOT Chain quick guide and the live RPCs on 2026-10-20. Check them again before each deploy.
| Network | Chain ID | RPC | Explorer |
|---|---|---|---|
| Bohr testnet | 968 | https://rpc.bohr.life | https://scan.bohr.life |
| BOT mainnet | 677 | https://rpc.botchain.ai | https://scan.botchain.ai |
contracts/.env.example to contracts/.env (git-ignored). Fill in PRIVATE_KEY for a wallet that
only holds test BOT, and OWNER. Or leave the key empty and use a Foundry keystore with --account.cd contracts
forge script script/Deploy.s.sol --rpc-url bohr --broadcast \
--verify --verifier blockscout --verifier-url https://scan.bohr.life/api/
The script refuses any chain other than 968, 677 and a local node.web/.env.local as NEXT_PUBLIC_BOHR_CONTRACT and
NEXT_PUBLIC_DEPLOY_BLOCK, then run node web/scripts/sync-abi.mjs if the contract changed.cd web && npm run build && npm start, or deploy the web/ folder to any Next.js host
with the same environment variables. Testnet and mainnet addresses are kept in separate variables, and
the app never falls back from one network to the other.Trusted: the market creator, to report the true outcome. The contract enforces who may report and when, but it can't know what happened in the real world. A creator can lie. The app says so on the create screen, on every market page and before every stake. Only join markets made by people you trust.
Not trusted, and enforced by the contract instead:
| Risk | Mitigation |
|---|---|
| Creator disappears | After deadline + 72 h, anyone can open refunds; the creator can no longer settle |
| Nobody took the other side | Refundable at the deadline, no fee; settlement is blocked |
| Late entry with a stale countdown | join reverts at or after the deadline, whatever the UI shows |
| Wrong amount | join reverts unless the value equals the stake exactly; nothing is trapped |
| Double claim, double refund | Each position is marked claimed before paying; tested, including reentrancy |
| Changing the result after settlement | Status only moves forward; settled and refunded are final |
| Fee raised on existing markets | The fee rate is captured at creation; changes only affect new markets; 5% cap |
| Owner draining stakes | withdrawFees can only move accruedFees, never escrowed stakes or unclaimed payouts |
| Funds stuck by rounding | The remainder joins the fee balance; fuzz tests check payouts plus fee equal the pot |
| Wrong network | The app checks the chain before every write and asks to switch |
Owner powers: set the fee for new markets (up to 5%), set the maximum stake for new markets, withdraw
accrued fees, and transfer ownership in two steps. The owner can't touch stakes, outcomes or existing
markets. On both networks the owner is the deployer wallet, 0x1727eF2a5622B8559Af818A942dBFd59493e175E, and its key
sits in a local file. Moving ownership to a hardware wallet or multisig is a recommended next step.
Privacy: none, by design. Questions, sides, wallets, stakes and outcomes are public on BOT Chain permanently. Sharing a link in a private chat doesn't make a market private. The create form asks people to keep personal details out of questions.
| Contract written and tested (35 tests) | done |
| Deployed and verified on Bohr testnet | done |
| On-chain end-to-end on Bohr: create, join, settle, claim, one-sided refund, every repeat rejected | done |
| Deployed and verified on BOT mainnet, capped at 1 BOT per person | done |
| All six routes built, reading the live contract | done |
| Browser-wallet click-through on mainnet | next |
| Real-user pilot and feedback | planned |
| Independent security review, legal and policy review | not started |
Photographs on the home page are from the 1904 Olympic tug-of-war competition in St. Louis, public domain, via Wikimedia Commons. Each is linked from the site's footer. Typeface: Switzer by Indian Type Foundry, via Fontshare.