⚠️ 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
Logic contract only. No initialize. Address needed for Step 7 (AFF_PROXY). ⚠️ Address inferred from step order (T083) — please confirm before proceeding
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
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.
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.