Derivation paths & accounts
A derivation path specifies how addresses and keys are generated from a seed or mnemonic phrase. This allows you to manage multiple addresses (or "accounts") under the same wallet.
For example, Ethereum commonly uses m/44'/60'/0'/0/0 for the first address. If you want the second address, you'd use m/44'/60'/0'/0/1, and so on.
Multiple address derivation is relevant only for HD wallets (phrase, seed, xpriv, or xpub).
If your wallet is from a private key or public key, you cannot derive multiple addresses — only index 0 is valid.
What is a derivation path?
A derivation path is instructions telling your wallet how to "walk" through a hierarchical key tree. Each segment corresponds to a level of derivation. By changing the final index, you can create new addresses — all from the same root seed.
For example, a Bitcoin wallet using the BIP84 standard (native SegWit) might use:
m/84'/0'/0'/0/0
84'— BIP84 (native SegWit / bech32)0'— Bitcoin coin type (SLIP-44)0'— First account0— External chain (receiving addresses)0— First receiving address
By incrementing the final index (m/84'/0'/0'/0/1, m/84'/0'/0'/0/2, etc.), the wallet deterministically generates new SegWit addresses — all from the same seed.
Using the index option
In ChainGate v2, you derive different addresses using the index option on the connector:
import { importWallet, ChainGate } from 'chaingate'
const wallet = importWallet({ phrase: 'some bip39 phrase ...' })
const cg = new ChainGate({ apiKey: 'your-api-key' })
const bitcoin = cg.connect(cg.networks.bitcoin, wallet)
// Default address (index 0)
const address0 = await bitcoin.address()
console.log('Address #0:', address0)
// Second address (index 1)
const address1 = await bitcoin.address({ index: 1 })
console.log('Address #1:', address1)
// Third address (index 2)
const address2 = await bitcoin.address({ index: 2 })
console.log('Address #2:', address2)
The index is appended to the network's default derivation path. For Bitcoin segwit, { index: 0 } resolves to m/84'/0'/0'/0/0, { index: 1 } to m/84'/0'/0'/0/1, etc.
UTXO address types
For UTXO networks, you can also choose the address type, which selects a different derivation path:
// Segwit address (default for Bitcoin)
const segwitAddr = await bitcoin.address({ addressType: 'segwit' })
// Taproot address
const taprootAddr = await bitcoin.address({ addressType: 'taproot' })
// Legacy address
const legacyAddr = await bitcoin.address({ addressType: 'legacy' })
// Combine address type and index
const taproot3 = await bitcoin.address({ addressType: 'taproot', index: 3 })
Available address types per network
| Network | Available types | Default |
|---|---|---|
| Bitcoin | segwit, taproot, legacy | segwit |
| Litecoin | segwit, taproot, legacy | segwit |
| Dogecoin | legacy | legacy |
| Bitcoin Cash | cashaddr, legacy | cashaddr |
| Bitcoin Testnet | segwit, taproot, legacy | segwit |
| Ethereum | eoa | eoa |
Custom derivation paths
You can override the derivation path entirely:
const address = await bitcoin.address({
derivationPath: "m/44'/0'/0'/0",
index: 5
})
// Resolves to m/44'/0'/0'/0/5
Operations at a specific index
All connector methods support the same options, so you can check balances, transfer, and view history at any index:
// Balance at index 2
const { confirmed } = await bitcoin.addressBalance({ index: 2 })
// Transfer from index 1
const amount = cg.networks.bitcoin.amount('0.001')
const tx = await bitcoin.transfer(amount, 'bc1q...', { index: 1 })
// History at index 3
const history = await bitcoin.addressHistory(undefined, { index: 3 })
Why use different paths?
- Multiple addresses: Assign different addresses for receiving payments, accounting separation, or organizational purposes.
- Privacy: Using a fresh address for each transaction improves privacy on UTXO networks.
- Multi-account support: Some protocols or dApps expect multiple derivation paths for advanced features.
Key points
- HD wallets only: Phrase, seed, xpriv, and xpub wallets support multiple derivation indices.
- Simple API: Use
{ index }to derive addresses — no manual path construction needed. - Address types: UTXO networks support
segwit,taproot,legacy(andcashaddrfor Bitcoin Cash). - Consistent: All connector methods (
address(),addressBalance(),transfer(),addressHistory()) accept the same options. - Default paths: ChainGate uses each network's standard derivation path (e.g.,
m/84'/0'/0'/0for Bitcoin segwit,m/44'/60'/0'/0for Ethereum). - Private/public key wallets: Only index
0is valid since there's a single key.