signDataV2 method

  1. @SquadronMethod.new()
  2. @dataSignatureMarshaler
Future<DataSignature> signDataV2(
  1. @walletMarshaler CardanoWalletImpl wallet,
  2. String payloadHex,
  3. String requestedSignerRaw,
  4. int deriveMaxAddressCount,
)

Implementation

@SquadronMethod()
@dataSignatureMarshaler
Future<DataSignature> signDataV2(
  @walletMarshaler CardanoWalletImpl wallet,
  String payloadHex,
  String requestedSignerRaw,
  int deriveMaxAddressCount,
) async {
  final Uint8List payloadBytes = payloadHex.hexDecode();

  // Note avoiding calling wallet.cardanoPubAccount() to keep the operation in current worker/isolate
  final pubAccount = await CardanoPubAccountFactory.instanceSync.fromBech32XPub(wallet.xPubBech32);
  final signer = await WalletTasksSign.findCardanoSigner(
    pubAccount: pubAccount,
    requestedSignerRaw: requestedSignerRaw,
    deriveMaxAddressCount: deriveMaxAddressCount,
  );
  final signingKeyPair = await WalletTasksSign.signerToSigningKeyPair(
    wallet: wallet,
    signer: signer,
  );

  final headers = SigningUtils.prepareCoseHeaders(
    requestedSignerBytes: signer.requestedSignerBytes,
    hashed: false,
  );

  final dataToSign = SigningUtils.prepareBytesToSign(
    headers: headers,
    payloadBytes: payloadBytes,
  );

  final SignedMessage signedMessage = signingKeyPair.signingKey.sign(dataToSign);

  final DataSignature dataSignature = SigningUtils.prepareDataSignature(
    verifyRawKeyBytes: signingKeyPair.verifyKey.rawKey.toUint8List(),
    headers: headers,
    payloadBytes: payloadBytes,
    signatureBytes: signedMessage.signature.toUint8List(),
  );

  return dataSignature;
}