438b27ea3b
Contingency tool: if the official RM Circle dApp ever goes down, positions can still be created/upgraded straight from the member's own wallet. Vanilla JS talks only to window.ethereum (CSP-safe, no external libs), builds register() [0x30de37e4, sponsorId+tier, value=base*1.05] and upgrade() [0xd55ec697, value=next-level cost] calls decoded from live txs, reads prices via getAllCosts() and position via getMember(address). Page lives outside public/ and is served only through a getSession-gated route, so it's admin-only. The contract is public and immutable, so this cements a company-domain-independent path to enroll. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>