Contrats et pouvoirs
Le pilote est fermé. Ses robots sont arrêtés et plus aucun tirage n'y a lieu. Retraits, unstakes et claims restent ouverts ; son coffre, immuable, accepte encore un dépôt direct : ne déposez pas. Ce que cette page dit « au pilote » décrit son fonctionnement jusqu'à la fermeture. La v2 sera déployée à neuf, sans reprise d'état, avec de nouveaux contrats.
Cette page est la référence des adresses du pilote et de « Contrats immuables ». Chaque adresse a été relue sur la
chaîne avant d'être écrite, le 18 septembre 2026, au bloc Robinhood 66231030 (lu on-chain). Chaque commande a été
exécutée telle quelle, chaque sortie est réelle ; cast et call sont présentés à la page 3 :
RH_RPC=https://rpc.mainnet.chain.robinhood.com
VAULT=0x4aaEBA7E0Bb05FeE125a491D6Be956027bd147bd
ORACLE=0x6f6Cc580122F7f4358999D6005e6107b00fB7F64
STAKING=0xd1DA0Bb40872525E84909345C059716A1dB66905
ROUTER=0x6Ca5a6a1a890b6077eF47fFED54F7E38e3DCc453
call() { cast call "$@" --rpc-url "$RH_RPC" | sed 's/ \[[^]]*\]//g'; }
1. Les contrats du pilote
Toutes les adresses sont celles du pilote : les quatre contrats NetNat, puis les contrats tiers que le coffre
appelle. Le bloc de création des quatre premiers vient de leur reçu de création, relu sur la chaîne. Les autres viennent
des variables publiques du coffre ou du routeur ; chacune héberge du code (lu on-chain : cast code).
| Contrat, rôle | Adresse (lien RobinScan) | Création, source |
|---|---|---|
Coffre, NetNatVault : reçoit les dépôts de wsNET, prélève le surplus, engage le bloc Bitcoin, tire et paie les lots |
0x4aaEBA7E0Bb05FeE125a491D6Be956027bd147bd |
bloc 61022723, reçu de création |
Oracle, BTCOracle : reçoit les votes des attestors et fige le hash de chaque hauteur Bitcoin |
0x6f6Cc580122F7f4358999D6005e6107b00fB7F64 |
bloc 61022673, reçu de création |
| NATStaking : reçoit les lots et la part de commission des stakers de NAT | 0xd1DA0Bb40872525E84909345C059716A1dB66905 |
bloc 61022697, reçu de création |
Routeur, NatRouter : vend le NET sur la paire v2 taxée et achète le NAT sur Uniswap v4 |
0x6Ca5a6a1a890b6077eF47fFED54F7E38e3DCc453 |
bloc 61022648, reçu de création |
| wsNET (NetNet) : le seul actif accepté en dépôt | 0x63C12667638f2Ae6fC6ae09B43D98Ec84a8586eA |
lu on-chain : WSNET() du coffre |
| sNET (NetNet) : l'unité du principal, ce que rend le déballage du wsNET | 0xb773ec2C326B7f98a5a83fc098825492F020a4c7 |
lu on-chain : SNET() du coffre |
| NET (NetNet) : le jeton vendu contre USDG, taxe de 5 % payée | 0xCA9c78Dd337A67F6e0077F65F5E9218719d30eDf |
lu on-chain : NET() du coffre |
| Staking NetNet : déstake en NET le sNET du surplus | 0xB078cc304A0B264C5F3680DC0488954ACcd02E87 |
lu on-chain : NET_STAKING() du coffre |
| USDG (dollar numérique de Paxos) : le pivot de la conversion | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
lu on-chain : USDG() du coffre |
| NAT (dmt-nat ponté, 0 décimale) : le jeton des lots | 0x41B981884BcB500ef0232f66092dDBfCE9852897 |
lu on-chain : NAT() du coffre |
| Paire Uniswap v2 NET/USDG, taxée : la seule vente de NET | 0x59F95461E68e0c77605299791E1449f175165B54 |
lu on-chain : PAIR() du routeur |
Uniswap v4, contrat PoolManager, pool NAT/ETH d'identifiant 0x45cb49857e1ae97a5aee6989a9d381ff66124840e9039964cf27eb62a9f94296 : l'achat de NAT, par tranches |
0x8366a39CC670B4001A1121B8F6A443A643e40951 |
lu on-chain : NAT_POOL_ID() du routeur |
v2 : de nouveaux contrats, déployés à neuf, sans reprise d'état du pilote ; cette page sera republiée avec leurs adresses.
2. Ce que « Contrats immuables » veut dire
Au pilote : pas de proxy, pas de mise à jour, pas de pause, pas de clé maîtresse ; ce qui est déployé est ce qui tourne. Son évolution est un nouveau déploiement : la v2, qui sera déployée à neuf, sans reprise d'état du pilote. En v2, le moteur est derrière un proxy, modifiable après un timelock de 72 h.
Un proxy renvoie chaque appel vers un autre contrat, remplaçable, dont l'adresse est rangée dans une case de stockage normalisée (EIP-1967). Lisez cette case sur les quatre contrats : zéro veut dire « pas de proxy ».
IMPL=0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
for a in $VAULT $ORACLE $STAKING $ROUTER; do cast storage $a $IMPL --rpc-url "$RH_RPC"; done
0x0000000000000000000000000000000000000000000000000000000000000000
0x0000000000000000000000000000000000000000000000000000000000000000
0x0000000000000000000000000000000000000000000000000000000000000000
0x0000000000000000000000000000000000000000000000000000000000000000
Pour comparaison, la case de l'USDG, un proxy :
cast storage 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 $IMPL --rpc-url "$RH_RPC"
0x00000000000000000000000068184c449e1a8f34fa18d289737129fd27b66f8f
La preuve complète est le code source, vérifié « Exact Match » sur RobinScan, Blockscout et Sourcify, identique octet pour octet au contrat déployé : il ne contient ni pause, ni retrait par un opérateur, ni modification de paramètre, à la seule exception du plafond de dépôt, section 3.
3. Le seul pouvoir privilégié
Une adresse, CAP_ADMIN, peut relever le plafond de dépôt, jamais le baisser, en deux temps, proposition puis exécution
après 24 h d'attente (lu on-chain : CAP_TIMELOCK = 86 400 s). Ce pouvoir ne touche ni aux dépôts, ni aux pots, ni aux
tirages, ni à l'oracle. Qui le détient, et une demande est-elle en attente ?
call "$VAULT" "CAP_ADMIN()(address)"
call "$VAULT" "depositCap()(uint256)"
call "$VAULT" "pendingCap()(uint256)"
call "$VAULT" "pendingCapExecutableAt()(uint256)"
0x443Ef9FEb0DD431103DB932cfc91b825d708DFDd
1000000000
0
0
Ce que vous venez de lire : le détenteur, une adresse simple, sans code (lu on-chain : cast code vide) ; le plafond,
1 sNET (9 décimales) ; aucune demande en attente, plafond proposé et date d'exécution à zéro. Une proposition
apparaîtrait ici au moins 24 h avant de s'appliquer, et dans l'événement CapRaiseProposed.
4. L'oracle et ses attestors
L'oracle tient une liste fixe de trois attestors et un seuil de deux votes identiques, fixés à sa création, et personne pour les changer.
call "$ORACLE" "attestors()(address[])"
call "$ORACLE" "THRESHOLD()(uint256)"
[0xA1f05930f4998EFb1F4b030a86de33FD36Ca976b, 0xa9e4728892432600d41767De232FE2BbEa6e61bf, 0xDA589c4D83cC3f6f64a669ddD68968dc29eB8C11]
2
Qui les opérait : au pilote, le builder ; ils sont arrêtés depuis la fermeture. Le hash rapporté dépendait donc d'un
seul opérateur, mais n'importe qui le vérifie contre Bitcoin (page 3), et un vote divergent laisse une trace publique,
l'événement Mismatch. En v2, les attestors gardent leurs adresses. En v3, cinq attestors extérieurs, seuil de trois.
5. Le keeper
Les trois étapes du cycle, sweep, tranches d'achat et règlement, sont ouvertes à tous : au pilote, aucune n'est réservée
à une adresse (lu on-chain : code du coffre). Le keeper, robot du builder, les appelait. La prime de 1 % du pot,
plafonnée à 25 millions de NAT, revient à qui règle le tirage, quel qu'il soit (lu on-chain : KEEPER_BOUNTY_BPS,
KEEPER_BOUNTY_MAX_NAT). Si le robot s'arrête, le protocole attend, rien n'est perdu.
6. Où va l'argent
La commission se prend sur le pot après la prime du keeper. Au pilote, nulle pendant 30 jours après le déploiement, puis
3 %, répartis 50 % pour NATStaking, 25 % pour le trésor, 25 % pour le builder (lu on-chain : FEE_BPS_AFTER,
FEE_SPLIT_*) ; la valeur en vigueur se lit avec feeBps(). Le pilote a fermé avant la fin de ces 30 jours : aucun de
ses tirages n'a payé de commission. En v2, 10 % dès le premier tirage : 4 % pour les stakers de NAT, 3 % pour le trésor,
3 % pour le builder. Les trois destinataires sont figés dans le coffre, trésor et builder conservés en v2 :
call "$VAULT" "NAT_STAKING()(address)"
call "$VAULT" "TREASURY()(address)"
call "$VAULT" "BUILDER()(address)"
0xd1DA0Bb40872525E84909345C059716A1dB66905
0x2760f4054aB846776D0a0a1783A5aC592a35F9f7
0xC09A8182003fA64DEbac08eF8151891058376157
Trésor et builder sont des adresses simples, sans code (lu on-chain : cast code vide). Détail des frais : page 4.
7. En une ligne
Contrats immuables. Bitcoin choisit. Les attestors rapportent. Tout le monde vérifie.