sign method
Creates a multisig transaction from the input and the multisig account.
Implementation
Future<SignedTransaction> sign({
required Account account,
required RawTransaction transaction,
}) async {
final sender = transaction.sender;
if (sender == null) {
throw AlgorandException(message: 'Sender is not valid');
}
// check that from addr of tx matches multisig preimage
if (sender.encodedAddress != toString()) {
throw AlgorandException(
message: 'Transaction sender does not match multisig account',
);
}
// check that account secret key is in multisig pk list
final publicKey = Ed25519PublicKey(
bytes: Uint8List.fromList(account.publicKey.bytes),
);
final index = publicKeys.indexOf(publicKey);
if (index == -1) {
throw AlgorandException(
message: 'Multisig account does not contain this secret key',
);
}
// Create the multisignature
final signedTx = await transaction.sign(account);
final subsigs = <MultisigSubsig>[];
for (var i = 0; i < publicKeys.length; i++) {
if (i == index) {
subsigs.add(
MultisigSubsig(
key: publicKey,
signature: Signature(
bytes: signedTx.signature ?? Uint8List.fromList([]),
),
),
);
} else {
subsigs.add(MultisigSubsig(key: publicKeys[i]));
}
}
final mSig = MultiSignature(
version: version,
threshold: threshold,
subsigs: subsigs,
);
return SignedTransaction(
transaction: transaction,
multiSignature: mSig,
transactionId: signedTx.transactionId,
);
}