SocialPix gate: /from/socialpix bridge page (advertiser copy by default, ?seg=earn), chatbot knows the new page
socialpix.club was being used as a free ad board by posting bots; its signup/onboarding/post flows now redirect here. No legacy credits for these arrivals. Referrer tagging (traffic.js) already covers /from/*. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -319,6 +319,10 @@ const JOIN_ANGLES = {
|
||||
'fw-earn': { t: 'Same daily habit. Real payouts on-chain.', d: 'You viewed ads on Faucet Wave. Here you view ads to earn credits, run your own campaign free, and get paid in POL to your own wallet when your line buys ads. Welcome-back credits waiting.', url: 'https://instantadpay.com/from/faucetwave' },
|
||||
't1-adv': { t: 'Your next ad budget pays you back.', d: 'Tier One Ads closed. InstantAdPay was built for the people who bought ads there: packages from $5, seven formats, every package in your line paid out on Polygon in the same transaction. Welcome-back credits waiting.', url: 'https://instantadpay.com/from/tieroneads?seg=advertiser' },
|
||||
't1-earn': { t: 'Same daily habit. Real payouts on-chain.', d: 'You viewed ads on Tier One Ads. Here you view ads to earn credits, run your own campaign free, and get paid in POL to your own wallet when your line buys ads. Welcome-back credits waiting.', url: 'https://instantadpay.com/from/tieroneads' },
|
||||
// SocialPix (socialpix.club) gate, 2026-09-20: the media-sharing site was being used as a free
|
||||
// ad board; its signup/post flows now land here. Default copy = advertiser (that is why they came).
|
||||
'sp-adv': { t: 'Your ad, seen across a whole network.', d: 'SocialPix no longer takes ad posts. Advertising now runs through InstantAdPay: a free account, your ad in seven formats across every site in the network, and every package in your line paid out on Polygon in the same transaction. Real email required.', url: 'https://instantadpay.com/from/socialpix' },
|
||||
'sp-earn': { t: 'Same feed. Real payouts on-chain.', d: 'SocialPix has moved its advertising to InstantAdPay. View ads to earn credits, run your own campaign free, and get paid in POL to your own wallet when your line buys ads. Join free by email.', url: 'https://instantadpay.com/from/socialpix?seg=earn' },
|
||||
instant: { t: 'Paid before the page reloads.', d: 'A smart contract on Polygon splits every ad package the moment it sells. Same transaction, real wallets, public ledger. Join free by email.' },
|
||||
adspend: { t: 'You were buying ads anyway.', d: 'Here the ad spend in your line pays you, in the same transaction, on a public ledger. Seven formats, packages from $5. Join free.' },
|
||||
free: { t: 'Watch first. Spend never.', d: 'Join free, view a few ads, earn credits, run your first campaign for zero dollars. Every payout public on Polygon.' },
|
||||
@@ -1077,10 +1081,14 @@ const server = http.createServer(async (req, res) => {
|
||||
// with brand copy, NO sponsor (the sponsor cookie is cleared so they land in the holding
|
||||
// tank for adoption), the angle remembered so the welcome-back grant fires at signup, and
|
||||
// a forced first-touch source so link stats / admin can see the legacy arrivals.
|
||||
m = /^\/from\/(faucetwave|tieroneads)$/.exec(p);
|
||||
m = /^\/from\/(faucetwave|tieroneads|socialpix)$/.exec(p);
|
||||
if (m && (req.method === 'GET' || req.method === 'HEAD')) {
|
||||
const brand = m[1];
|
||||
const key = (brand === 'faucetwave' ? 'fw' : 't1') + (String(u.searchParams.get('seg') || '').toLowerCase().startsWith('adv') ? '-adv' : '-earn');
|
||||
// SocialPix arrivals came to POST ads, so their default copy is the advertiser one (?seg=earn flips it);
|
||||
// the closed EvolutionScript brands default to the earner copy (?seg=advertiser flips it).
|
||||
const seg = String(u.searchParams.get('seg') || '').toLowerCase();
|
||||
const prefix = { faucetwave: 'fw', tieroneads: 't1', socialpix: 'sp' }[brand];
|
||||
const key = prefix + (brand === 'socialpix' ? (seg.startsWith('earn') ? '-earn' : '-adv') : (seg.startsWith('adv') ? '-adv' : '-earn'));
|
||||
const cookieTail = `; Path=/; SameSite=Lax; Max-Age=${30 * 24 * 3600}${IS_PROD ? '; Secure' : ''}`;
|
||||
const src = String(u.searchParams.get('src') || '').toLowerCase().replace(/[^a-z0-9.\-]/g, '').slice(0, 40); // e.g. the old domain's splash page
|
||||
const set = ['iap.sponsor=; Path=/; SameSite=Lax; Max-Age=0' + (IS_PROD ? '; Secure' : ''), 'iap.angle=' + key + cookieTail, 'iap.ref=' + encodeURIComponent('legacy:' + brand + (src ? ':' + src : '')) + cookieTail];
|
||||
@@ -2256,7 +2264,7 @@ const server = http.createServer(async (req, res) => {
|
||||
let items = [];
|
||||
try { const j = JSON.parse(fs.readFileSync(path.join(DATA_DIR, 'training.json'), 'utf8')); if (Array.isArray(j)) items = j; } catch (e) {}
|
||||
// a card with feature:'pipeline' waits for the switch, so the video can be ready before the tab opens (Marty, 2026-09-15)
|
||||
const scT = siteConfig(); const launched = scT.launchAt && Date.now() >= new Date(scT.launchAt).getTime(); // feature:'polhunter' waits for the launch moment (Marty, 2026-09-20)
|
||||
const scT = siteConfig(); const launched = scT.launchAt && Date.now() >= new Date(scT.launchAt).getTime(); // feature:'polhunter' waits for the launch moment (Marty, 2026-09-20)
|
||||
items = items.filter(it => !it.feature || (it.feature === 'pipeline' && pipeline.visible(scT.pipelineMode, s.email, ADMIN_EMAIL)) || (it.feature === 'polhunter' && launched));
|
||||
if (!items.length) items = [{ title: 'Getting started with InstantAdPay',
|
||||
desc: 'How the platform works, how every payout splits on-chain to real wallets, and how to build your line.',
|
||||
@@ -3070,10 +3078,10 @@ const server = http.createServer(async (req, res) => {
|
||||
|
||||
// -- pages (HEAD answered like GET so link previewers and crawlers see 200; Node drops the body)
|
||||
if (req.method === 'GET' || req.method === 'HEAD') {
|
||||
if (p === '/') {
|
||||
// arrived from PolHunter: remember it for 30 days so the dashboard can send them back once a wallet is linked
|
||||
if (u.searchParams.get('from') === 'polhunter') { res.writeHead(302, { Location: '/', 'Set-Cookie': 'iap.return=polhunter; Path=/; SameSite=Lax; Max-Age=' + (30 * 24 * 3600) + (IS_PROD ? '; Secure' : ''), 'Cache-Control': 'no-store' }); return res.end(); }
|
||||
return sendFile(res, path.join(PUBLIC_DIR, 'index.html'));
|
||||
if (p === '/') {
|
||||
// arrived from PolHunter: remember it for 30 days so the dashboard can send them back once a wallet is linked
|
||||
if (u.searchParams.get('from') === 'polhunter') { res.writeHead(302, { Location: '/', 'Set-Cookie': 'iap.return=polhunter; Path=/; SameSite=Lax; Max-Age=' + (30 * 24 * 3600) + (IS_PROD ? '; Secure' : ''), 'Cache-Control': 'no-store' }); return res.end(); }
|
||||
return sendFile(res, path.join(PUBLIC_DIR, 'index.html'));
|
||||
}
|
||||
if (p === '/ledger') return sendFile(res, path.join(PUBLIC_DIR, 'ledger.html'));
|
||||
if (p === '/contract') return sendFile(res, path.join(PUBLIC_DIR, 'contract.html'));
|
||||
|
||||
Reference in New Issue
Block a user