Marchés et ordres
Un marché ZooBC est un carnet d’ordres pour une paire d’actifs, tenu et apparié par la chaîne elle-même. Chaque nœud applique les mêmes règles d’appariement lorsqu’une transaction d’ordre est appliquée : chaque nœud aboutit donc aux mêmes exécutions, aucun opérateur ne détient les fonds des négociants, et personne ne peut réordonner le carnet. N’importe qui peut ouvrir un marché, et un marché actif paie son propre loyer.
Ouvrir un marché
Un marché est une paire (base, cotation) : par exemple un jeton, l’actif de base, coté en ZBC, l’actif de cotation. La paire est ordonnée : (A, B) et (B, A) sont donc deux marchés différents. Les deux actifs doivent avoir 8 décimales (voir les décimales et le pas).
CreateMarket (type 21) coûte market_creation_cost, soit 50 ZBC sur le mainnet. Ce coût devient le dépôt de loyer du marché (voir plus bas).
Placer un ordre
Un PlaceOrder (type 22) indique le marché, un sens (achat ou vente), un prix limite, un montant, des options (flags) et une expiration facultative. Les options peuvent en faire un ordre au marché (exécution immédiate ou annulation) ou un ordre post-only.
Les prix s’expriment en unités atomiques de cotation par unité atomique de base, multipliées par 10⁸. Un prix de 1,015 ZBC par jeton s’écrit donc 101 500 000.
Lorsqu’un bloc applique l’ordre :
- L’ordre bloque ce qu’il peut dépenser : un ordre de vente bloque son montant de base ; un ordre d’achat bloque montant × prix ÷ 10⁸ de l’actif de cotation.
- Il s’apparie aussitôt avec les ordres en attente de l’autre côté, au meilleur prix d’abord et, à prix égal, l’id de transaction le plus petit en premier. Chaque exécution se fait au prix de l’ordre en attente, et non à la limite du preneur.
- Ce qui n’est pas exécuté reste dans le carnet, sauf pour un ordre au marché, dont le reliquat est remboursé.
Chaque produit est arrondi vers le bas en arithmétique 128 bits, de sorte que chaque nœud calcule exactement les mêmes exécutions.
Deux règles gardent les carnets d’ordres propres : la valeur en cotation d’un ordre doit être d’au moins 2 500 000 unités atomiques (0,025 de l’actif de cotation), et un preneur n’est jamais exécuté contre son propre ordre en attente.
Les frais de preneur
Seul le preneur paie des frais de négociation : exchange_taker_fee_bps, 10 points de base (0,1 %) sur le mainnet, prélevés sur l’actif que reçoit le preneur (l’actif de base pour un achat, l’actif de cotation pour une vente) et versés au producteur du bloc. Dans l’exemple ci-dessus, 0,3 des 300 jetons reçus vont au producteur. Le taux est un paramètre de la chaîne qui peut aller de 1 à 100 points de base. Les apporteurs (makers) ne paient aucuns frais de négociation, et le créateur du marché n’en touche aucune part.
Les frais de preneur sont distincts des frais de transaction. Les frais de PlaceOrder et de CancelOrder sont des frais ordinaires, qui vont à la loterie coinbase. Lorsque le producteur du bloc n’est pas encore mature (voir la maturité et les gains), les frais de preneur qui lui reviendraient vont eux aussi à la loterie coinbase.
Annulation et expiration
CancelOrder (type 23) permet à l’apporteur, et à lui seul, de retirer un ordre en attente ; ce qui reste de son blocage lui revient. Un ordre en attente doté d’une expiration expire au début d’un bloc, d’après l’horodatage du bloc précédent.
Le loyer d’un marché
Un marché occupe l’état de la chaîne ; il paie donc un loyer, comme tout ce qui l’occupe :
- le coût de création de 50 ZBC est un dépôt qui prépaie 12 périodes de loyer ; chaque période de 172 800 blocs (30 jours) en prélève un douzième, environ 4,17 ZBC, au profit du fonds de longévité ;
- chaque PlaceOrder et chaque CancelOrder ajoute au dépôt 20 % de ses propres frais, en plus de ces frais, jusqu’à un dépôt de 24 périodes : ce sont ainsi les ordres eux-mêmes qui maintiennent financé un marché actif ;
- un marché qui ne peut pas payer une période, ou dont l’un des actifs a expiré, est élagué : ses ordres en attente sont remboursés à leurs apporteurs, le reste du dépôt va au fonds de longévité, et la paire peut être rouverte plus tard.
ZooBC n’a pas de pools de teneur de marché automatisé : chaque échange se fait entre des ordres que des personnes placent. Pour un échange ponctuel entre deux actifs quelconques, y compris des jetons à moins de 8 décimales, voir les offres d’échange.