Skip to content

Commit

Permalink
fix two way link removal processing. (#829)
Browse files Browse the repository at this point in the history
* fix two way link removal processing.

* fix resolving two way link if target end doesnt exist. Previously it was marked as valid two way link

* changelog entry for bug fixes.
  • Loading branch information
PawelPawelec-RDX authored Feb 27, 2025
1 parent 6386114 commit e6d7492
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 36 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
## 1.10.0
Release built: _not released yet_

### Bug fixes
- Fixed two bugs in two-way links returned from `/state/entity/details`:
- If one end of the link pointed to an entity without a corresponding metadata key, it was incorrectly considered a valid two-way link.
- Fixed invalidation after removing a metadata entry on one end. Previously, the link was still considered valid even after the metadata entry was removed.

### API Changes
- New filters are supported on the `/stream/transactions` endpoint:
- `transaction_status_filter` - Allows filtering by the transaction commit status (`Success`, `Failure`, `All`). Defaults to `All`.
Expand Down Expand Up @@ -36,7 +41,6 @@ Release built: _not released yet_
- Added a new configuration parameter, `GatewayApi__Endpoint__EntitiesByRoleRequirementLookupMaxRequestedRequirementsCount`, which sets the limit (default `50`) on the number of requirements that can be queried using the `/extensions/entities-by-role-requirement/lookup` endpoint.
- Added a new configuration parameter, `GatewayApi__Endpoint__ImplicitRequirementsLookupMaxRequestedRequirementsCount`, which sets the limit (default `100`) on the number of implicit requirements that can be queried using the `/extensions/implicit-requirements/lookup` endpoint.


## 1.9.2
Release built: 9.12.2024

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,35 +99,28 @@ public StandardMetadataProcessor(ProcessorContext context, ReferencedEntityDicti

public void VisitUpsert(CoreModel.IUpsertedSubstate substate, ReferencedEntity referencedEntity, long stateVersion)
{
var substateData = substate.Value.SubstateData;

if (substateData is not CoreModel.MetadataModuleEntrySubstate metadataEntry)
{
return;
}

bool TryParseValue<T>([NotNullWhen(true)] out T? value)
T? ParseMetadataValue<T>(CoreModel.MetadataModuleEntrySubstate metadataSubstate)
where T : GatewayModel.MetadataTypedValue
{
var parsed = metadataEntry.Value == null
var parsed = metadataSubstate.Value == null
? null
: ScryptoSborUtils.DecodeToGatewayMetadataItemValue(metadataEntry.Value.DataStruct.StructData.GetDataBytes(), _context.NetworkConfiguration.Id);
: ScryptoSborUtils.DecodeToGatewayMetadataItemValue(metadataSubstate.Value.DataStruct.StructData.GetDataBytes(), _context.NetworkConfiguration.Id);

if (parsed is T typed)
{
value = typed;
return true;
}
return parsed as T;
}

var substateData = substate.Value.SubstateData;

value = default;
return false;
if (substateData is not CoreModel.MetadataModuleEntrySubstate metadataEntry)
{
return;
}

var key = metadataEntry.Key.Name;

if (referencedEntity.Address.IsAccount)
{
if (key == StandardMetadataConstants.DappAccountType && TryParseValue<GatewayModel.MetadataStringValue>(out var accountType))
if (key == StandardMetadataConstants.DappAccountType)
{
_entriesToAdd.Add(
new DappAccountTypeUnverifiedStandardMetadataEntryHistory
Expand All @@ -137,10 +130,10 @@ bool TryParseValue<T>([NotNullWhen(true)] out T? value)
EntityId = referencedEntity.DatabaseId,
IsDeleted = metadataEntry.Value == null,
IsLocked = substateData.IsLocked,
Value = accountType.Value,
Value = ParseMetadataValue<GatewayModel.MetadataStringValue>(metadataEntry)?.Value,
});
}
else if (key == StandardMetadataConstants.DappClaimedWebsites && TryParseValue<GatewayModel.MetadataOriginArrayValue>(out var claimedWebsites))
else if (key == StandardMetadataConstants.DappClaimedWebsites)
{
_entriesToAdd.Add(
new DappClaimedWebsitesUnverifiedStandardMetadataEntryHistory
Expand All @@ -150,10 +143,10 @@ bool TryParseValue<T>([NotNullWhen(true)] out T? value)
EntityId = referencedEntity.DatabaseId,
IsDeleted = metadataEntry.Value == null,
IsLocked = substateData.IsLocked,
ClaimedWebsites = claimedWebsites.Values.ToArray(),
ClaimedWebsites = ParseMetadataValue<GatewayModel.MetadataOriginArrayValue>(metadataEntry)?.Values.ToArray(),
});
}
else if (key == StandardMetadataConstants.DappClaimedEntities && TryParseValue<GatewayModel.MetadataGlobalAddressArrayValue>(out var claimedEntities))
else if (key == StandardMetadataConstants.DappClaimedEntities)
{
_entriesToAdd.Add(
new DappClaimedEntitiesUnverifiedStandardMetadataEntryHistory
Expand All @@ -163,10 +156,13 @@ bool TryParseValue<T>([NotNullWhen(true)] out T? value)
EntityId = referencedEntity.DatabaseId,
IsDeleted = metadataEntry.Value == null,
IsLocked = substateData.IsLocked,
ClaimedEntityIds = claimedEntities.Values.Select(address => _referencedEntities.Get((EntityAddress)address).DatabaseId).ToArray(),
ClaimedEntityIds = ParseMetadataValue<GatewayModel.MetadataGlobalAddressArrayValue>(metadataEntry)
?.Values
.Select(address => _referencedEntities.Get((EntityAddress)address).DatabaseId)
.ToArray(),
});
}
else if (key == StandardMetadataConstants.DappDefinitions && TryParseValue<GatewayModel.MetadataGlobalAddressArrayValue>(out var dappDefinitions))
else if (key == StandardMetadataConstants.DappDefinitions)
{
_entriesToAdd.Add(
new DappDefinitionsUnverifiedStandardMetadataEntryHistory
Expand All @@ -176,11 +172,16 @@ bool TryParseValue<T>([NotNullWhen(true)] out T? value)
EntityId = referencedEntity.DatabaseId,
IsDeleted = metadataEntry.Value == null,
IsLocked = substateData.IsLocked,
DappDefinitionEntityIds = dappDefinitions.Values.Select(address => _referencedEntities.Get((EntityAddress)address).DatabaseId).ToArray(),
DappDefinitionEntityIds = ParseMetadataValue<GatewayModel.MetadataGlobalAddressArrayValue>(metadataEntry)
?.Values
.Select(address => _referencedEntities.Get((EntityAddress)address).DatabaseId)
.ToArray(),
});
}
else if (key == StandardMetadataConstants.DappAccountLocker && TryParseValue<GatewayModel.MetadataGlobalAddressValue>(out var dappAccountLocker))
else if (key == StandardMetadataConstants.DappAccountLocker)
{
var parsedValue = ParseMetadataValue<GatewayModel.MetadataGlobalAddressValue>(metadataEntry);

_entriesToAdd.Add(
new DappAccountLockerUnverifiedStandardMetadataEntryHistory
{
Expand All @@ -189,13 +190,13 @@ bool TryParseValue<T>([NotNullWhen(true)] out T? value)
EntityId = referencedEntity.DatabaseId,
IsDeleted = metadataEntry.Value == null,
IsLocked = substateData.IsLocked,
AccountLockerEntityId = _referencedEntities.Get((EntityAddress)dappAccountLocker.Value).DatabaseId,
AccountLockerEntityId = parsedValue != null ? _referencedEntities.Get((EntityAddress)parsedValue.Value).DatabaseId : null,
});
}
}
else if (referencedEntity.Address.IsResource)
{
if (key == StandardMetadataConstants.DappDefinitions && TryParseValue<GatewayModel.MetadataGlobalAddressArrayValue>(out var dappDefinitions))
if (key == StandardMetadataConstants.DappDefinitions)
{
_entriesToAdd.Add(
new DappDefinitionsUnverifiedStandardMetadataEntryHistory
Expand All @@ -205,14 +206,18 @@ bool TryParseValue<T>([NotNullWhen(true)] out T? value)
EntityId = referencedEntity.DatabaseId,
IsDeleted = metadataEntry.Value == null,
IsLocked = substateData.IsLocked,
DappDefinitionEntityIds = dappDefinitions.Values.Select(address => _referencedEntities.Get((EntityAddress)address).DatabaseId).ToArray(),
DappDefinitionEntityIds = ParseMetadataValue<GatewayModel.MetadataGlobalAddressArrayValue>(metadataEntry)
?.Values
.Select(address => _referencedEntities.Get((EntityAddress)address).DatabaseId)
.ToArray(),
});
}
}
else if (referencedEntity.Address.IsGlobal)
{
if (key == StandardMetadataConstants.DappDefinition && TryParseValue<GatewayModel.MetadataGlobalAddressValue>(out var dappDefinition))
if (key == StandardMetadataConstants.DappDefinition)
{
var parsedValue = ParseMetadataValue<GatewayModel.MetadataGlobalAddressValue>(metadataEntry);
_entriesToAdd.Add(
new DappDefinitionUnverifiedStandardMetadataEntryHistory
{
Expand All @@ -221,7 +226,7 @@ bool TryParseValue<T>([NotNullWhen(true)] out T? value)
EntityId = referencedEntity.DatabaseId,
IsDeleted = metadataEntry.Value == null,
IsLocked = substateData.IsLocked,
DappDefinitionEntityId = _referencedEntities.Get((EntityAddress)dappDefinition.Value).DatabaseId,
DappDefinitionEntityId = parsedValue != null ? _referencedEntities.Get((EntityAddress)parsedValue.Value).DatabaseId : null,
});
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,9 @@ candidates AS (
target_entity.id AS target_entity_id,
target_entity.address AS target_entity_address,
target_entity.discriminator AS target_entity_discriminator,
dapp_marker_check.valid AS dapp_marker_check_valid,
target_dapp_marker_check.valid AS target_dapp_marker_check_valid,
target_entity_check.valid AS target_entity_check_valid
COALESCE(dapp_marker_check.valid, FALSE) AS dapp_marker_check_valid,
COALESCE(target_dapp_marker_check.valid, FALSE) AS target_dapp_marker_check_valid,
COALESCE(target_entity_check.valid, FALSE) AS target_entity_check_valid
FROM entry_history_expanded entry
INNER JOIN entities source_entity ON source_entity.id = entry.entity_id
LEFT JOIN entities target_entity ON target_entity.id = entry.target_entity_id
Expand Down Expand Up @@ -229,7 +229,7 @@ resolved AS (
-- 'on-app-check' - on-ledger, partially validated,
-- 'off-app-check' - off-ledger, partially validated,
-- <non-null string value> - validation failure
coalesce(CASE c.discriminator
COALESCE(CASE c.discriminator
WHEN 'dapp_account_type' THEN
CASE FALSE
WHEN source_discriminator = 'global_account_component' THEN 'account expected'
Expand Down

0 comments on commit e6d7492

Please sign in to comment.