updateTransactionSC method
Future<({KeyPair previousKeyPair, Transaction transaction})>
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,
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,
);
}