dffcaa113b8a8fc94521923c49836061cc3e4a20
Marty, 2026-09-16: a purchase must never wait on a sponsor who has not linked a wallet / switched on payouts. /api/sponsor and /me now walk the site's sponsor line upward to the first upline that is activated with payouts on (not on the no-payout list) and the buy proceeds under them; nobody activated -> the catch position (#1). The buyer sees a one-line notice and carries on; admin gets a heads-up. When the position is created on-chain (MemberActivated), sponsorSyncOnEvent re-points the buyer's stored sponsor to whoever was paid (#1 included), so the referral leaves the skipped sponsor's line for good, then sends the pointed notices: the skipped sponsor(s) are told they lost this referral permanently and how to switch on payouts; the sponsor who was paid is told the referral is theirs for good and to coach the one who missed it (teach-forward). Admin lookup: GET /api/admin/sponsor-resolve?ref=. Only a transient chain error still pauses a buy. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
InstantAdPay — site
Membership advertising with immutable on-chain settlement. Zero-dependency Node server (RM Circle pattern): static pages + JSON API + SSE ledger.
Architecture
server.js— http server: pages,/api/*,/join/<id>sponsor links, SSE feedchain.js— contract reader + persistent event indexer (free public RPCs)auth.js— SIWE wallet sign-in (EIP-4361), sessions in the volumeaccounts.js— site-side records only (free members, last-touch sponsor attribution, handles). The CHAIN is the source of truth for money/credits.public/— landing, live ledger, member area; no client libraries
Chain flip (rehearsal → mainnet)
Everything chain-specific lives in data/config.json (volume):
{contract, chainId, chainName, explorer, rpcs, deployBlock}.
Defaults point at the Amoy rehearsal deployment. Launch = deploy the
mainnet contract, wipe accounts.json/sessions.json/chain-index.json,
PATCH /api/admin/chain with the mainnet values, set rehearsal:false via
/api/admin/site. Same code, different config.
Run
PORT=3100 node server.js # DATA_DIR defaults to ./data
Admin API auth: Authorization: Bearer $ADMIN_PASSWORD.
Spec: ../CONTRACT-SPEC.md (v1.0.3-frozen). Contracts: ../contracts/.
Description
Languages
JavaScript
78.6%
HTML
17.1%
CSS
4.2%
Shell
0.1%