Playbook
Mainnet Web3Modal und Wallet-Härtung (Mainnet Web3modal Wallet Haertung)
Von MetaMask-only zu Web3Modal + WalletConnect + Coinbase WalletLink; chainId, Gas und Adressen härten.
NFT-Collection-Mint und Mainnet-Härtung
Teil 4 von 4
CBD All-Stars- und Confident-Gorillas-Mint-Oberflächen: WIP-Whitelist-Funnel, IPFS-Metadaten, Placeholder→Reveal-Pipeline und Web3Modal-Mainnet-Wallet-Härtung.
Mainnet bricht die Single-Wallet-Annahme
Gorillas Mainnet 1.8 verlässt den All-Stars/1.4-Pfad window.ethereum.enable(). Web3Modal öffnet mit cacheProvider; WalletConnect (Infura-Id) und custom Coinbase WalletLink (chainId: 1) kommen in providerOptions. ConnectWeb3 → ethers Web3Provider → address; Contract-Instanzen sprechen über den Modal-Provider.
Before (All-Stars / early)
window.ethereum only → Web3
After (mainnet 1.8)
Web3Modal
├─ WalletConnect (Infura)
├─ WalletLink / Coinbase (chainId 1)
└─ injected (MetaMask)
↓
provider → ethers Web3Provider
↓
getNftContract(Web3(provider))
Dieser Teil schließt die Serie mit einer Mainnet-Readiness-Checkliste: Wallet-Vielfalt, Netz-Asserts, Gas und Adress-/ABI-Disziplin.
Begriffe, dort definiert, wo sie zuerst auftauchen
📦 Web3Modal
Multi-Wallet-Connect-UI; WalletConnect/WalletLink über providerOptions.
📦 WalletConnect
QR-/Mobile-Wallet-Brücke; braucht Infura- (oder RPC-) Id.
📦 WalletLink
Coinbase-Wallet-Connector; appName, networkUrl, chainId.
📦 cacheProvider
Merkt den letzten Provider; Reconnect-UX mit Stale-Session-Risiko.
RPC-/Infura-Project-Ids sind Konfiguration — keine Secrets im Playbook. Keys leben in Env, nicht im Repo.
Warum MetaMask-only nicht reicht
Landing-FAQ sagt vielleicht noch MetaMask; Mainnet-Nutzer wollen Coinbase Wallet und mobiles WalletConnect. Ein injizierter Pfad killt Conversion. 1.8-Entscheidung: Multi-Connector-Modal, network: 'mainnet'.
User segments
Desktop MetaMask
Mobile WC
Coinbase WalletLink
↓
one ConnectWeb3() API
Connection-Lebenszyklus
ConnectWeb3: web3Modal.connect() → Web3Provider → getAddress. DisconnectWeb3: clearCachedProvider + provider.disconnect + reload. getNetwork liest netId vom Provider. Contract-Getter bauen Web3.eth.Contract aus initialState.provider — der alte appWeb3()-Infura-Fallback darf kein Mainnet-Signierpfad sein.
connect → address
getNetwork → chainId check
mint/reveal only if chainId OK
disconnect → clear cache → reload
ADR: Web3Modal als Wallet-Facade
Entscheidung: Mint/Reveal-Utils binden nicht direkt an window.ethereum; die Modal-Facade liefert Address und Provider. Plus: Connector hinzufügen ist Produktentscheidung. Minus: dualer ethers+web3-Stack und cacheProvider-Stale. Mitigation: chainId vor Mint asserten; Cache bei Disconnect löschen.
ADR-04 Web3Modal facade
UI → ConnectWeb3 / DisconnectWeb3
Utils → provider from modal state
Guard → chainId === 1 before send
Reject → wrong net / no provider
Mainnet-Failure-Playbook
- Stub-Contract-Adressen in Production — Tx wirkt ok, State falsch. 2) Falsches Netz — Signatur auf Rinkeby/Goerli, Mainnet-Supply unverändert. 3) gasPrice: 0 — underpriced im Mempool. 4) ABI-Mismatch — multipleMint/reveal Encode fail. 5) Pinata/Infura-Keys im Client-Bundle — Secret-Leak (nie committen).
Hardening checklist
✓ real mainnet addresses
✓ chainId === 1 gate
✓ dynamic gas / tip
✓ ABI ↔ deployment lock
✓ secrets in env only
Die am häufigsten verwechselten Zuordnungen
❌ window.ethereum reicht; Modal ist Luxus
✓ Multi-Connector ist Mainnet-Conversion-Anforderung
❌ cacheProvider = immer verbunden bleiben
✓ Stale Provider mit disconnect + clearCachedProvider löschen
❌ Infura/Pinata-Keys in Constants
✓ Keys in Env/Secret-Store; minimale Client-Scope
Checkliste zur Prüfung des eigenen Systems
- Wird nach Connect chainId === 1 assertet?
- Ist provider vor Mint-Send non-null?
- Hat gasPrice: 0 den Production-Build überlebt?
- Sind nft/reserve/auction-Adressen verschieden und Mainnet?
- Wurden WalletConnect / WalletLink auf echten Geräten getestet?
Was aus diesem Teil bleiben sollte
- Der 1.8-Sprung: MetaMask-only → Web3Modal Multi-Wallet-Facade.
- Mainnet-Härtung ist Adress-, Netz-, Gas-, ABI- und Secret-Disziplin.
- Disconnect und Cache-Clear gehören zur Reconnect-UX.
Eine Wallet zu verbinden ist kein Feature; auf dem falschen Netz zu signieren ist ein stiller Production-Incident.
FAQ
Häufige Fragen
Was ist Web3Modal?
Multi-Wallet-Connect-UI; WalletConnect/WalletLink über providerOptions.
Was ist WalletConnect?
QR-/Mobile-Wallet-Brücke; braucht Infura- (oder RPC-) Id.
Stimmt es, dass „window.ethereum reicht; Modal ist Luxus“?
Multi-Connector ist Mainnet-Conversion-Anforderung
Was legt dieser Teil fest?
Dieser Teil schließt die Serie mit einer Mainnet-Readiness-Checkliste: Wallet-Vielfalt, Netz-Asserts, Gas und Adress-/ABI-Disziplin. Gorillas Mainnet 1.8 verlässt den All-Stars/1.4-Pfad window.ethereum.enable(). Web3Modal öffnet mit cacheProvider; WalletConnect (Infura-Id) und custom Coinbase WalletLink (chainId: 1) kommen in providerOptions. ConnectWeb3 → ethers Web3Provider → address; Contract-Instanzen sprechen über den Modal-Provider.
Gelernte Engineering-Prinzipien
- Legen Sie Mint-Utils hinter eine Wallet-Facade.
- Asserten Sie chainId, Adresse und Gas vor jedem Send.
- Halten Sie Secrets aus dem Bundle; beweisen Sie Connectoren auf echten Geräten.
Weiterlesen
Weiterlesen
Nachster Teil der Serie
Placeholder-URI und Owner-Reveal-Pipeline
Placeholder-Metadaten beim Mint, uridata-Map, reveal(tokenId, uriHash) und eine owner-only Reveal-Oberfläche.
Aus derselben Serie
IPFS (InterPlanetary File System)-Metadaten, Mint und Multiple Mint
Infura IPFS + Pinata-Pin, Metadata-JSON, mint(tokenId, uri) und multipleMint: 0.1 ETH × n, 750 Supply.
Aus derselben Serie
Collection-Landing und WIP-Whitelist-Funnel
CBD-All-Stars-Mint-Landing: #GETINTHEWIP, 750 Plätze, Discount-Funnel und wie eine MetaMask-only-Mint-Oberfläche zum Produkt wird.