deriveDynamicFieldId function

String deriveDynamicFieldId({
  1. required String parentObjectId,
  2. required String keyTypeTag,
  3. required Uint8List keyBcs,
})

Deterministic UID of a dynamic field. Lets callers getObject(uid) directly instead of paginating listDynamicFields.

BLAKE2b-256 of: 0xf0 || parent (32) || keyLen (u64 LE) || keyBcs || typeTagBcs.

Implementation

String deriveDynamicFieldId({
  required String parentObjectId,
  required String keyTypeTag,
  required Uint8List keyBcs,
}) {
  final parentBytes = Hex.decode(normalizeSuiAddress(parentObjectId));
  final keyTypeTagBcs = SuiBcs.TypeTag.serialize(keyTypeTag).toBytes();

  final lenLE = ByteData(8)..setUint64(0, keyBcs.length, Endian.little);

  final input = BytesBuilder(copy: false)
    ..addByte(_kHashingIntentChildObjectId)
    ..add(parentBytes)
    ..add(lenLE.buffer.asUint8List())
    ..add(keyBcs)
    ..add(keyTypeTagBcs);

  return normalizeSuiAddress('0x${Hex.encode(blake2b(input.toBytes()))}');
}