> ## Documentation Index
> Fetch the complete documentation index at: https://docs.counsel.markets/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK counsel-js : référence complète des méthodes et types TypeScript

> Référence complète des méthodes de la classe Counsel : constructeur, markets, betIntent, placeBet, positions, leaderboard, et toutes les interfaces TypeScript.

Cette page documente chaque méthode de la classe `Counsel` exportée depuis `counsel.ts`. Chaque méthode correspond à un seul endpoint de l'API publique de counsel. Toutes les méthodes sont asynchrones et lèvent une exception sur les réponses non `2xx`. La méthode `placeBet` lève également une exception si le XRP Ledger renvoie un résultat autre que `tesSUCCESS`.

## Interfaces

Les interfaces TypeScript suivantes sont exportées directement depuis `counsel.ts`. Importez-les avec la classe pour accéder de façon typée aux valeurs de retour.

### `CounselOptions`

```typescript theme={null}
export interface CounselOptions {
  /** Base URL of a counsel deployment, e.g. https://api.counsel.markets */
  baseUrl: string;
  /** XRPL node to submit on (testnet by default). */
  wss?: string;
}
```

### `BetIntent`

```typescript theme={null}
export interface BetIntent {
  tx: Payment;
  pool_account: string;
  destination_tag: number;
  source_tag: number;
  amount_xrp: number;
  projected_implied_odds_after: { implied_prob: number; payout_per_unit: number | null };
  market: { id: string; question: string; outcome: number; outcome_label: string };
}
```

`Payment` est le type de transaction non signée du paquet `xrpl`. `tx` est passé directement à `client.autofill()` et `wallet.sign()` à l'intérieur de `placeBet`.

***

## `constructor(opts: CounselOptions)`

Instancie le client. Aucune connexion réseau n'est établie au moment de la construction.

<ParamField path="baseUrl" type="string" required>
  URL de base du déploiement de counsel. Utilisez `https://api.counsel.markets` pour l'instance hébergée.
</ParamField>

<ParamField path="wss" type="string">
  URL du noeud WebSocket XRPL utilisé par `placeBet` lors de la connexion au ledger. Par défaut, le testnet XRPL (`wss://s.altnet.rippletest.net:51233`).
</ParamField>

```typescript theme={null}
const counsel = new Counsel({
  baseUrl: "https://api.counsel.markets",
  wss: "wss://xrplcluster.com", // omit to use testnet
});
```

***

## `markets()`

```typescript theme={null}
markets(): Promise<{ markets: MarketV1[], source_tag: number | null }>
```

Récupère tous les marchés publics, y compris la taille en direct des pools, les probabilités implicites par issue, et la phase courante. Utilisez cette méthode pour découvrir les marchés ouverts et lire les cotes indicatives avant de placer un pari.

Les champs de `MarketV1` incluent : `id`, `question`, `family`, `phase`, `status` (`"open" | "resolved" | "void"`), `pool_account`, `fee_rate`, `bet_cutoff`, `resolution_time`, `total_xrp`, `total_drops`, et un tableau `outcomes`.

Chaque issue dans `outcomes` porte : `index`, `label`, `destination_tag`, `pool_drops`, `pool_xrp`, `bets`, `implied_prob`, et `payout_per_unit`.

**Retourne**

<ResponseField name="markets" type="MarketV1[]">
  Tableau de tous les marchés actuellement suivis par l'indexeur de counsel.
</ResponseField>

<ResponseField name="source_tag" type="number | null">
  Le SourceTag que counsel attend sur toutes les transactions Payment. Appliqué automatiquement par `placeBet`.
</ResponseField>

```typescript theme={null}
const { markets } = await counsel.markets();
const open = markets.filter(m => m.status === "open");
```

***

## `market(id: string)`

```typescript theme={null}
market(id: string): Promise<Record<string, unknown>>
```

Récupère un marché unique par son ID. Retourne l'objet marché complet, y compris tous les pools d'issues et les métadonnées de résolution.

<ParamField path="id" type="string" required>
  L'ID du marché, une chaîne hexadécimale telle que `"9b6a290b0cc8c5be"`.
</ParamField>

**Retourne**

<ResponseField name="(root)" type="Record<string, unknown>">
  L'objet marché brut. La forme correspond à une seule entrée du tableau de `markets()`.
</ResponseField>

```typescript theme={null}
const m = await counsel.market("9b6a290b0cc8c5be");
```

***

## `betIntent(id, account, outcome, amountXrp)`

```typescript theme={null}
betIntent(
  id: string,
  account: string,
  outcome: number,
  amountXrp: number
): Promise<BetIntent>
```

Récupère une intention de pari non signée pour l'issue et la mise spécifiées. Le serveur calcule les cotes projetées après ajout de votre mise au pool, ce qui vous permet de vérifier le slippage avant de signer. Aucune transaction n'est soumise ; rien n'est envoyé au ledger à ce stade.

<ParamField path="id" type="string" required>
  ID du marché.
</ParamField>

<ParamField path="account" type="string" required>
  Votre adresse XRPL (par exemple `"rYourAddress..."`). Utilisée comme champ `Account` dans le `Payment` non signé.
</ParamField>

<ParamField path="outcome" type="number" required>
  Index (base zéro) de l'issue sur laquelle vous voulez parier. Correspond à `OutcomeV1.index` dans le tableau `outcomes` du marché.
</ParamField>

<ParamField path="amountXrp" type="number" required>
  Mise en XRP (pas en drops). Par exemple, `5` signifie 5 XRP.
</ParamField>

**Retourne**

<ResponseField name="tx" type="Payment">
  Transaction Payment XRPL non signée. À passer à `client.autofill()` puis `wallet.sign()`.
</ResponseField>

<ResponseField name="pool_account" type="string">
  L'adresse XRPL du compte pool du marché (la destination du Payment).
</ResponseField>

<ResponseField name="destination_tag" type="number">
  Le DestinationTag identifiant l'issue sur le compte pool.
</ResponseField>

<ResponseField name="source_tag" type="number">
  Le SourceTag que counsel requiert pour l'attribution. Déjà intégré dans `tx`.
</ResponseField>

<ResponseField name="amount_xrp" type="number">
  Mise confirmée en XRP telle que le serveur l'a interprétée.
</ResponseField>

<ResponseField name="projected_implied_odds_after" type="object">
  Cotes parimutuel pour cette issue une fois votre mise incluse.

  <ResponseField name="implied_prob" type="number">
    Probabilité implicite (0-1) de cette issue après votre mise.
  </ResponseField>

  <ResponseField name="payout_per_unit" type="number | null">
    Payout net par XRP misé si cette issue gagne, après frais. `null` si le pool serait nul.
  </ResponseField>
</ResponseField>

<ResponseField name="market" type="object">
  Résumé compact du marché pour l'affichage ou la journalisation.

  <ResponseField name="id" type="string">ID du marché.</ResponseField>
  <ResponseField name="question" type="string">Question du marché, lisible par un humain.</ResponseField>
  <ResponseField name="outcome" type="number">Index de l'issue sur laquelle vous avez parié.</ResponseField>
  <ResponseField name="outcome_label" type="string">Libellé lisible de l'issue.</ResponseField>
</ResponseField>

```typescript theme={null}
const intent = await counsel.betIntent(
  "9b6a290b0cc8c5be",
  "rYourAddress",
  0,    // outcome index
  5,    // XRP
);
console.log("implied prob after bet:", intent.projected_implied_odds_after.implied_prob);
console.log("payout per XRP if win:", intent.projected_implied_odds_after.payout_per_unit);
```

***

## `positions(address: string)`

```typescript theme={null}
positions(address: string): Promise<{ account: string, positions: unknown[] }>
```

Récupère toutes les positions ouvertes et réglées pour l'adresse XRPL donnée.

<ParamField path="address" type="string" required>
  L'adresse XRPL à interroger. Doit être une adresse r valide.
</ParamField>

**Retourne**

<ResponseField name="account" type="string">
  L'adresse qui a été interrogée.
</ResponseField>

<ResponseField name="positions" type="unknown[]">
  Tableau d'objets position, un par pari placé par l'adresse. Chaque entrée inclut le marché, l'issue, la mise, et l'état de règlement.
</ResponseField>

```typescript theme={null}
const { positions } = await counsel.positions("rYourAddress");
console.log(`${positions.length} positions found`);
```

***

## `leaderboard()`

```typescript theme={null}
leaderboard(): Promise<Record<string, unknown>>
```

Récupère le classement global, ordonnant les participants par volume ou par profit sur l'ensemble des marchés résolus.

**Retourne**

<ResponseField name="(root)" type="Record<string, unknown>">
  La charge utile du classement. Le schéma peut évoluer ; traitez-la comme un objet brut tant qu'une forme stable n'est pas publiée.
</ResponseField>

```typescript theme={null}
const lb = await counsel.leaderboard();
```

***

## `placeBet(seed, id, outcome, amountXrp)`

```typescript theme={null}
placeBet(
  seed: string,
  id: string,
  outcome: number,
  amountXrp: number
): Promise<string>
```

Helper de bout en bout : récupère une intention de pari, la signe localement avec `Wallet.fromSeed(seed)`, complète automatiquement les champs de séquence du ledger via `client.autofill()`, signe avec `wallet.sign()`, soumet avec `client.submitAndWait()`, et vérifie `tesSUCCESS` avant de retourner. Ouvre une connexion WebSocket XRPL pour la durée de l'appel, puis se déconnecte. Le seed n'est jamais envoyé au serveur counsel.

<ParamField path="seed" type="string" required>
  Le seed du wallet XRPL du parieur. Passé à `Wallet.fromSeed()` entièrement côté client. Seule l'adresse `account` dérivée est envoyée à l'API counsel.
</ParamField>

<ParamField path="id" type="string" required>
  ID du marché.
</ParamField>

<ParamField path="outcome" type="number" required>
  Index de l'issue (base zéro).
</ParamField>

<ParamField path="amountXrp" type="number" required>
  Mise en XRP.
</ParamField>

**Retourne**

<ResponseField name="(root)" type="string">
  Le hash de transaction validé renvoyé par le ledger (`res.result.hash`), confirmé `tesSUCCESS`.
</ResponseField>

```typescript theme={null}
const hash = await counsel.placeBet(
  process.env.BOT_SEED!,
  "9b6a290b0cc8c5be",
  0,   // outcome
  5,   // XRP
);
console.log("validated tx:", hash);
```

<Warning>
  `placeBet` lève une exception si le ledger renvoie un résultat autre que `tesSUCCESS`. Le message d'erreur inclut le code de résultat du ledger (par exemple `"ledger rejected: tecUNFUNDED_PAYMENT"`). Gérez ce cas dans les bots de production : solde insuffisant, conflits de séquence, et autres erreurs du ledger remontent tous ici.
</Warning>
