diff --git a/src/main/java/org/cardanofoundation/explorer/api/repository/ledgersyncagg/AddressTxAmountRepository.java b/src/main/java/org/cardanofoundation/explorer/api/repository/ledgersyncagg/AddressTxAmountRepository.java index 947adf100..c93f1c7b4 100644 --- a/src/main/java/org/cardanofoundation/explorer/api/repository/ledgersyncagg/AddressTxAmountRepository.java +++ b/src/main/java/org/cardanofoundation/explorer/api/repository/ledgersyncagg/AddressTxAmountRepository.java @@ -198,8 +198,9 @@ List findAllByStakeAddressAndTxHashIn( @Query( value = """ - SELECT max(atm.blockTime) FROM AddressTxAmount atm - WHERE atm.unit = :unit + SELECT MAX(slot) + FROM AddressTxAmount + WHERE unit = :unit """) - Long getLastActivityTimeOfToken(@Param("unit") String unit); + Long getLastActivitySlotOfToken(@Param("unit") String unit); } diff --git a/src/main/java/org/cardanofoundation/explorer/api/service/impl/TokenServiceImpl.java b/src/main/java/org/cardanofoundation/explorer/api/service/impl/TokenServiceImpl.java index b9c48ba72..e218b7c57 100644 --- a/src/main/java/org/cardanofoundation/explorer/api/service/impl/TokenServiceImpl.java +++ b/src/main/java/org/cardanofoundation/explorer/api/service/impl/TokenServiceImpl.java @@ -46,8 +46,6 @@ import org.cardanofoundation.explorer.api.repository.ledgersync.MaTxMintRepository; import org.cardanofoundation.explorer.api.repository.ledgersync.MultiAssetRepository; import org.cardanofoundation.explorer.api.repository.ledgersync.ScriptRepository; -import org.cardanofoundation.explorer.api.repository.ledgersync.StakeAddressRepository; -import org.cardanofoundation.explorer.api.repository.ledgersyncagg.AddressRepository; import org.cardanofoundation.explorer.api.repository.ledgersyncagg.AddressTxAmountRepository; import org.cardanofoundation.explorer.api.repository.ledgersyncagg.AggregateAddressTokenRepository; import org.cardanofoundation.explorer.api.repository.ledgersyncagg.LatestTokenBalanceRepository; @@ -77,9 +75,7 @@ public class TokenServiceImpl implements TokenService { private final MaTxMintRepository maTxMintRepository; private final AssetMetadataRepository assetMetadataRepository; private final LatestTokenBalanceRepository latestTokenBalanceRepository; - private final AddressRepository addressRepository; private final AddressTxAmountRepository addressTxAmountRepository; - private final StakeAddressRepository stakeAddressRepository; private final ScriptRepository scriptRepository; private final TokenMapper tokenMapper; @@ -224,11 +220,11 @@ public TokenResponse getTokenDetail(String tokenId) { tokenResponse.setMetadata(assetMetadataMapper.fromAssetMetadata(assetMetadata)); - Long latestEpochTime = - addressTxAmountRepository.getLastActivityTimeOfToken(multiAsset.getUnit()); - tokenResponse.setTokenLastActivity( - Timestamp.valueOf( - LocalDateTime.ofInstant(Instant.ofEpochSecond(latestEpochTime), ZoneOffset.UTC))); + Long latestSlot = addressTxAmountRepository.getLastActivitySlotOfToken(multiAsset.getUnit()); + + var latestEpochTime = cardanoConverters.slot().slotToTime(latestSlot); + + tokenResponse.setTokenLastActivity(Timestamp.valueOf(latestEpochTime)); setTxMetadataJson(tokenResponse, multiAsset); return tokenResponse; } diff --git a/src/test/java/org/cardanofoundation/explorer/api/service/TokenServiceTest.java b/src/test/java/org/cardanofoundation/explorer/api/service/TokenServiceTest.java index a89596d68..1ae47791a 100644 --- a/src/test/java/org/cardanofoundation/explorer/api/service/TokenServiceTest.java +++ b/src/test/java/org/cardanofoundation/explorer/api/service/TokenServiceTest.java @@ -243,12 +243,16 @@ void testGetTokenDetail_WhenTokenFoundAndMetadataJsonIsNullAndTokenTypeIsFT() { when(assetMetadataMapper.fromAssetMetadata(metadata)).thenReturn(tokenMetadataResponse); // Configure MultiAssetRepository.getLastActivityTimeOfToken(...). + CardanoConverters cardanoConverters = + ClasspathConversionsFactory.createConverters(NetworkType.MAINNET); + ReflectionTestUtils.setField(tokenService, "cardanoConverters", cardanoConverters); + final long latestEpochTime = 1715133010; - final Timestamp latestTimestamp = - Timestamp.valueOf( - LocalDateTime.ofInstant(Instant.ofEpochSecond(latestEpochTime), ZoneOffset.UTC)); - when(addressTxAmountRepository.getLastActivityTimeOfToken(multiAsset.getUnit())) - .thenReturn(latestEpochTime); + final LocalDateTime latestEpochDateTime = + LocalDateTime.ofInstant(Instant.ofEpochSecond(latestEpochTime), ZoneOffset.UTC); + final Timestamp latestTimestamp = Timestamp.valueOf(latestEpochDateTime); + when(addressTxAmountRepository.getLastActivitySlotOfToken(multiAsset.getUnit())) + .thenReturn(cardanoConverters.time().toSlot(latestEpochDateTime)); when(maTxMintRepository.getTxMetadataToken(anyString(), any())).thenReturn(null); @@ -312,12 +316,16 @@ void testGetTokenDetail_WhenTokenFoundAndMetadataJsonNotContainVersionKeyAndToke when(assetMetadataMapper.fromAssetMetadata(metadata)).thenReturn(tokenMetadataResponse); // Configure MultiAssetRepository.getLastActivityTimeOfToken(...). + CardanoConverters cardanoConverters = + ClasspathConversionsFactory.createConverters(NetworkType.MAINNET); + ReflectionTestUtils.setField(tokenService, "cardanoConverters", cardanoConverters); + final long latestEpochTime = 1715133010; - final Timestamp latestTimestamp = - Timestamp.valueOf( - LocalDateTime.ofInstant(Instant.ofEpochSecond(latestEpochTime), ZoneOffset.UTC)); - when(addressTxAmountRepository.getLastActivityTimeOfToken(multiAsset.getUnit())) - .thenReturn(latestEpochTime); + final LocalDateTime latestEpochDateTime = + LocalDateTime.ofInstant(Instant.ofEpochSecond(latestEpochTime), ZoneOffset.UTC); + final Timestamp latestTimestamp = Timestamp.valueOf(latestEpochDateTime); + when(addressTxAmountRepository.getLastActivitySlotOfToken(multiAsset.getUnit())) + .thenReturn(cardanoConverters.time().toSlot(latestEpochDateTime)); when(maTxMintRepository.getTxMetadataToken(anyString(), any())) .thenReturn( @@ -382,12 +390,16 @@ void testGetTokenDetail_WhenTokenFoundAndMetadataJsonContainsVersionKeyAndTokenT when(assetMetadataMapper.fromAssetMetadata(metadata)).thenReturn(tokenMetadataResponse); // Configure MultiAssetRepository.getLastActivityTimeOfToken(...). + CardanoConverters cardanoConverters = + ClasspathConversionsFactory.createConverters(NetworkType.MAINNET); + ReflectionTestUtils.setField(tokenService, "cardanoConverters", cardanoConverters); + final long latestEpochTime = 1715133010; - final Timestamp latestTimestamp = - Timestamp.valueOf( - LocalDateTime.ofInstant(Instant.ofEpochSecond(latestEpochTime), ZoneOffset.UTC)); - when(addressTxAmountRepository.getLastActivityTimeOfToken(multiAsset.getUnit())) - .thenReturn(latestEpochTime); + final LocalDateTime latestEpochDateTime = + LocalDateTime.ofInstant(Instant.ofEpochSecond(latestEpochTime), ZoneOffset.UTC); + final Timestamp latestTimestamp = Timestamp.valueOf(latestEpochDateTime); + when(addressTxAmountRepository.getLastActivitySlotOfToken(multiAsset.getUnit())) + .thenReturn(cardanoConverters.time().toSlot(latestEpochDateTime)); when(maTxMintRepository.getTxMetadataToken(anyString(), any())) .thenReturn(