Patolabs OG : des NFTs pour ouvrir mes betas
1 000 NFTs sur Base, trois tiers, art 100% on-chain, et un seul but : donner aux early adopters un accès vérifié aux betas TestFlight des apps Patolabs.
J'avais un problème simple : comment donner accès à mes betas TestFlight à des gens qui me soutiennent, sans passer par un Google Form et une liste d'emails que je gère à la main ?
TestFlight, c'est bien fait. Mais le flow d'invitation est pensé pour des équipes, pas pour une communauté ouverte. Tu ajoutes des gens un par un, tu gères des emails, tu relances ceux qui n'ont pas accepté l'invitation. Pour un dev solo avec un projet perso, c'est du travail administratif qui n'a rien à voir avec le code.
J'ai voulu essayer autre chose. Quelque chose qui soit vérifiable, permanent, et qui ne dépende pas de moi pour fonctionner.
L'idée
Un NFT comme clé d'accès. Pas un NFT spéculatif, pas un projet PFP, pas une roadmap en dix phases. Un token ERC-721 sur Base qui dit : "cette personne soutient Patolabs". Et qui déverrouille concrètement quelque chose — l'accès aux builds beta de toutes les apps que je publie.
La collection s'appelle Patolabs OG (ticker PATOG). 1 000 tokens, trois tiers, un contrat custom déployé sur Base mainnet. Tout est on-chain : le contrat, l'art, les métadonnées. Pas d'IPFS, pas d'Arweave, pas de serveur externe. Tant que Base existe, les tokens existent.
Trois tiers, une règle
Les trois tiers correspondent à trois niveaux de soutien :
Supporter, à 0.003 ETH — 600 disponibles, en bleu. La carte de base.
Backer, à 0.008 ETH — 300 disponibles, en orange. Un anneau autour du logo en plus.
Founder, à 0.028 ETH — 100 disponibles, en violet. Deux anneaux et des brackets aux coins. Le tier le plus rare.
Au cours actuel de l'ETH, ça donne environ 7 € le Supporter, 18 € le Backer, 60 € le Founder. Volontairement accessible — pas pensé comme un investissement, mais comme un geste de soutien concret.
Les supplies sont figées à jamais dans le constructeur du contrat : 600, 300, 100. Pas d'extension possible, pas de phase 2 où on rajoute 2 000 tokens. C'est codé en dur. Les prix, eux, peuvent être ajustés par le owner via setTierPrice — si l'ETH s'envole ou s'effondre, je ne veux pas que le Supporter coûte 50 € ou 50 centimes. C'est un choix assumé pour garder le pricing cohérent dans le temps. Le owner peut aussi retirer l'ETH du contrat via withdraw(). Transparence totale — le contrat est vérifié, n'importe qui peut le lire.
Et la règle qui tient tout ensemble : un seul NFT par tier par wallet. Tu peux mint un Supporter, un Backer et un Founder si tu veux — mais pas deux Supporters. Pas d'accumulation possible. La distribution est forcément large.
Ce n'est pas juste une contrainte au mint. L'invariant est vérifié à chaque transfert, y compris sur le marché secondaire. Si quelqu'un essaie d'acheter un Supporter sur OpenSea alors qu'il en a déjà un, la transaction revert. C'est codé dans le hook _update() du contrat — impossible à contourner.
L'art, fabriqué à la lecture
C'est le choix technique dont je suis le plus content. Quand un wallet ou une marketplace appelle tokenURI(), le contrat ne renvoie pas un lien vers une image hébergée quelque part. Il construit le SVG à la volée et le renvoie en base64.
Fond noir avec un léger gradient, le gros "OG" au centre, le logo Patolabs en haut à gauche, le nom du tier en bas, le numéro d'édition en bas à droite. Les décorations — anneaux, brackets — dépendent du tier. Tout est généré par le Solidity, à chaque appel.
Le résultat est déterministe : le token #42 aura toujours exactement le même rendu, que tu le regardes aujourd'hui ou dans cinq ans. Pas de pinning à maintenir, pas de gateway IPFS qui meurt, pas de reveal différé. L'art existe tant que le contrat existe.
Ça a un coût : le contrat est plus gros qu'un ERC-721 classique, parce qu'il embarque tout le SVG en Solidity. Mais sur Base, le gas est suffisamment bas pour que ça reste négligeable.
Le gate : de la blockchain à TestFlight
Avoir un beau NFT c'est bien, mais il fallait qu'il serve à quelque chose.
Sur patolabs.dev/fr/beta, les holders accèdent à un dashboard qui liste les builds beta de toutes les apps Patolabs — Souffle pour le moment, et tout ce qui suivra.
Le flow est simple : tu connectes ton wallet, le front envoie ton adresse au backend, le backend appelle balanceOf() directement sur le contrat via un RPC Base. Si tu détiens au moins un token, tu accèdes aux liens TestFlight. Sinon, non.
Pas de signature à demander, pas d'authentification complexe. Juste une vérification de balance côté serveur. Les URLs TestFlight ne sont jamais envoyées au client sans vérification on-chain préalable — elles restent côté serveur tant que la preuve de possession n'est pas faite.
Soyons honnête : sans signature, quelqu'un qui connaît l'adresse d'un holder pourrait théoriquement appeler l'API directement. Pour une vérification plus stricte, on pourrait demander une signature wallet. Mais pour des liens TestFlight — qu'on peut révoquer à tout moment — la friction supplémentaire n'en vaut pas le coût. Trade-off assumé.
La liste des apps est stockée en Vercel KV et modifiable depuis un panel admin intégré à la même page. L'admin n'est visible que si le wallet connecté correspond au owner() du contrat — pas une variable d'environnement, une vérification dérivée du contrat lui-même.
Pourquoi Base
Pour le pragmatisme.
Base est un L2 bon marché — un mint Supporter coûte quelques centimes de gas en plus du prix du token. C'est EVM-compatible, donc tout l'outillage standard fonctionne : Foundry pour le contrat, wagmi et Viem côté front. Et l'écosystème Coinbase rend l'onboarding moins douloureux pour les gens qui ne vivent pas dans un wallet au quotidien.
Avant le déploiement mainnet, tout a été testé sur Base Sepolia. Le contrat est vérifié et lisible sur Basescan.
Le parcours
Si tu veux voir à quoi ça ressemble : tu arrives sur la page beta, tu vois trois cartes — une par tier — avec un bouton pour connecter ton wallet. Si tu n'es pas sur Base, l'app te propose de switcher de réseau.
Tu choisis ton tier, tu confirmes dans ton wallet, et quelques secondes plus tard ton NFT apparaît avec une petite animation de reveal. Le SVG est là, généré à l'instant par le contrat. En dessous, le dashboard s'ouvre avec les apps disponibles et leurs liens TestFlight.
C'est tout. Pas de whitelist, pas de Discord à rejoindre, pas de form à remplir. Tu soutiens, tu accèdes.
Un point important : ton accès est lié à ton wallet. Si tu perds ta seed phrase, tu perds ton NFT et ton accès aux betas. Pas de bouton "mot de passe oublié" sur la blockchain.
Pourquoi tout ça
Je pouvais faire un Google Form. Sérieusement. "Entre ton email, je t'ajoute sur TestFlight." Ça marche, c'est simple, personne ne m'aurait reproché quoi que ce soit.
Mais j'aimais l'idée que le soutien soit visible, vérifiable, permanent. Qu'un early adopter puisse dire "j'étais là au début" avec une preuve on-chain plutôt qu'un email dans une boîte de réception. Que la clé d'accès ne dépende pas de moi — si je perds ma base de données d'emails, les tokens sont toujours là.
Et surtout, j'aimais le défi technique. Un contrat custom avec du SVG généré on-chain, un gate server-side par vérification de balance, le tout câblé en un weekend. Le genre de side project où chaque couche — Solidity, RPC, front Next.js — doit s'emboîter proprement pour que l'ensemble tienne.
Patolabs OG, c'est un programme de soutien matérialisé en NFT. Pas plus, pas moins. Si tu veux soutenir le projet et accéder aux betas en avant-première, c'est par ici.
— Pato