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

# Mint cAROUSD

> Convert public test stablecoin into encrypted cAROUSD and step onto the confidential rail.

Minting converts public stablecoin into **cAROUSD** at 1:1; after a mint,
value that used to be visible on-chain becomes an encrypted balance. Minting
requires a **custodial wallet**: the sandbox signs the on-chain calls with the
wallet's key.

## Prerequisites

* A [custodial wallet](/concepts/wallets) with ETH for gas
  ([faucet](/guides/fund-a-wallet) covers this).
* In `backed` mode, the wallet must also hold enough public stablecoin to
  deposit. In `float` mode the operator mints directly, so a stablecoin
  balance in your wallet is not required. See
  [mint modes](/concepts/how-aropay-works#mint-modes-backed-vs-float).

## Make the call

```bash theme={null}
curl -s "$BASE/mint" \
  -H "Authorization: Bearer $KEY" \
  -H "content-type: application/json" \
  -d "{\"walletId\":\"$WALLET\",\"amount\":\"100\"}"
```

```json theme={null}
{
  "ok": true,
  "data": {
    "transaction": {
      "id": "cktxn0002…",
      "type": "MINT",
      "status": "CONFIRMED",
      "amount": "100.00",
      "token": "cAROUSD",
      "txHash": "0x51b7…",
      "explorerUrl": "https://sepolia.etherscan.io/tx/0x51b7…",
      "walletId": "ckwlt0001…",
      "createdAt": "2026-08-13T09:40:00.000Z",
      "updatedAt": "2026-08-13T09:40:52.000Z"
    }
  }
}
```

`amount` is a required decimal string in human units. The call blocks up to
\~90 seconds for the receipt; if it returns `PENDING`, poll
[`GET /transactions/{id}`](/guides/track-transactions) until terminal.

## What happens on-chain

<Tabs>
  <Tab title="Backed mode">
    1. Your wallet approves the commitment contract to spend the stablecoin.
    2. The wallet calls `commitDeposit`: stablecoin is locked in the
       commitment, and the equivalent cAROUSD is minted to the wallet as an
       encrypted amount.

    Every cAROUSD in circulation is collateralized by stablecoin held in the
    contract.
  </Tab>

  <Tab title="Float mode">
    The **operator** calls `confidentialMint` for your wallet with the
    encrypted amount. Your stablecoin balance is untouched; the operator's
    float backs redemptions instead.
  </Tab>
</Tabs>

Either way, the encryption of the minted amount happens **server-side**:
you send `"100"`, the sandbox produces the FHE ciphertext and proof.

## Verify

```bash theme={null}
curl -s "$BASE/balances?walletId=$WALLET" -H "Authorization: Bearer $KEY" \
  | jq '.data.balances[0] | {normal: .normal.amount, confidential: .confidential.amount}'
```

In backed mode you'll see `normal` decrease and `confidential` increase by the
minted amount; in float mode only `confidential` moves.

## Common failures

| Response          | Meaning                                                                                                                                                                                                                                       |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400` validation  | Missing/invalid `amount`, unknown wallet, external wallet, or insufficient stablecoin (backed mode).                                                                                                                                          |
| `502 mint_failed` | The on-chain call reverted. In float mode this usually means the operator is missing `ROLE_MINTER`; in backed mode, the stablecoin may not be allow-listed on the commitment. Platform-side; see [Troubleshooting](/support/troubleshooting). |

<Tip>
  The first confidential operation after a deployment restart fetches FHE keys
  and can be noticeably slower. Don't tune timeouts to that first call.
</Tip>

Next: [send a private transfer](/guides/send-transfers) or
[redeem back to stablecoin](/guides/redeem-carousd).
