Skip to main content

BIP-32 derivation

BIP-32 child key derivation lets you derive multiple public keys (and therefore multiple blockchain addresses) from a single MPC keyshare without running keygen again. The example uses deriveChildPublicKey with path "m" (the root) for its primary address — but you can use any valid BIP-32 path like "m/44'/60'/0'/0/0" for standard HD wallet paths.

For the SDK contract see BIP-32 (Kotlin) and BIP-32 (Swift).

How the example derives addresses

vault/.../session/VaultSessionManager.kt
private suspend fun extractPublicKey(keyType: KeyType, keyshare: ByteArray): ByteArray =
when (keyType) {
KeyType.ECDSA -> SilentShard.ECDSA.deriveChildPublicKey(keyshare, "m").getOrThrow()
KeyType.EdDSA -> SilentShard.EdDSA.getKeysharePublicKey(keyshare).getOrThrow()
}

ECDSA keys support BIP-32 derivation (deriveChildPublicKey). EdDSA keys use getKeysharePublicKey directly — the Ed25519 curve doesn't support the standard BIP-32 derivation scheme.

The returned public key bytes are then passed to AddressUtils.deriveAddress in the app layer, which handles the chain-specific encoding (Ethereum keccak-256 + checksum, Solana base58).