Repository navigation
feat(courses): pay for the club in TON on the site, any language - #1638
Conversation
The render now answers the checkout with ton.on and the amount at the current TON rate (gHashTag/999-multibots-telegraf#4005). The gate shows one email field with "Pay N TON" for every reader (next to roubles for Russian readers); after the press it shows amount, address and comment to copy and a ton:// wallet button, keeps the order in the address and opens the course itself once the payment arrives. An expired order says so. Only TON, never $TRI (FACTS.md s.6). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary by t27-beesChecked by the t27 compilert27c parse, parse-complete and typecheck on each changed .t27 file at
Read by the modelWorth a look
Read: 6 files, +242 -36, the whole diff. Head |
What
Pay for the club in TON on t27.ai, any language, no card and no Telegram. Built on the render API from gHashTag/999-multibots-telegraf#4005 (merged).
{ "version": 1, "head_sha": "6e6c6df22bcccbdac80f30a900a2755f1336279e", "summary": "Readers in any language can now pay for the club in TON on t27.ai, without a card or Telegram. The gate shows one email field with a Pay N TON button, then the amount, address and comment to copy and a wallet button, and opens the course by itself once the render sees the payment. Built against the render API merged in gHashTag/999-multibots-telegraf#4005.", "changes": [ "src/lib/courseLadder.ts: checkoutOffer reads ton.on and the TON amount; startTonCheckout posts pay ton; readOrder understands TON transfers and expired orders; only ton://transfer links are accepted", "src/pages/Course.tsx: PayForm with one email and rouble and/or TON buttons; TonWait shows amount, address, comment with copy buttons and a wallet button; the order poll waits up to 75 minutes for TON and reports expiry", "specs/ladder/course-ladder.t27 + i18n/course-ladder.ru.json: twelve TON words; PAID_LATER now only says card payment in dollars is not built", "src/pages/Course.css: layout of the TON rows" ], "tests": [ { "command": "npm run check:course-ladder && npm run test:course-ladder && npm run check:course-pages && npm run check:aria", "result": "61 words in 2 languages up to date; 5 tests pass; pages and ARIA references clean", "status": "passed", "evidence": "local run in apps/website on head 6e6c6df22 after regenerating the words" }, { "command": "npx vite build", "result": "built in 18.67s with no errors", "status": "passed", "evidence": "local vite build in apps/website on head 6e6c6df22" }, { "command": "browser on vite dev with the render answers mocked: three courses open, fourth course, pay in TON", "result": "form, transfer details, ton:// link, order in the address, then key saved and Welcome to the club after the mocked payment", "status": "passed", "evidence": "BrowserOS neo check against the dev server with window.fetch mocked for the render" } ], "limitations": [ "No real TON payment was made; TON stays off on the site until TON_WALLET_ADDRESS and SESSION_SIGNING_KEY are set on the render service.", "Whether Tonkeeper and Telegram Wallet open the ton://transfer link on every platform was not tested." ], "tags": [ "courses", "payments", "ton", "ux" ], "blog": { "title": "Paying for the club in TON, right on the course page", "summary": "Any reader can now pay for the club in TON from any wallet on t27.ai, and the course opens itself when the payment lands.", "outline": [ "Until now a reader outside Russia could only pay for the club in Telegram Stars inside the bot, which cost us every reader without Telegram.", "The course gate now shows one email field with a Pay in TON button for every language, next to roubles for readers who use Russian.", "After the press the page shows the exact amount, the address and a short comment, each one press to copy, and a button that opens a wallet.", "The order lives in the page address, so a reload keeps waiting, and the course opens by itself as soon as the render sees the transfer on chain.", "Only TON is accepted and the project token is never part of the checkout, because the company facts say that token is never sold." ] } }🤖 Generated with Claude Code