Both verified against contract source today (payout loop: level > levelIndex && 2 directs; one structural skip per depth).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Verified against the exact-match ABI on Sourcify: per-level entry rows on company charts are vestigial contract data with no callable path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Live getAllCosts() numbers: entry 360.58 incl 5% (sponsor 326.24), upgrades double exactly per level, 100% member-to-member. Answers the 'why is entry different from upgrade / is the chart inflated' question with verifiable numbers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Marty: the tear-off designs did not look good next to the artwork handouts. Page renamed Printable Handouts; dashboard link, tools card/nav, chatbot answer, and AI prompt synced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Five full-bleed AI-generated designs (nano-banana-pro) with baked-in stylized headlines matching the banner-kit energy; QR + link + disclaimer now a percentage-scaled DOM overlay (canvas approach removed - it collapsed on mobile and clipped the QR). Lower-right of each artwork kept calm for the QR panel.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces text-heavy card design with eye-catching image backgrounds (pocket/two/phone/graveyard/stop-waiting angles, 1700x1100px, half-sheet 2-per-page format). QR code + link overlaid dynamically via Canvas in bottom-right with semi-dark fade for readability. Print layout: two copies per letter page with cut line between. Visual impact first, clean overlay on top.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phantom exposes its EVM provider at window.phantom.ethereum and does not always
fire EIP-6963, so the picker never saw it. probeInjected() now folds in Phantom
and any window.ethereum.providers[] entries (deduped by identity + name) for
both pick() and list(). Phantom added to the mobile in-app-browser hint and the
dashboard no-wallet message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New shared wallet-notice.js on join-now, my, training: if config.walletNotice
is set, shows an admin-authored heads-up right above every connect/unlock
button; empty string hides it everywhere (one PATCH, no deploy). Placed at the
friction point only, not a sitewide banner, so unaffected wallets/Mini App
users are not told about a warning they will never see.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Mobile users on SafePal/Coinbase/Rabby had no route in — the deep-link help
only offered MetaMask + Trust. Added a wallet-agnostic instruction (open your
wallet app -> Browser/DApp tab -> type the join URL) that works via the
injected provider our EIP-6963 picker already resolves; join-now fills the
sponsor path into the hint. Dashboard no-wallet message made wallet-agnostic
and names SafePal. No guessed SafePal deep-link scheme (unverified).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaced every retire-your-link instruction (8 spots across index, join,
start, my, training FAQ, chat.js core-strategy + qualified + moving-link
answers, and the AI prompt) with the automated doctrine: after 2/2 the same
invite link self-routes each signup to the next position in the leg that
needs a direct; personal effort shifts to coaching your two. Raw-ID dApp
signups on a qualified position stay documented as the bonus path. Video
content already correct (Video 1 rebuild script fixed this framing before
recording; Method lesson scripts never said retire).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New card in the tools objection section: truth (name the product first;
business-in-a-box inventory; wallet-is-the-login members area) + the
ready-to-send casual reply (Lesson 1 free preview, verify-before-you-join
close). AI prompt tools inventory notes the objection bank.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The product now has a lid. Server refuses the gated video FILES without a
wallet-verified member session (the Mini App bridge session counts, so
Telegram members see no locks). Lesson 1, every poster, and all join-funnel
and transparency videos stay public: free preview + trust engine. Training
page renders locked cards with a one-signature unlock (same SIWE flow as
Messages) and a members-unlocked badge. Chatbot: new members-area canned
answer, Method answer notes the preview, AI prompt routing rule now answers
prospects directly instead of sending locked links; bot lesson command notes
the unlock path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
friend-circle-290a3815db.mp4: Marty-only share URL, referenced from no page.
recruitMsg + its Get Started button now read config.recruitCtaUrl (new PATCH
key, default home page) so notification CTAs can point at a proof-first
landing like /my/21. Tweet CTA was already config-driven (value PATCHed).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Each coach card now carries a pre-written, situation-specific teach-forward
message (all four recommendation kinds) sent over the existing wallet-verified
Messages rails: msg-send plus the Telegram bridge. When not signed in, an
inline prompt appears and the page smooth-scrolls to the Messages card.
Chatbot canned answer and AI prompt synced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nav-dash.js on all header pages: a top-right My Dashboard button when the
visitor is known (msg session from wallet sign-in or the Mini App bridge is
authoritative; else the last dashboard opened on the device). Prospects with
no identity never see it.
recordEvent was silently dropping the new engaged + ctb-offer-* events
(whitelist); now recorded per source, with admin funnel tiles for both.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
track.js: on join pages with a ctb1_ clickid, count 30s of VISIBLE time (1s
ticks, pauses when tab hidden), then report engaged once per session.
server.js: relay engaged ctb1_ clickids to the CTB backend per the spec
contract (X-Offer-Secret header, any-200-is-done); light in-process dedupe.
New volume config keys ctbOfferPostbackUrl + ctbOfferSecret (PATCH allowlist).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5 SMS-sized low-pressure messages (general moving link + one per angle video,
each carrying the matching ?v= landing link) with one-tap launchers: sms: body
pre-fill, wa.me text pre-fill, t.me/share with the member''s Mini App invite
(angle-matched), Copy for Messenger/IG. Hrefs rebuilt on personalization.
Chatbot canned answer + AI prompt synced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>