sign method

Future<SignedTransaction> sign({
  1. required Account account,
  2. required RawTransaction transaction,
})

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,
  );
}