> For the complete documentation index, see [llms.txt](https://vaultbook.gauntlet.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vaultbook.gauntlet.xyz/fr/vaults/gauntlet-usd-alpha-vault/how-to-integrate-with-gauntlet-usd-alpha.md).

# Comment intégrer Gauntlet USD Alpha

[gtUSDa](https://basescan.org/address/0x000000000001CdB57E58Fa75Fe420a0f4D6640D5) est l'ERC20 de notre vault phare de stablecoin sur Base, Arbitrum, Optimism et Ethereum Mainnet, qui peut être intégré à d'autres applications DeFi. Voici un guide d'intégration de base pour intégrer gtUSDa à votre protocole ou application.

{% hint style="info" %}
**gtUSDa est un ERC20 transférable sur Base, Arbitrum, Optimism et Ethereum Mainnet.**
{% endhint %}

Nous avons également un frontend dédié pour approvisionner ce vault à [app.gauntlet.xyz/vaults/gtusda](https://app.gauntlet.xyz/vaults/gtusda).

### Adresses des contrats

**Adresses du vault gtUSDa**

* `0x000000000001CdB57E58Fa75Fe420a0f4D6640D5` (contrat gtUSDa sur Base)
* `0x3bd9248048df95Db4fBD748C6CD99C1bAa40bAD0` (contrat gtUSDa sur Ethereum)
* `0x000000001DC8bd45d7E7829fb1c969cbe4D0D1eC` (contrat gtUSDa sur Arbitrum)
* `0x000000001DC8bd45d7E7829fb1c969cbe4D0D1eC` (contrat gtUSDa sur Optimism)

**Adresses des jetons**

* `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` (contrat USDC sur Base)
* `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` (contrat USDC sur Ethereum Mainnet)
* `0xaf88d065e77c8cC2239327C5EDb3A432268e5831` (contrat USDC sur Arbitrum)
* `0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85` (contrat USDC sur Optimism)

**Adresses du provisioner**

* `0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07` (contrat provisioner sur Base)
* `0x74C4A66CE4F4779B11E7c63D42e51EEef3A80D11` (contrat provisioner sur Ethereum)
* `0xDd4a42603E6d8E515C3468789375A98c376821b3` (contrat provisioner sur Arbitrum)
* `0xCC923371F0d3A9cA75d98E767Df9dE1cdf5799Ef` (contrat provisioner sur Optimism)

{% hint style="info" %}
Remarque : tous les exemples ci-dessous sont exécutés sur Base.
{% endhint %}

### Approvisionnement via des appels de contrat

Approvisionner dans gtUSDa est une combinaison de 2 appels de fonction : un `approve` appel pour dépenser l'USDC, et un `requestDeposit` appel.

1. appel [`approve`](https://basescan.org/token/0x833589fcd6edb6e08f4c7c32d4f71b54bda02913#writeProxyContract#F1) sur le contrat USDC pour autoriser que le montant d'USDC soit dépensé par le [contrat provisioner](https://basescan.org/address/0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07)
   1. Notez qu'il ne s'agit pas du contrat vault lui-même, car la demande passe par le provisioner pour émettre des unités vault de manière asynchrone via un mécanisme de résolution (voir [https://docs.aera.finance/entry-exit-with-provisioner](https://docs.aera.finance/entry-exit-with-provisioner "mention") pour plus de détails)
2. [`requestDeposit`](https://basescan.org/address/0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07#writeContract#F7) . `requestDeposit` est une opération asynchrone, l'utilisateur enverra l'USDC au provisioner et, une fois la demande résolue, des unités gtUSDa seront renvoyées directement au portefeuille de l'utilisateur. Cela se produit généralement en moins de 6 heures, mais peut prendre jusqu'à 3 jours (ou selon la deadline). Voir [https://docs.aera.finance/entry-exit-with-provisioner](https://docs.aera.finance/entry-exit-with-provisioner "mention") pour plus de détails
   1. jeton : `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` (contrat USDC sur Base)
   2. tokensIn : montant d'USDC entrant (valeur ajustée en décimales)
   3. minUnitsOut : ce paramètre doit être basé sur le prix actuel de gtUSDa. Pour le calculer, référez-vous au [PriceAndFeeCalculator](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#code) contrat, en particulier l'appel de fonction [`convertTokenToUnits`](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#readContract#F4) .
      1. `convertTokenToUnits(0x000000000001CdB57E58Fa75Fe420a0f4D6640D5, 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, tokensIn)` -> Renvoie les unités gtUSDa ajustées en décimales.
      2. Multipliez la valeur ci-dessus par 0.97 (une marge de sécurité en cas de variation de prix)
   4. solverTip : `0`
   5. deadline : `block.timestamp + 259200` (3 jours en secondes)
   6. maxPriceAge : `3600` (1 heure en secondes)
   7. isFixedPrice : `False`

{% hint style="info" %}
`minUnitsOut` n'est techniquement pas requis pour les ordres à prix automatique si le prix du vault est fiable, mais il est fortement recommandé pour des raisons de sécurité.\
\
Veuillez ne pas inclure un `solverTip` car le solver ne résoudra pas ces requêtes.\
\
Veuillez ne pas inclure une deadline trop longue, car les ordres non exécutables ne peuvent pas être remboursés avant la `deadline`.
{% endhint %}

#### Exemple de demande pour déposer 1000 USDC

Appeler [`approve`](https://basescan.org/token/0x833589fcd6edb6e08f4c7c32d4f71b54bda02913#writeProxyContract#F1) sur le contrat USDC de Base pour autoriser le provisioner à dépenser

```
approve(
    0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07, // Adresse du contrat provisioner 
    1000000000 // Montant USDC ajusté en décimales
)
```

appel [`requestDeposit`](https://basescan.org/address/0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07#writeContract#F7) sur le provisioner, paramétrer cet appel est important

```
requestDeposit(
    0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, // contrat USDC sur Base
    1000000000, // Montant USDC ajusté en décimales
    0.97 * convertTokensToUnit(0x000000000001CdB57E58Fa75Fe420a0f4D6640D5, 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, 1000000000), // minUnitsOut voir ci-dessus pour plus de détails
    0, // solverTip
    block.timestamp + 259200, // deadline : définir au moins 3 jours, soit 3 jours en secondes
    3600, // maxPriceAge : définir à 1 heure, 1 heure en secondes
    False // isFixedPrice
)
```

### Retrait via des appels de contrat

Pour retirer, vous devez de la même manière faire un `approve` appel suivi de `requestRedeem` sur le [contrat Provisioner](https://basescan.org/address/0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07) avec les paramètres corrects.

1. appel [`approve`](https://basescan.org/address/0x000000000001CdB57E58Fa75Fe420a0f4D6640D5#writeContract#F2) sur le contrat gtUSDa pour autoriser que le montant gtUSDa soit dépensé par le [contrat provisioner](https://basescan.org/address/0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07)
2. [`requestRedeem`](https://basescan.org/address/0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07#writeContract#F8) C'est également un appel asynchrone où l'utilisateur renvoie les vaultUnits au contrat Provisioner et, une fois la requête résolue, l'utilisateur recevra de l'USDC dans son portefeuille
   1. jeton : `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` (contrat USDC sur Base)
   2. unitsIn : le montant d'unités de vault que vous souhaitez racheter, correctement ajusté en décimales. Si vous voulez calculer le `unitsIn` sur la base de la valeur USDC pour l'utilisateur, vous pouvez à nouveau utiliser la [`convertTokenToUnits`](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#readContract#F4) fonction sur le [PriceAndFeeCalculator](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#code) contrat, comme pour l'appel de dépôt.
   3. minTokensOut : ce paramètre doit être basé sur le prix actuel de gtUSDa. Pour le calculer, référez-vous au [PriceAndFeeCalculator](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#code) contrat, en particulier l'appel de fonction [`convertUnitsToToken`](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#readContract#F7) fonction.
      1. `convertUnitsToToken(0x000000000001CdB57E58Fa75Fe420a0f4D6640D5, 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, unitsIn)` -> Renvoie la valeur USDC ajustée en décimales des VaultUnits
      2. Multipliez la valeur ci-dessus par 0.97 (une marge de sécurité en cas de variation de prix)
   4. solverTip : `0`
   5. deadline : `block.timestamp + 259200` (3 jours en secondes)
   6. maxPriceAge : `3600` (1 heure en secondes)
   7. isFixedPrice : `False`

{% hint style="info" %}
`minTokensOut` n'est techniquement pas requis pour les ordres à prix automatique si le prix du vault est fiable, mais il est fortement recommandé pour des raisons de sécurité.\
\
Veuillez ne pas inclure un `solverTip` car le solver ne résoudra pas ces requêtes.\
\
Veuillez ne pas inclure une deadline trop longue, car les ordres non exécutables ne peuvent pas être remboursés avant la `deadline`.
{% endhint %}

#### Exemple de demande pour retirer 1000 USDC

appel [`approve`](https://basescan.org/address/0x000000000001CdB57E58Fa75Fe420a0f4D6640D5#writeContract#F2) sur le contrat gtUSDa pour autoriser le provisioner à dépenser

```
approve(
    0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07, // Adresse du contrat provisioner 
    convertTokensToUnit(0x000000000001CdB57E58Fa75Fe420a0f4D6640D5, 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, 1000000000) // montant gtUSDa ajusté en décimales
)
```

appel [`requestRedeem`](https://basescan.org/address/0x18CF8d963E1a727F9bbF3AEffa0Bd04FB4dBdA07#writeContract#F8) sur le provisioner, paramétrer cet appel est important

```
requestRedeem(
    0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, // jeton : contrat USDC sur Base
    convertTokensToUnit(0x000000000001CdB57E58Fa75Fe420a0f4D6640D5, 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, 1000000000), // unitsIn : 1000 USDC via le calculateur PriceAndFee
    0.97 * convertUnitsToToken(0x000000000001CdB57E58Fa75Fe420a0f4D6640D5, 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, unitsIn), // minTokensOut : unitsIn est la réponse de la ligne précédente
    0, // solverTip
    block.timestamp + 259200, // deadline : définir au moins 3 jours, soit 3 jours en secondes
    3600, // maxPriceAge : définir à 1 heure, soit 1 heure en secondes
    False // isFixedPrice
)
```

### \[AVANCÉ] Surveillance et remboursement des ordres

**Suivi des ordres**

Lorsqu'un ordre asynchrone est placé, l'utilisateur aura un ordre actif mais non exécuté. Pour offrir plus de transparence aux utilisateurs, ces ordres peuvent être surveillés en suivant les `DepositRequested` ou `RedeemRequested` événements :

```
/// @notice Émis lorsqu'un utilisateur crée une demande de dépôt
/// @param user L'adresse qui demande le dépôt
/// @param token Le jeton déposé
/// @param tokensIn Le montant de jetons à déposer
/// @param minUnitsOut Le montant minimum d'unités attendu
/// @param solverTip Le pourboire offert au solver en termes de jeton de dépôt
/// @param deadline Horodatage jusqu'auquel la requête est valide
/// @param maxPriceAge Âge maximal des données de prix que le solver peut utiliser
/// @param isFixedPrice Indique si la requête est à prix fixe
/// @param depositRequestHash Le hachage de la demande de dépôt
event DepositRequested(
    address indexed user,
    IERC20 indexed token,
    uint256 tokensIn,
    uint256 minUnitsOut,
    uint256 solverTip,
    uint256 deadline,
    uint256 maxPriceAge,
    bool isFixedPrice,
    bytes32 depositRequestHash
);

/// @notice Émis lorsqu'un utilisateur crée une demande de rachat
/// @param user L'adresse demandant le rachat
/// @param token Le jeton demandé en échange des unités
/// @param minTokensOut Le montant minimum de jetons que l'utilisateur s'attend à recevoir
/// @param unitsIn Le montant d'unités en cours de rachat
/// @param solverTip Le pourboire offert au solver en termes de jeton de rachat
/// @param deadline L'horodatage jusqu'auquel cette requête est valide
/// @param maxPriceAge Âge maximal des données de prix que le solver peut utiliser
/// @param isFixedPrice Indique si la requête est à prix fixe
/// @param redeemRequestHash Le hachage de la demande de rachat
event RedeemRequested(
    address indexed user,
    IERC20 indexed token,
    uint256 minTokensOut,
    uint256 unitsIn,
    uint256 solverTip,
    uint256 deadline,
    uint256 maxPriceAge,
    bool isFixedPrice,
    bytes32 redeemRequestHash
);
```

**Vérification du moment où les ordres sont exécutés**

Lorsqu'un dépôt ou un rachat est exécuté, l'un des événements suivants sera émis dans le Provisioner :

```
/// @notice Émis lorsqu'une demande de dépôt est résolue avec succès
/// @param depositHash L'identifiant unique de la demande de dépôt résolue
event DepositSolved(bytes32 indexed depositHash);

/// @notice Émis lorsqu'une demande de rachat est résolue avec succès
/// @param redeemHash L'identifiant unique de la demande de rachat résolue
event RedeemSolved(bytes32 indexed redeemHash);
```

**Remboursement des ordres expirés**

Si la deadline est dépassée mais qu'un ordre n'est pas résolu (rare), l'utilisateur doit récupérer ses USDC ou ses jetons gtUSDa en utilisant le `refundRequest` fonction.

```
/// @notice Paramètres de requête pour les dépôts et les rachats
/// @dev
/// - Pour les dépôts :
///   - units : unités minimales que l'utilisateur souhaite recevoir (minUnitsOut)
///   - tokens : montant de jetons que l'utilisateur fournit (tokensIn)
/// - Pour les rachats :
///   - units : montant d'unités que l'utilisateur rachète (unitsIn)
///   - tokens : montant minimal de jetons que l'utilisateur souhaite recevoir (minTokensOut)
struct Request {
    /// @notice Type de requête (dépôt/rachat + prix auto/fixe)
    RequestType requestType;
    /// @notice Adresse de l'utilisateur qui effectue la requête
    address user;
    /// @notice Montant d'unités de vault
    uint256 units;
    /// @notice Montant de jetons sous-jacents
    uint256 tokens;
    /// @notice Pourboire payé au solver, toujours en jetons
    uint256 solverTip;
    /// @notice Horodatage après lequel la requête expire
    uint256 deadline;
    /// @notice Âge maximal autorisé des données de prix
    uint256 maxPriceAge;
}

/// @notice Rembourser une demande de dépôt ou de rachat expirée
/// @param token Le jeton concerné par la requête
/// @param request La requête à rembourser
/// @dev Peut uniquement être appelé après le dépassement de la deadline de la requête
function refundRequest(IERC20 token, Request calldata request) external;
```

### Obtenir le solde gtUSDa de l'utilisateur

Appelez simplement la fonction [balanceOf](https://basescan.org/address/0x000000000001CdB57E58Fa75Fe420a0f4D6640D5#readContract#F5) sur [gtUSDa](https://basescan.org/address/0x000000000001CdB57E58Fa75Fe420a0f4D6640D5) avec l'adresse de l'utilisateur.

### Tarification des unités gtUSDa en USDC (et inversement)

Nous fournissons de simples utilitaires de conversion de prix entre gtUSDa et USDC via le [PriceAndFeeCalculator](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e) contrat.

Plus précisément, il y a deux fonctions pertinentes

* [`convertTokensToUnits`](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#readContract#F4) -> Prend une valeur USDC et renvoie le montant d'unités vault au prix actuel
  * vault : `0x000000000001CdB57E58Fa75Fe420a0f4D6640D5` (contrat vault gtUSDa)
  * jeton : `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` (contrat USDC sur Base)
  * tokenAmount : valeur USDC ajustée en décimales (USDC a [6 décimales](https://basescan.org/token/0x833589fcd6edb6e08f4c7c32d4f71b54bda02913#readProxyContract#F11))
* [`convertUnitsToTokens`](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#readContract#F7) -> Prend des vaultUnits et renvoie la valeur USDC au prix actuel
  * vault : `0x000000000001CdB57E58Fa75Fe420a0f4D6640D5` (contrat vault gtUSDa)
  * jeton : `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` (contrat USDC sur Base)
  * unitsAmount : valeur gtUSDa ajustée en décimales (gtUSDa a [18 décimales](https://basescan.org/address/0x000000000001CdB57E58Fa75Fe420a0f4D6640D5#readContract#F7))

### Récupération de l'APY du vault

Cela est un peu plus délicat pour le moment, mais nous visons à simplifier cela à l'avenir via une API. Pour l'instant, la meilleure façon d'obtenir l'APY du vault est d'indexer le prix des unités du vault en USDC sur une période donnée et d'extrapoler cela en un APY annuel.

### Calcul du TVL du vault

Pour obtenir le TVL total du vault, utilisez la fonction [`convertUnitsToTokens`](https://basescan.org/address/0x69dD4D44eed6BbC33B8A0bdFe17897Ab9044372e#readContract#F7) et utilisez le [`totalSupply`](https://basescan.org/address/0x000000000001CdB57E58Fa75Fe420a0f4D6640D5#readContract#F21) de gtUSDa comme entrée.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://vaultbook.gauntlet.xyz/fr/vaults/gauntlet-usd-alpha-vault/how-to-integrate-with-gauntlet-usd-alpha.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
