updateTransactionSC method

Future<({KeyPair previousKeyPair, Transaction transaction})> updateTransactionSC({
  1. required Keychain keychain,
  2. required ApiService apiService,
  3. required String discussionName,
  4. required List<String> adminsPubKey,
  5. required List<String> membersPubKey,
  6. required String adminAddress,
  7. required String serviceName,
  8. required String discussionSCAddress,
  9. required KeyPair adminKeyPair,
  10. bool updateSCAESKey = false,
})

Implementation

Future<({Transaction transaction, KeyPair previousKeyPair})>
    updateTransactionSC({
  required Keychain keychain,
  required ApiService apiService,
  required String discussionName,
  required List<String> adminsPubKey,
  required List<String> membersPubKey,
  required String adminAddress,
  required String serviceName,
  required String discussionSCAddress,
  required KeyPair adminKeyPair,
  bool updateSCAESKey = false,
}) async {
  final indexMap = await apiService.getTransactionIndex([adminAddress]);
  if (indexMap[adminAddress] == null) {
    throw Exception('Discussion not exists');
  }

  var discussionKeyAccess = '';

  if (updateSCAESKey) {
    discussionKeyAccess = generateRandomAESKey();
  } else {
    discussionKeyAccess = uint8ListToHex(
      await getDiscussionKeyAccess(
        apiService: apiService,
        discussionSCAddress: discussionSCAddress,
        keyPair: adminKeyPair,
      ),
    );
  }

  final newContent = _generateDiscussionSCContent(
    discussionName: discussionName,
    adminsPubKey: adminsPubKey,
    discussionKeyAccess: discussionKeyAccess,
  );

  final originPrivateKey = apiService.getOriginKey();

  /// AESKey (32-byte (256-bit) random key) manages SC secrets
  final aesKey = generateRandomAESKey();
  final membersAuthorizedKeys = _addMembersInAuthorized(
    aesKey: aesKey,
    membersPubKey: membersPubKey,
  );

  final ownership = Ownership(
    secret: uint8ListToHex(
      aesEncrypt(discussionKeyAccess, aesKey),
    ),
    authorizedPublicKeys: membersAuthorizedKeys,
  );

  Map<String, Object?> ownershipToJson(Ownership x) {
    final authorizedKeysMap = <String, String>{};
    for (final key in x.authorizedPublicKeys) {
      if (key.publicKey != null && key.encryptedSecretKey != null) {
        authorizedKeysMap[key.publicKey!] = key.encryptedSecretKey!;
      }
    }

    return {
      'authorized_keys': authorizedKeysMap,
      'secret': x.secret == null ? '' : x.secret!,
    };
  }

  final blockchainTxVersion = int.parse(
    (await apiService.getBlockchainVersion()).version.transaction,
  );

  final transactionTransfer = Transaction(
    type: 'transfer',
    version: blockchainTxVersion,
    data: Transaction.initData(),
  ).addRecipient(
    discussionSCAddress,
    action: 'update_discussion',
    args: [
      newContent,
      ownershipToJson(ownership),
    ],
  ).addUCOTransfer(discussionSCAddress, toBigInt(5));

  final transactionTransferBuildResult = keychain.buildTransaction(
    transactionTransfer,
    serviceName,
    indexMap[adminAddress]!,
  );

  final transactionTransferSigned =
      transactionTransferBuildResult.transaction.originSign(originPrivateKey);

  await TransactionUtil().sendTransactions(
    [transactionTransferSigned],
    apiService,
  );

  return (
    transaction: transactionTransferSigned,
    previousKeyPair: transactionTransferBuildResult.keyPair,
  );
}