La trésorerie

Deux pour cent de chaque trade entrent dans le TreasuryVault du marché, en ressortent sous forme d'actions tokenisées, et sont airdroppés aux holders du token. Voici le trajet complet.

Les trois acteurs

Le trader ne fait rien de spécial : il achète ou il vend. La taxe est prélevée par le hook dans la même transaction.

Les contrats décident de tout. Le vault sait quel basket il doit détenir, à quelles bornes de prix il accepte d'échanger, et ce qu'il refuse. Aucune fonction ne change le basket. Les bornes de prix et le seuil de conversion sont des réglages de l'owner de StockFun depuis le 2026-10-05, lus en direct par chaque vault ; au-delà, seul un upgrade du vault par l'owner de StockFun peut changer ses règles.

Le keeper est un worker offchain qui ne fait que déclencher. Il choisit le moment, fixe le montant de chaque étape, et propose des routes et des montants minimaux, que le vault refuse s'ils sont plus lâches que sa propre borne de prix ; il ne choisit ni les actifs, ni la répartition du cash entre eux, ni les prix. Il ne peut ni détourner un actif, ni desserrer une borne, ni changer les poids du basket, ni choisir qui reçoit l'airdrop.

Le trajet

flowchart TD T[Trade sur le pool v4] -->|2 % de taxe| V[TreasuryVault du marché] V -->|ETH → USDC, Uniswap v4| U[USDC] U -->|USDC → USDG, Curve| G[USDG] G -->|OFT Paxos, LayerZero| R[Robinhood Chain] R --> M[Vault miroir du marché] M -->|achat sur pools secondaires| S[Actions tokenisées

NVDA · MSFT · GOOGL · SPY · QQQ] S -->|wrappées, vers Ethereum| AD[AirdropDistributor] AD -->|airdrop, 100 %, au prorata| H[Holders du token]

Chaque jambe est bornée par un oracle Chainlink indépendant : par défaut 50 points de base sur ETH → USDC, 200 points de base sur la jambe qui achète les actions. Le vault mesure ce qu'il reçoit réellement et refuse la transaction si le résultat reste sous le minimum du keeper, lui-même jamais plus lâche que la borne (depuis le 2026-10-05 ; jusque-là, sous la borne). Il ne fait confiance ni au keeper, ni au rail, ni au prix qu'on lui annonce.

Le seuil de conversion

Le vault ne convertit pas à chaque trade. Une fois toutes les 24 heures, juste avant l'airdrop, il convertit ce qu'il a accumulé — à condition que ce soit au moins 0,1 ETH, le seuil par défaut — et les actions achetées partent à l'airdrop une fois la séance du jour terminée. En dessous du seuil, le gas et le slippage mangeraient l'opération : rien ne se passe ce jour-là, et l'ETH attend le cycle suivant, même si des trades lui font franchir le seuil plus tard dans la journée. Le keeper le vérifie à son premier passage après la fermeture de la fenêtre de l'airdrop, 13:00 UTC par défaut ; il s'y tient depuis le 2026-10-06, et convertissait jusque-là l'ETH d'un vault à n'importe lequel de ses passages pendant la séance, dès que le vault détenait le seuil.

Le seuil par défaut est calibré pour qu'un marché qui a épuisé sa première bande de liquidité l'ait toujours franchi : à ce moment-là il a reçu environ 0,159 ETH, et il convertit au cycle quotidien suivant.

Depuis le 2026-10-01, chaque étape convertit un montant que fixe le keeper, jamais moins que le seuil sur l'étape ETH, au lieu du solde entier. Un vault qui a grandi au-delà de ce que sa place d'échange exécute dans la borne convertit par tranches, et le reste attend le cycle suivant. Jusque-là, un tel vault ne pouvait plus jamais convertir.

Les poids du basket

Le cash est mis de côté action par action, aux poids du basket, à mesure qu'il arrive. Chaque action ne dépense que sa propre part. Une action qui ne peut pas être achetée un jour donné, parce que son émetteur l'a gelée, que son feed s'est tu, que son pool est trop mince ou, depuis le 2026-10-06 sur Robinhood Chain, qu'elle traverse une opération sur titres qui met en pause l'oracle de son token, garde sa part pour un cycle suivant. Depuis le 2026-10-05, sa jambe échoue seule, avec l'événement LegFailed, et les autres actions sont achetées dans le même appel ; avant, une jambe qui échouait faisait échouer tout l'achat.

Depuis le 2026-10-01, le keeper ne peut donc pas changer la composition en sautant des actions. Avant, la part d'une action sautée était redivisée sur tout le basket.

Depuis le pipeline de sécurité du 2026-10-01, une urgence qui fait passer le cash d'un vault sous ce qui est réservé annule toutes les réservations : ce qui reste, et tout ce qui arrive ensuite, est réparti à nouveau aux poids. Voir Le mode urgence. À chaque achat, le keeper retient n−1 unités de la part de la dernière action, n étant le nombre d'actions ; elles restent réservées pour l'appel suivant. Voir Le keeper.

Ce que le vault peut contenir

À un instant donné, un vault détient un mélange de :

  • ETH — reçu, pas encore converti
  • USDC puis USDG — en cours de route vers la chaîne distante
  • Actions tokenisées — l'état final, sur Robinhood Chain

Les trois s'affichent comme la trésorerie en attente du prochain airdrop ; seules les actions sont distribuées, une fois achetées. Un vault plein d'USDC n'est pas un vault en panne, c'est un vault en transit.

Ce qui ne peut pas arriver

Personne ne peut retirer d'un vault. Pas de withdraw, pas de transfer, pas de sweep, pas d'owner : appeler ces fonctions échoue parce qu'elles n'existent pas.

Les actifs d'une trésorerie n'en sortent que de trois façons : la conversion en actions tokenisées, la remise de ces actions au contrat de l'airdrop pour les holders du token, et le mode urgence, par lequel l'owner de StockFun les déplace vers n'importe quelle adresse, aussitôt. Rien d'autre dans le code actuel ne peut les déplacer. Depuis le 2026-10-02, l'owner de StockFun peut upgrader le vault, avec effet immédiat : voir Modèle de confiance.

Deux contrats, en plus des vaults, détiennent les actifs du protocole pour plusieurs marchés à la fois : le contrat de l'airdrop et le hub distant. Depuis le 2026-10-05, après un transfert d'urgence hors de l'un d'eux, aucun marché n'est payé avec les actifs d'un autre, pas même avec des actifs arrivés pour un autre marché et pas encore crédités : ce qui manque attend le retour des actifs (restore ; un transfert simple ne compte pas), ou que l'owner de StockFun passe la perte sur le marché qui l'a subie. restore rembourse d'abord ce que le transfert a pris au-delà de ce qui couvrait les comptes, ces actifs-là appartenant à des livraisons pas encore créditées. Sur le hub distant, une urgence chargée à un seul marché solde ses comptes dans le même appel : aucun autre marché n'attend. Voir Le mode urgence.