Mainnet Deploy Tool — v1.1.7 — Full Clean Slate (8 contracts) ⚠️ MAINNET

⚠️ MAINNET — Arbitrum One — uses real ETH. Double-check every address before confirming in your wallet app.
Direct-deploy version of DeployTool_v8_6_0_fresh_MAINNET_v2.html — same 14-step sequence, same bytecode/ABI, connects via WalletConnect (Reown AppKit) instead of MetaMask's in-app browser. Open this page directly in Safari on iPad.
Supersedes the Gist + htmlpreview.github.io workflow — this file lives in the live site and is opened directly.
Network: Arbitrum One (chainId 0xa4b1)
OWNER / VAT / Payout / Comm: 0xFa15B81BFCAC53E2723FA6530C040d9dFb5A9b19 (hardcoded mainnet OWNER — connect gate is strict, no fallback)
USDC: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831
⏳ Checking bytecodes...
Every step has a skip input. Paste an existing address to bypass deployment — useful if a step was already done or you want to reuse a known-good contract. Leave blank to deploy fresh.
Progress backup
Every resolved address auto-saves to this browser (localStorage) — a page reload won't lose Step 1-4b/5-14 progress anymore. Export/Import move progress across devices; Reset restores Steps 1-4b to their known-deployed defaults and clears everything from Step 5 on.

Owner / VAT / Payout / Comm Wallet — mainnet (hardcoded, not editable)
This one address is used as the owner/vatWallet/payoutWallet/commWallet parameter in every initialize() call and as the expected value in the final health check. This tool only allows a connected wallet that exactly matches this address to use any deploy/init button — see the STRICT OWNER gate on connect.
0xFa15B81BFCAC53E2723FA6530C040d9dFb5A9b19

Step 1 — Deploy LearnAndEarnLib (v8.6.0 MAINNET bundle — source v8.5.3, logic unchanged)

Standalone library. No proxy. Address needed for Step 6 (initialize LE_PROXY).
LE_LIB:

Step 2 — Deploy LearnAndEarn Logic (v8.6.0 MAINNET bundle — source v8.5.3, logic unchanged)

Logic contract only. No initialize. Address needed for Step 5 (LE_PROXY).
LE_LOGIC:

Step 3 — Deploy HolgerAffiliate Logic (v8.6.0 MAINNET bundle — source v8.5.3, logic unchanged)

Logic contract only. No initialize. Address needed for Step 7 (AFF_PROXY).
⚠️ Address inferred from step order (T083) — please confirm before proceeding
AFF_LOGIC:

Step 4 — Deploy HolgerPaymentLib (v8.6.0 MAINNET bundle — source v8.5.4, incl. FIX 179: contract not library)

Library contract. No proxy. Address passed to PAY_PROXY initialize() as 7th param.
Stateless — safe to redeploy. setPaymentLib() upgrades lib without redeploying proxy.
⚠️ Address inferred from step order (T083) — please confirm before proceeding
PAY_LIB:

Step 4b — Deploy HolgerPayment Logic (v8.6.0 MAINNET bundle — source v8.5.3, incl. FIX 165 CampaignV1 + v8.5.2 memberWallets + v8.5.3 addPaymentRecordsBatch)

Logic contract only. No initialize. Address needed for Step 9 (PAY_PROXY).
⚠️ Address inferred from step order (T083) — please confirm before proceeding
PAY_LOGIC:

Step 5 — Deploy LE_PROXY (no init)

Deploys ERC1967Proxy with LE_LOGIC as implementation. Empty _data — no initialize call here.
Verifies EIP1967 slot on-chain. Proceed to Step 6 to initialize.
LE_PROXY (permanent):

Step 6 — Initialize LE_PROXY

Calls initialize(OWNER, USDC, LE_LIB) on LE_PROXY as a separate tx.
If MetaMask shows "likely to fail" — confirm anyway to capture the revert reason on Arbiscan.

Step 7 — Deploy AFF_PROXY (no init)

Deploys ERC1967Proxy with AFF_LOGIC as implementation. Empty _data — no initialize here.
Verifies EIP1967 slot. Proceed to Step 8 to initialize.
AFF_PROXY (permanent):

Step 8 — Initialize AFF_PROXY

Calls initialize(OWNER, OWNER_placeholder, OWNER) on AFF_PROXY.
paymentContract = OWNER placeholder — fixed in Step 12 (setPaymentContract). commWallet = OWNER.

Step 9 — Deploy PAY_PROXY (no init)

Deploys ERC1967Proxy with PAY_LOGIC as implementation. Empty _data — no initialize here.
Verifies EIP1967 slot. Proceed to Step 10 to initialize.
PAY_PROXY (permanent):

Step 10 — Initialize PAY_PROXY

Calls initialize(OWNER, USDC, AFF_PROXY, OWNER, OWNER, OWNER, PAY_LIB) on PAY_PROXY.
vatWallet = payoutWallet = commWallet = OWNER. PAY_LIB = HolgerPaymentLib from Step 4.

Step 11 — setLearnEarnContract on PAY_PROXY

Tells PAY_PROXY which LE_PROXY to extend subscriptions on.

Step 12 — setPaymentContract on AFF_PROXY

Replaces the OWNER placeholder from Step 8 with the real PAY_PROXY address.

Step 13 — setMainContract on LE_PROXY

Tells LE_PROXY which PAY_PROXY to call for subscription extensions.

Step 14 — Health Check

Reads ownerWallet() from all 3 proxies — all must return OWNER.
Reads learnEarnLib() from LE_PROXY. Reads paymentContract() from AFF_PROXY.
After this passes: update CONFIG in admin.html with the 3 new proxy addresses.