Validate addresses
Every network descriptor provides an isValidAddress() method — a single multichain address format checker that covers Bitcoin, Ethereum, Litecoin, Dogecoin, Bitcoin Cash, and every custom EVM RPC network you register. It's the first line of defense in any send flow: validate recipient addresses in your UI before creating a transaction.
Basic usage
import { ChainGate } from 'chaingate'
const cg = new ChainGate()
// Bitcoin
cg.networks.bitcoin.isValidAddress('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4') // true
cg.networks.bitcoin.isValidAddress('invalid-address') // false
// Ethereum
cg.networks.ethereum.isValidAddress('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045') // true
cg.networks.ethereum.isValidAddress('not-an-address') // false
// Bitcoin Cash
cg.networks.bitcoincash.isValidAddress('bitcoincash:qq...') // true
EVM address validation
EVM networks accept both checksummed (mixed-case) and all-lowercase or all-uppercase addresses. When the address uses mixed case, the EIP-55 checksum is verified automatically — invalid checksums return false, so you can catch copy/paste corruption before sending funds.
// All valid
cg.networks.ethereum.isValidAddress('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045') // true (checksummed)
cg.networks.ethereum.isValidAddress('0xd8da6bf26964af9d7eed9e03e53415d37aa96045') // true (lowercase)
// Invalid checksum (wrong mixed-case)
cg.networks.ethereum.isValidAddress('0xD8DA6bf26964af9d7eed9e03e53415d37aa96045') // false
This also works on custom RPC networks:
const bsc = cg.networks.evmRpc({
rpcUrl: 'https://bsc-dataseed.binance.org',
chainId: 56,
name: 'BNB Smart Chain',
symbol: 'BNB',
})
bsc.isValidAddress('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045') // true
UTXO address type identification
UTXO networks provide an additional identifyAddressType() method that returns the detailed type of a valid address. Pair it with isValidAddress() to know both whether the address is valid and exactly which script encoding it uses.
const btc = cg.networks.bitcoin
btc.identifyAddressType('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4')
// → 'segwit-p2wpkh'
btc.identifyAddressType('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa')
// → 'legacy-p2pkh'
btc.identifyAddressType('bc1p...')
// → 'taproot-p2tr'
btc.identifyAddressType('invalid')
// → 'unknown'
Possible return values
| Value | Description |
|---|---|
'legacy-p2pkh' | Pay-to-Public-Key-Hash (starts with 1 on Bitcoin) |
'legacy-p2sh' | Pay-to-Script-Hash (starts with 3 on Bitcoin) |
'legacy-p2pk' | Pay-to-Public-Key |
'legacy-p2ms' | Bare multisig |
'segwit-p2wpkh' | Native SegWit (starts with bc1q on Bitcoin) |
'segwit-p2wsh' | SegWit script hash |
'taproot-p2tr' | Taproot (starts with bc1p on Bitcoin) |
'taproot-n-of-n' | Taproot n-of-n multisig |
'taproot-m-of-n' | Taproot m-of-n multisig |
'unknown' | Not a recognized address format |
Bitcoin Cash validation
Bitcoin Cash accepts both CashAddr format (e.g., bitcoincash:qq...) and legacy Base58Check format:
const bch = cg.networks.bitcoincash
bch.isValidAddress('bitcoincash:qqkv9wr69ry2p9l53lxp67xtt0m405eecfkpk648ks') // true
bch.isValidAddress('1BpEi6DfDAUFd7GtWo8VKMmk7CQi4xr2pG') // true
bch.isValidAddress('invalid') // false
Standalone EVM validation
A standalone isValidEvmAddress() function is also exported for use without a ChainGate instance — useful for lightweight form-validation utilities or serverless functions:
import { isValidEvmAddress } from 'chaingate'
isValidEvmAddress('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045') // true
Use cases
- Form validation -- Validate recipient addresses in your UI before creating a transaction.
- Address detection -- Use
identifyAddressType()to detect the encoding of a UTXO address and adapt your UI accordingly. - Multi-network support -- Check which network an address belongs to by testing it against multiple network descriptors.