Menu

© 2026 Crypto Daves

check USDT balance BNB Smart Chain Aug 06, 2026 17 min read 33 views

Check USDT (BEP20) Wallet Balance In PHP & Laravel

Learn how to check a USDT (BEP20) wallet balance on BNB Smart Chain using PHP and Laravel. This guide covers the eth_call JSON-RPC method, ABI-encoded balanceOf requests, and precision-safe GMP conversion for 18-decimal token balances. Includes production-ready code, Laravel service classes, Artisan commands, caching strategies, multi-wallet batch lookups, and RPC error troubleshooting — everything needed to reliably fetch BEP20 USDT balances in real-world PHP applications.

How BEP20 Token Balances Actually Work

BNB Smart Chain is an EVM‑compatible chain, so it follows Ethereum's account model rather than Solana's separate token‑account model. USDT (BEP20) is not held in a dedicated account the way SPL tokens are — it lives entirely inside the USDT smart contract's internal storage, as an entry in a mapping of address => balance. Your wallet address is simply the key used to look that value up.

Wallet address balanceOf() lookup in USDT contract storage

To read that value, you don't query "the wallet" — you call the read‑only balanceOf(address) function on the USDT contract itself, via the JSON‑RPC eth_call method. There's no separate account that has to "exist" first, which is a meaningful difference from Solana's Associated Token Account model covered in our other guides — more on that below.

Prerequisites

  • PHP 7.4 or later (cURL enabled)
  • The ext-gmp or ext-bcmath extension, to handle 256‑bit integers without precision loss
  • A BNB Smart Chain RPC endpoint (public or dedicated)
  • A BEP20 wallet address (42‑character hex string starting with 0x)
Public RPC (rate‑limited)
https://bsc-dataseed.bnbchain.org/

For production: NOWNodes, Ankr, NodeReal, or Chainstack

The RPC Method: eth_call

eth_call executes a read‑only smart contract function without broadcasting a transaction or spending gas. It's the standard way to query any ERC20/BEP20 token's balanceOf function.

USDT (BEP20) contract address: 0x55d398326f99059fF775485246999027B3197955

Encoding the balanceOf Call

Unlike Solana's getTokenAccountsByOwner, which accepts a plain wallet address, EVM contract calls require ABI‑encoded calldata. That means combining a 4‑byte function selector with the wallet address, padded to 32 bytes.

  • 0x70a08231 function selector for balanceOf(address) — the first 4 bytes of its Keccak‑256 hash
  • 000...<address> wallet address, left‑padded with zeros to 32 bytes (64 hex characters)

Concatenated together, the data field looks like this for wallet 0xAbC123...789:

0x70a08231000000000000000000000000abc123...789

You don't need a full ABI library for this — string concatenation and str_pad() in PHP is enough, since balanceOf only takes one simple argument.

1JSON‑RPC Request

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_call",
  "params": [
    {
      "to": "0x55d398326f99059fF775485246999027B3197955",
      "data": "0x70a08231000000000000000000000000YOUR_WALLET_ADDRESS_NO_0x"
    },
    "latest"
  ]
}

The "latest" parameter tells the node to read state as of the most recent confirmed block.

Understanding the Response

A successful call returns a single hex string — the balance in the token's smallest unit (wei‑equivalent), left‑padded to 32 bytes:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x00000000000000000000000000000000000000000000056bc75e2d63100000"
}

That hex value is a plain integer, not pre‑formatted with decimals the way Solana's uiAmountString is. You have to convert it and apply the token's decimal precision yourself — covered next.

Raw Wei vs Displayed Balance

USDT on BEP20 uses 18 decimals — not 6, like USDT on Ethereum or Solana. This is one of the most common sources of bugs when developers port token logic between chains.

  • 0x...56bc75e2d63100000 raw hex value returned by eth_call
  • 100000000000000000000 same value in decimal (wei‑equivalent, base‑10)
  • 18 decimal precision (BEP20 USDT uses 18)
  • 100.000000000000000000 human‑readable balance
Critical: never cast this hex value with hexdec() alone or convert it to a PHP int/float. Balances above roughly 9.2 quintillion wei will silently lose precision on 64‑bit systems, and floats lose precision far sooner. Use gmp or bcmath for the conversion, shown in the code example below.

USDT on BNB Smart Chain: The Bigger Picture

Contract: 0x55d398326f99059fF775485246999027B3197955 decimals: 18 standard: BEP20

USDT (BEP20) is Tether's deployment of USDT on BNB Smart Chain, following the BEP20 token standard — BNB Chain's ERC20‑compatible interface. It represents the same dollar peg as USDT on other chains, but it is a distinct on‑chain asset with its own contract address, and it is not natively interchangeable with USDT on Ethereum, Tron, or Solana without going through a bridge or a centralized exchange.

The USDT (BEP20) contract address is 0x55d398326f99059fF775485246999027B3197955 and it uses 18 decimal places.

Why USDT Runs on BNB Smart Chain

BNB Smart Chain offers EVM compatibility with meaningfully lower gas costs and faster block times than Ethereum mainnet, which made it an attractive venue for retail‑scale DeFi activity, especially during periods when Ethereum gas fees made small transfers impractical. USDT's BEP20 deployment let the token participate directly in that ecosystem instead of requiring a wrapped bridge asset for every integration.

Where USDT (BEP20) Shows Up in the BSC Stack

DEX liquidity

USDT is one of the primary trading pairs on PancakeSwap, BSC's dominant decentralized exchange, alongside BUSD‑successor stablecoins and USDC.

Lending & yield

Protocols like Venus Protocol list USDT as a core lending and borrowing asset, using it as both collateral and a stable yield‑bearing deposit.

Exchange rails

Because BNB Smart Chain is tightly integrated with the Binance exchange ecosystem, BEP20 USDT is a common choice for fast, low‑fee deposits and withdrawals to and from centralized exchange accounts.

Retail payments & apps

Low transaction fees make BEP20 USDT practical for consumer‑facing apps and micro‑payments where per‑transfer cost matters, more so than on higher‑fee chains.

BEP20 USDT vs Other Chains' USDT

A wallet address that holds USDT on BNB Smart Chain has zero USDT on Ethereum, Tron, or Solana unless it separately holds tokens on those chains too — the balances, contracts, and even address formats can differ between EVM chains and non‑EVM chains like Solana. If you're building an app that supports USDT across multiple chains, you'll need a chain‑specific balance check for each one; this guide covers the BEP20 (BNB Smart Chain) case specifically.

As with any token, never assume a contract is "real" USDT based on its symbol alone — anyone can deploy a BEP20 contract named USDT. Always verify against the canonical contract address above, ideally cross‑checked on BscScan.

Developer takeaway: reliably reading a BEP20 USDT balance is usually the first building block for wallet dashboards, payment gateways, and exchange‑integration tools targeting the BNB Smart Chain ecosystem.

PHP Code – Get USDT (BEP20) Balance

This script fetches the USDT (BEP20) balance for a given wallet address, correctly handling the 256‑bit integer with GMP.



$usdtContract = '0x55d398326f99059fF775485246999027B3197955';
$rpc = 'https://bsc-dataseed.bnbchain.org/';
$wallet = '0xYourWalletAddress'; // Replace with actual wallet

// Build the ABI-encoded calldata for balanceOf(address)
$functionSelector = '70a08231';
$paddedAddress = str_pad(strtolower(str_replace('0x', '', $wallet)), 64, '0', STR_PAD_LEFT);
$data = '0x' . $functionSelector . $paddedAddress;

$payload = [
    'jsonrpc' => '2.0',
    'id' => 1,
    'method' => 'eth_call',
    'params' => [
        ['to' => $usdtContract, 'data' => $data],
        'latest'
    ]
];

$ch = curl_init($rpc);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode !== 200) {
    die("Error: HTTP $httpCode");
}

$result = json_decode($response, true);

if (isset($result['error'])) {
    die("RPC Error: " . $result['error']['message']);
}

$resultHex = $result['result'] ?? '0x0';

// Convert the 256-bit hex value to decimal using GMP (avoids precision loss)
$balanceWei = gmp_init($resultHex, 16);
$decimals = 18; // USDT on BEP20 uses 18 decimals
$divisor = gmp_pow(10, $decimals);
$whole = gmp_div_q($balanceWei, $divisor);
$remainder = gmp_mod($balanceWei, $divisor);
$remainderStr = str_pad(gmp_strval($remainder), $decimals, '0', STR_PAD_LEFT);

$usdtBalance = gmp_strval($whole) . '.' . $remainderStr;

echo "USDT (BEP20) balance: $usdtBalance\n";

If the gmp extension isn't available, bcmath's bcdiv() and bcmod() work as a drop‑in alternative — both avoid the float/int precision loss that plain arithmetic would introduce on a 256‑bit number.

Error Handling & Rate Limits

Public RPC endpoints are rate‑limited and occasionally return execution errors instead of a balance. Always handle HTTP errors, RPC‑level errors, and implement exponential backoff for production use.

// Enhanced error handling with retry
function getUsdtBep20Balance(string $wallet, string $rpc, string $contract, int $retries = 3): array {
    $functionSelector = '70a08231';
    $paddedAddress = str_pad(strtolower(str_replace('0x', '', $wallet)), 64, '0', STR_PAD_LEFT);

    $payload = [
        'jsonrpc' => '2.0',
        'id' => 1,
        'method' => 'eth_call',
        'params' => [
            ['to' => $contract, 'data' => '0x' . $functionSelector . $paddedAddress],
            'latest'
        ]
    ];

    for ($i = 0; $i < $retries; $i++) {
        $ch = curl_init($rpc);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $curlError = curl_error($ch);
        curl_close($ch);

        if ($curlError) {
            if ($i === $retries - 1) {
                return ['error' => "cURL error: $curlError"];
            }
            sleep(pow(2, $i));
            continue;
        }

        if ($httpCode === 429) {
            sleep(pow(2, $i)); // Exponential backoff: 1s, 2s, 4s
            continue;
        }

        if ($httpCode === 200) {
            $data = json_decode($response, true);

            if (isset($data['error'])) {
                // e.g. execution reverted, invalid params
                return ['error' => $data['error']['message']];
            }

            $resultHex = $data['result'] ?? '0x0';
            $balanceWei = gmp_init($resultHex, 16);
            $divisor = gmp_pow(10, 18);
            $whole = gmp_div_q($balanceWei, $divisor);
            $remainder = gmp_mod($balanceWei, $divisor);
            $remainderStr = str_pad(gmp_strval($remainder), 18, '0', STR_PAD_LEFT);

            return ['balance' => gmp_strval($whole) . '.' . $remainderStr];
        }
    }

    return ['error' => 'Max retries exceeded'];
}

// Usage
$result = getUsdtBep20Balance(
    '0xYourWalletAddress',
    'https://bsc-dataseed.bnbchain.org/',
    '0x55d398326f99059fF775485246999027B3197955'
);

echo $result['balance'] ?? "Error: {$result['error']}";

Laravel Implementation

For a Laravel app, wrap the eth_call logic in a dedicated service class instead of inline cURL. This keeps the ABI encoding and GMP math testable, injectable, and reusable across controllers, jobs, and Artisan commands.

1. Config

Add the RPC endpoint and contract address to config/services.php so they're environment‑driven instead of hardcoded.

// config/services.php
return [
    // ...existing services

    'bsc' => [
        'rpc_url' => env('BSC_RPC_URL', 'https://bsc-dataseed.bnbchain.org/'),
        'usdt_contract' => env('BSC_USDT_CONTRACT', '0x55d398326f99059fF775485246999027B3197955'),
    ],
];

Then in .env:

BSC_RPC_URL=https://your-dedicated-rpc-provider.com/YOUR_API_KEY
BSC_USDT_CONTRACT=0x55d398326f99059fF775485246999027B3197955

2. Service class

Use Laravel's Http facade instead of raw cURL — it gives you retries, timeouts, and testability (via Http::fake()) out of the box.

// app/Services/Bsc/UsdtBep20BalanceService.php
namespace App\Services\Bsc;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;

class UsdtBep20BalanceService
{
    private const BALANCE_OF_SELECTOR = '70a08231';
    private const DECIMALS = 18;

    public function __construct(
        private readonly string $rpcUrl = '',
        private readonly string $contract = '',
    ) {
        $this->rpcUrl ?: $this->rpcUrl = config('services.bsc.rpc_url');
        $this->contract ?: $this->contract = config('services.bsc.usdt_contract');
    }

    public function getBalance(string $wallet, bool $useCache = true): string
    {
        if ($useCache) {
            return Cache::remember(
                "usdt_bep20_balance:{$wallet}",
                now()->addSeconds(30),
                fn () => $this->fetchBalance($wallet)
            );
        }

        return $this->fetchBalance($wallet);
    }

    private function fetchBalance(string $wallet): string
    {
        $paddedAddress = str_pad(strtolower(str_replace('0x', '', $wallet)), 64, '0', STR_PAD_LEFT);

        $response = Http::retry(3, 1000, throw: false)
            ->timeout(10)
            ->post($this->rpcUrl, [
                'jsonrpc' => '2.0',
                'id' => 1,
                'method' => 'eth_call',
                'params' => [
                    ['to' => $this->contract, 'data' => '0x' . self::BALANCE_OF_SELECTOR . $paddedAddress],
                    'latest',
                ],
            ]);

        if ($response->failed()) {
            throw new \RuntimeException("BSC RPC request failed: {$response->status()}");
        }

        if ($response->json('error')) {
            throw new \RuntimeException('RPC error: ' . $response->json('error.message'));
        }

        $resultHex = $response->json('result', '0x0');

        $balanceWei = gmp_init($resultHex, 16);
        $divisor = gmp_pow(10, self::DECIMALS);
        $whole = gmp_div_q($balanceWei, $divisor);
        $remainder = gmp_mod($balanceWei, $divisor);
        $remainderStr = str_pad(gmp_strval($remainder), self::DECIMALS, '0', STR_PAD_LEFT);

        return gmp_strval($whole) . '.' . $remainderStr;
    }
}

3. Bind it in a service provider

// app/Providers/AppServiceProvider.php
use App\Services\Bsc\UsdtBep20BalanceService;

public function register(): void
{
    $this->app->singleton(UsdtBep20BalanceService::class, function () {
        return new UsdtBep20BalanceService(
            config('services.bsc.rpc_url'),
            config('services.bsc.usdt_contract'),
        );
    });
}

4. Use it in a controller

// app/Http/Controllers/WalletController.php
namespace App\Http\Controllers;

use App\Services\Bsc\UsdtBep20BalanceService;
use Illuminate\Http\Request;

class WalletController extends Controller
{
    public function balance(Request $request, UsdtBep20BalanceService $usdt)
    {
        $request->validate(['wallet' => 'required|string|regex:/^0x[a-fA-F0-9]{40}$/']);

        $balance = $usdt->getBalance($request->string('wallet'));

        return response()->json(['wallet' => $request->wallet, 'usdt_bep20_balance' => $balance]);
    }
}

5. Optional: Artisan command

Handy for cron jobs, ops scripts, or quick CLI checks without spinning up a route.

// app/Console/Commands/CheckUsdtBep20Balance.php
namespace App\Console\Commands;

use App\Services\Bsc\UsdtBep20BalanceService;
use Illuminate\Console\Command;

class CheckUsdtBep20Balance extends Command
{
    protected $signature = 'bsc:usdt-balance {wallet}';
    protected $description = 'Fetch the USDT (BEP20) balance for a given BNB Smart Chain wallet address';

    public function handle(UsdtBep20BalanceService $usdt): int
    {
        $balance = $usdt->getBalance($this->argument('wallet'), useCache: false);
        $this->info("USDT (BEP20) balance: {$balance}");

        return self::SUCCESS;
    }
}
Run with: php artisan bsc:usdt-balance 0xYourWalletAddress

Caching & Multi‑Wallet Lookups

Public and even dedicated RPC endpoints have rate limits. If your app checks the same wallet's balance repeatedly (dashboards, polling UIs), cache the result for a short TTL — 15 to 60 seconds is usually enough since balances don't change every second.

Plain PHP caching example (using APCu, adjust for your stack):

function getCachedUsdtBep20Balance(string $wallet, callable $fetcher, int $ttl = 30): string {
    $key = "usdt_bep20_balance_{$wallet}";

    if (function_exists('apcu_fetch')) {
        $cached = apcu_fetch($key, $success);
        if ($success) {
            return $cached;
        }
    }

    $balance = $fetcher($wallet);

    if (function_exists('apcu_store')) {
        apcu_store($key, $balance, $ttl);
    }

    return $balance;
}

Checking Multiple Wallets Efficiently

JSON‑RPC natively supports batch requests: instead of sending one HTTP request per wallet, send a single POST with an array of call objects. Most BSC nodes process the batch and return an array of results in the same order.

function getUsdtBalancesForWallets(array $wallets, string $rpc, string $contract): array {
    $batch = [];
    foreach ($wallets as $i => $wallet) {
        $paddedAddress = str_pad(strtolower(str_replace('0x', '', $wallet)), 64, '0', STR_PAD_LEFT);
        $batch[] = [
            'jsonrpc' => '2.0',
            'id' => $i,
            'method' => 'eth_call',
            'params' => [
                ['to' => $contract, 'data' => '0x70a08231' . $paddedAddress],
                'latest',
            ],
        ];
    }

    $ch = curl_init($rpc);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($batch));
    $response = json_decode(curl_exec($ch), true);
    curl_close($ch);

    $results = [];
    foreach ($response as $entry) {
        $wallet = $wallets[$entry['id']];
        $resultHex = $entry['result'] ?? '0x0';
        $balanceWei = gmp_init($resultHex, 16);
        $divisor = gmp_pow(10, 18);
        $whole = gmp_div_q($balanceWei, $divisor);
        $remainder = gmp_mod($balanceWei, $divisor);
        $results[$wallet] = gmp_strval($whole) . '.' . str_pad(gmp_strval($remainder), 18, '0', STR_PAD_LEFT);
    }

    return $results;
}

In Laravel, Http::pool() is a simpler alternative if your RPC provider doesn't support batching well — it fires the individual requests concurrently instead.

use Illuminate\Support\Facades\Http;

$responses = Http::pool(fn ($pool) => collect($wallets)->map(function ($wallet) use ($pool, $rpcUrl, $contract) {
    $paddedAddress = str_pad(strtolower(str_replace('0x', '', $wallet)), 64, '0', STR_PAD_LEFT);
    return $pool->as($wallet)->post($rpcUrl, [
        'jsonrpc' => '2.0',
        'id' => 1,
        'method' => 'eth_call',
        'params' => [
            ['to' => $contract, 'data' => '0x70a08231' . $paddedAddress],
            'latest',
        ],
    ]);
})->all());

foreach ($wallets as $wallet) {
    $resultHex = $responses[$wallet]->json('result', '0x0');
    // ...convert with gmp as shown above
}

Common Mistakes

  • Using 6 decimals instead of 18 – BEP20 USDT uses 18 decimals, unlike USDT on Ethereum or Solana. Hardcoding 6 from another chain's implementation will report balances 10¹² times too small.
  • Casting the hex result with hexdec() or (int) – large balances silently lose precision. Always use GMP or bcmath for the conversion.
  • Forgetting to left-pad the address to 32 bytes – calldata that isn't correctly padded will either revert or, worse, silently call the wrong storage slot.
  • Calling getBalance-style native methodseth_getBalance returns native BNB, not BEP20 token balances. You need eth_call against the token contract instead.
  • Using the wrong contract address – double-check the USDT (BEP20) contract: 0x55d398326f99059fF775485246999027B3197955
  • Trusting a token's name/symbol alone – scam tokens can name themselves "USDT" with a fake contract. Always verify the contract address, ideally against BscScan.
  • Skipping caching in high-traffic apps – repeated uncached RPC calls for the same wallet will quickly hit rate limits; see the caching section above.

RPC Error Troubleshooting

Most "it's not working" reports trace back to one of these RPC-level issues rather than a bug in the balance‑parsing logic itself.

HTTP / RPC codeLikely causeFix
429Rate limit exceeded on public RPCAdd exponential backoff, or switch to a dedicated provider (QuickNode, Ankr, NodeReal, etc.)
403Blocked / restricted API key or IPCheck provider dashboard for key restrictions or usage caps
-32000Execution reverted — often a malformed calldata stringVerify the selector, address padding, and that the contract address is correct
-32602Invalid params — malformed to or data fieldConfirm the wallet address is valid hex and the JSON structure matches the spec exactly
Result is 0xContract call reverted or contract doesn't exist at that address on this chainDouble-check you're pointed at BNB Smart Chain (chain ID 56), not another EVM chain
Result is all zerosWallet has never held USDT — this is a valid, expected zero balanceNot an error — treat as a zero USDT balance
cURL timeoutPublic RPC under load, or network/firewall issueIncrease CURLOPT_TIMEOUT, retry, or switch providers
The public https://bsc-dataseed.bnbchain.org/ endpoint is not meant for heavy production traffic — its rate limits are tight and can change without notice. For anything user‑facing, use a dedicated RPC provider. Feel free to check out NOWNodes which is a multichain node provider. The list of networks updates continuously based on user demand. All blockchains can be deployed on dedicated servers.

Native BNB vs BEP20 Tokens (USDT)

FeatureNative BNBUSDT (BEP20)
Balance stored directly on account Yes No
Balance stored in token contract storage No Yes
Retrieved with eth_getBalance Yes No
Retrieved with eth_call + balanceOf No Yes
Has a contract address No Yes
Decimal precision1818 (for this specific token)

If you need both native BNB and BEP20 USDT balances for the same wallet, you'll be making two different RPC calls: eth_getBalance for BNB, and eth_call against the token contract for USDT. They are not interchangeable calls.

USDT (BEP20) FAQ

What is the USDT BEP20 contract address on BNB Smart Chain?
0x55d398326f99059fF775485246999027B3197955
How many decimals does USDT use on BEP20?
USDT on BNB Smart Chain (BEP20) uses 18 decimals, unlike USDT on Ethereum (6 decimals) or Solana (6 decimals).
Why is my USDT BEP20 balance showing 0?
Unlike account-based token models on other chains, a BEP20 balanceOf call simply returns zero for any address that has never held the token, since contract storage defaults to zero rather than throwing a missing-account error.
Is BEP20 USDT the same token as ERC20 or Solana USDT?
No. They are separate tokens deployed on separate chains with different contract or mint addresses. They represent the same peg but require a bridge or exchange to move between chains.
Do I need a special PHP library to check a BEP20 balance?
No. A plain cURL POST request to any BNB Smart Chain JSON-RPC endpoint using the eth_call method is enough. A full Web3 SDK is not required for simple read-only balance checks.
Can I check a BEP20 balance in a Laravel application?
Yes. Wrap the eth_call request in a dedicated service class, bind it in a service provider, and cache results briefly using Laravel's Cache facade to avoid excessive RPC calls.

Conclusion

Fetching a USDT (BEP20) balance on BNB Smart Chain comes down to one eth_call against the token's balanceOf function, with correctly ABI‑encoded calldata and precision‑safe conversion of the returned 256‑bit hex value. There's no separate token account to manage, but the ABI encoding and 18‑decimal precision are the two details most likely to trip up a first implementation.

USDT (BEP20) is a core liquidity and settlement asset across PancakeSwap, Venus, and Binance's broader exchange ecosystem. This guide gives you a production‑ready approach — including caching, batching, and Laravel integration — for reading it reliably in your PHP applications.

Next steps: Explore the full BNB Smart Chain JSON-RPC reference, review Tether's transparency reports, or verify the contract on BscScan.

Comments (0)

Leave a comment