npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

chainkit-sdk

v0.1.0

Published

Multi-chain wallet SDK. 30 blockchains, unified API, zero external chain SDK dependencies.

Readme

ChainKit

Cross-chain wallet SDK. One unified API for 30 blockchains -- wallet creation, address validation, balance queries, transaction signing, and token operations.

Zero external chain SDK dependencies. Pure JavaScript crypto via @noble/@scure.

Playground Chains Zero Deps

Installation

# Install the client and only the chains you need
npm install @chainkit/client @chainkit/ethereum @chainkit/bitcoin @chainkit/solana

# Full list of chain packages:
# @chainkit/{ethereum,bitcoin,solana,tron,ton,cosmos,aptos,sui,near,cardano,
#   xrp,stellar,starknet,stacks,kaia,eos,polkadot,hedera,filecoin,icp,
#   algorand,vechain,tezos,theta,multiversx,iota,neo,flow,icon,mina}

Quick Start

import { createClient } from '@chainkit/client'
import { ethereum } from '@chainkit/ethereum'
import { bitcoin } from '@chainkit/bitcoin'
import { solana } from '@chainkit/solana'

const client = await createClient({
  chains: {
    ethereum: {
      chain: ethereum,
      rpcs: ['https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY'],
      privateKey: '0x...',
    },
    bitcoin: {
      chain: bitcoin,
      rpcs: ['https://btc-rpc.example.com'],
    },
    solana: {
      chain: solana,
      rpcs: ['https://api.mainnet-beta.solana.com'],
      mnemonic: 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about',
      hdPath: "m/44'/501'/0'/0'",
    },
  },
})

// Read (all chains)
await client.ethereum.getBalance('0x...')
await client.bitcoin.getBalance('bc1...')
await client.solana.getBalance('HAgk...')

// Write (only when privateKey or mnemonic is provided)
const txHash = await client.ethereum.send({ to: '0x...', amount: '1000000000000000000' })

// Wait for confirmation
const confirmedTx = await client.ethereum.waitForTransaction(txHash)

// Clean up key material when done
client.ethereum.destroy()

Unified API Reference

ChainSigner (Offline -- all 30 chains)

Every chain signer implements these methods identically:

import { EthereumSigner } from '@chainkit/ethereum'
import { BitcoinSigner } from '@chainkit/bitcoin'
import { SolanaSigner } from '@chainkit/solana'

// Works the same on ALL chains
const signer = new EthereumSigner()

// --- Mnemonic ---
const mnemonic = signer.generateMnemonic()        // 12 words (128 bits)
signer.generateMnemonic(256)                       // 24 words
signer.validateMnemonic(mnemonic)                  // true/false

// --- Key derivation ---
const pk = await signer.derivePrivateKey(mnemonic, "m/44'/60'/0'/0/0")

// --- Address ---
const address = signer.getAddress(pk)
signer.validateAddress(address)                    // true
signer.validateAddress('invalid')                  // false

// --- Default HD path ---
signer.getDefaultHdPath()                          // "m/44'/60'/0'/0/0"

// --- Sign transaction (unified params object) ---
const signed = await signer.signTransaction({
  privateKey: pk,
  tx: {
    to: '0x742d35Cc6634C0532925a3b844Bc9e7595f2bD68',
    value: '1000000000000000000',
    fee: { gasLimit: '0x5208', maxFeePerGas: '0x2540be400' },
    extra: { chainId: 1 },
  },
})

// --- Sign message ---
const sig = await signer.signMessage({
  privateKey: pk,
  message: 'Hello ChainKit',
})

ChainSigner Method Reference

| Method | Parameters | Return | Description | |--------|-----------|--------|-------------| | generateMnemonic | strength?: number (128 or 256) | string | Generate BIP39 mnemonic (12 or 24 words) | | validateMnemonic | mnemonic: string | boolean | Validate a BIP39 mnemonic | | derivePrivateKey | mnemonic: string, hdPath: string | Promise<string> \| string | Derive private key from mnemonic via BIP44 | | getAddress | privateKey: string | string | Get address from private key | | validateAddress | address: string | boolean | Validate address format for this chain | | signTransaction | params: { privateKey, tx } | Promise<string> | Sign a transaction, returns signed tx hex | | signMessage | params: { privateKey, message } | Promise<string> \| string | Sign an arbitrary message | | getDefaultHdPath | (none) | string | Get the default HD derivation path |

ChainProvider (Online -- all 30 chains)

import { EthereumProvider } from '@chainkit/ethereum'

const provider = new EthereumProvider({
  endpoints: ['https://eth-mainnet.example.com'],
  strategy: 'failover',    // 'failover' | 'round-robin' | 'fastest'
  timeout: 10000,
  retries: 2,
})

// Balance
const balance = await provider.getBalance('0x...')
// { address: '0x...', amount: '1000000000000000000', decimals: 18, symbol: 'ETH' }

// Nonce / sequence number
const nonce = await provider.getNonce('0x...')

// Transaction info
const tx = await provider.getTransaction('0xabc...')
// { hash, from, to, value, fee, blockNumber, blockHash, status, timestamp, data, nonce }

// Block info
const block = await provider.getBlock(12345)
// { number, hash, parentHash, timestamp, transactions }

// Fee estimation (slow / average / fast)
const fee = await provider.estimateFee()
// { slow: '...', average: '...', fast: '...', unit: 'wei' }

// Broadcast signed transaction
const txHash = await provider.broadcastTransaction(signedTxHex)

// Chain info
const info = await provider.getChainInfo()
// { chainId: '1', name: 'Ethereum Mainnet', symbol: 'ETH', decimals: 18, testnet: false, blockHeight: 12345 }

// Wait for transaction confirmation
const confirmedTx = await provider.waitForTransaction('0xabc...', {
  timeoutMs: 60000,    // default: 60000 (1 minute)
  intervalMs: 3000,    // default: 3000 (3 seconds)
})

ChainProvider Method Reference

| Method | Parameters | Return | Description | |--------|-----------|--------|-------------| | getBalance | address: string | Promise<Balance> | Get native token balance | | getNativeBalances | address: string | Promise<Balance[]> | Get all native balances (dual-token chains, optional) | | getTransaction | hash: string | Promise<TransactionInfo \| null> | Get transaction by hash | | getBlock | hashOrNumber: string \| number | Promise<BlockInfo \| null> | Get block by number or hash | | getNonce | address: string | Promise<string \| number> | Get nonce/sequence number | | estimateFee | (none) | Promise<FeeEstimate> | Estimate fees (slow/average/fast) | | broadcastTransaction | signedTx: string | Promise<string> | Broadcast signed tx, returns tx hash | | getChainInfo | (none) | Promise<ChainInfo> | Get chain metadata | | waitForTransaction | hash: string, options?: WaitForTransactionOptions | Promise<TransactionInfo> | Poll until confirmed/failed/timeout |

Capabilities (chain-specific extensions)

Not all chains support all features. Capabilities are type-safe extensions:

ContractCapable

// EVM, Solana, Cosmos, Tron, TON, Aptos, Sui, NEAR, Tezos, etc.
await provider.callContract(contractAddress, 'balanceOf(address)', ['0x...'])
await provider.estimateGas(contractAddress, 'transfer(address,uint256)', ['0x...', 1000n])

TokenCapable

// Get single token balance
await provider.getTokenBalance(address, tokenAddress)

// Get multiple token balances at once
await provider.getMultipleTokenBalances(address, [token1, token2, token3])

// Get token metadata (name, symbol, decimals, totalSupply)
await provider.getTokenMetadata(tokenAddress)

UtxoCapable

// Bitcoin, Cardano (eUTXO)
await provider.getUtxos(address)
await provider.selectUtxos(address, '100000')  // coin selection

SubscriptionCapable

// Poll-based subscriptions
const unsubscribe = await provider.subscribeBlocks(blockNumber => { ... })
const unsubscribe = await provider.subscribeTransactions(address, tx => { ... })

EvmSignerCapable (EIP-712)

// Ethereum, Kaia
const sig = await signer.signTypedData({
  privateKey: pk,
  domain: { name: 'MyDApp', version: '1', chainId: 1 },
  types: {
    Order: [
      { name: 'maker', type: 'address' },
      { name: 'amount', type: 'uint256' },
    ],
  },
  primaryType: 'Order',
  message: { maker: '0x...', amount: '1000' },
})

Dual-Token Chains

// VeChain (VET/VTHO), Theta (THETA/TFUEL), Neo (NEO/GAS), EOS (CPU/NET/RAM)
await provider.getBalance(address)             // primary token
await provider.getNativeBalances?.(address)     // all native tokens

Unified Client

The unified client wraps signer and provider into a single ergonomic interface:

import { createClient } from '@chainkit/client'
import { ethereum } from '@chainkit/ethereum'
import { bitcoin } from '@chainkit/bitcoin'

const client = await createClient({
  chains: {
    ethereum: {
      chain: ethereum,
      rpcs: ['https://...'],
      privateKey: '0x...',     // optional: omit for read-only
      network: 'mainnet',      // optional: 'mainnet' | 'testnet'
    },
    bitcoin: {
      chain: bitcoin,
      rpcs: ['https://...'],
      network: 'testnet',      // affects address format (bc1 vs tb1)
    },
  },
})

// --- Read (all chains) ---
await client.ethereum.getBalance('0x...')
await client.ethereum.getTransaction('0xabc...')
await client.ethereum.getBlock(12345)
await client.ethereum.estimateFee()
await client.ethereum.getChainInfo()

// --- Write (only when privateKey or mnemonic provided) ---

// send() auto-fetches nonce and fee, signs, and broadcasts
const txHash = await client.ethereum.send({
  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f2bD68',
  amount: '1000000000000000000',
  memo: 'optional memo',
  data: '0x...',               // optional calldata
  options: { chainId: 1 },     // chain-specific overrides
})

// Wait for confirmation
const confirmed = await client.ethereum.waitForTransaction(txHash, {
  timeoutMs: 120000,
  intervalMs: 5000,
})

// prepareTransaction() builds an unsigned tx without signing
const unsignedTx = await client.ethereum.prepareTransaction({
  to: '0x...',
  amount: '1000000000000000000',
})

// Low-level signing (bypasses auto-fetch)
await client.ethereum.signTransaction({
  privateKey: '0x...',
  tx: { to: '0x...', value: '1000' },
})
await client.ethereum.signMessage({
  privateKey: '0x...',
  message: 'Hello',
})

// Get the address derived from the configured key
const myAddress = client.ethereum.getAddress()

// Access underlying signer/provider directly
client.ethereum.provider   // ChainProvider instance
client.ethereum.signer     // ChainSigner instance (only when key provided)

// Zero out stored private key material when done
client.ethereum.destroy()

Client Configuration Reference

| Option | Type | Default | Description | |--------|------|---------|-------------| | chain | ChainDefinition | (required) | Chain definition from @chainkit/<chain> | | rpcs | string[] | (required) | RPC endpoint URLs | | network | 'mainnet' \| 'testnet' | 'mainnet' | Controls address generation and default HD paths | | strategy | 'failover' \| 'round-robin' \| 'fastest' | 'failover' | RPC endpoint selection strategy | | timeout | number | 10000 | Request timeout in milliseconds | | retries | number | 2 | Number of retries per endpoint | | privateKey | string | (optional) | Private key for signing (hex string) | | mnemonic | string | (optional) | BIP39 mnemonic for key derivation | | hdPath | string | chain default | BIP44 HD derivation path |

Security note: When a signing client uses strategy: 'fastest', the client automatically downgrades to 'failover' to prevent a rogue endpoint from supplying manipulated nonce or fee data.

ABI Encoder

ChainKit includes a built-in ABI encoder/decoder for EVM contract interactions. No external ABI libraries needed.

import {
  encodeFunctionCall,
  encodeFunctionSelector,
  decodeFunctionResult,
  ERC20,
} from '@chainkit/core'

// --- Encode a function call ---
const transferData = encodeFunctionCall(
  'transfer(address,uint256)',
  ['0x742d35Cc6634C0532925a3b844Bc9e7595f2bD68', 1000000n],
)
// Returns: "0xa9059cbb000000000000000000000000742d35cc6634c0532925a3b844bc9e7595f2bd6800000000000000000000000000000000000000000000000000000000000f4240"

// --- ERC-20 presets ---
const approveData = encodeFunctionCall(ERC20.approve, ['0xSpender...', 1000000n])
const balanceData = encodeFunctionCall(ERC20.balanceOf, ['0xHolder...'])
// Available presets: ERC20.transfer, ERC20.approve, ERC20.balanceOf,
// ERC20.allowance, ERC20.totalSupply, ERC20.decimals, ERC20.symbol, ERC20.name

// --- Get function selector ---
const selector = encodeFunctionSelector('transfer(address,uint256)')
// "0xa9059cbb"

// --- Decode return data ---
const [balance] = decodeFunctionResult(['uint256'], '0x00000000000000000000000000000000000000000000000000000000000f4240')
// balance = 1000000n

// Decode multiple return values
const [addr, amount] = decodeFunctionResult(
  ['address', 'uint256'],
  returnDataHex,
)

Supported ABI Types

| Type | Encode | Decode | |------|--------|--------| | address | encodeAddress | decodeAddress | | uint256 (and all uint*) | encodeUint256 | decodeUint256 | | int256 (and all int*) | encodeInt256 | decodeInt256 | | bool | encodeBool | decodeBool | | bytes32 (and all fixed bytes*) | encodeBytes32 | decodeBytes32 | | string | encodeString | decodeString | | bytes | encodeBytes | (via decodeFunctionResult) |

Limitation: Dynamic arrays (e.g., uint256[]) are not supported in the encoder. For complex ABI encoding with arrays, use an external ABI library.

SecureKey

JavaScript strings are immutable and cannot be cleared from memory. SecureKey stores private key material as a mutable Uint8Array that can be explicitly zeroed.

import { SecureKey } from '@chainkit/core'

// Create from hex string or Uint8Array
const key = new SecureKey('0xabc123...')

// Access key material
key.hex     // "0xabc123..." (0x-prefixed hex string)
key.bytes   // Uint8Array

// Check if destroyed
key.isDestroyed  // false

// Zero out key material
key.destroy()

// After destroy, accessing .hex or .bytes throws an error
key.isDestroyed  // true
key.hex           // throws Error: 'SecureKey has been destroyed'

The unified client uses SecureKey internally. Call client.<chain>.destroy() to zero the stored key material when the client is no longer needed.

RPC Strategies

// Failover: try endpoints in order, fall back on failure
{ endpoints: ['rpc1', 'rpc2'], strategy: 'failover' }

// Round-robin: distribute requests across endpoints
{ endpoints: ['rpc1', 'rpc2', 'rpc3'], strategy: 'round-robin' }

// Fastest: race all endpoints, use the first successful response
{ endpoints: ['rpc1', 'rpc2'], strategy: 'fastest' }

All strategies include automatic retry (configurable retries, default 2) and per-request timeout (configurable timeout, default 10000ms). JSON-RPC errors are not retried -- only network/timeout failures trigger retries.

strictHttps

Enable strictHttps: true to reject non-HTTPS endpoints (except localhost/127.0.0.1). Without this flag, insecure endpoints produce a console warning but are still used.

const provider = new EthereumProvider({
  endpoints: ['https://eth-mainnet.example.com'],
  strictHttps: true,  // throws on http:// endpoints
})

RPC URL Redaction

Error messages from RPC failures automatically redact endpoint URLs to prevent API key leakage. For example, https://eth-mainnet.g.alchemy.com/v2/sk_abc123 becomes https://eth-mainnet.g.alchemy.com/....

JSON-RPC Response Validation

The RPC manager validates that:

  • Responses conform to JSON-RPC 2.0 structure
  • Response IDs match request IDs (prevents response desynchronization from a malicious endpoint)

Key Management

  • BIP39 mnemonic: 12 or 24 word phrases (128/256 bit entropy)
  • BIP32/44 HD derivation: Standard derivation paths per chain (e.g., m/44'/60'/0'/0/0 for Ethereum)
  • Raw private key: Direct hex-encoded private key input
  • WIF: Bitcoin Wallet Import Format
  • Address validation: Per-chain format validation (EIP-55 checksum, bech32, base58, base58check, SS58, etc.)

Network Configuration

The network option on createClient controls address generation and default HD paths. This matters for chains where mainnet and testnet use different address formats or coin types.

// Bitcoin: network affects address prefix (bc1 vs tb1) and HD path coin type
const client = await createClient({
  chains: {
    bitcoin: {
      chain: bitcoin,
      rpcs: ['https://...'],
      network: 'testnet',  // generates tb1... addresses, uses m/84'/1'/0'/0/0
      mnemonic: '...',
    },
  },
})

// Stacks: network affects address prefix (SP vs ST) and tx chain ID
const client = await createClient({
  chains: {
    stacks: {
      chain: stacks,
      rpcs: ['https://api.testnet.hiro.so'],
      network: 'testnet',  // generates ST... addresses
      mnemonic: '...',
    },
  },
})

Chains where network affects behavior:

  • Bitcoin: Address prefix (bc1 vs tb1), HD path coin type (0' vs 1'), address validation
  • Stacks: Address prefix (SP vs ST), transaction chain ID

For all other chains, network is accepted but does not change address derivation.

Default HD Paths

| Chain | Default HD Path | Coin Type | |-------|----------------|-----------| | Ethereum | m/44'/60'/0'/0/0 | 60 | | Bitcoin (mainnet) | m/84'/0'/0'/0/0 | 0 | | Bitcoin (testnet) | m/84'/1'/0'/0/0 | 1 | | Solana | m/44'/501'/0'/0' | 501 | | Tron | m/44'/195'/0'/0/0 | 195 | | TON | m/44'/607'/0'/0'/0' | 607 | | Cosmos | m/44'/118'/0'/0/0 | 118 | | Aptos | m/44'/637'/0'/0'/0' | 637 | | Sui | m/44'/784'/0'/0'/0' | 784 | | NEAR | m/44'/397'/0' | 397 | | Cardano | m/1852'/1815'/0'/0/0 | 1815 | | XRP | m/44'/144'/0'/0/0 | 144 | | Stellar | m/44'/148'/0' | 148 | | StarkNet | m/44'/9004'/0'/0/0 | 9004 | | Stacks | m/44'/5757'/0'/0/0 | 5757 | | Kaia | m/44'/8217'/0'/0/0 | 8217 | | EOS | m/44'/194'/0'/0/0 | 194 | | Polkadot | m/44'/354'/0'/0/0 | 354 | | Hedera | m/44'/3030'/0'/0/0 | 3030 | | Filecoin | m/44'/461'/0'/0/0 | 461 | | ICP | m/44'/223'/0'/0/0 | 223 | | Algorand | m/44'/283'/0'/0/0 | 283 | | VeChain | m/44'/818'/0'/0/0 | 818 | | Tezos | m/44'/1729'/0'/0' | 1729 | | Theta | m/44'/500'/0'/0/0 | 500 | | MultiversX | m/44'/508'/0'/0'/0' | 508 | | IOTA | m/44'/4218'/0'/0'/0' | 4218 | | Neo | m/44'/888'/0'/0/0 | 888 | | Flow | m/44'/539'/0'/0/0 | 539 | | Icon | m/44'/4801074'/0'/0/0 | 4801074 | | Mina | m/44'/12586'/0'/0/0 | 12586 |

Signature Algorithm Categories

| Category | Curve | Chains | |----------|-------|--------| | Secp256k1 | secp256k1 ECDSA | Ethereum, Bitcoin, Tron, Cosmos, XRP, Stacks, Kaia, EOS, Filecoin, VeChain, Theta, Icon | | ED25519 | Ed25519 EdDSA | Solana, TON, Aptos, Sui, NEAR, Cardano, Stellar, Hedera, ICP, Algorand, Tezos, MultiversX, IOTA | | SR25519 | Schnorrkel/Ristretto | Polkadot | | STARK | Stark curve | StarkNet | | Secp256r1 | NIST P-256 ECDSA | Neo | | ECDSA_P256 | ECDSA P-256 | Flow | | Pasta | Pallas curve Schnorr | Mina |

Packages

| Package | Description | |---------|-------------| | @chainkit/core | Shared interfaces, types, crypto utilities (BIP39/32), RPC manager, ABI encoder/decoder, SecureKey | | @chainkit/client | Unified client that composes chain packages | | @chainkit/ethereum | Ethereum + all EVM chains | | @chainkit/bitcoin | Bitcoin + UTXO forks | | @chainkit/solana | Solana + SPL tokens | | @chainkit/tron | Tron + TRC-20 tokens | | @chainkit/ton | TON + Jetton tokens | | @chainkit/cosmos | Cosmos Hub + IBC/Cosmos SDK chains | | @chainkit/aptos | Aptos | | @chainkit/sui | Sui | | @chainkit/near | NEAR Protocol | | @chainkit/cardano | Cardano | | @chainkit/xrp | XRP Ledger | | @chainkit/stellar | Stellar | | @chainkit/starknet | StarkNet | | @chainkit/stacks | Stacks | | @chainkit/kaia | Kaia (prev Klaytn) + KIP-7 tokens | | @chainkit/eos | EOS / Vaulta | | @chainkit/polkadot | Polkadot + Substrate parachains | | @chainkit/hedera | Hedera (ED25519 + ECDSA signers) | | @chainkit/filecoin | Filecoin | | @chainkit/icp | Internet Computer | | @chainkit/algorand | Algorand | | @chainkit/vechain | VeChain | | @chainkit/tezos | Tezos | | @chainkit/theta | Theta | | @chainkit/multiversx | MultiversX | | @chainkit/iota | IOTA | | @chainkit/neo | Neo | | @chainkit/flow | Flow | | @chainkit/icon | Icon | | @chainkit/mina | Mina |

Supported Chains & Exchange Coverage

ChainKit covers ~230/246 coins on Upbit KRW market (~93.5%) and ~420/438 coins on Binance USDT spot (~95.9%).

Below is the full breakdown of which coins each package supports.


@chainkit/ethereum (Secp256k1)

Covers Ethereum and all EVM-compatible L1/L2 chains. Any ERC-20 token or EVM chain is supported.

Native: ETH

EVM L1/L2 chains covered (native tokens):

| Chain | Token | Upbit | Binance | |-------|-------|-------|---------| | Polygon | POL (MATIC) | O | O | | Arbitrum | ARB | O | O | | Optimism | OP | O | O | | BNB Smart Chain | BNB | - | O | | Avalanche C-Chain | AVAX | O | O | | Sonic (prev Fantom) | S (FTM) | - | O | | Cronos | CRO | O | - | | Mantle | MNT | O | - | | Celo | CELO | O | O | | Blast | BLAST | O | - | | Base | (tokens below) | O | O | | Linea | LINEA | O | O | | zkSync | ZK | O | O | | Zora | ZORA | O | - | | Taiko | TAIKO | O | - | | Berachain | BERA | O | O | | Monad | MON | O | - | | Manta | MANTA | - | O | | Metis | METIS | - | O | | Scroll | SCR | - | O | | Ronin | RON | - | O | | Moonbeam | GLMR | - | O | | Moonriver | MOVR | - | O | | KAVA | KAVA | O | O | | Ethereum Classic | ETC | O | O |

Major ERC-20 / EVM tokens:

| Token | Name | Upbit | Binance | |-------|------|-------|---------| | USDT | Tether | O | O | | USDC | USD Coin | O | O | | LINK | Chainlink | O | O | | UNI | Uniswap | O | O | | AAVE | Aave | O | O | | PEPE | Pepe | O | O | | SHIB | Shiba Inu | O | O | | MKR | Maker | O | O | | LDO | Lido | O | O | | ENS | ENS | O | O | | ONDO | Ondo | O | O | | IMX | Immutable | O | O | | PENDLE | Pendle | O | O | | GRT | The Graph | O | O | | SNX | Synthetix | O | O | | CRV | Curve | O | O | | COMP | Compound | O | O | | 1INCH | 1inch | O | O | | AXS | Axie Infinity | O | O | | SAND | The Sandbox | O | O | | MANA | Decentraland | O | O | | ENJ | Enjin | O | O | | CHZ | Chiliz | O | O | | BAT | Basic Attention | O | O | | WLD | Worldcoin | O | O | | ENA | Ethena | O | O | | ETHFI | EtherFi | O | O | | BLUR | Blur | O | O | | MASK | Mask Network | O | O | | FLOKI | Floki | O | O | | YFI | Yearn | O | O | | SUSHI | SushiSwap | O | O | | ANKR | Ankr | O | O | | SKL | SKALE | O | O | | STORJ | Storj | O | O | | KNC | Kyber Network | O | O | | ZRX | 0x | O | O | | LPT | Livepeer | O | O | | GTC | Gitcoin | O | O | | EIGEN | EigenLayer | O | O | | ZRO | LayerZero | O | O | | ARKM | Arkham | O | O | | ID | SPACE ID | O | O | | CYBER | Cyber | O | O | | ORBS | Orbs | O | - | | PUNDIX | Pundi X | O | - | | IQ | IQ | O | - | | AXL | Axelar | O | O | | SAFE | Safe | O | O | | COW | CoW Protocol | O | O | | W | Wormhole | O | O | | FET | Fetch.ai | O | O | | RSR | Reserve Rights | O | O | | GMX | GMX | - | O | | SSV | SSV Network | - | O | | CVX | Convex | - | O | | RPL | Rocket Pool | - | O | | SNT | Status | O | - | | CVC | Civic | O | - | | MTL | Metal | O | - | | POWR | Power Ledger | O | - | | WBTC | Wrapped Bitcoin | O | O | | PAXG | PAX Gold | - | O |

Plus 50+ additional ERC-20 tokens. Any token deployed on Ethereum or EVM chains is supported.

Estimated total: ~120+ coins


@chainkit/bitcoin (Secp256k1)

Covers Bitcoin and UTXO-model forks sharing Bitcoin's transaction primitives.

Native: BTC

| Token | Chain | Upbit | Binance | |-------|-------|-------|---------| | BTC | Bitcoin | O | O | | DOGE | Dogecoin | O | O | | BCH | Bitcoin Cash | O | O | | LTC | Litecoin | - | O | | BSV | Bitcoin SV | O | - | | ORDI | Bitcoin (BRC-20) | - | O | | 1000SATS | Bitcoin (BRC-20) | - | O |

Note: XEC (eCash), DASH, DGB, RVN, ZEC, DCR, PIVX, XVG are Bitcoin-derived UTXO chains that share similar primitives but may need address format adjustments.

Estimated total: ~14 coins


@chainkit/solana (ED25519)

Covers Solana and all SPL tokens.

Native: SOL

| Token | Name | Upbit | Binance | |-------|------|-------|---------| | SOL | Solana | O | O | | BONK | Bonk | O | O | | JTO | Jito | O | O | | JUP | Jupiter | O | O | | PYTH | Pyth | O | O | | RENDER | Render | O | O | | RAY | Raydium | O | O | | ME | Magic Eden | O | O | | TRUMP | TRUMP | O | O | | PENGU | Pudgy Penguins | O | O | | MOODENG | Moo Deng | O | O | | MEW | cat in a dogs world | O | O | | LAYER | Solayer | O | O | | PUMP | Pump.fun | O | O | | DOOD | Doodles | O | O | | WIF | dogwifhat | - | O | | DRIFT | Drift | O | - | | SONIC | Sonic SVM | O | - | | ORCA | Orca | O | O | | BOME | BOOK OF MEME | - | O | | PNUT | Peanut | - | O | | TNSR | Tensor | - | O | | FIDA | Bonfida | - | O | | NEIRO | Neiro | - | O |

Plus additional SPL tokens. Any token on Solana is supported.

Estimated total: ~32+ coins


@chainkit/tron (Secp256k1)

Covers Tron and all TRC-20 tokens.

Native: TRX

| Token | Name | Upbit | Binance | |-------|------|-------|---------| | TRX | Tron | O | O | | BTT | BitTorrent | O | O | | JST | JUST | O | O | | SUN | Sun | O | O | | WIN | WINkLink | - | O | | USDT | Tether (TRC-20) | O | O |

Estimated total: ~6 coins


@chainkit/ton (ED25519)

Covers TON and Jetton tokens.

Native: TON

| Token | Name | Upbit | Binance | |-------|------|-------|---------| | TON | TON | - | O | | NOT | Notcoin | - | O | | DOGS | DOGS | - | O | | HMSTR | Hamster Kombat | - | O | | CATI | Catizen | - | O |

Estimated total: ~5 coins


@chainkit/cosmos (Secp256k1)

Covers Cosmos Hub and all Cosmos SDK / IBC-connected chains. Supports custom bech32 prefixes.

Native: ATOM

| Token | Chain | Upbit | Binance | |-------|-------|-------|---------| | ATOM | Cosmos Hub | O | O | | INJ | Injective | O | O | | SEI | Sei | O | O | | TIA | Celestia | O | O | | OM | MANTRA | O | O | | AKT | Akash | O | - | | DYDX | dYdX v4 | - | O | | OSMO | Osmosis | - | O | | RUNE | THORChain | - | O | | LUNA | Terra | - | O | | LUNC | Terra Classic | - | O | | SAGA | Saga | - | O | | DYM | Dymension | - | O | | INIT | Initia | - | O | | BAND | Band Protocol | - | O | | SCRT | Secret | - | O | | KAVA | Kava (also EVM) | O | O | | STEEM | Steem | O | O | | HIVE | Hive | O | O |

Note: Any Cosmos SDK chain with IBC support can use this package with a custom bech32 prefix.

Estimated total: ~21 coins


@chainkit/kaia (Secp256k1)

Covers Kaia (prev Klaytn) and KIP-7 tokens. EVM-compatible with klay_ RPC prefix.

Native: KAIA (KLAY)

| Token | Name | Upbit | Binance | |-------|------|-------|---------| | KAIA | Kaia | - | O | | BORA | BORA | O | - | | MBL | MovieBloc | O | O | | MLK | MiL.k | O | - | | MVL | MVL | O | - | | MED | MediBloc | O | - | | META | Metadium | O | - | | MOC | Moss Coin | O | - | | CBK | Cobak | O | - | | DKA | dKargo | O | - | | HUNT | Hunt | O | - |

Estimated total: ~13 coins


@chainkit/polkadot (SR25519)

Covers Polkadot, Kusama, and all Substrate-based parachains. Supports custom SS58 network prefixes.

Native: DOT

| Token | Chain | Upbit | Binance | |-------|-------|-------|---------| | DOT | Polkadot | O | O | | KSM | Kusama | - | O | | ASTR | Astar | O | O | | GLMR | Moonbeam | - | O | | MOVR | Moonriver | - | O | | PHA | Phala | - | O | | POLYX | Polymesh | O | O | | CFG | Centrifuge | O | O |

Estimated total: ~8 coins


@chainkit/xrp (Secp256k1)

Native: XRP

| Token | Name | Upbit | Binance | |-------|------|-------|---------| | XRP | XRP | O | O | | RLUSD | Ripple USD | - | O |

Estimated total: ~2 coins


@chainkit/sui (ED25519)

Native: SUI

| Token | Name | Upbit | Binance | |-------|------|-------|---------| | SUI | Sui | O | O | | WAL | Walrus | O | O | | DEEP | DeepBook | O | O | | CETUS | Cetus | - | O | | HAEDAL | Haedal | - | O |

Estimated total: ~5 coins


@chainkit/aptos (ED25519)

Native: APT

| Token | Upbit | Binance | |-------|-------|---------| | APT | O | O |

Estimated total: ~1 coin


@chainkit/near (ED25519)

Native: NEAR

| Token | Upbit | Binance | |-------|-------|---------| | NEAR | O | O |

Estimated total: ~1 coin


@chainkit/cardano (ED25519)

Native: ADA

| Token | Upbit | Binance | |-------|-------|---------| | ADA | O | O |

Estimated total: ~1 coin


@chainkit/stellar (ED25519)

Native: XLM

| Token | Upbit | Binance | |-------|-------|---------| | XLM | O | O |

Estimated total: ~1 coin


@chainkit/starknet (STARK)

Native: STRK

| Token | Upbit | Binance | |-------|-------|---------| | STRK | - | O |

Estimated total: ~1 coin


@chainkit/stacks (Secp256k1)

Native: STX

| Token | Upbit | Binance | |-------|-------|---------| | STX | O | O |

Estimated total: ~1 coin


@chainkit/eos (Secp256k1)

Native: A (Vaulta, prev EOS)

| Token | Upbit | Binance | |-------|-------|---------| | A (EOS) | O | O |

Estimated total: ~1 coin


@chainkit/hedera (ED25519)

Native: HBAR

Hedera provides two signers:

  • HederaSigner (default, ED25519) -- Hedera-native transactions with public key alias addresses
  • HederaEcdsaSigner (Secp256k1) -- EVM-compatible mode with 0x addresses, for use with Hedera's EVM relay

| Token | Upbit | Binance | |-------|-------|---------| | HBAR | O | O |

Estimated total: ~1 coin


@chainkit/filecoin (Secp256k1)

Native: FIL

| Token | Upbit | Binance | |-------|-------|---------| | FIL | O | O |

Estimated total: ~1 coin


@chainkit/icp (ED25519)

Native: ICP

| Token | Upbit | Binance | |-------|-------|---------| | ICP | O | O |

Estimated total: ~1 coin


@chainkit/algorand (ED25519)

Native: ALGO

| Token | Upbit | Binance | |-------|-------|---------| | ALGO | O | O |

Estimated total: ~1 coin


@chainkit/vechain (Secp256k1)

Native: VET

| Token | Upbit | Binance | |-------|-------|---------| | VET | - | O | | VTHO | - | O |

Estimated total: ~2 coins


@chainkit/tezos (ED25519)

Native: XTZ

| Token | Upbit | Binance | |-------|-------|---------| | XTZ | O | O |

Estimated total: ~1 coin


@chainkit/theta (Secp256k1)

Native: THETA

| Token | Upbit | Binance | |-------|-------|---------| | THETA | O | O | | TFUEL | O | O |

Estimated total: ~2 coins


@chainkit/multiversx (ED25519)

Native: EGLD

| Token | Upbit | Binance | |-------|-------|---------| | EGLD | - | O |

Estimated total: ~1 coin


@chainkit/iota (ED25519)

Native: IOTA

| Token | Upbit | Binance | |-------|-------|---------| | IOTA | - | O |

Estimated total: ~1 coin


@chainkit/neo (Secp256r1)

Native: NEO

| Token | Upbit | Binance | |-------|-------|---------| | NEO | - | O | | GAS | - | O |

Estimated total: ~2 coins


@chainkit/flow (ECDSA_P256)

Native: FLOW

| Token | Upbit | Binance | |-------|-------|---------| | FLOW | O | O |

Estimated total: ~1 coin


@chainkit/icon (Secp256k1)

Native: ICX

| Token | Upbit | Binance | |-------|-------|---------| | ICX | O | O |

Estimated total: ~1 coin


@chainkit/mina (Pasta)

Native: MINA

| Token | Upbit | Binance | |-------|-------|---------| | MINA | - | O |

Estimated total: ~1 coin


Security

Key security properties:

  • No third-party chain SDKs -- eliminates supply chain attack surface
  • All crypto via Cure53-audited libraries -- @noble/hashes, @noble/secp256k1, @noble/ed25519, @scure/bip39, @scure/base
  • Private key zeroing -- SecureKey stores keys as Uint8Array, explicitly zeroed via destroy()
  • Address validation before signing -- recipient addresses validated against chain format before transaction construction
  • ChainId enforcement for EVM -- extra.chainId required, preventing cross-chain replay attacks
  • strictHttps option -- reject non-HTTPS RPC endpoints in production
  • Nonce mutex -- concurrent send() calls use a serialized nonce counter to prevent nonce collisions
  • RPC response validation -- JSON-RPC 2.0 structure verification and request/response ID matching
  • URL redaction -- API keys in RPC URLs are never exposed in error messages
  • Bitcoin fee sanity check -- fee cannot exceed 50% of total input value
  • Network enforcement -- Bitcoin signer rejects addresses from wrong network (mainnet/testnet)
  • Mnemonic validation -- invalid mnemonics rejected before seed derivation
  • Strategy auto-downgrade -- signing clients using fastest strategy automatically downgrade to failover
  • Input sanitization -- send() strips signing-critical fields (outputs, inputs) from user-provided options

Independently audited with 24 security findings identified and remediated.

Playground

Try it live -- no installation required

ChainKit includes a browser-based playground for testing all 30 chains interactively.

Features

| Feature | Description | |---------|-------------| | Global Wallet | Enter one mnemonic, derive addresses for all 30 chains instantly | | Per-Chain Testing | Select any chain to test balance queries, transaction signing, RPC connectivity | | Address Validation | Real-time validation with checksum verification per chain | | Copy & Explorer Links | One-click copy addresses, direct links to block explorers | | Dark Theme | Monospace-friendly UI designed for crypto data |

Run Locally

cd playground
pnpm install
pnpm dev

Architecture

@chainkit/client (unified multi-chain client)
  |
  +-- createClient() --> ReadOnlyChainInstance (no key = read-only)
  |                  --> FullChainInstance     (key provided = read+write)
  |                      +-- send()              auto nonce+fee, sign, broadcast
  |                      +-- prepareTransaction() build unsigned tx
  |                      +-- waitForTransaction() poll until confirmed
  |                      +-- destroy()            zero key material
  |
  +-- @chainkit/core
  |     +-- ChainSigner interface    (generateMnemonic, derivePrivateKey, getAddress,
  |     |                             signTransaction, signMessage, validateAddress,
  |     |                             getDefaultHdPath)
  |     +-- ChainProvider interface  (getBalance, getTransaction, getBlock, getNonce,
  |     |                             estimateFee, broadcastTransaction, getChainInfo,
  |     |                             waitForTransaction)
  |     +-- Capabilities             (ContractCapable, TokenCapable, UtxoCapable,
  |     |                             SubscriptionCapable, EvmSignerCapable)
  |     +-- RpcManager               (failover, round-robin, fastest, strictHttps)
  |     +-- ABI Encoder/Decoder      (encodeFunctionCall, decodeFunctionResult, ERC20 presets)
  |     +-- SecureKey                (Uint8Array key storage with explicit zeroing)
  |     +-- Crypto utilities         (BIP39 mnemonic, BIP32 HD derivation via @scure/bip39
  |                                   + @noble/hashes)
  |
  +-- @chainkit/<chain>
        +-- signer.ts    (offline: key generation, address derivation, tx signing,
        |                 message signing)
        +-- provider.ts  (online: RPC queries, balance, blocks, broadcasting,
        |                 token ops)
        +-- types.ts     (chain-specific types)

License

MIT