尚未检测到更新。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.