sign method

  1. @override
AptosMultiKeySignature sign(
  1. List<int> digest, {
  2. List<AptosBasePrivateKey<AptosCryptoPublicKey<IPublicKey>, AptosAnySignature>>? signers,
  3. bool forAuth = false,
})
override

Sign the digest using the appropriate private keys, considering the threshold and bitmap. signers can be provided to select specific private keys. If forAuth is true, the function will break early when the required number of signatures for authentication is reached.

Implementation

@override
AptosMultiKeySignature sign(List<int> digest,
    {List<AptosBasePrivateKey>? signers, bool forAuth = false}) {
  signers = (signers ?? privateKeys)
      .where((e) => publicKey.publicKeys.contains(e.publicKey))
      .toList();
  signers.sort((a, b) => publicKey.publicKeys
      .indexOf(a.publicKey)
      .compareTo(publicKey.publicKeys.indexOf(b.publicKey)));

  const int bit = 128;
  final List<int> bitmap = [0, 0, 0, 0];
  List<AptosAnySignature> signatures = [];
  final List<int> bits = [];
  for (final i in signers) {
    final index = publicKey.publicKeys.indexOf(i.publicKey);
    if (index < 0 || bits.contains(index)) continue;
    int offset = (index / 8).floor();
    bitmap[offset] |= bit >> index % 8;
    final signature = i.sign(digest);
    signatures.add(signature);
    if (forAuth && signatures.length >= publicKey.requiredSignature) {
      break;
    }
  }
  if (signatures.length < publicKey.requiredSignature) {
    throw DartAptosPluginException(
      "Insufficient signatures. Expected ${publicKey.requiredSignature} but ${signatures.length} generated.",
      details: {
        "expected": publicKey.requiredSignature,
        "received": signatures.length
      },
    );
  }
  return AptosMultiKeySignature(signatures: signatures, bitmap: bitmap);
}