sign method
AptosMultiEd25519Signature
sign(
- List<
int> digest, { - List<
AptosED25519PrivateKey> ? signers, - 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
AptosMultiEd25519Signature sign(List<int> digest,
{List<AptosED25519PrivateKey>? 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)));
int bit = 128;
List<int> bitmap = [0, 0, 0, 0];
List<AptosEd25519Signature> signatures = [];
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 = AptosEd25519Signature(i.sign(digest).signature);
signatures.add(signature);
bits.add(index);
if (forAuth && signatures.length >= publicKey.threshold) {
break;
}
}
if (signatures.length < publicKey.threshold) {
throw DartAptosPluginException(
"Insufficient signatures. Expected ${publicKey.threshold} but ${signatures.length} generated.",
details: {
"expected": publicKey.threshold,
"received": signatures.length
},
);
}
return AptosMultiEd25519Signature(signatures: signatures, bitmap: bitmap);
}