Connect the owner wallet to access the admin panel.
All other wallets will be denied.
The connected wallet is not the owner wallet.
This panel is restricted to the owner address only.
Connected:
Prices are stored on-chain in USDC (6 decimals). Enter the dollar amount — the page converts automatically. Changes affect new payments only. Members with price locks are unaffected.
Add a new plan to the on-chain plan registry. Plans created here appear immediately in all plan dropdowns.
Toggle whether purchasing an existing plan requires manual admin approval before
membership activates. Calls the real setPlanRequiresApproval(planId, bool)
on PaymentAdminFacet.
Enter rates as plain percentages — e.g. type 10 for 10%. The page converts to basis points automatically before sending to the contract.
Set the Tier 1 commission rate for each founding group. Enter as plain percentage — e.g. type 30 for 30%. Defaults: Founding 30%, Early 20%, Pioneer 15%.
Multiple campaign slots can run concurrently. First active slot whose window contains now() wins. Priority: per-wallet queue → global schedule → locked price → plan price.
Per-wallet queue is checked before global schedule. Multiple slots per wallet supported.
Override the country for VAT calculation. If set, this takes priority over the country field in payment records.
Create coupon codes for discounts. Coupons take priority over campaign rates. Invalid or expired coupon = transaction reverts. FR-27: set linkedWallet to auto-credit affiliate commissions when this coupon is used.
Enter the member's email address. The frontend will hash it (keccak256) and call setWalletForEmail on-chain. The raw email is never stored anywhere.
This member submitted an email hash for your approval. Tap Confirm to promote it to their verified email hash.
Members who submitted their email hash for approval. Confirm each one to link their email to their wallet.
Override this member's locked price. Their future top-up calculations will use this rate instead of the global plan price. Set to 0 to clear the lock — next payment will re-lock at the current global price.
Assigns a wallet to a founding group and records a price lock at current prices. Slot caps: Founding 1–20, Early 21–40, Pioneer 41–60.
Manually assigns or reassigns a referrer for any member wallet. Manual referrals only — link-based referrals are currently locked by the contract and cannot be reassigned. This restriction will be removed in a future upgrade.
Records a subscription for a member who paid outside the smart contract. No USDC moves — record only. Subscription is treated as live from the payment date.
Transfers all membership records from the old wallet to the new wallet. The old wallet is permanently blocked from future payments.
Manual refund records a history entry only — no funds move.
Recorded as a CreditNote entry in payment history (no funds move).
Shows how net USDC (after VAT) is distributed across wallets when a member pays. Total must always equal 100%.
Define how net USDC is split across wallets. All percentages must total exactly 100%. Minimum 1 wallet. This replaces the entire split in one transaction.
Reads all payment events from the contract (PaymentReceived, ManualSubscriptionAdded, RefundRecorded) and generates a downloadable CSV.
Columns: Date, Type, Wallet, Plan, Gross USDC, VAT Amount, Net USDC, Country, TX Hash.
Loads all members from the contract. Uses the v8.5.2 memberWallets array for instant lookup. If the array is incomplete (members pre-dating v8.5.2), automatically recovers wallets from recent contract events and syncs the array — self-healing, no manual input required.
Enables the GHL → button in Member Lookup and Set Referrer. Searches GoHighLevel by wallet address and shows the contact's name, email, tags, and GHL ID. Read-only — no data is written to GHL. The key is stored in your browser only, never on any server.
Triggers your GHL automation when a member's subscription has expired. In GHL, open your Automation → Settings → copy the Webhook Trigger URL and paste it here.
Once saved, two actions become available in the Members tab:
• Option A — Notify button per expired row: sends that wallet's info to GHL to start your reminder sequence.
• Option B — Notify All Expired button: sends all expired members to GHL in one click.
Payload sent to GHL: { wallet, expiredDate, planName, totalPaid }. Map these fields in your GHL workflow to update contacts, remove from Skool, and queue reminder sequences.
Stored in your browser only — never on any server.
One-time initialization calls. Run these once after first deploy. Read current values first to confirm what is already set.
Tells LearnAndEarn which HolgerPayment contract to use. Enter P_PROXY address.
Wallet that USDC payouts are sent from. Enter owner/payout wallet address.
Tells HolgerPayment where the LearnAndEarn contract lives. Enter LE_PROXY address.
Saved labels for injection source fields. Stored in browser local storage.
Epochs track active trading days. Open at the start of each period. Close with the real day count when the period ends.
Positive = add days, negative = subtract days. Only corrects the current open epoch — closed epochs are permanent.
Edit the start date, end date, or trading day count of any epoch — open or closed. Total active days recalculated automatically. Emits on-chain audit event.
⚠ Emergency use only. Directly sets the global total confirmed active trading days counter. Use to fix major discrepancies after editEpoch is insufficient.
When ON (default): new payments automatically create a card. When OFF: payment creates a pending entry — you approve or reject each one manually before a card is created.
Only visible when auto-approve is OFF. Shows all payments waiting for your approval. Approve to create the card, reject to dismiss permanently.
Split a total USDC amount equally across the N longest-waiting members in the queue.
Specify exact USDC amounts per wallet. Each wallet moves to back of queue after payout.
Pull back any USDC that has been allocated but not yet withdrawn by members. No time lock — callable anytime.
Record on-chain for transparency. Positive = profit, negative = loss.
All members in payout order. Position 1 = next to receive. Click a wallet to open the per-wallet panel.
Override the global daily return rate for this wallet. Set to 0 to revert to global rate. Enter as percentage (e.g. 1.5 = 1.5%/day = 150 BPS).
Move this wallet to a specific position in the payout queue. Enter the wallet address this wallet should be inserted after. Enter 0x000...000 (zero address) to move to front of queue.
Correct a previously recorded external payout. Original is marked corrected on-chain — audit trail preserved. Load payout history below to find the record index (0-based).
Change the rate on an already-running cycle. Use cycle index from the list above (0-based). Enter rate as percentage (e.g. 1.5 = 150 BPS).
Mark a running cycle as complete before 240 days. Irreversible. Use cycle index from the list above (0-based).
Pause or resume a single card independently of the wallet pause. Days stop accumulating while paused. Use cycle index from the list above (0-based).
Withdraw the available profit from one specific card. The card keeps running and continues accumulating. Requires the member's Withdraw Override to be enabled — toggle it above before using this from admin.
Split one card into multiple sub-cards. Enter the new amounts as comma-separated USDC values. They must sum to the original card amount. Use cycle index from the list above.
Add pre-epoch trading days to a manually entered cycle. Use for payments that predate the first epoch. Can be called multiple times — days accumulate.
Instantly mark a cycle as fully complete. Use for very old payments where counting days is impractical. Irreversible.
Create a membership account without payment — for bank transfer clients, demo accounts, or partners. The member gets a referral link and full access until the expiry date you set. A GRANTED badge appears in Member Lookup. When they make a real payment later, the badge clears automatically.
Upload a CSV file to grant access to multiple members at once. Each row = one MetaMask confirmation.
0x995aef...,client@example.com,2026-12-31,0,DE,Hans,Müller
| # | Wallet | Expiry | Plan | Status |
|---|
Only works on members where the GRANTED badge is active. Expires their access immediately. Member record stays on-chain — nothing is deleted.
⚠️ Calls RefundFacet.addCreditNoteWithExpiry / addCreditNoteWithExpiryBatch — built in T128, NOT YET on the live PAY_DIAMOND. Will revert until Holger's diamondCut upgrade.
Grants a credit of any amount to one wallet, with its own independent expiration date — separate from proration (mutually exclusive per the feature spec: applying a promo credit to an upgrade voids that upgrade's proration).
Same amount and expiry applied to every wallet listed, one per line. Calls
addCreditNoteWithExpiryBatch in a single transaction.
⚠️ Calls PaymentAdminFacet.adjustMemberSubscription — built in T128, NOT YET on the live PAY_DIAMOND. Will revert until Holger's diamondCut upgrade.
Add or subtract time from a member's subscription with NO payment attached — e.g. bonus
days for a slow manual invite. Enter days in exactly one of the two fields below; it is
converted to the signed secondsDelta the real function expects
(add → positive, subtract → negative). Positive extends from
max(expiry, now); negative subtracts, floored at 0.
⚠️ Calls PaymentAdminFacet.setMaintenanceMode / PaymentViewFacet.getMaintenanceMode — built in T128, NOT YET on the live PAY_DIAMOND. The status read below will fail/show "unknown" and the toggle will revert until Holger's diamondCut upgrade. Frontend gating in members.html/learn.html was already built in T129 and is ready for this flag.
When ON, members.html and learn.html show an "Under
Maintenance" screen to every wallet instead of the dashboard.
Shown on the "Under Maintenance" gate card in members.html/learn.html, read live via PaymentViewFacet.getMaintenanceMessage(). Pick a preset below (or write your own) and click Set Message — independent of the ON/OFF switch above, so it can be prepared ahead of time.
⚠️ Calls PaymentAdminFacet.approveMembershipBatch/rejectMembershipBatch and MembershipFacet.deactivateMemberBatch/reactivateMemberBatch — built in T128, NOT YET on the live PAY_DIAMOND. Will revert until Holger's diamondCut upgrade.
Scans the live PAY_DIAMOND for MembershipPendingApproval events, then confirms
each wallet is STILL genuinely pending (via getPendingRegistration/
isActiveMember) before listing it — wallets already approved or rejected since
the event fired are filtered out automatically. This can take a while (scans in
block-range chunks) — it is a manual action, not run automatically on page load.
Paste wallet addresses, one per line, then pick an action — or use the pending-registration scan above and click "Use Selected" to fill this box automatically instead of pasting by hand.
Lists every wallet from getAllMemberWallets(), cross-referenced against
PaymentReceived event logs (chunked scan, same 10M-block/200k-chunk pattern
as Pending Registrations above) to find each wallet's most recent payment timestamp — no
new Solidity getter needed. Filter by "paid in the last N days," then send the selected
wallets to either action box below.
Calls MembershipFacet.resetMember/resetMemberBatch — wipes a
wallet's ENTIRE member record (payment history, VAT-relevant amounts, email hash + pending
email hash, active/inactive flag, subscription expiry, referral data, plan-lock/renewal
trackers) so the wallet becomes indistinguishable from one that never registered.
This cannot be undone on-chain. Reset-for-Retest and Delete-Permanently do the exact
same wipe — only the reasonCode recorded in the MemberReset event differs, so
wallet history can later be told apart in the dashboard.
Deploy a new logic contract and point the proxy at it. The proxy address never changes. All member data stays intact. Call once per proxy that needs upgrading.
Points LE_PROXY at a new LE_LIB contract. Use this when the library logic is updated without changing the proxy. Deploy the new LE_LIB first, then paste its address below.
Points PAY_PROXY at a new HolgerPaymentLib contract. Use this when the payment library is upgraded without migrating the proxy. Deploy the new PAY_LIB first, then paste its address here.
Reads live from the chain. Shows all active contracts, key on-chain state, and USDC approvals in one place. Values start as — until you tap Load.
Live trading-balance compounding projector. Fully separate tool with its own owner-wallet gate — no connection to this contract's state, ABI, or storage. Opens in a new tab.
Open Trading Calculator →Real trading-results log — track actual daily performance and lock confirmed days once they're final. Fully separate tool with its own owner-wallet gate — no connection to this contract's state, ABI, or storage. Opens in a new tab.
Open Trading Tracker →Bookkeeping / EKS-preparation log for the Jobcenter payout account — owner-only tool, all data stays local (localStorage + JSON backup), nothing stored on-chain or on any server. Opens in a new tab.
Open Jobcenter Tracker →Manual trade-position log — grouped dollar-cost-average breakeven pricing, net open volume overview, and Close Day/Reopen Day realized-P&L locking. Fully separate tool with its own owner-wallet gate — no connection to this contract's state, ABI, or storage. Opens in a new tab.
Open Position Manager →Direct-deploy tool for the 14-step, 8-contract mainnet deployment sequence — connects via the same WalletConnect / Reown AppKit flow as this admin panel, strict OWNER-only wallet gate, no fallback. Fully separate tool, opens in a new tab. Supersedes the old Gist + htmlpreview.github.io workflow.
Open Mainnet Deploy Tool →The real EIP-2535 Diamond deploy tool for HolgerPayment's production Diamond — NOT the toy proof-of-concept above. Deploys real compiled Payment facets (views, admin approval gating, refunds, campaigns, plans, memberships, and the money-moving core facet) with one independently-clickable, resumable button per step, plus a manual-address-override field on every step so an already-deployed contract can be reused without redeploying. Progress auto-saves to this browser. Connects via the same WalletConnect / Reown AppKit flow as this admin panel, strict OWNER-only wallet gate, no fallback. Fully separate tool, opens in a new tab. Not yet run — awaiting Holger's own click-through.
Open PAY_DIAMOND Deploy Tool (REAL) →The real EIP-2535 diamondCut UPGRADE tool for the ALREADY-LIVE PAY_DIAMOND — distinct from the deploy tool above, which only ever adds facets to a brand-new Diamond. This tool now deploys the v8.13.0 MembershipFacet (T189 — new `resetMember(address,uint8)`/`resetMemberBatch(address[],uint8)`, onlyOwner, full wipe of a member's on-chain data with an event-logged reasonCode distinguishing "Reset for Retest" from "Deleted Permanently") and repoints the live Diamond's selectors so both new functions become callable. As of T189d, categorization is verified against a live, read-only `facets()` call to the real chain (zero gas) before COMPUTE CUT runs — not just the hand-maintained snapshot — so Replace/Add is based on actual current on-chain state. T190 fix: the Remove list is now also built from that live read, not the stale static snapshot (was causing a real SIMULATE revert on the first live attempt). Same OWNER-gate/WalletConnect/resumable pattern. Fully separate tool, opens in a new tab.
Open PAY_DIAMOND Upgrade Tool (REAL) →Permanent, reusable tool for moving real member state from an OLD PAY_DIAMOND to a brand-new one — distinct from both tools above, which handle deploying/upgrading facets, not migrating data. Built T190 after a diamondCut accident permanently destroyed the live PAY_DIAMOND's own diamondCut/Loupe/owner selector routing (that specific proxy can never be upgraded again). Reads every member wallet off the OLD diamond read-only (zero gas — getAllMemberWallets/getStats/getPayments/getMemberCountry), then replays that state onto a NEW diamond (which must already be deployed with all 10 facets via the Deploy tool above) via the real admin functions that already exist — grantMembership+adjustMemberSubscription for an exact expiry restore, setMemberLockedPrice, setMemberCountry, addCreditNoteWithExpiry, and addPaymentRecordsBatch (built into PaymentCoreFacet specifically for this). Per-wallet resumable, with a dry-run preview step and an explicit in-page list of exactly which fields (referralId, currentPlanType, per-plan price-lock snapshots, hasEverPurchasedPlan, pending registrations) cannot be restored via any existing admin function — honest gaps, not silently glossed over. Not yet run live — the current live PAY_DIAMOND has zero real members as of T190 (test data only); reserved for the future. Same OWNER-gate/WalletConnect flow, fully separate tool, opens in a new tab.
Open PAY_DIAMOND Migration Tool (REAL) →diamondCut UPGRADE tool for the already-live AFF_DIAMOND (deployed T121), mirroring the PAY_DIAMOND Upgrade tool's pattern exactly — SIMULATE dry-run, live-selector-refresh from chain via facets(), Replace/Add/Remove categorization with the Remove-list SAFELY scoped to only the 4 Affiliate business facets (DiamondCutFacet/DiamondLoupeFacet/OwnershipFacet selectors are structurally excluded from removal, per the T190 incident fix — see Fix Records). Affiliate's Solidity has had zero functional changes since T121, so this tool's first real use will simply redeploy the same 4 facets and produce a clean Replace-only cut — built now as standing infrastructure for whenever Affiliate gets real feature work.
Open AFF_DIAMOND Upgrade Tool (REAL) →The real EIP-2535 Diamond deploy tool for HolgerAffiliate's production Diamond — a direct port of the PAY_DIAMOND tool above. Deploys real compiled Affiliate facets (views, admin config incl. cross-Diamond setPaymentContract wiring, payout release, and the core commission-accrual facet) with one independently-clickable, resumable button per step, plus a manual-address-override field on every step so an already-deployed contract can be reused without redeploying. Progress auto-saves to this browser. Connects via the same WalletConnect / Reown AppKit flow as this admin panel, strict OWNER-only wallet gate, no fallback. Fully separate tool, opens in a new tab. Not yet run — awaiting Holger's own click-through.
Open AFF_DIAMOND Deploy Tool (REAL) →The real EIP-2535 Diamond deploy tool for LearnAndEarn's production Diamond — a direct port of the PAY_DIAMOND/AFF_DIAMOND tools above. Deploys real compiled Learn & Earn facets (views, admin/epoch/pause config incl. a NEW cross-Diamond setAffiliateContract wiring setter, member withdraw/payout, and the core payment-intake/injection/queue facet) with one independently-clickable, resumable button per step, plus a manual-address-override field on every step so an already-deployed contract can be reused without redeploying. Also has a one-time bootstrapFirstEpoch step (NEW — not in the real v8.5.3 source, needed since this Diamond has no initializer). Progress auto-saves to this browser. Connects via the same WalletConnect / Reown AppKit flow as this admin panel, strict OWNER-only wallet gate, no fallback. Fully separate tool, opens in a new tab. Not yet run — awaiting Holger's own click-through.
Open LE_DIAMOND Deploy Tool (REAL) →
diamondCut UPGRADE tool for the already-live LE_DIAMOND (deployed T121), mirroring the PAY_DIAMOND/AFF_DIAMOND Upgrade tools' pattern exactly — SIMULATE dry-run, live-selector-refresh from chain via facets(), Replace/Add/Remove categorization with the Remove-list SAFELY scoped via a hardcoded PROTECTED_CORE_SELECTORS set (the 7 universal EIP-2535/Ownable selectors — diamondCut, the 4 Diamond Loupe reads, owner/transferOwnership — structurally excluded from removal, built in from v1.0.0 per the T188/T190 incident fix — see Fix Records). Learn & Earn's Solidity has had zero functional changes since T121, so this tool's first real use will simply redeploy the same 4 facets and produce a clean Replace-only cut — built now as standing infrastructure for whenever Learn & Earn gets real feature work.
The dedicated cross-Diamond connector tool per the migration plan's section 9i design decision — wiring is a separate concern from deploying, so it lives in its own tool rather than as an extra step inside each deploy tool above. Covers all four real cross-Diamond wiring calls found across the three Diamonds' facets: Payment→Affiliate, Affiliate→Payment, Payment→Learn&Earn, and Learn&Earn→Affiliate — each its own independently-clickable button, with a read-only verify button next to it. Just needs the relevant Diamond addresses pasted in (persisted to this browser) — doesn't care how any Diamond was deployed. Stays useful forever, including reconnecting after any future single-Diamond redeploy. Same WalletConnect/AppKit + strict OWNER gate as every other tab. Fully separate tool, opens in a new tab. Not yet run — no Diamonds are deployed yet.
Open Diamond Connector Tool →