findCardanoSigner static method
Future<CardanoSigner>
findCardanoSigner(
{ - required CardanoPubAccount pubAccount,
- required String requestedSignerRaw,
- 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;
}