deriveAddressFromExtendedPublicKey function

Map<String, Object?> deriveAddressFromExtendedPublicKey({
  1. required String extendedPublicKey,
  2. required String chain,
  3. int change = 0,
  4. int index = 0,
  5. String? scriptType,
})

Implementation

Map<String, Object?> deriveAddressFromExtendedPublicKey(
    {required String extendedPublicKey,
    required String chain,
    int change = 0,
    int index = 0,
    String? scriptType}) {
  final info = _chain(chain);
  if (info.curve != 'secp256k1') {
    throw const WalletHDDerivationException(
        'extended public derivation is available only for secp256k1 chains');
  }
  final parsed = parseExtendedKey(extendedPublicKey);
  if (parsed.isPrivate) {
    throw const WalletHDDerivationException(
        'use an extended public key, not an extended private key');
  }
  _index(change, 'change');
  _index(index, 'index');
  final node = parsed._node
      .childKey(Bip32KeyIndex(change))
      .childKey(Bip32KeyIndex(index));
  final script = scriptType ??
      switch (parsed.format) {
        'ypub' || 'upub' || 'Mtub' => 'p2sh-p2wpkh',
        'zpub' || 'vpub' => 'p2wpkh',
        _ => info.defaultScriptType
      };
  final public = node.publicKey.compressed;
  return _addressResult(info, '$change/$index', 0, change, index, script,
      _publicKeyAddress(public, info, script), public);
}