findCardanoSigner static method

Future<CardanoSigner> findCardanoSigner({
  1. required CardanoPubAccount pubAccount,
  2. required String requestedSignerRaw,
  3. required int deriveMaxAddressCount,
})

Implementation

static Future<CardanoSigner> findCardanoSigner({
  required CardanoPubAccount pubAccount,
  required String requestedSignerRaw, // hex or bech32
  required int deriveMaxAddressCount, // max number of addresses to derive for payment and change
}) async {
  // if it's a bech32, convert it to hex
  final requestedSignerHex = ["addr", "stake", "drep", "cc_hot", "cc_cold"].any(requestedSignerRaw.startsWith)
      ? requestedSignerRaw.bech32ToHex()
      : requestedSignerRaw;

  final FutureOr<CardanoSigner> data = switch (requestedSignerHex.length) {
    // This is used for dRep (CIP-95)
    //
    // NOTE: In the future, we can maybe also check against any other payment/change/stake/cc credentials
    //   (since the 56 bytes creds do not include the header which tells us the creds type)
    56 => _dataFromDrepIdOrDrepCreds(
      drepIdOrCredsHex: requestedSignerHex,
      pubAccount: pubAccount,
      deriveMaxAddressCount: deriveMaxAddressCount,
      requestedSignerHex: requestedSignerHex,
    ),
    // 58 or 114 is the length of the stake or receive address hex
    58 => () {
      final requestedSignerBytes = requestedSignerHex.hexDecode();
      final headerBytes = requestedSignerBytes[0];
      return headerBytes & 0x0f > 1
          ? _dataFromDrepIdOrDrepCreds(
              drepIdOrCredsHex: requestedSignerHex,
              pubAccount: pubAccount,
              deriveMaxAddressCount: deriveMaxAddressCount,
              requestedSignerHex: requestedSignerHex,
            )
          : _dataFromAddress(
              requestedSigningAddress: CardanoAddress.fromHexString(requestedSignerHex),
              pubAccount: pubAccount,
              deriveMaxAddressCount: deriveMaxAddressCount,
              requestedSignerHex: requestedSignerHex,
            );
    }(),
    114 => _dataFromAddress(
      requestedSigningAddress: CardanoAddress.fromHexString(requestedSignerHex),
      pubAccount: pubAccount,
      deriveMaxAddressCount: deriveMaxAddressCount,
      requestedSignerHex: requestedSignerHex,
    ),
    _ => throw SigningAddressNotValidException(
      hexInvalidAddressOrCredential: requestedSignerHex,
      signingContext: "When signing payload message",
    ),
  };

  return await data;
}