sign method

  1. @override
ScpTxData sign()
override

Implementation

@override
ScpTxData sign() {
  final sigs = txData.transactionSignatures;
  if (sigs.length != txData.toSign.length) {
    throw StateError(
        'transactionSignatures length (${sigs.length}) must match '
        'toSign length (${txData.toSign.length})');
  }

  // Build the mutable list of signature entries in the transaction map
  final txSigsList = (txData.transaction['transactionSignatures'] as List?) ??
      <dynamic>[];

  for (int i = 0; i < txData.toSign.length; i++) {
    // wallet.sign() returns base64-encoded ed25519 signature — exactly what
    // SCP expects in transactionSignatures[*].signature.
    final base64Sig = wallet.sign(txData.toSign[i]);

    // Update the model object
    sigs[i] = ScpTransactionSignature(
      parentID: sigs[i].parentID,
      publicKeyIndex: sigs[i].publicKeyIndex,
      coveredFields: sigs[i].coveredFields,
      signature: base64Sig,
    );

    // Update the transaction map
    if (i < txSigsList.length) {
      (txSigsList[i] as Map)['signature'] = base64Sig;
    }
  }

  if (txData.toSign.isNotEmpty) {
    txData.message = txData.toSign.first;
    txData.signature = sigs.first.signature;
  }
  txData.isSigned = true;
  return txData;
}