parseEntityDetails function

Future<EntityDetails> parseEntityDetails(
  1. List<StateEntityDetailsResponseItem> entities,
  2. StateApi state
)

Implementation

Future<EntityDetails> parseEntityDetails(
    List<StateEntityDetailsResponseItem> entities, StateApi state) async {
  Future<Map<String, String>> getLogicComponents() async {
    final logicVersionStore = entities.firstWhere((s) {
      return s.details?.type ==
              StateEntityDetailsResponseItemDetailsType.component &&
          (s.details as StateEntityDetailsResponseComponentDetails)
                  .blueprintName ==
              'RNSUpdatable';
    }).details as StateEntityDetailsResponseComponentDetails?;

    final componentVersionsField =
        logicVersionStore?.state?.asMap['fields'].firstWhere(
      (f) => f['field_name'] == 'component_versions',
    );

    final versionStoreIds = (await state.keyValueStoreData(
            stateKeyValueStoreDataRequest:
                StateKeyValueStoreDataRequest((builder) {
      builder.keyValueStoreAddress = componentVersionsField['value'];
      builder.keys.addAll([
        StateKeyValueStoreDataRequestKeyItem((builder) {
          builder.keyJson = ProgrammaticScryptoSborValueString((b) {
            b.kind = ProgrammaticScryptoSborValueKind.string;
            b.value = 'rns_logic';
          });
        }),
        StateKeyValueStoreDataRequestKeyItem((builder) {
          builder.keyJson = ProgrammaticScryptoSborValueString((b) {
            b.kind = ProgrammaticScryptoSborValueKind.string;
            b.value = 'rns_auction_logic';
          });
        }),
      ]);
    })))
        .data;

    final versionManagers = versionStoreIds?.entries.map((kv) {
      return (kv.value.programmaticJson as ProgrammaticScryptoSborValueTuple)
          .fields
          .fold<Map<String, dynamic>>(
        {},
        (acc, field) {
          if (isValueType(field)) {
            switch (field.kind) {
              case ProgrammaticScryptoSborValueKind.string:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueString).value;
                break;
              case ProgrammaticScryptoSborValueKind.u128:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueU128).value;
                break;
              case ProgrammaticScryptoSborValueKind.u64:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueU64).value;
                break;
              case ProgrammaticScryptoSborValueKind.u32:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueU32).value;
                break;
              case ProgrammaticScryptoSborValueKind.u16:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueU16).value;
                break;
              case ProgrammaticScryptoSborValueKind.u8:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueU8).value;
                break;
              case ProgrammaticScryptoSborValueKind.i128:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueI128).value;
                break;
              case ProgrammaticScryptoSborValueKind.i64:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueI64).value;
                break;
              case ProgrammaticScryptoSborValueKind.i32:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueI32).value;
                break;
              case ProgrammaticScryptoSborValueKind.i16:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueI16).value;
                break;
              case ProgrammaticScryptoSborValueKind.i8:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueI8).value;
                break;
              case ProgrammaticScryptoSborValueKind.bool_:
                acc[field.fieldName!] =
                    (field as ProgrammaticScryptoSborValueBool).value;
                break;
              case ProgrammaticScryptoSborValueKind.own:
                final typedField = (field as ProgrammaticScryptoSborValueOwn);
                acc[typedField.fieldName!] = typedField.value;
                break;
              case ProgrammaticScryptoSborValueKind.reference:
                final typedField =
                    (field as ProgrammaticScryptoSborValueReference);
                acc[typedField.fieldName!] = typedField.value;
                break;
              default:
                break;
            }
          }
          return acc;
        },
      );
    }).toList();

    final logicComponents = await Future.wait(versionManagers?.map((v) async {
          final kv = await state.keyValueStoreData(
              stateKeyValueStoreDataRequest:
                  StateKeyValueStoreDataRequest((builder) {
            builder.keyValueStoreAddress = v['versions'];
            builder.keys.add(
              StateKeyValueStoreDataRequestKeyItem((builder) {
                builder.keyJson = ProgrammaticScryptoSborValueU64((b) {
                  b.kind = ProgrammaticScryptoSborValueKind.u64;
                  b.value = v['current_version'];
                });
              }),
            );
          }));
          return (kv.data?.entries[0].value.programmaticJson
                  as ProgrammaticScryptoSborValueReference)
              .value;
        }) ??
        []);

    return {
      'radixNameServiceComponent': logicComponents[0] as String,
      'rnsAuctionComponent': logicComponents[1] as String,
    };
  }

  final logicComponents = await getLogicComponents();

  final addresses = entities.fold<Map<String, dynamic>>({}, (acc, entity) {
    if (entity.details?.type ==
        StateEntityDetailsResponseItemDetailsType.component) {
      final stateFields =
          (entity.details as StateEntityDetailsResponseComponentDetails)
              .state!
              .asMap['fields'];

      final biddersVaultId = (stateFields.firstWhere(
          (f) => f['field_name'] == 'bidders_vault',
          orElse: () => {'value': null}))['value'];
      final settlementVaultId = stateFields.firstWhere(
          (f) => f['field_name'] == 'domain_settlement_periods',
          orElse: () => {'value': null})['value'];
      final subdomainVaults = stateFields.firstWhere(
          (f) => f['field_name'] == 'subdomain_vaults',
          orElse: () => {'value': null})['value'];
      final recordServiceVaultId = stateFields.firstWhere(
          (f) => f['field_name'] == 'record_vaults',
          orElse: () => {'value': null})['value'];
      final latestAuctionId = stateFields.firstWhere(
          (f) => f['field_name'] == 'auction_id',
          orElse: () => {'value': null})['value'];
      final latestBidId = stateFields.firstWhere(
          (f) => f['field_name'] == 'bid_id',
          orElse: () => {'value': null})['value'];
      final priceMap = parsePricingTiers(stateFields.firstWhere(
          (f) => f['field_name'] == 'price_mapping',
          orElse: () => null));

      final minimumPremium = stateFields.firstWhere(
          (f) => f['field_name'] == 'minimum_premium',
          orElse: () => {'value': null})['value'];
      final domainEventClaimsKvId = stateFields.firstWhere(
          (f) => f['field_name'] == 'domain_event_claims',
          orElse: () => {'value': null})['value'];
      final domainTldKvId = stateFields.firstWhere(
          (f) => f['field_name'] == 'domain_mintable',
          orElse: () => {'value': null})['value'];

      final name = nameMappings[
          (entity.details as StateEntityDetailsResponseComponentDetails)
              .blueprintName];

      acc.addAll({
        name ??
            ((entity.details as StateEntityDetailsResponseComponentDetails)
                .blueprintName): entity.address,
        if (subdomainVaults != null) 'subdomainVaults': subdomainVaults,
        if (biddersVaultId != null) 'biddersVaultId': biddersVaultId,
        if (settlementVaultId != null) 'settlementVaultId': settlementVaultId,
        if (recordServiceVaultId != null)
          'recordServiceVaultId': recordServiceVaultId,
        if (latestAuctionId != null) 'latestAuctionId': latestAuctionId,
        if (latestBidId != null) 'latestBidId': latestBidId,
        if (priceMap != null) 'priceMap': priceMap,
        if (minimumPremium != null) 'minimumPremium': minimumPremium,
        if (domainEventClaimsKvId != null)
          'domainEventClaimsKvId': domainEventClaimsKvId,
        if (domainTldKvId != null) 'domainTldKvId': domainTldKvId,
      });
    } else if (entity.details?.type ==
            StateEntityDetailsResponseItemDetailsType.fungibleResource ||
        entity.details?.type ==
            StateEntityDetailsResponseItemDetailsType.nonFungibleResource) {
      final items = entity.explicitMetadata?.items;

      if (items != null && items.isNotEmpty) {
        final resourceValue =
            (items[0].value.typed as MetadataStringValue).value;

        if (nameMappings[resourceValue] != null) {
          acc[nameMappings[resourceValue]!] = entity.address;
        }
      }
    }

    return acc;
  });

  return EntityDetails.fromMap({...logicComponents, ...addresses});
}