counsel est transparent sur sa custody, mais pas trustless. Les pools résident dans des comptes par marché sécurisés par une SignerList multisig avec la master key désactivée, de sorte qu’aucune clé seule ne peut déplacer les fonds. Tout est on-chain et recalculable de façon indépendante.
1. Créer un marché (on-chain)
Un opérateur écrit un memo JSONcounsel/market/v1 sur un Payment vers le compte de registre. La définition inclut le compte de pool, les issues, la famille (A ou B), les paramètres de résolution et la politique d’annulation. Il n’y a pas de smart contract ni d’étape de déploiement : un marché est un enregistrement sur le ledger.
Le compte de pool est un compte XRPL propre à chaque marché. Sa master key est désactivée et une SignerList multisig le contrôle, de sorte que les mises ne peuvent quitter le pool qu’au travers de Payments signés par le comité.
2. Parier via un Payment XRP taggé
Pour placer un pari, vous envoyez un Payment XRP natif vers le compte de pool du marché, avec deux tags renseignés :L’index entier de l’issue que vous avez choisie (par exemple
0 pour la première issue, 1 pour la seconde). C’est ainsi que le compte de pool sait à quel pool d’issue appartient votre mise.Le tag d’attribution de counsel, fourni par l’UI ou le SDK. Il crédite le pari à counsel à des fins de classement et d’attribution.
Votre mise en drops XRP (1 XRP = 1 000 000 drops).
counsel/bet/v1) consignant l’ID du marché, l’index de l’issue et le libellé de l’issue, de sorte que chaque pari soit lisible de façon indépendante on-chain.
Vous signez ce Payment dans votre propre wallet (Xaman, GemWallet, Crossmark ou une clé de bot). counsel construit la transaction non signée et la renvoie. Il ne signe jamais à votre place et ne détient jamais de clé. C’est non custodial.
3. Le tableau parimutuel en direct
Dès qu’un pari arrive on-chain, counsel le lit depuis le ledger et recalcule les cotes de chaque issue. Le tableau parimutuel se met à jour en temps réel. Pour chaque issuek, les chiffres affichés sont :
| Champ | Formule |
|---|---|
implied_prob | outcome_drops / total_drops |
payout_per_unit | total_drops * (1 - fee_rate) / outcome_drops |
payout_per_unit correspond au montant indicatif en XRP renvoyé pour 1 XRP misé si cette issue gagne, après les frais.
Ces chiffres sont indicatifs tant que le marché est ouvert. Parce que counsel est un véritable marché parimutuel, chaque mise ultérieure déplace la ligne. La répartition est définitive au bet_cutoff, fixée par l’état du pool à la clôture. Il n’existe aucun moyen de verrouiller un prix observé avant la clôture.
4. Résoudre
Famille A : prix crypto (oracle)
Les marchés de prix crypto se résolvent automatiquement contre l’oracle de prix natif XLS-47. Aucun humain n’intervient dans la boucle de règlement.L'oracle publie un prix
Un objet
PriceOracle XLS-47 sur le XRP Ledger détient le dernier prix publié pour la paire d’actifs.Les paris ferment au bet_cutoff
Au
bet_cutoff, le pool est gelé. Tout Payment arrivant à ce timestamp ou après n’est pas compté comme une mise. La fermeture est appliquée d’après le timestamp du ledger, pas seulement d’après l’UI.Valeur de l'oracle lue au moment de la résolution
counsel lit la dernière valeur de l’oracle depuis le ledger et vérifie sa fenêtre de fraîcheur. Si la valeur de l’oracle est périmée, le marché est annulé (voir ci-dessous).
Famille B : monde réel (proposition, contestation, comité)
Les marchés du monde réel (résultats sportifs, issues de gouvernance, événements macro) se résolvent par une issue proposée par un opérateur, une fenêtre de contestation avec bond, et une finalisation par comité multisig.L'opérateur publie une proposition on-chain
Au moment de la résolution, l’opérateur publie un memo
counsel/proposal/v1 nommant l’issue proposée et les preuves à l’appui. Cette transaction lance le compte à rebours de contestation.La fenêtre de contestation s'ouvre
Pendant la fenêtre de contestation avec bond, tout compte XRPL peut contester la proposition en déposant un bond on-chain. Le montant du bond correspond à celui de l’opérateur.
Finalisation par le comité
Si la fenêtre de contestation se ferme sans contestation, l’opérateur règle. Si une contestation a été déposée, le comité multisig (une
SignerList sur le compte de pool) finalise par signature à supermajorité. Chaque signature ainsi que l’issue finale sont publiées on-chain.5. Payer
Les deux familles paient de la même manière. Les frais sont un forfait de 3 % (fee_rate, typiquement 0.03) prélevé sur l’ensemble du pool brut avant la répartition, jamais de façon sélective sur les gagnants. Le pool net est ensuite réparti sur le côté gagnant, au prorata de la mise de chaque gagnant.
counsel/payout/v1 consignant l’ID du marché, l’issue et la répartition. N’importe qui peut recalculer la répartition depuis le ledger et vérifier chaque payout. Le résidu d’arrondi issu de l’arithmétique entière en drops revient à la réserve de l’opérateur plutôt que de gonfler un payout individuel.
Annulation et remboursement (pools dégénérés)
Un marché est annulé et intégralement remboursé, sans frais, lorsque le pool est dégénéré :Pool à sens unique
Une seule issue a reçu des mises, il n’y a donc aucun côté adverse à payer.
Aucun gagnant
Aucune issue ne peut être déclarée gagnante au regard de la définition du marché.
Événement annulé
L’événement sous-jacent a été annulé, reporté ou s’est soldé par une égalité.
Oracle périmé
Aucune valeur d’oracle fraîche n’existe dans la fenêtre de fraîcheur (famille A).
Cycle de vie complet
Marché créé on-chain
L’opérateur écrit un memo
counsel/market/v1 sur un Payment vers le compte de registre, définissant le compte de pool, les issues, la famille, les paramètres de résolution et la politique d’annulation.Paris ouverts
Les utilisateurs envoient des Payments XRP taggés vers le compte de pool. counsel lit l’historique des transactions du compte de pool depuis le ledger et tient à jour en direct les pools d’issues et les cotes.
bet_cutoff atteint
Le pool se gèle. Toute mise arrivant au timestamp de fermeture ou après n’est pas comptée. La ligne de cotes finale est désormais fixée.
Résolution
Famille A : counsel lit l’oracle XLS-47 et publie l’issue on-chain. Famille B : l’opérateur publie une proposition, la fenêtre de contestation se déroule, et le comité multisigne l’issue finale.