combinePartialSignatures method

String combinePartialSignatures(
  1. List<String> signatures
)

Combines multiple partial signatures into a single multisig, ensuring that each public key signs only once and that all the public keys involved are known and valid, and then serializes multisig into the standard format

Implementation

String combinePartialSignatures(List<String> signatures) {
	if (signatures.length > MAX_SIGNER_IN_MULTISIG) {
		throw ArgumentError("Max number of signatures in a multisig is $MAX_SIGNER_IN_MULTISIG");
	}

	var bitmap = 0;
    final compressedSignatures = <Map<String, Uint8List>>[];

	for (int i = 0; i < signatures.length; i++) {
		final parsed = parseSerializedSignature(signatures[i]);
		if (parsed.signatureScheme == SignatureScheme.MultiSig) {
			throw ArgumentError("MultiSig is not supported inside MultiSig");
		}

		Uint8List publicKey;
		if (parsed.signatureScheme == SignatureScheme.ZkLogin) {
			publicKey = toZkLoginPublicIdentifier(
				parsed.zkLogin!["addressSeed"],
				parsed.zkLogin!["iss"],
			).toRawBytes();
		} else {
			publicKey = parsed.pubKey!.toRawBytes();
		}

      compressedSignatures.add({
			parsed.signatureScheme.name: parsed.signature,
		});

		int? publicKeyIndex;
		for (int j = 0; j < publicKeys.length; j++) {
			if (bytesEqual(publicKey, publicKeys[j].publicKey.toRawBytes())) {
				if (bitmap & (1 << j) != 0) {
					throw ArgumentError("Received multiple signatures from the same public key");
				}

				publicKeyIndex = j;
				break;
			}
		}

		if (publicKeyIndex == null) {
			throw ArgumentError("Received signature from unknown public key");
		}

		bitmap |= 1 << publicKeyIndex;
	}

	final multisig = {
		"sigs": compressedSignatures,
		"bitmap": bitmap,
		"multisig_pk": _multisigPublicKey,
	};
    final bytes = bcs.ser('MultiSig', multisig, BcsWriterOptions(maxSize: 8192)).toBytes();
    var tmp = Uint8List(bytes.length + 1);
    tmp.setAll(0, [SIGNATURE_SCHEME_TO_FLAG.MultiSig]);
    tmp.setAll(1, bytes);
    return base64Encode(tmp);
}