UNPKG

multichain-address-validator

Version:

Multichain address validator for Bitcoin and other blockchains.

198 lines (184 loc) 5.42 kB
import {describe, it} from 'mocha' import {expect} from 'chai' import {validate, Chain, NetworkType} from '../src' // @ts-ignore import addresses, {TestAddress} from './addresses/addresses' function check(address: TestAddress, chain: Chain) { address.invalid ? invalid(address, chain) : valid(address, chain) } function valid(address: TestAddress, chain: Chain) { const valid = validate(address, chain); expect({address, chain, valid}).to.deep.equal({address, chain, valid: true}); } function invalid(address: TestAddress, chain: Chain) { const valid = validate(address, chain); expect({address, chain, valid}).to.deep.equal({address, chain, valid: false}); } interface TestCase { alternatives: string[], testAddresses: keyof typeof addresses, exclude?: (keyof typeof addresses)[] testnet?: { testAddresses: keyof typeof addresses } } const TestCases: Record<string, TestCase> = { 'algorand': { alternatives: [], testAddresses: 'algorand', }, 'aptos': { alternatives: [], testAddresses: 'aptos', exclude: ['sui'] }, 'bitcoin': { alternatives: ['btc', 'omni'], testAddresses: 'btc', // corresponds to addresses.js exclude: ['bch', 'ltc'], testnet: { testAddresses: 'btc-testnet' } }, 'bitcoin-cash': { alternatives: ['bch', 'bitcoincash', 'bitcoin cash'], testAddresses: 'bch', exclude: ['btc', 'ltc'], testnet: { testAddresses: 'bch-testnet', } }, 'cardano': { alternatives: ['ada'], testAddresses: 'cardano', }, 'doge': { alternatives: ['dogecoin'], exclude: ['btc'], testAddresses: 'doge', testnet: { testAddresses: 'doge-testnet', } }, 'eos': { alternatives: [], testAddresses: 'eos', }, 'ethereum': { alternatives: [ 'arbitrum', 'avalanche', 'avalanche-c', 'base', 'berachain', 'binance', 'bnb', 'bsc', 'eth', 'flare', 'optimism', 'sonic', 'story', ], testAddresses: 'evm', }, 'hedera': { alternatives: [], testAddresses: 'hbar' }, 'litecoin': { alternatives: ['ltc'], exclude: ['btc', 'bch'], testAddresses: 'ltc', testnet: { testAddresses: 'ltc-testnet' } }, 'monero': { alternatives: [], testAddresses: 'monero', testnet: { testAddresses: 'monero-testnet', } }, 'nano': { alternatives: [], testAddresses: 'nano', }, 'nem': { alternatives: [], testAddresses: 'nem', }, 'polkadot': { alternatives: [], testAddresses: 'polkadot', }, 'ripple': { alternatives: ['xrp'], testAddresses: 'ripple' }, 'sia': { alternatives: ['SiaCoin'], testAddresses: 'sia', }, 'solana': { alternatives: ['sol', 'spl'], testAddresses: 'solana' }, 'sui': { alternatives: [], testAddresses: 'sui', exclude: ['aptos'] }, 'tezos': { alternatives: [], testAddresses: 'tezos', exclude: ['btc', 'bch', 'btc-testnet', 'ltc-testnet', 'bch-testnet', 'doge', 'doge-testnet', 'ltc', 'tron'], }, 'tron': { alternatives: ['trc20'], testAddresses: 'tron', }, 'xlm': { alternatives: ['stellar', 'stellarlumens'], testAddresses: 'xlm', } } describe('multichain address validator', function () { it('should check valid addresses for chains', function () { for (const chain in TestCases) { for (const c of [chain, ...TestCases[chain].alternatives]) { if (!addresses[TestCases[chain].testAddresses]) { throw new Error(`No test addresses for chain '${chain}'`) } for (const address of addresses[TestCases[chain].testAddresses]) { check(address, c) } if (TestCases[chain].testnet) { if (!addresses[TestCases[chain].testnet.testAddresses]) { throw new Error(`No test testnet addresses for chain '${chain}'`) } for (const address of addresses[TestCases[chain].testnet.testAddresses]) { check(address, { chain: c, networkType: NetworkType.TestNet }) } } } } }) it('should check invalid addresses for chains', function () { for (const chain in TestCases) { for (const c of [chain, ...TestCases[chain].alternatives]) { const invalidChains = Object.keys(addresses) .filter(key => key !== TestCases[chain].testAddresses) .filter(key => !TestCases[chain].exclude?.includes(key as any)) for (const invalidChain of invalidChains) { for (const address of addresses[invalidChain]) { invalid(address, c) } } } } }) })