# USDT0

Source: https://developers.bitgo.com/docs/usdt0

## Overview

Stable is an EVM-compatible Layer 1 blockchain where USDT0 serves as both the native asset and gas token, eliminating the need for a secondary token to fund transactions. Standard EVM tooling operates without modification on the Stable network. The chain supports ERC-3009 and x402 standards, enabling payment flows including P2P transactions, subscriptions, invoices, and pay-per-call mechanisms.

## Explorer

<a href="https://stablescan.xyz/" target="_blank" rel="noreferrer">
  https://stablescan.xyz/
</a>

## Wallets Types

BitGo enables holding usdt0 in the following wallet types:

|                  | Multisig Cold | Multisig Hot | MPC Cold | MPC Hot |
| ---------------- | ------------- | ------------ | -------- | ------- |
| **Custody**      | ❌            | ❌           | ✅       | ❌      |
| **Self-Custody** | ❌            | ❌           | ✅       | ✅      |

## Ticker Symbols

| Mainnet | Testnet |
| ------- | ------- |
| USDT0   | TUSDT0  |

## Faucet

You can use a faucet to obtain free testnet tusdt0 for development and testing purposes.

**Faucet:** https://faucet.stable.xyz/

## Units

Each USDT0 consists of `1,000,000,000,000,000,000` (<code>10<sup>18</sup></code>) wei, so not even a single USDT0 can be stored numerically without exceeding the range of JavaScript numbers. Gas fees use gwei.

- 1 usdt0 = <code>10<sup>18</sup></code> wei
- 1 wei = <code>10<sup>-18</sup></code> usdt0
- 1 gwei = <code>10<sup>-9</sup></code> usdt0

For that reason, only string balance properties are available, which are `balanceString`, `confirmedBalanceString`, and
`spendableBalanceString`.

## Tokens

USDT0 supports the ERC20 token standard. ERC20 tokens on the Stable network are available as BitGo supported assets.

## Fees

USDT0 supports EIP-1559 fee pricing. All transaction fees use USDT0, the native asset of the Stable network. The base fee is the minimum price per unit of gas required for a transaction to be included in a block, and must be exceeded by the transaction specified maximum base fee. A priority fee can be added on top of the base fee to incentivize faster processing.

## Create Wallet

```javascript
bitgo
  .coin("tusdt0")
  .wallets()
  .generateWallet({
    label: "My Test Wallet",
    passphrase: "secretpassphrase1a5df8380e0e30",
    enterprise: "5612c2beeecf83610b621b90964448cd",
    walletVersion: 4,
  })
  .then(function (wallet) {
    // print the new wallet
    console.dir(wallet);
  });
```
```shell
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tusdt0"
export ACCESS_TOKEN=<YOUR_ACCESS_TOKEN>
export LABEL="<DESIRED_WALLET_NAME>"
export PASSPHRASE="<YOUR_BITGO_LOGIN_PASSPHRASE>"
export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"

curl -X POST \
 http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/generate \
 -H 'Content-Type: application/json' \
 -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "label": "'"$LABEL"'",
    "passphrase": "'"$PASSPHRASE"'",
    "enterprise": "'"$ENTERPRISE_ID"'",
    "walletVersion": 4
}'
```

## Create Address

```javascript
bitgo
  .coin("tusdt0")
  .wallets()
  .getWallet({ id: "585c51a5df8380e0e3082e46" })
  .then(function (wallet) {
    return wallet.createAddress();
  })
  .then(function (newAddress) {
    // print new address details
    console.dir(newAddress);
  });
```
```shell
export WALLET="585c51a5df8380e0e3082e46"
export ACCESS_TOKEN=<YOUR_ACCESS_TOKEN>

curl -X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
https://app.bitgo-test.com/api/v2/tusdt0/wallet/$WALLET/address
```

## Consolidate Balance

USDT0 supports Multisignature smart-contract wallets which utilize forwarder smart contracts to enable multiple receive addresses. The forwarder smart contract automatically consolidates native tokens received in your receive addresses to your base address. However, if you receive non-native tokens, such as ERC20 tokens, a different consolidation transaction initiates to the base address. Additionally, forwarders can only send assets to the base address of the wallet.

## Estimate Fee

```javascript
const BitGoJS = require("../../../src/index.js");
const bitgo = new BitGoJS.BitGo({ env: "test" });
const accessToken = process.env.ACCESS_TOKEN;
const coin = "tusdt0";

async function getFeeEstimate() {
  try {
    await bitgo.authenticateWithAccessToken({ accessToken });
    const res = await bitgo.coin(coin).feeEstimate({ numBlocks: 2 });
    console.dir(res);
  } catch (err) {
    console.error("Error fetching fee estimate:", err);
  }
}

getFeeEstimate();
```
```shell
export COIN="tusdt0"
export ACCESS_TOKEN=<YOUR_ACCESS_TOKEN>

curl -X GET \
 https://app.bitgo-test.com/api/v2/$COIN/tx/fee \
 -H 'Content-Type: application/json' \
 -H "Authorization: Bearer $ACCESS_TOKEN"
```

## Transact

```javascript
const tx = await fundedWallet.send({
  address: "<DESTINATION_ADDRESS>",
  amount: "<AMOUNT>",
  walletPassphrase: process.env.PASSWORD,
});
```
```shell
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tusdt0"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN=<YOUR_ACCESS_TOKEN>
export ADDRESS="<DESTINATION_ADDRESS>"
export AMOUNT="<AMOUNT_IN_BASE_UNITS>"
export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>"

curl -X POST \
 http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendcoins \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "address": "'"$ADDRESS"'",
    "amount": "'"$AMOUNT"'",
    "walletPassphrase": "'"$WALLET_PASSPHRASE"'"
}'
```

## Stake

USDT0 isn't a stakeable asset.
