Skip to content

Commit

Permalink
Use previous substate version to calculate component's resource change
Browse files Browse the repository at this point in the history
  • Loading branch information
krzlabrdx committed Aug 21, 2023
1 parent 8fa55ae commit b0abf54
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 79 deletions.
36 changes: 36 additions & 0 deletions src/RadixDlt.CoreApiSdk/Model/CreatedSubstate.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;

namespace RadixDlt.CoreApiSdk.Model;

public partial class StateUpdates
{
public List<IAbc> MyCreated => CreatedSubstates.ToList<IAbc>();
public List<IAbc> MyUpdate => UpdatedSubstates.ToList<IAbc>();
}

public partial class CreatedSubstate : IAbc
{
public SubstateValue PreviousValue => null;
}

public partial class UpdatedSubstate : IAbc
{
public SubstateValue Value => NewValue;
}

public interface IAbc
{
public SubstateId SubstateId { get; }

public SubstateValue Value { get; }

public SubstateValue PreviousValue { get; }

[MemberNotNullWhen(true, nameof(Value))]
public bool HasValue => Value != null;

[MemberNotNullWhen(true, nameof(PreviousValue))]
public bool HasPreviousValue => PreviousValue != null;
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ namespace RadixDlt.NetworkGateway.Abstractions.Numerics;
public static readonly TokenAmount Zero;
public static readonly TokenAmount NaN;
public static readonly TokenAmount OneFullUnit;
public static readonly TokenAmount MinusOne;

static TokenAmount()
{
Expand All @@ -88,7 +87,6 @@ static TokenAmount()
Zero = new TokenAmount(0);
NaN = new TokenAmount(true);
OneFullUnit = new TokenAmount(_divisor);
MinusOne = new TokenAmount(-1);
}

private readonly BigInteger _subUnits;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public TransactionStreamReader(
Hash = false,
Raw = false,
Typed = true,
Previous = false,
Previous = true,
},
sborFormatOptions: new CoreModel.SborFormatOptions
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -351,10 +351,7 @@ private async Task<ExtendLedgerReport> ProcessTransactions(ReadWriteDbContext db
});
}

foreach (var substate in stateUpdates
.CreatedSubstates
.Select(x => new { x.SubstateId, x.Value })
.Concat(stateUpdates.UpdatedSubstates.Select(x => new { x.SubstateId, Value = x.NewValue })))
foreach (var substate in stateUpdates.MyCreated.Concat(stateUpdates.MyUpdate))
{
var substateId = substate.SubstateId;
var substateData = substate.Value.SubstateData;
Expand Down Expand Up @@ -768,10 +765,7 @@ private async Task<ExtendLedgerReport> ProcessTransactions(ReadWriteDbContext db

try
{
foreach (var substate in stateUpdates
.CreatedSubstates
.Select(x => new { x.SubstateId, x.Value })
.Concat(stateUpdates.UpdatedSubstates.Select(x => new { x.SubstateId, Value = x.NewValue })))
foreach (var substate in stateUpdates.MyCreated.Concat(stateUpdates.MyUpdate))
{
var substateId = substate.SubstateId;
var substateData = substate.Value.SubstateData;
Expand All @@ -789,15 +783,51 @@ private async Task<ExtendLedgerReport> ProcessTransactions(ReadWriteDbContext db

if (substateData is CoreModel.FungibleVaultFieldBalanceSubstate fungibleVaultFieldBalanceSubstate)
{
var vaultEntity = referencedEntity.GetDatabaseEntity<InternalFungibleVaultEntity>();
var resourceEntity = referencedEntities.GetByDatabaseId(vaultEntity.ResourceEntityId);
var amount = TokenAmount.FromDecimalString(fungibleVaultFieldBalanceSubstate.Value.Amount);
var resourceEntity = referencedEntities.GetByDatabaseId(referencedEntity.GetDatabaseEntity<InternalFungibleVaultEntity>().ResourceEntityId);

fungibleVaultChanges.Add(new FungibleVaultChange(referencedEntity, resourceEntity, amount, stateVersion));

if (!vaultEntity.IsRoyaltyVault)
{
var previousAmountRaw = (substate.PreviousValue?.SubstateData as CoreModel.FungibleVaultFieldBalanceSubstate)?.Value.Amount;
var previousAmount = previousAmountRaw == null ? TokenAmount.Zero : TokenAmount.FromDecimalString(previousAmountRaw);
var delta = amount - previousAmount;

entityFungibleResourceBalanceChangeEvents.Add(new EntityFungibleResourceBalanceChangeEvent(referencedEntity.DatabaseGlobalAncestorId, referencedEntity.DatabaseId,
delta, stateVersion));

if (referencedEntity.DatabaseGlobalAncestorId != referencedEntity.DatabaseOwnerAncestorId)
{
entityFungibleResourceBalanceChangeEvents.Add(new EntityFungibleResourceBalanceChangeEvent(referencedEntity.DatabaseOwnerAncestorId, referencedEntity.DatabaseId,
delta, stateVersion));
}
}
}

if (substateData is CoreModel.NonFungibleVaultFieldBalanceSubstate nonFungibleVaultFieldBalanceSubstate)
{
var amount = long.Parse(nonFungibleVaultFieldBalanceSubstate.Value.Amount);

var previousAmountRaw = (substate.PreviousValue?.SubstateData as CoreModel.NonFungibleVaultFieldBalanceSubstate)?.Value.Amount;
var previousAmount = previousAmountRaw == null ? 0 : long.Parse(previousAmountRaw);
var delta = amount - previousAmount;

entityNonFungibleResourceBalanceChangeEvents.Add(new EntityNonFungibleResourceBalanceChangeEvent(referencedEntity.DatabaseGlobalAncestorId, referencedEntity.DatabaseId,
delta, stateVersion));

if (referencedEntity.DatabaseGlobalAncestorId != referencedEntity.DatabaseOwnerAncestorId)
{
entityNonFungibleResourceBalanceChangeEvents.Add(new EntityNonFungibleResourceBalanceChangeEvent(referencedEntity.DatabaseOwnerAncestorId, referencedEntity.DatabaseId,
delta, stateVersion));
}
}

if (substateData is CoreModel.NonFungibleVaultContentsIndexEntrySubstate nonFungibleVaultContentsIndexEntrySubstate)
{
var resourceEntity = referencedEntities.GetByDatabaseId(referencedEntity.GetDatabaseEntity<InternalNonFungibleVaultEntity>().ResourceEntityId);
var vaultEntity = referencedEntity.GetDatabaseEntity<InternalNonFungibleVaultEntity>();
var resourceEntity = referencedEntities.GetByDatabaseId(vaultEntity.ResourceEntityId);

nonFungibleVaultChanges.Add(new NonFungibleVaultChange(
referencedEntity,
Expand Down Expand Up @@ -1190,109 +1220,51 @@ private async Task<ExtendLedgerReport> ProcessTransactions(ReadWriteDbContext db
}
else if (EventDecoder.TryGetFungibleVaultWithdrawalEvent(decodedEvent, out var fungibleVaultWithdrawalEvent))
{
var value = TokenAmount.FromDecimalString(fungibleVaultWithdrawalEvent.value.AsStr());
var vaultEntity = eventEmitterEntity.GetDatabaseEntity<InternalFungibleVaultEntity>();
var resourceEntityId = vaultEntity.ResourceEntityId;

ledgerTransactionMarkersToAdd.Add(new EventLedgerTransactionMarker
{
Id = sequences.LedgerTransactionMarkerSequence++,
StateVersion = stateVersion,
EventType = LedgerTransactionMarkerEventType.Withdrawal,
EntityId = eventEmitterEntity.DatabaseGlobalAncestorId,
ResourceEntityId = resourceEntityId,
Quantity = value,
ResourceEntityId = eventEmitterEntity.GetDatabaseEntity<InternalFungibleVaultEntity>().ResourceEntityId,
Quantity = TokenAmount.FromDecimalString(fungibleVaultWithdrawalEvent.value.AsStr()),
});

if (!vaultEntity.IsRoyaltyVault)
{
entityFungibleResourceBalanceChangeEvents.Add(new EntityFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseGlobalAncestorId, resourceEntityId,
value * TokenAmount.MinusOne, stateVersion));

if (eventEmitterEntity.DatabaseGlobalAncestorId != eventEmitterEntity.DatabaseOwnerAncestorId)
{
entityFungibleResourceBalanceChangeEvents.Add(new EntityFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseOwnerAncestorId, resourceEntityId,
value * TokenAmount.MinusOne, stateVersion));
}
}
}
else if (EventDecoder.TryGetFungibleVaultDepositEvent(decodedEvent, out var fungibleVaultDepositEvent))
{
var value = TokenAmount.FromDecimalString(fungibleVaultDepositEvent.value.AsStr());
var vaultEntity = eventEmitterEntity.GetDatabaseEntity<InternalFungibleVaultEntity>();
var resourceEntityId = vaultEntity.ResourceEntityId;

ledgerTransactionMarkersToAdd.Add(new EventLedgerTransactionMarker
{
Id = sequences.LedgerTransactionMarkerSequence++,
StateVersion = stateVersion,
EventType = LedgerTransactionMarkerEventType.Deposit,
EntityId = eventEmitterEntity.DatabaseGlobalAncestorId,
ResourceEntityId = resourceEntityId,
Quantity = value,
ResourceEntityId = eventEmitterEntity.GetDatabaseEntity<InternalFungibleVaultEntity>().ResourceEntityId,
Quantity = TokenAmount.FromDecimalString(fungibleVaultDepositEvent.value.AsStr()),
});

if (!vaultEntity.IsRoyaltyVault)
{
entityFungibleResourceBalanceChangeEvents.Add(new EntityFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseGlobalAncestorId, resourceEntityId, value,
stateVersion));

if (eventEmitterEntity.DatabaseGlobalAncestorId != eventEmitterEntity.DatabaseOwnerAncestorId)
{
entityFungibleResourceBalanceChangeEvents.Add(new EntityFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseOwnerAncestorId, resourceEntityId, value,
stateVersion));
}
}
}
else if (EventDecoder.TryGetNonFungibleVaultWithdrawalEvent(decodedEvent, out var nonFungibleVaultWithdrawalEvent))
{
var value = nonFungibleVaultWithdrawalEvent.value.Count.ToString();
var vaultEntity = eventEmitterEntity.GetDatabaseEntity<InternalNonFungibleVaultEntity>();
var resourceEntityId = vaultEntity.ResourceEntityId;

ledgerTransactionMarkersToAdd.Add(new EventLedgerTransactionMarker
{
Id = sequences.LedgerTransactionMarkerSequence++,
StateVersion = stateVersion,
EventType = LedgerTransactionMarkerEventType.Withdrawal,
EntityId = eventEmitterEntity.DatabaseGlobalAncestorId,
ResourceEntityId = resourceEntityId,
Quantity = TokenAmount.FromDecimalString(value),
ResourceEntityId = eventEmitterEntity.GetDatabaseEntity<InternalNonFungibleVaultEntity>().ResourceEntityId,
Quantity = TokenAmount.FromDecimalString(nonFungibleVaultWithdrawalEvent.value.Count.ToString()),
});

entityNonFungibleResourceBalanceChangeEvents.Add(new EntityNonFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseGlobalAncestorId, resourceEntityId,
long.Parse(value) * -1, stateVersion));

if (eventEmitterEntity.DatabaseGlobalAncestorId != eventEmitterEntity.DatabaseOwnerAncestorId)
{
entityNonFungibleResourceBalanceChangeEvents.Add(new EntityNonFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseOwnerAncestorId, resourceEntityId,
long.Parse(value) * -1, stateVersion));
}
}
else if (EventDecoder.TryGetNonFungibleVaultDepositEvent(decodedEvent, out var nonFungibleVaultDepositEvent))
{
var value = nonFungibleVaultDepositEvent.value.Count.ToString();
var vaultEntity = eventEmitterEntity.GetDatabaseEntity<InternalNonFungibleVaultEntity>();
var resourceEntityId = vaultEntity.ResourceEntityId;

ledgerTransactionMarkersToAdd.Add(new EventLedgerTransactionMarker
{
Id = sequences.LedgerTransactionMarkerSequence++,
StateVersion = stateVersion,
EventType = LedgerTransactionMarkerEventType.Deposit,
EntityId = eventEmitterEntity.DatabaseGlobalAncestorId,
ResourceEntityId = resourceEntityId,
Quantity = TokenAmount.FromDecimalString(value),
ResourceEntityId = eventEmitterEntity.GetDatabaseEntity<InternalNonFungibleVaultEntity>().ResourceEntityId,
Quantity = TokenAmount.FromDecimalString(nonFungibleVaultDepositEvent.value.Count.ToString()),
});

entityNonFungibleResourceBalanceChangeEvents.Add(new EntityNonFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseGlobalAncestorId, resourceEntityId,
long.Parse(value), stateVersion));

if (eventEmitterEntity.DatabaseGlobalAncestorId != eventEmitterEntity.DatabaseOwnerAncestorId)
{
entityNonFungibleResourceBalanceChangeEvents.Add(new EntityNonFungibleResourceBalanceChangeEvent(eventEmitterEntity.DatabaseOwnerAncestorId, resourceEntityId,
long.Parse(value), stateVersion));
}
}
else if (EventDecoder.TryGetFungibleResourceMintedEvent(decodedEvent, out var fungibleResourceMintedEvent))
{
Expand Down

0 comments on commit b0abf54

Please sign in to comment.