
NFT Fractions Decentralized Exchange n’implémente pas le modèle AMM (automated market maker). Il utilise à la place l’ancien modèle de carnet d’ordres, ce qui signifie qu’il enregistre les ordres des commerçants et les compare les uns aux autres. Ceci est évidemment inefficace par rapport au modèle AMM mais est plus simple à mettre en œuvre. La bourse peut gérer les ordres à cours limité et les ordres de marché. Les ordres à cours limité sont définis pour être exécutés à un prix donné, tandis que les ordres de marché correspondent immédiatement aux meilleurs prix indépendamment du prix réel. Vous pouvez lire une explication plus longue ici.
Regardons le groupe de contrat Dex :

Le contrat de base garde une trace des structures de données nécessaires :
- Soldes ETH des commerçants
- Soldes ETH réservés des commerçants qui conservent le montant total ETH réservé actuellement dans les ordres de chaque commerçant
- Carnet de commandes contenant des structures de commande qui représentent des commandes individuelles. Les commandes sont organisées en deux compartiments : les commandes d’achat et de vente.
- Actions réservées qui conserve le nombre d’actions réservées dans les ordres par NFT et propriétaires
Remarque : L’ETH est désigné comme devise d’échange de contrepartie dans le contrat de base. En effet, les contrats sont déployés dans des chaînes compatibles EVM (BSC et Polygone), de sorte que l’ETH est traité comme une abstraction de BSC et Matic.
Les fonctions du contrat de base :
- Dépôt d’ETH et retrait d’ETH : pour gérer les dépôts et les retraits de devises au comptoir
- Créer un ordre limité : comme son nom l’indique, il crée un ordre limité dans le carnet d’ordres. Il tient le carnet de commandes organisé de la manière suivante :
– Les ordres d’achat sont conservés par ordre décroissant de leur prix.
– Pendant ce temps, les ordres de vente sont conservés par ordre croissant de leur prix.
C’est comme la façon dont nous pouvons voir les carnets d’ordres dans les échanges traditionnels. Il aide le mécanisme d’appariement des ordres du marché. - Créer un ordre au marché : il crée un ordre au marché et le compare automatiquement aux meilleurs ordres à cours limité. En fait, l’ordre au marché n’est même pas enregistré dans le carnet d’ordres, il est simplement comparé et exécuté contre des ordres limités.
Il existe deux simplifications par rapport aux échanges réels :
- Les ordres à cours limité ne sont pas comparés les uns aux autres, seuls les ordres au marché sont comparés aux ordres à cours limité.
- Après avoir comparé les ordres au marché aux ordres à cours limité, la partie restante et non exécutée de l’ordre au marché est perdue. Cela signifie qu’il n’est pas inscrit dans le carnet d’ordres puisque le carnet d’ordres ne contient actuellement que les ordres limités.
Les deux limitations empêchent ce modèle d’être utilisé dans n’importe quelle application réelle, mais rendent le modèle plus facile à mettre en œuvre pour le bien de l’expérience d’apprentissage.
La partie la plus complexe du contrat est la création d’ordres de marché et la comparaison avec des ordres à cours limité. Décomposons-le en points clés :
1. L’algorithme d’appariement s’exécute tant qu’il y a des ordres à apparier et que l’ordre au marché a une partie restante à apparier :
while (i < orders.length && remaining > 0)
2. Sur la base de la partie disponible de l’ordre à cours limité et de la partie restante de l’ordre au marché, le montant correspondant peut être calculé :
uint256 available = orders[i].amount — orders[i].filled;
uint256 matched = (remaining > available) ? available : remaining;
remaining = remaining — matched;
3. Il existe une différence entre les ordres de vente et d’achat en ce qui concerne la conservation des soldes et le transfert de la devise du commerce de contrepartie. L’idée générale peut être comprise avec l’exemple de l’exécution de l’ordre de vente :
nftFractionsRepository.transferFrom(
msg.sender,
orders[i].trader,
tokenId,
matched,
“”
);
ethBalance[msg.sender] += orders[i].price * matched;
ethBalance[orders[i].trader] -= orders[i].price * matched;
ethReservedBalance[orders[i].trader] -= orders[i].price * matched;
4. À la fin, lorsque l’algorithme de correspondance se termine, il y a une tâche de maintenance. Le carnet d’ordres doit être nettoyé des ordres entièrement exécutés. Étant donné que les éléments d’un tableau ne peuvent être insérés que dans Solidity (seul le dernier élément peut être supprimé), nous devons réorganiser le carnet de commandes pour contenir les éléments entièrement exécutés à la fin et les afficher :
while (i < orders.length && orders[i].filled == orders[i].amount) {
_onOrderRemoval(orders[i].id);
for (uint256 j = i; j < orders.length — 1; j++) {
orders[j] = orders[j + 1];
}
orders.pop();
i++;
}
Le contrat de base définit également des fonctions de hook pour accrocher des logiques aux points appropriés de l’exécution :
– Sur commande upsert (insertion/mise à jour)
– Enlèvement sur commande
– Sur l’exécution des transactions
– Sur changement de solde ETH
– Sur changement de solde réservé ETH
– Sur actions réservées changement de solde
Ces hooks ne sont implémentés que dans la version Polygon du contrat Dex : MaticDex
Il émet les événements correspondants à capturer par le Graph :
– Commande Upsert
– Retrait de commande
– NouveauCommerce
– EthBalanceChange
– EthReservedBalanceChange
– ActionsRéservéesBalanceChange
En revanche, la version BSC du contrat Dex expose les fonctions getter des structures de données internes :
– Obtenir des commandes
– Obtenez le solde ETH
– Obtenez le solde réservé ETH
– Obtenez le solde des actions réservées
Ils répondent aux besoins en données de l’interface utilisateur d’affichage et d’exécution des commandes.
Dans la section suivante, nous détaillerons le pont.
Si vous souhaitez accéder à d’autres articles de la série, vous pouvez trouver des liens dans l’article principal.
Ou si vous souhaitez voir mes autres projets et contributions :
https://www.szabolcsszentes.com/
Rejoignez Coinmonks Telegram Channel et Youtube Channel pour en savoir plus sur le trading et l’investissement crypto