Show a USD equivalent next to Earned below you
Server keeps an hourly-cached POL/USD spot price (CoinGecko, 8s timeout, last-known fallback) and rides it on the member API. The org bar adds a dollar tile with the rate it used; hidden when no price is known. Display-only - never used in on-chain math.
This commit is contained in:
+1
-1
@@ -35,7 +35,7 @@
|
|||||||
{k:['pyramid','ponzi','pyramid scheme','ponzi scheme','mlm','recruiting scheme','is this a scheme'],
|
{k:['pyramid','ponzi','pyramid scheme','ponzi scheme','mlm','recruiting scheme','is this a scheme'],
|
||||||
a:()=>`A pyramid or Ponzi scheme funnels everyone's money to a central company and pays earlier joiners out of later joiners' deposits — and you can't verify any of it. This is the opposite: <strong>no company holds the money</strong>. A public smart contract on Polygon sends each payment person-to-person in the same transaction it arrives, and you can read the code and every payout yourself on-chain — nothing pooled, nothing hidden, rules that can't be changed. It <em>is</em> a team build, so it takes real effort and carries real crypto risk — not a passive investment. But you don't have to trust anyone; verify it at <a href="/contract">rmcircle.team/contract</a>. No income is guaranteed.`},
|
a:()=>`A pyramid or Ponzi scheme funnels everyone's money to a central company and pays earlier joiners out of later joiners' deposits — and you can't verify any of it. This is the opposite: <strong>no company holds the money</strong>. A public smart contract on Polygon sends each payment person-to-person in the same transaction it arrives, and you can read the code and every payout yourself on-chain — nothing pooled, nothing hidden, rules that can't be changed. It <em>is</em> a team build, so it takes real effort and carries real crypto risk — not a passive investment. But you don't have to trust anyone; verify it at <a href="/contract">rmcircle.team/contract</a>. No income is guaranteed.`},
|
||||||
{k:['how many people','team size','organization size','org size','how big is my team','total team','people in my team','members below'],
|
{k:['how many people','team size','organization size','org size','how big is my team','total team','people in my team','members below'],
|
||||||
a:()=>`Open your dashboard at <a href="/my">rmcircle.team/my</a> and look at the top of the "Your team" panel — the organization bar shows your total member count, how many generations deep your team runs, how many positions below you are qualified, and the total POL earned below you. The matrix cards under it break the same numbers down leg by leg (the ⬇ rollup line on each card counts everyone underneath, all the way down).`},
|
a:()=>`Open your dashboard at <a href="/my">rmcircle.team/my</a> and look at the top of the "Your team" panel — the organization bar shows your total member count, how many generations deep your team runs, how many positions below you are qualified, the total POL earned below you, and its approximate US-dollar value at the latest POL price (refreshed about hourly). The matrix cards under it break the same numbers down leg by leg (the ⬇ rollup line on each card counts everyone underneath, all the way down).`},
|
||||||
{k:['wont upgrade',"won't upgrade",'not upgrading','refuses to upgrade','stalled','stuck member','not ready to upgrade','below me wont','waiting on someone','blocked by'],
|
{k:['wont upgrade',"won't upgrade",'not upgrading','refuses to upgrade','stalled','stuck member','not ready to upgrade','below me wont','waiting on someone','blocked by'],
|
||||||
a:()=>`Good news — a member who isn't upgrading never blocks your money. Each person below you pays you separately, once, at one level; nothing waits on pairs or chains. If someone pauses, payments they can't catch simply pass UP to the next ready position (often yours), and everyone below them keeps flowing normally. The only thing on hold is the single payment that person would send at your matching level. Never pressure anyone — upgrades are optional and self-paced, and paused members often return once their own entry rewards stack up and the upgrade funds itself. Your <a href="/my">pipeline panel</a> shows who's actually moving — coach them.`},
|
a:()=>`Good news — a member who isn't upgrading never blocks your money. Each person below you pays you separately, once, at one level; nothing waits on pairs or chains. If someone pauses, payments they can't catch simply pass UP to the next ready position (often yours), and everyone below them keeps flowing normally. The only thing on hold is the single payment that person would send at your matching level. Never pressure anyone — upgrades are optional and self-paced, and paused members often return once their own entry rewards stack up and the upgrade funds itself. Your <a href="/my">pipeline panel</a> shows who's actually moving — coach them.`},
|
||||||
{k:['stops there','stop there','dead end','runs out','run out of people','get their two','get their 2','their own two','only two people','what if my two','cant get their'],
|
{k:['stops there','stop there','dead end','runs out','run out of people','get their two','get their 2','their own two','only two people','what if my two','cant get their'],
|
||||||
|
|||||||
@@ -92,6 +92,7 @@
|
|||||||
`<div class="fact" style="flex:1;min-width:110px"><small>Generations deep</small><strong style="font-size:22px">${gens}</strong></div>`+
|
`<div class="fact" style="flex:1;min-width:110px"><small>Generations deep</small><strong style="font-size:22px">${gens}</strong></div>`+
|
||||||
`<div class="fact" style="flex:1;min-width:110px"><small>Qualified below you</small><strong style="font-size:22px">${q}</strong></div>`+
|
`<div class="fact" style="flex:1;min-width:110px"><small>Qualified below you</small><strong style="font-size:22px">${q}</strong></div>`+
|
||||||
`<div class="fact" style="flex:1;min-width:140px"><small>Earned below you</small><strong style="font-size:22px;color:var(--ok)">${fmt(st.downPol)} POL</strong></div>`+
|
`<div class="fact" style="flex:1;min-width:140px"><small>Earned below you</small><strong style="font-size:22px;color:var(--ok)">${fmt(st.downPol)} POL</strong></div>`+
|
||||||
|
(d.polUsd>0?`<div class="fact" style="flex:1;min-width:140px"><small>≈ US dollars (POL @ $${d.polUsd<0.1?d.polUsd.toFixed(4):d.polUsd.toFixed(2)})</small><strong style="font-size:22px;color:var(--ok)">$${(st.downPol*d.polUsd).toLocaleString(undefined,{maximumFractionDigits:0})}</strong></div>`:'')+
|
||||||
`</div>`;
|
`</div>`;
|
||||||
}
|
}
|
||||||
function renderTree(){
|
function renderTree(){
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ FACTS:
|
|||||||
- MEMBER DASHBOARD & ALERTS: each member has a live dashboard at https://rmcircle.team/my (enter your ID) showing position, team, payments, pipeline (incoming money forming below), a team-depth summary (members per generation below you and which level's upgrade each generation pays you at), a "Coach Your Team" panel (who in YOUR leg needs a nudge — qualified-but-not-upgraded members sitting on entry rewards, members about to miss forming payments, members one direct from qualifying), spillover tags, and qualification badges. Members can turn on opt-in EMAIL ALERTS there (notified when paid, and when they need to upgrade to catch incoming pay). A member's personal invite page to share is https://rmcircle.team/join/<their-id>.
|
- MEMBER DASHBOARD & ALERTS: each member has a live dashboard at https://rmcircle.team/my (enter your ID) showing position, team, payments, pipeline (incoming money forming below), a team-depth summary (members per generation below you and which level's upgrade each generation pays you at), a "Coach Your Team" panel (who in YOUR leg needs a nudge — qualified-but-not-upgraded members sitting on entry rewards, members about to miss forming payments, members one direct from qualifying), spillover tags, and qualification badges. Members can turn on opt-in EMAIL ALERTS there (notified when paid, and when they need to upgrade to catch incoming pay). A member's personal invite page to share is https://rmcircle.team/join/<their-id>.
|
||||||
- RESILIENCE ("what if the creators disappear / owner loses keys / it falls apart over time"): the contract is autonomous and immutable — NO admin action, heartbeat, or living operator is required for joins, upgrades, matrix placement, or payouts; there is no pause switch and no expiry. Verified on-chain that the founder, development, and fee-receiver wallets are ordinary wallets (EOAs), NOT smart contracts — an ordinary wallet always accepts incoming POL even if its key is lost forever, so a dead or abandoned admin wallet cannot block any member payment (only the project's OWN uncollected fee would sit idle). The contract stores no balance (every payment is delivered in the same transaction). If the owner's key were lost, only the four limited admin powers freeze in place; members are unaffected. Details in section 6 of https://rmcircle.team/contract.
|
- RESILIENCE ("what if the creators disappear / owner loses keys / it falls apart over time"): the contract is autonomous and immutable — NO admin action, heartbeat, or living operator is required for joins, upgrades, matrix placement, or payouts; there is no pause switch and no expiry. Verified on-chain that the founder, development, and fee-receiver wallets are ordinary wallets (EOAs), NOT smart contracts — an ordinary wallet always accepts incoming POL even if its key is lost forever, so a dead or abandoned admin wallet cannot block any member payment (only the project's OWN uncollected fee would sit idle). The contract stores no balance (every payment is delivered in the same transaction). If the owner's key were lost, only the four limited admin powers freeze in place; members are unaffected. Details in section 6 of https://rmcircle.team/contract.
|
||||||
- Current team sponsor: ${a ? `ID ${a.id}${c.showSponsorName && a.name ? ` (${a.name})` : ''}, ${a.directs}/2 directs` : 'shown on the start page'}. ${waiting} placement(s) waiting. Placements rotate as positions qualify — always verify on https://rmcircle.team/start right before joining.
|
- Current team sponsor: ${a ? `ID ${a.id}${c.showSponsorName && a.name ? ` (${a.name})` : ''}, ${a.directs}/2 directs` : 'shown on the start page'}. ${waiting} placement(s) waiting. Placements rotate as positions qualify — always verify on https://rmcircle.team/start right before joining.
|
||||||
- Site pages: https://rmcircle.team/ (strategy overview + roadmap + live team stats), https://rmcircle.team/start (current sponsor + join steps), https://rmcircle.team/training (7 videos — team overview, wallet setup, funding, the new connect-wallet join flow on the site, the dApp backup method, how payments work, and a full 14-min Member Dashboard walkthrough — + spillover article), https://rmcircle.team/how-pay-works (the two income streams shown as a pay-flow diagram + Premium/Standard tier comparison), https://rmcircle.team/contract (plain-language security review of the verified smart contract — code can't change, no pooled funds, locked rules, honest list of operator powers), https://rmcircle.team/my (member dashboard — its "Your team" panel opens with an organization bar: total members in your org, generations deep, qualified count below you, and POL earned below you; the matrix under it drills leg by leg), https://rmcircle.team/tools (for existing team members who want to promote — share-ready promo videos (including the “$27” curiosity hook video — 25 ways people burn $27 with nothing to show for it, then the side-hustle flip; it deliberately shows no URL so the poster's invite link in the caption/description carries the credit, and matching $27-angle post copy sits in the Social posts section), copy-paste social posts, short/long email swipes, a downloadable banner kit in every standard size, and an Official RM Circle Media library (13 vertical social videos + 15 graphics from the creators — pair them with your own invite link in the caption); open it from the gold Promo Tools button on your dashboard and every post/swipe arrives pre-personalized with YOUR invite link; to write promos in their own voice, mybrandedvoice.com), https://rmcircle.team/disclaimer (affiliate/earnings/risk disclosures).
|
- Site pages: https://rmcircle.team/ (strategy overview + roadmap + live team stats), https://rmcircle.team/start (current sponsor + join steps), https://rmcircle.team/training (7 videos — team overview, wallet setup, funding, the new connect-wallet join flow on the site, the dApp backup method, how payments work, and a full 14-min Member Dashboard walkthrough — + spillover article), https://rmcircle.team/how-pay-works (the two income streams shown as a pay-flow diagram + Premium/Standard tier comparison), https://rmcircle.team/contract (plain-language security review of the verified smart contract — code can't change, no pooled funds, locked rules, honest list of operator powers), https://rmcircle.team/my (member dashboard — its "Your team" panel opens with an organization bar: total members in your org, generations deep, qualified count below you, POL earned below you, and its approximate USD value at an hourly-cached POL price; the matrix under it drills leg by leg), https://rmcircle.team/tools (for existing team members who want to promote — share-ready promo videos (including the “$27” curiosity hook video — 25 ways people burn $27 with nothing to show for it, then the side-hustle flip; it deliberately shows no URL so the poster's invite link in the caption/description carries the credit, and matching $27-angle post copy sits in the Social posts section), copy-paste social posts, short/long email swipes, a downloadable banner kit in every standard size, and an Official RM Circle Media library (13 vertical social videos + 15 graphics from the creators — pair them with your own invite link in the caption); open it from the gold Promo Tools button on your dashboard and every post/swipe arrives pre-personalized with YOUR invite link; to write promos in their own voice, mybrandedvoice.com), https://rmcircle.team/disclaimer (affiliate/earnings/risk disclosures).
|
||||||
- UPGRADING FROM THE DASHBOARD: a qualified member can upgrade their level directly on their dashboard (rmcircle.team/my/<id>) — an "Upgrade" card appears with the exact next-level cost read live from the contract; they connect the wallet that OWNS the position, confirm one transaction, done. The site never touches the funds (wallet pays the contract directly). If the wallet doesn't cover the cost, the card offers the MoonPay card-buy option. On phones, open the page inside the wallet app's browser.
|
- UPGRADING FROM THE DASHBOARD: a qualified member can upgrade their level directly on their dashboard (rmcircle.team/my/<id>) — an "Upgrade" card appears with the exact next-level cost read live from the contract; they connect the wallet that OWNS the position, confirm one transaction, done. The site never touches the funds (wallet pays the contract directly). If the wallet doesn't cover the cost, the card offers the MoonPay card-buy option. On phones, open the page inside the wallet app's browser.
|
||||||
- MESSAGES (on-site, wallet-verified): every member dashboard has a Messages panel — sign in once with the wallet that owns your position (a free signature, cannot move funds), then message your upline or anyone in your own team, or broadcast to your whole team. Spam-proof by design: messaging only works along your own matrix lines, so strangers can't message you. Unread messages show as a bell on your dashboard. Members are told the team admin can review messages for abuse. No email address needed.
|
- MESSAGES (on-site, wallet-verified): every member dashboard has a Messages panel — sign in once with the wallet that owns your position (a free signature, cannot move funds), then message your upline or anyone in your own team, or broadcast to your whole team. Spam-proof by design: messaging only works along your own matrix lines, so strangers can't message you. Unread messages show as a bell on your dashboard. Members are told the team admin can review messages for abuse. No email address needed.
|
||||||
- BUYING POL WITH A CARD (for people brand new to crypto): the site links to MoonPay (moonpay.com/buy/pol) on the training page, the start page, and automatically on the join page when a connected wallet's balance is short. Guidance to give: choose POL on the POLYGON network, send it to YOUR OWN wallet address, buy about entry + gas (~385 POL). MoonPay is an independent company (merchant of record) — it handles ID verification and charges its own card fee (~4.5%); this site never touches or holds anyone's money. First purchases can take a few minutes to arrive.
|
- BUYING POL WITH A CARD (for people brand new to crypto): the site links to MoonPay (moonpay.com/buy/pol) on the training page, the start page, and automatically on the join page when a connected wallet's balance is short. Guidance to give: choose POL on the POLYGON network, send it to YOUR OWN wallet address, buy about entry + gas (~385 POL). MoonPay is an independent company (merchant of record) — it handles ID verification and charges its own card fee (~4.5%); this site never touches or holds anyone's money. First purchases can take a few minutes to arrive.
|
||||||
@@ -70,6 +70,19 @@ RULES:
|
|||||||
const SUBMISSIONS_FILE = path.join(DATA_DIR, 'submissions.json');
|
const SUBMISSIONS_FILE = path.join(DATA_DIR, 'submissions.json');
|
||||||
if (!fs.existsSync(SUBMISSIONS_FILE)) fs.writeFileSync(SUBMISSIONS_FILE, '[]');
|
if (!fs.existsSync(SUBMISSIONS_FILE)) fs.writeFileSync(SUBMISSIONS_FILE, '[]');
|
||||||
const memberCache = new Map();
|
const memberCache = new Map();
|
||||||
|
const polPrice={usd:0,at:0};
|
||||||
|
async function getPolUsd(){
|
||||||
|
if(polPrice.usd&&Date.now()-polPrice.at<3600000)return polPrice.usd;
|
||||||
|
try{
|
||||||
|
const r=await Promise.race([
|
||||||
|
fetch('https://api.coingecko.com/api/v3/simple/price?ids=polygon-ecosystem-token&vs_currencies=usd').then(x=>x.json()),
|
||||||
|
new Promise((_,rej)=>setTimeout(()=>rej(new Error('price timeout')),8000))
|
||||||
|
]);
|
||||||
|
const usd=Number(r&&r['polygon-ecosystem-token']&&r['polygon-ecosystem-token'].usd);
|
||||||
|
if(usd>0){polPrice.usd=usd;polPrice.at=Date.now();}
|
||||||
|
}catch(e){}
|
||||||
|
return polPrice.usd||0; // 0 = unknown; dashboard simply hides the USD tile
|
||||||
|
}
|
||||||
const lookupHits = new Map();
|
const lookupHits = new Map();
|
||||||
function memberLookupLimited(ip) {
|
function memberLookupLimited(ip) {
|
||||||
const now = Date.now(), rec = lookupHits.get(ip);
|
const now = Date.now(), rec = lookupHits.get(ip);
|
||||||
@@ -450,6 +463,7 @@ async function handleApi(req,res,pathname){
|
|||||||
r.nextStep={kind:'max'};
|
r.nextStep={kind:'max'};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const usd=await getPolUsd(); if(usd>0){r.polUsd=usd;r.polUsdAt=polPrice.at;}
|
||||||
memberCache.set(id,{data:r,ts:Date.now()});
|
memberCache.set(id,{data:r,ts:Date.now()});
|
||||||
if(memberCache.size>500)memberCache.delete(memberCache.keys().next().value);
|
if(memberCache.size>500)memberCache.delete(memberCache.keys().next().value);
|
||||||
return json(res,200,r,{'Cache-Control':'public, max-age=60'});
|
return json(res,200,r,{'Cache-Control':'public, max-age=60'});
|
||||||
|
|||||||
Reference in New Issue
Block a user