BRS (BRL stablecoin)

BRS is a 1:1 Real-backed stablecoin on Solana. How users get it, how to move it, and how to pay PIX from it.

BRS is Nora Finance's Brazilian Real stablecoin: minted 1:1 against BRL, fully reserved with public attestations, issued by licensed and KYB-verified minters. It lives on Solana only today.

FieldValue
Peg1 BRS = R$ 1,00
Networksolana
MintBRSxQRUaGswjLs7ewcH7uXj3r7SgmfKSSLLXyCKHZtUo
Decimals6
Minimum per mintR$ 5,00
Flag requiredNORA_RAIL (per account)

Always match BRS by mint address, never by symbol. An unrelated token also called BRS exists on Solana; a symbol lookup can read the wrong balance.

The three rules

  1. 1:1, no spread on the mint. Pay R$ 100 → receive 100 BRS. There is no FX leg and, by default, no on-ramp fee: Hodle absorbs the PIX cash-in cost.
  2. BRS is only delivered to the user's own Hodle Solana wallet. There is no destination field when buying — a third-party address is refused.
  3. To send BRS anywhere else, use transfer. That is the only way BRS leaves the Hodle wallet as a token.

Getting BRS (on-ramp)

BRS is bought with a PIX charge created by POST /api/deposit/asset. The request does not include an address: BRS is minted to the user's own Hodle Solana wallet. The account must have NORA_RAIL enabled.

Create a BRS deposit
curl --request POST \
  --url https://api.hodle.com.br/api/deposit/asset \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "value": 10000,
    "asset": "BRS",
    "network": "solana",
    "externalId": "my-brs-order-123"
  }'

The reason is rule 2. Nora mints only to wallets that hold an on-chain authorization grant, and Hodle pays for each grant, so the destination is always a Solana wallet the account already owns. Requesting an address the user does not own fails with:

rejected destination
{ "success": false, "error": "BRS só pode ser recebido em uma carteira Solana da própria conta" }

The account must therefore have a Solana wallet before buying. Delivery is asynchronous: the PIX settles, Hodle forwards the amount to Nora (Nora only accepts funds from Hodle, never from the end customer), Nora mints, and the purchase closes when the mint confirms on-chain. Amounts below R$ 5,00 net are rejected up front — that floor is enforced by the mint contract and cannot be waived.

Pricing

SetupUser paysUser receives
DefaultR$ 100100 BRS
Cost pass-through enabled (BRS_FEE_PASSTHROUGH)R$ 100100 BRS minus the PIX cash-in cost and the account's markup

Ask Hodle which mode your account is on before quoting BRS to your users.

Moving BRS — POST /api/wallet/transfer

POST /api/wallet/transfer
{
  "recipientAddress": "7xKX...gAsU",
  "asset": "BRS",
  "network": "solana",
  "value": 5000,
  "walletPin": "123456",
  "protectedSymmetricKey": "..."
}
  • network must be solana; asset must be BRS.
  • Signed as an SPL transferChecked with the user's own key. Hodle's master wallet pays the network fee and, on a first transfer to a fresh recipient, the rent of the recipient's associated token account — the user never needs SOL.
  • Not ledger-backed: the balance is enforced on-chain, so the wallet must actually hold the BRS.
  • recipientAddress can be any Solana address. Use toSubAccountId instead to move BRS between two of your own subaccounts.

Without NORA_RAIL the call returns 403:

403 Forbidden
{ "success": false, "error": "BRS is not enabled for this account. Please send a message to support." }

Paying PIX from BRS — POST /api/wallet/payout

POST /api/wallet/payout
{
  "value": 5000,
  "network": "solana",
  "asset": "BRS",
  "pixKey": "user@email.com",
  "walletPin": "123456",
  "protectedSymmetricKey": "..."
}
  • Zero fee, 1:1. Hodle transfers exactly value BRS from the user's wallet to its Solana master and pays exactly value as PIX, so fee comes back as "0.00". No FX rate is applied (for USDT/USDC the same call converts at the current rate).
  • The wallet must hold enough BRS to cover value; otherwise the call returns 400 before anything moves.
  • Both pixKey and qrCode are supported. Hodle pays either destination from its own operating account.
  • Minimum R$ 5,00 (value: 500), enforced by the mint contract.
  • Requires NORA_RAIL in addition to WALLET_PAYOUT_API; the response is 403 otherwise.
  • Returns 202. If Hodle's operating account has enough BRL, the PIX is paid immediately and Nora replenishes the account afterwards. If it does not, the transaction remains PENDING: Nora burns the BRS from Hodle's master and returns BRL to Hodle first, then Hodle releases the customer's PIX as soon as that balance is visible. Nora's leg can take about 18 minutes in production, so keep polling GET /api/wallet/payout/{transactionId} or consume the payout webhooks.
  • The Nora-first burn is irreversible. Hodle does not report the payout as failed or return BRS while the corresponding BRL is still on its way; the PIX continuation is idempotent and resumes automatically after Nora's authenticated webhook.

Limitations

  • First read can come back cold. /api/wallet/get does expose Solana: the address is addresses.solana and the balance is the { "network": "solana", "asset": "BRS" } row. The rows are served from a cached chain read, so the first call on a wallet that was never synced returns no Solana rows and schedules the sync in the background — send sync: true to force a fresh read.
  • No sandbox. The sandbox settles on Base Sepolia; Solana and BRS are production-only.
  • Solana only. Nora lists Ethereum as upcoming; Hodle supports no other BRS network today.

See also