Contrats et pouvoirs
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 (DEPLOY.md §3).
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 ; SPEC §2 |
v2 : à venir au déploiement ; cette page sera republiée, avec un cinquième contrat, la réserve de gas (SPEC §12.1 point 6).
2. Ce que « Contrats immuables » veut dire
Pas de proxy, pas de mise à jour, pas de pause, pas de clé maîtresse. Ce qui est déployé est ce qui tourne. Une évolution est un nouveau déploiement, avec migration volontaire des déposants (SPEC §3).
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 (SPEC §2) :
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é (DEPLOY.md §4) : 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 (SPEC §4.9).
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 (SPEC §4.9 ; 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 (SPEC §4.9). 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 (SPEC §6.1 ; §9).
call "$ORACLE" "attestors()(address[])"
call "$ORACLE" "THRESHOLD()(uint256)"
[0xA1f05930f4998EFb1F4b030a86de33FD36Ca976b, 0xa9e4728892432600d41767De232FE2BbEa6e61bf, 0xDA589c4D83cC3f6f64a669ddD68968dc29eB8C11]
2
Qui les opère : au pilote, le builder, les trois sur une seule machine, avec le keeper (DEPLOY.md §1 ; §5). Le hash
rapporté dépend 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 (SPEC §6.2). En v2, deux machines distinctes, le quorum sur la plus
fiable, et le premier attestor remplacé par précaution (SPEC §12.1 points 1 et 2). En v3, cinq attestors extérieurs,
seuil de trois (SPEC §12.1 point 9).
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 (SPEC §4.4 ; §4.4 bis ; §4.6 ; lu on-chain : code du coffre). Le keeper, robot du builder, les
appelle. La prime de 1 % du pot, plafonnée à 25 millions de NAT, revient à qui règle le tirage,
quel qu'il soit (SPEC §4.8 ; lu on-chain : KEEPER_BOUNTY_BPS, KEEPER_BOUNTY_MAX_NAT). Si le robot s'arrête, le
protocole attend, rien n'est perdu (SPEC §12.1 point 2).
6. Où va l'argent
La commission se prend sur le pot après la prime du keeper (SPEC §4.6). 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 (SPEC §4.7 ; lu
on-chain : FEE_BPS_AFTER, FEE_SPLIT_*) ; la valeur en vigueur se lit avec feeBps(). En v2, 10 % dès le premier
tirage : 4 % pour les stakers de NAT, 3 % pour le trésor, 3 % pour le builder (SPEC §12.1 point 4). Les trois
destinataires sont figés dans le coffre, trésor et builder conservés en v2 (SPEC §12.1 point 3) :
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) ; un multisig pourra les
recevoir plus tard par simple transfert (SPEC §12.1 point 3). Détail des frais : page 4.
7. En une ligne
Contrats immuables. Bitcoin choisit. Les attestors rapportent. Tout le monde vérifie.