/* RM Circle — direct on-chain enrollment (contingency tool). Talks ONLY to the injected wallet provider (window.ethereum), so it needs no external libraries and no network of its own — CSP-safe (connect-src 'self'). It builds transactions to the RM Circle contract that the USER signs and pays; this page has zero custody and zero authority. If msg.value is ever wrong the contract simply reverts and the user keeps their POL (minus trivial gas). */ (function(){ 'use strict'; var CONTRACT='0x33bdaeefd6d17d80ae53816c916dfb26c4fb2daf'; var POLYGON_HEX='0x89'; // 137 // function selectors (decoded from live transactions) var SEL_REGISTER='0x30de37e4'; // register(uint48 sponsorId, uint8 tier) payable var SEL_UPGRADE ='0xd55ec697'; // upgrade() payable var SEL_GETMEMBER='0x2ada2596';// getMember(address) view var SEL_GETCOSTS='0x735f87b9'; // getAllCosts() view -> 4x uint256[8] (reg std, reg prem, up std, up prem) var T_REGISTERED='0xe4a74887d749eb048f14bfef37b204477f3a5ff67055908b7c8cc62c202aef17'; // MemberRegistered(uint48 id,...) var T_UPGRADED='0xc0b79a9e133d4dcbb1a606a57591d98dce93c7d5c86197a5caae22c4a1480049'; // MemberUpgraded(uint48 id,...) var LEVELS=['','Scintilla','Ascensus','Fabrica','Culmen','Apex','Fastigium','Vertex','Corona']; var $=function(id){return document.getElementById(id);}; var eth=window.ethereum; var account=null, costs=null; function log(msg,kind){var b=$('log');var d=document.createElement('div');d.className='dj-log '+(kind||'');d.innerHTML=msg;b.appendChild(d);b.scrollTop=b.scrollHeight;} function word(n){return BigInt(n).toString(16).padStart(64,'0');} // uint -> 32-byte hex word function addrWord(a){return a.toLowerCase().replace(/^0x/,'').padStart(64,'0');} function polStr(wei){return (Number(wei)/1e18).toFixed(4);} function hexWei(wei){return '0x'+BigInt(wei).toString(16);} async function req(method,params){ if(!eth) throw new Error('No wallet found'); return await eth.request({method:method,params:params||[]}); } async function ethCall(data){ return await req('eth_call',[{to:CONTRACT,data:data},'latest']); } // ---- reads (via the wallet's own RPC) ---- async function loadCosts(){ var r=await ethCall(SEL_GETCOSTS); var d=r.slice(2), w=[]; for(var i=0;i (level '+pos.level+'/8, '+(pos.tier===2?'Premium':'Standard')+' tier, '+pos.directs+'/2 directs).'; if(pos.level<8){ $('upBox').style.display='block'; $('upNext').textContent=LEVELS[pos.level+1]; $('upCost').textContent=polStr(upValue(pos.tier,pos.level))+' POL'; $('upgradeBtn').dataset.tier=pos.tier; $('upgradeBtn').dataset.level=pos.level; } else $('upInfo').innerHTML='Already at the top level (Corona).'; log('Connected. This wallet is registered — Upgrade is available; Join a new position would need a fresh wallet.','ok'); } else { log('Connected. This wallet has no position yet — you can Register a new position below.','ok'); } }catch(e){ log('Connect failed: '+(e.message||e),'err'); } } async function doRegister(){ try{ var sponsor=($('sponsorId').value||'').trim(); if(!/^\d{1,15}$/.test(sponsor)){ log('Enter a valid numeric sponsor ID first.','err'); return; } var tier=$('tier').value==='1'?1:2; await ensurePolygon(); var val=regValue(tier); var override=($('customPol').value||'').trim(); if(override){ if(!/^\d+(\.\d+)?$/.test(override)){log('Custom amount must be a number.','err');return;} val=BigInt(Math.round(parseFloat(override)*1e6))*(10n**12n); } var data=SEL_REGISTER+word(sponsor)+word(tier); log('Sending REGISTER — sponsor #'+sponsor+', '+(tier===2?'Premium':'Standard')+', paying '+polStr(val)+' POL. Confirm in your wallet…'); var tx=await req('eth_sendTransaction',[{from:account,to:CONTRACT,value:hexWei(val),data:data}]); log('Submitted: '+tx.slice(0,18)+'… — waiting for confirmation…','ok'); var rc=await waitReceipt(tx); if(!rc){ log('Still pending after a few minutes — your new ID will appear on Polygonscan once it mines.',''); return; } if(rc.status==='0x0'){ log('⚠️ Reverted on-chain — no position created; your POL was returned (minus gas). Re-check the sponsor ID and amount.','err'); return; } refreshBalance(); var newId=receiptEventId(rc,T_REGISTERED); if(newId){ showResult('#'+newId,'Your new position under sponsor #'+sponsor+' is live. Save this ID.',newId); log('🎉 Confirmed — your new position is #'+newId+'.','ok'); } else log('Confirmed on-chain, but could not read the ID from the receipt — check the tx on Polygonscan.','ok'); }catch(e){ log('Register failed / rejected: '+(e.message||e),'err'); } } async function doUpgrade(){ try{ await ensurePolygon(); var tier=parseInt($('upgradeBtn').dataset.tier,10), level=parseInt($('upgradeBtn').dataset.level,10); var val=upValue(tier,level); var override=($('customPol').value||'').trim(); if(override){ if(!/^\d+(\.\d+)?$/.test(override)){log('Custom amount must be a number.','err');return;} val=BigInt(Math.round(parseFloat(override)*1e6))*(10n**12n); } var data=SEL_UPGRADE; log('Sending UPGRADE '+LEVELS[level]+' → '+LEVELS[level+1]+', paying '+polStr(val)+' POL. Confirm in your wallet…'); var tx=await req('eth_sendTransaction',[{from:account,to:CONTRACT,value:hexWei(val),data:data}]); log('Submitted: '+tx.slice(0,18)+'… — waiting for confirmation…','ok'); var rc=await waitReceipt(tx); if(!rc){ log('Still pending — check the tx on Polygonscan.',''); return; } if(rc.status==='0x0'){ log('⚠️ Upgrade reverted — your POL was returned (minus gas).','err'); return; } refreshBalance(); showResult(LEVELS[level+1],'Upgraded to level '+(level+1)+' of 8.'); log('🎉 Confirmed — upgraded to '+LEVELS[level+1]+'.','ok'); }catch(e){ log('Upgrade failed / rejected: '+(e.message||e),'err'); } } document.addEventListener('DOMContentLoaded',function(){ $('connectBtn').addEventListener('click',connect); $('registerBtn').addEventListener('click',doRegister); var ub=$('upgradeBtn'); if(ub) ub.addEventListener('click',doUpgrade); // Update in place on wallet events — do NOT location.reload() here: some wallets // (Trust Wallet in Brave) fire chainChanged on load, and reloading re-arms the // handler → infinite refresh loop that blocks the Connect button. if(eth && eth.on){ eth.on('accountsChanged',function(accs){ account=(accs&&accs[0])||null; if(!account){ $('connected').style.display='none'; $('connectBtn').style.display=''; log('Wallet disconnected.','err'); } else { $('wallet').textContent=account.slice(0,6)+'…'+account.slice(-4); refreshBalance(); } }); eth.on('chainChanged',function(){ if(account) refreshBalance(); }); } if(!eth) log('No wallet detected in this browser. Use MetaMask or Trust Wallet (extension, or the wallet app’s in-app browser).','err'); }); })();