Skip to content

Commit

Permalink
Merge pull request #1187 from cardano-foundation/feat/MET-2064-apply-…
Browse files Browse the repository at this point in the history
…script-controller-with-ledger-sync-v2

feat: apply Script Controller with ledger sync v2
  • Loading branch information
Sotatek-DucPhung committed May 7, 2024
2 parents 1448284 + 274b04b commit 78af01b
Show file tree
Hide file tree
Showing 10 changed files with 534 additions and 487 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.cardanofoundation.explorer.api.model.response.script.nativescript.NativeScriptResponse;
import org.cardanofoundation.explorer.api.model.response.script.smartcontract.SmartContractDetailResponse;
import org.cardanofoundation.explorer.api.model.response.token.TokenAddressResponse;
import org.cardanofoundation.explorer.common.entity.ledgersync.TokenTxCount_;
import org.springdoc.core.annotations.ParameterObject;

import org.cardanofoundation.explorer.api.config.LogMessage;
Expand Down Expand Up @@ -58,12 +62,12 @@ public ResponseEntity<BaseFilterResponse<NativeScriptFilterResponse>> getNativeS
scriptService.getNativeScripts(filterRequest, pagination.toPageable()));
}

// @GetMapping("/native-scripts/{scriptHash}")
// @LogMessage
// public ResponseEntity<NativeScriptResponse> getNativeScriptDetail(
// @PathVariable String scriptHash) {
// return ResponseEntity.ok(scriptService.getNativeScriptDetail(scriptHash));
// }
@GetMapping("/native-scripts/{scriptHash}")
@LogMessage
public ResponseEntity<NativeScriptResponse> getNativeScriptDetail(
@PathVariable String scriptHash) {
return ResponseEntity.ok(scriptService.getNativeScriptDetail(scriptHash));
}

@PostMapping("/native-scripts/{scriptHash}/verify")
@LogMessage
Expand All @@ -82,25 +86,25 @@ public ResponseEntity<BaseFilterResponse<TokenFilterResponse>> getTokens(
@PaginationValid
@PaginationDefault(
size = 20,
sort = {MultiAsset_.TX_COUNT},
sort = {TokenTxCount_.TX_COUNT},
direction = Sort.Direction.DESC)
@Valid
Pagination pagination) {
return ResponseEntity.ok(
scriptService.getNativeScriptTokens(scriptHash, pagination.toPageable()));
}

// @GetMapping("/native-scripts/{scriptHash}/holders")
// @LogMessage
// @Operation(
// summary = "Get holders by policy",
// description = "Get all holders of all tokens of policy")
// public ResponseEntity<BaseFilterResponse<TokenAddressResponse>> getHolders(
// @PathVariable @Parameter(description = "The native script hash") String scriptHash,
// @ParameterObject @PaginationValid @Valid Pagination pagination) {
// return ResponseEntity.ok(
// scriptService.getNativeScriptHolders(scriptHash, pagination.toPageable()));
// }
@GetMapping("/native-scripts/{scriptHash}/holders")
@LogMessage
@Operation(
summary = "Get holders by policy",
description = "Get all holders of all tokens of policy")
public ResponseEntity<BaseFilterResponse<TokenAddressResponse>> getHolders(
@PathVariable @Parameter(description = "The native script hash") String scriptHash,
@ParameterObject @PaginationValid @Valid Pagination pagination) {
return ResponseEntity.ok(
scriptService.getNativeScriptHolders(scriptHash, pagination.toPageable()));
}

@GetMapping("/contracts")
public ResponseEntity<BaseFilterResponse<SmartContractFilterResponse>> getSmartContracts(
Expand All @@ -118,15 +122,15 @@ public ResponseEntity<BaseFilterResponse<SmartContractFilterResponse>> getSmartC
scriptService.getSmartContracts(filterRequest, pagination.toPageable()));
}

// @GetMapping("/contracts/{scriptHash}")
// @LogMessage
// @Operation(
// summary = "Get smart contract detail",
// tags = {"script"})
// public ResponseEntity<SmartContractDetailResponse> getSmartContracts(
// @PathVariable @Parameter(description = "The script hash") String scriptHash) {
// return ResponseEntity.ok(scriptService.getSmartContractDetail(scriptHash));
// }
@GetMapping("/contracts/{scriptHash}")
@LogMessage
@Operation(
summary = "Get smart contract detail",
tags = {"script"})
public ResponseEntity<SmartContractDetailResponse> getSmartContracts(
@PathVariable @Parameter(description = "The script hash") String scriptHash) {
return ResponseEntity.ok(scriptService.getSmartContractDetail(scriptHash));
}

@GetMapping("/contracts/{scriptHash}/txs")
@LogMessage
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package org.cardanofoundation.explorer.api.repository.ledgersync;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import org.cardanofoundation.explorer.common.entity.ledgersync.Address;

Expand All @@ -20,7 +24,6 @@ public interface AddressRepository extends JpaRepository<Address, Long> {
//
// List<Address> findAddressByIdIn(@Param("idList") Collection<Long> idList);
//
// @Query(value = "SELECT addr.address FROM Address addr " + "WHERE addr.paymentCred =
// :scriptHash")
// List<String> getAssociatedAddress(@Param("scriptHash") String scriptHash);
@Query(value = "SELECT addr.address FROM Address addr WHERE addr.paymentCredential = :scriptHash")
List<String> getAssociatedAddress(@Param("scriptHash") String scriptHash);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,83 +16,81 @@
//
// public interface AddressTokenBalanceRepository extends JpaRepository<AddressTokenBalance, Long> {
//
// @Query(
// "SELECT COUNT(atb.addressId) FROM AddressTokenBalance atb "
// + "WHERE atb.multiAsset = :multiAsset "
// + "AND atb.stakeAddress.id IS NULL AND atb.balance > 0 ")
// Optional<Long> countAddressNotHaveStakeByMultiAsset(@Param("multiAsset") MultiAsset multiAsset);
//
// @Query(
// "SELECT COUNT(DISTINCT atb.stakeAddress.id) FROM AddressTokenBalance atb "
// + "WHERE atb.multiAsset = :multiAsset "
// + "AND atb.balance > 0 ")
// Optional<Long> countStakeByMultiAsset(@Param("multiAsset") MultiAsset multiAsset);
//// @Query(
//// "SELECT COUNT(atb.addressId) FROM AddressTokenBalance atb "
//// + "WHERE atb.multiAsset = :multiAsset "
//// + "AND atb.stakeAddress.id IS NULL AND atb.balance > 0 ")
//// Optional<Long> countAddressNotHaveStakeByMultiAsset(@Param("multiAsset") MultiAsset multiAsset);
////
//// @Query(
//// "SELECT COUNT(DISTINCT atb.stakeAddress.id) FROM AddressTokenBalance atb "
//// + "WHERE atb.multiAsset = :multiAsset "
//// + "AND atb.balance > 0 ")
//// Optional<Long> countStakeByMultiAsset(@Param("multiAsset") MultiAsset multiAsset);
////
//// @Query(
//// value =
//// "SELECT COALESCE(atb.stakeAddress.id, atb.addressId * -1L) as addressId,
//// SUM(atb.balance) as quantity"
//// + " FROM AddressTokenBalance atb "
//// + " WHERE atb.multiAsset = :multiAsset"
//// + " AND atb.balance > 0"
//// + " GROUP BY COALESCE(atb.stakeAddress.id, atb.addressId * -1L)"
//// + " ORDER BY SUM(atb.balance) DESC")
//// List<AddressTokenProjection> findAddressAndBalanceByMultiAsset(
//// @Param("multiAsset") MultiAsset multiAsset, Pageable pageable);
////
//// @Query(
//// "SELECT ma.fingerprint as fingerprint, "
//// + " ma.policy as policy, "
//// + " ma.name as tokenName, "
//// + " atb.balance as quantity"
//// + " FROM AddressTokenBalance atb "
//// + " INNER JOIN MultiAsset ma ON ma.id = atb.multiAsset.id"
//// + " WHERE atb.address = :address"
//// + " AND (lower(ma.nameView) LIKE CONCAT('%', :searchValue, '%') OR fingerprint =
//// :searchValue)"
//// + " AND atb.balance > 0")
//// Page<AddressTokenProjection> findTokenAndBalanceByAddressAndNameView(
//// @Param("address") Address address,
//// @Param("searchValue") String searchValue,
//// Pageable pageable);
////
//// @Query(
//// "SELECT ma.fingerprint as fingerprint, ma.id as multiAssetId,"
//// + " ma.policy as policy, "
//// + " ma.name as tokenName, "
//// + " atb.balance as quantity,"
//// + " am.url as url, am.decimals as decimals, am.ticker as ticker,"
//// + " am.logo as logo, am.description as description, am.subject as subject"
//// + " FROM AddressTokenBalance atb "
//// + " INNER JOIN MultiAsset ma ON ma.id = atb.multiAsset.id"
//// + " LEFT JOIN AssetMetadata am ON am.fingerprint=ma.fingerprint"
//// + " WHERE atb.address = :address"
//// + " AND atb.balance > 0")
//// Page<AddressTokenProjection> findTokenAndBalanceByAddress(
//// @Param("address") Address address, Pageable pageable);
////
//// @Query(
//// "SELECT ma.name as tokenName, ma.fingerprint as fingerprint,"
//// + " atb.addressId as addressId, atb.balance as quantity, ma.policy as policy"
//// + " FROM AddressTokenBalance atb "
//// + " INNER JOIN MultiAsset ma ON ma.id = atb.multiAsset.id"
//// + " WHERE ma.policy = :policy"
//// + " AND atb.balance > 0"
//// + " ORDER BY atb.balance DESC")
//// Page<AddressTokenProjection> findAddressAndBalanceByMultiAssetIn(
//// @Param("policy") String policy, Pageable pageable);
//
// @Query(
// value =
// "SELECT COALESCE(atb.stakeAddress.id, atb.addressId * -1L) as addressId,
// SUM(atb.balance) as quantity"
// + " FROM AddressTokenBalance atb "
// + " WHERE atb.multiAsset = :multiAsset"
// + " AND atb.balance > 0"
// + " GROUP BY COALESCE(atb.stakeAddress.id, atb.addressId * -1L)"
// + " ORDER BY SUM(atb.balance) DESC")
// List<AddressTokenProjection> findAddressAndBalanceByMultiAsset(
// @Param("multiAsset") MultiAsset multiAsset, Pageable pageable);
// value = """
//
// @Query(
// "SELECT ma.fingerprint as fingerprint, "
// + " ma.policy as policy, "
// + " ma.name as tokenName, "
// + " atb.balance as quantity"
// + " FROM AddressTokenBalance atb "
// + " INNER JOIN MultiAsset ma ON ma.id = atb.multiAsset.id"
// + " WHERE atb.address = :address"
// + " AND (lower(ma.nameView) LIKE CONCAT('%', :searchValue, '%') OR fingerprint =
// :searchValue)"
// + " AND atb.balance > 0")
// Page<AddressTokenProjection> findTokenAndBalanceByAddressAndNameView(
// @Param("address") Address address,
// @Param("searchValue") String searchValue,
// Pageable pageable);
//
// @Query(
// "SELECT ma.fingerprint as fingerprint, ma.id as multiAssetId,"
// + " ma.policy as policy, "
// + " ma.name as tokenName, "
// + " atb.balance as quantity,"
// + " am.url as url, am.decimals as decimals, am.ticker as ticker,"
// + " am.logo as logo, am.description as description, am.subject as subject"
// + " FROM AddressTokenBalance atb "
// + " INNER JOIN MultiAsset ma ON ma.id = atb.multiAsset.id"
// + " LEFT JOIN AssetMetadata am ON am.fingerprint=ma.fingerprint"
// + " WHERE atb.address = :address"
// + " AND atb.balance > 0")
// Page<AddressTokenProjection> findTokenAndBalanceByAddress(
// @Param("address") Address address, Pageable pageable);
//
// @Query(
// "SELECT ma.name as tokenName, ma.fingerprint as fingerprint,"
// + " atb.addressId as addressId, atb.balance as quantity, ma.policy as policy"
// + " FROM AddressTokenBalance atb "
// + " INNER JOIN MultiAsset ma ON ma.id = atb.multiAsset.id"
// + " WHERE ma.policy = :policy"
// + " AND atb.balance > 0"
// + " ORDER BY atb.balance DESC")
// Page<AddressTokenProjection> findAddressAndBalanceByMultiAssetIn(
// @Param("policy") String policy, Pageable pageable);
//
// @Query(
// "SELECT ma.name as tokenName, ma.fingerprint as fingerprint,"
// + " atb.addressId as addressId, atb.balance as quantity, ma.policy as policy, "
// + " am.url as url, am.decimals as decimals, am.ticker as ticker,"
// + " am.logo as logo, am.description as description, am.subject as subject"
// + " FROM AddressTokenBalance atb "
// + " INNER JOIN MultiAsset ma ON ma.id = atb.multiAsset.id"
// + " LEFT JOIN AssetMetadata am ON am.fingerprint = ma.fingerprint"
// + " WHERE ma.policy = :policy"
// + " AND atb.balance > 0"
// + " ORDER BY atb.balance DESC")
// SELECT ltb.address as address, ltb.quantity as balance, ma.nameView as tokenName, ma.fingerprint as fingerprint
// FROM LatestTokenBalance ltb
// inner JOIN MultiAsset ma ON ma.unit = ltb.unit
// WHERE ma.policy = :policy
// order by ltb.quantity desc
// """)
// List<AddressTokenProjection> findAddressAndBalanceByPolicy(
// @Param("policy") String policy, Pageable pageable);
// }
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.cardanofoundation.explorer.api.repository.ledgersync;

import java.util.List;

import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import org.cardanofoundation.explorer.api.projection.AddressTokenProjection;
import org.cardanofoundation.explorer.common.entity.compositeKey.AddressBalanceId;
import org.cardanofoundation.explorer.common.entity.ledgersync.LatestTokenBalance;

public interface LatestTokenBalanceRepository extends
JpaRepository<LatestTokenBalance, AddressBalanceId> {

@Query(
value = """
SELECT ltb.address as address, ltb.quantity as quantity, ma.nameView as tokenName, ma.fingerprint as fingerprint
FROM LatestTokenBalance ltb
inner JOIN MultiAsset ma ON ma.unit = ltb.unit
WHERE ma.policy = :policy
order by ltb.quantity desc
""")
List<AddressTokenProjection> findAddressAndBalanceByPolicy(
@Param("policy") String policy, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ public interface MultiAssetRepository extends JpaRepository<MultiAsset, Long> {

@Query(
value =
"SELECT ma.id as id, ma.policy as policy, ma.name as name, ma.nameView as nameView, ma.txCount as txCount,"
+ " ma.fingerprint as fingerprint, ma.supply as supply, ma.totalVolume as totalVolume, ma.time as time,"
"SELECT ma.id as id, ma.policy as policy, ma.name as name, ma.nameView as nameView, ttc.txCount as txCount,"
+ " ma.fingerprint as fingerprint, ma.supply as supply, ma.time as time,"
+ " LENGTH(ma.nameView) as nameViewLength, "
+ " am.url as url, am.ticker as ticker, am.decimals as decimals, "
+ " am.logo as logo, am.description as description, am.subject as subject"
+ " FROM MultiAsset ma"
+ " LEFT JOIN AssetMetadata am ON am.fingerprint = ma.fingerprint"
+ " LEFT JOIN TokenTxCount ttc on ttc.ident = ma.id "
+ " WHERE ma.fingerprint = :query OR LOWER(ma.nameView) LIKE CONCAT('%', :query, '%')")
List<TokenProjection> findAll(@Param("query") String query, Pageable pageable);

Expand All @@ -39,13 +40,14 @@ public interface MultiAssetRepository extends JpaRepository<MultiAsset, Long> {

@Query(
value =
"SELECT ma.id as id, ma.policy as policy, ma.name as name, ma.nameView as nameView, ma.txCount as txCount,"
+ " ma.fingerprint as fingerprint, ma.supply as supply, ma.totalVolume as totalVolume, ma.time as time,"
"SELECT ma.id as id, ma.policy as policy, ma.name as name, ma.nameView as nameView, ttc.txCount as txCount,"
+ " ma.fingerprint as fingerprint, ma.supply as supply, ma.time as time,"
+ " LENGTH(ma.nameView) as nameViewLength, "
+ " am.url as url, am.ticker as ticker, am.decimals as decimals, "
+ " am.logo as logo, am.description as description, am.subject as subject"
+ " FROM MultiAsset ma"
+ " LEFT JOIN AssetMetadata am ON am.fingerprint = ma.fingerprint")
+ " LEFT JOIN AssetMetadata am ON am.fingerprint = ma.fingerprint"
+ " LEFT JOIN TokenTxCount ttc on ttc.ident = ma.id" )
List<TokenProjection> findMultiAssets(Pageable pageable);

Optional<MultiAsset> findByFingerprint(@Param("fingerprint") String fingerprint);
Expand All @@ -56,13 +58,16 @@ public interface MultiAssetRepository extends JpaRepository<MultiAsset, Long> {

@Query(
value =
"SELECT ma.id as id, ma.policy as policy, ma.name as name, ma.nameView as nameView, ma.txCount as txCount,"
+ " ma.fingerprint as fingerprint, ma.supply as supply, ma.totalVolume as totalVolume, ma.time as time,"
+ " am.subject as subject, am.url as url, am.ticker as ticker, "
+ " am.decimals as decimals, am.logo as logo, am.description as description"
+ " FROM MultiAsset ma"
+ " LEFT JOIN AssetMetadata am ON am.fingerprint = ma.fingerprint"
+ " WHERE ma.policy = :scriptHash")
"""
SELECT ma.id as id, ma.policy as policy, ma.name as name, ma.nameView as nameView, ttc.txCount as txCount,
ma.fingerprint as fingerprint, ma.supply as supply, ma.time as time,
am.subject as subject, am.url as url, am.ticker as ticker,
am.decimals as decimals, am.logo as logo, am.description as description
FROM MultiAsset ma
LEFT JOIN AssetMetadata am ON am.fingerprint = ma.fingerprint
LEFT JOIN TokenTxCount ttc on ttc.ident = ma.id
WHERE ma.policy = :scriptHash
""")
List<TokenProjection> findTokenInfoByScriptHash(
@Param("scriptHash") String scriptHash, Pageable pageable);

Expand All @@ -88,13 +93,13 @@ List<TokenProjection> findTokenInfoByScriptHash(
+ " WHERE multiAsset.policy = :policy")
Long countMultiAssetByPolicy(@Param("policy") String policy);

// @Query(
// "SELECT COALESCE(COUNT(DISTINCT(atb.addressId, atb.multiAssetId)), 0) "
// + " FROM MultiAsset ma "
// + " INNER JOIN AddressTokenBalance atb ON atb.multiAsset = ma"
// + " WHERE ma.policy = :policy "
// + " AND atb.balance > 0 ")
// Long countAssetHoldersByPolicy(@Param("policy") String policy);
@Query(value = """
SELECT COALESCE(COUNT(latestTokenBalance), 0) as numberOfHolders
FROM MultiAsset multiAsset
LEFT JOIN LatestTokenBalance latestTokenBalance ON multiAsset.unit = latestTokenBalance.unit
WHERE multiAsset.policy = :policy
""")
Long countAssetHoldersByPolicy(@Param("policy") String policy);

@Query(
value =
Expand All @@ -104,7 +109,8 @@ List<TokenProjection> findTokenInfoByScriptHash(
+ " CROSS JOIN LATERAL"
+ " (SELECT ma.name as name, ma.name_view as name_view, ma.policy as policy, ma.fingerprint as fingerprint"
+ " FROM multi_asset ma "
+ " WHERE ma.policy = s.hash ORDER BY ma.tx_count DESC LIMIT 5)"
+ " JOIN token_tx_count ttc on ttc.ident = ma.id"
+ " WHERE ma.policy = s.hash ORDER BY ttc.tx_count DESC LIMIT 5)"
+ " AS topMultiAsset WHERE s.hash IN :scriptHashes)"
+ " SELECT firstResult.policy as policy, firstResult.name as name, firstResult.name_view as nameView, firstResult.fingerprint as fingerprint,"
+ " am.url as url, am.ticker as ticker, am.decimals as decimals, "
Expand Down

0 comments on commit 78af01b

Please sign in to comment.