39 const std::string &contractId,
40 const std::unordered_map<std::string, std::string> &idToType,
43 if (trimmedContractId.empty()) {
47 const auto indexedType = idToType.find(trimmedContractId);
48 if (indexedType != idToType.end()) {
50 if (!trimmedType.empty()) {
55 for (
const auto &contract : state.
contracts()) {
64 if (!trimmedType.empty()) {
81 std::unordered_map<std::string, std::string> propertyNamesById;
82 propertyNamesById.reserve(state.
properties().size());
83 for (
const auto &property : state.
properties()) {
85 propertyNamesById[
property->id()] =
property->name();
89 std::unordered_map<std::string, std::string> contractTypesById;
90 contractTypesById.reserve(state.
contracts().size());
91 for (
const auto &contract : state.
contracts()) {
93 contractTypesById[contract->id()] = contract->type();
98 std::unordered_set<std::string> seenContractTypes;
99 std::unordered_set<std::string> seenProperties;
102 if (!transaction || transaction->propertyIds().empty()) {
107 transaction->contractId(), contractTypesById, state);
108 if (seenContractTypes.insert(contractType).second) {
112 for (
const auto &propertyId : transaction->propertyIds()) {
113 const auto propertyNameIt = propertyNamesById.find(propertyId);
114 const std::string propertyName = propertyNameIt != propertyNamesById.end()
115 ? propertyNameIt->second
118 transaction->amount();
119 seenProperties.insert(propertyName);
124 for (
const auto &property : state.
properties()) {
131 if (seenProperties.erase(property->name()) > 0) {
137 if (seenProperties.erase(propertyName) > 0) {