From 1c0f6bc560ced099562efee84dc8e69edd332c39 Mon Sep 17 00:00:00 2001 From: Hendrik Ebbers Date: Fri, 6 Dec 2024 10:01:33 +0100 Subject: [PATCH 1/4] More functionality for NFT Repository and dummy impl of mirror node for microprofile --- .../hiero/base/data/NftMetadata.java | 16 +++ .../hiero/base/data/TokenMetadata.java | 15 +++ .../implementation/NftRepositoryImpl.java | 22 ++++- .../base/mirrornode/MirrorNodeClient.java | 10 ++ .../hiero/base/mirrornode/NftRepository.java | 26 +++++ .../hiero/microprofile/ClientProvider.java | 40 ++++++++ .../implementation/MirrorNodeClientImpl.java | 99 +++++++++++++++++++ .../implementation/MirrorNodeClientImpl.java | 20 +++- 8 files changed, 244 insertions(+), 4 deletions(-) create mode 100644 hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/NftMetadata.java create mode 100644 hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/TokenMetadata.java create mode 100644 hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java diff --git a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/NftMetadata.java b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/NftMetadata.java new file mode 100644 index 00000000..0e90993d --- /dev/null +++ b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/NftMetadata.java @@ -0,0 +1,16 @@ +package com.openelements.hiero.base.data; + +import com.hedera.hashgraph.sdk.AccountId; +import com.hedera.hashgraph.sdk.TokenId; +import java.util.Objects; + +public record NftMetadata(TokenId tokenId, String name, String symbol, AccountId treasuryAccountId) implements + TokenMetadata { + + public NftMetadata { + Objects.requireNonNull(tokenId, "tokenId must not be null"); + Objects.requireNonNull(name, "name must not be null"); + Objects.requireNonNull(symbol, "symbol must not be null"); + Objects.requireNonNull(treasuryAccountId, "treasuryAccountId must not be null"); + } +} diff --git a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/TokenMetadata.java b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/TokenMetadata.java new file mode 100644 index 00000000..2a7f5ada --- /dev/null +++ b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/TokenMetadata.java @@ -0,0 +1,15 @@ +package com.openelements.hiero.base.data; + +import com.hedera.hashgraph.sdk.AccountId; +import com.hedera.hashgraph.sdk.TokenId; + +public interface TokenMetadata { + + TokenId tokenId(); + + String name(); + + String symbol(); + + AccountId treasuryAccountId(); +} diff --git a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/NftRepositoryImpl.java b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/NftRepositoryImpl.java index 8e2fee95..b47561a6 100644 --- a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/NftRepositoryImpl.java +++ b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/NftRepositoryImpl.java @@ -4,9 +4,10 @@ import com.hedera.hashgraph.sdk.TokenId; import com.openelements.hiero.base.HieroException; import com.openelements.hiero.base.data.Nft; -import com.openelements.hiero.base.mirrornode.NftRepository; -import com.openelements.hiero.base.mirrornode.MirrorNodeClient; +import com.openelements.hiero.base.data.NftMetadata; import com.openelements.hiero.base.data.Page; +import com.openelements.hiero.base.mirrornode.MirrorNodeClient; +import com.openelements.hiero.base.mirrornode.NftRepository; import java.util.Objects; import java.util.Optional; import org.jspecify.annotations.NonNull; @@ -51,4 +52,21 @@ public Optional findByOwnerAndTypeAndSerial(@NonNull final AccountId owner, final long serialNumber) throws HieroException { return mirrorNodeClient.queryNftsByAccountAndTokenIdAndSerial(owner, tokenId, serialNumber); } + + @NonNull + @Override + public NftMetadata getNftMetadata(TokenId tokenId) throws HieroException { + return mirrorNodeClient.getNftMetadata(tokenId); + } + + @NonNull + @Override + public Page findTypesByOwner(@NonNull AccountId ownerId) throws HieroException { + return mirrorNodeClient.findNftTypesByOwner(ownerId); + } + + @Override + public Page findAllTypes() throws HieroException { + return mirrorNodeClient.findAllNftTypes(); + } } diff --git a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/MirrorNodeClient.java b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/MirrorNodeClient.java index 4cbd2406..dbe302c1 100644 --- a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/MirrorNodeClient.java +++ b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/MirrorNodeClient.java @@ -9,6 +9,7 @@ import com.openelements.hiero.base.data.NetworkStake; import com.openelements.hiero.base.data.NetworkSupplies; import com.openelements.hiero.base.data.Nft; +import com.openelements.hiero.base.data.NftMetadata; import com.openelements.hiero.base.data.Page; import com.openelements.hiero.base.data.TransactionInfo; import java.util.List; @@ -231,4 +232,13 @@ default Optional queryAccount(@NonNull String accountId) throws Hie */ @NonNull Optional queryNetworkSupplies() throws HieroException; + + @NonNull + NftMetadata getNftMetadata(TokenId tokenId) throws HieroException; + + @NonNull + Page findNftTypesByOwner(AccountId ownerId); + + @NonNull + Page findAllNftTypes(); } diff --git a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/NftRepository.java b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/NftRepository.java index b3c8d2d8..3f278a62 100644 --- a/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/NftRepository.java +++ b/hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/NftRepository.java @@ -4,6 +4,7 @@ import com.hedera.hashgraph.sdk.TokenId; import com.openelements.hiero.base.HieroException; import com.openelements.hiero.base.data.Nft; +import com.openelements.hiero.base.data.NftMetadata; import com.openelements.hiero.base.data.Page; import java.util.Objects; import java.util.Optional; @@ -14,6 +15,19 @@ */ public interface NftRepository { + Page findAllTypes() throws HieroException; + + + @NonNull + Page findTypesByOwner(@NonNull AccountId ownerId) throws HieroException; + + @NonNull + default Page findTypesByOwner(@NonNull String ownerId) throws HieroException { + Objects.requireNonNull(ownerId, "ownerId must not be null"); + return findTypesByOwner(AccountId.fromString(ownerId)); + } + + /** * Return all NFTs that are owned by the given owner. * @@ -140,4 +154,16 @@ default Optional findByOwnerAndTypeAndSerial(@NonNull String owner, @NonNul Objects.requireNonNull(tokenId, "tokenId must not be null"); return findByOwnerAndTypeAndSerial(AccountId.fromString(owner), TokenId.fromString(tokenId), serialNumber); } + + default NftMetadata getNftMetadata(String tokenId) throws HieroException { + Objects.requireNonNull(tokenId, "tokenId must not be null"); + return getNftMetadata(TokenId.fromString(tokenId)); + } + + NftMetadata getNftMetadata(TokenId tokenId) throws HieroException; + + default NftMetadata getNftMetadata(Nft nft) throws HieroException { + Objects.requireNonNull(nft, "nft must not be null"); + return getNftMetadata(nft.tokenId()); + } } diff --git a/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/ClientProvider.java b/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/ClientProvider.java index c13cf80b..b7e10137 100644 --- a/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/ClientProvider.java +++ b/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/ClientProvider.java @@ -6,13 +6,23 @@ import com.openelements.hiero.base.SmartContractClient; import com.openelements.hiero.base.config.HieroConfig; import com.openelements.hiero.base.implementation.AccountClientImpl; +import com.openelements.hiero.base.implementation.AccountRepositoryImpl; import com.openelements.hiero.base.implementation.FileClientImpl; +import com.openelements.hiero.base.implementation.NetworkRepositoryImpl; +import com.openelements.hiero.base.implementation.NftRepositoryImpl; import com.openelements.hiero.base.implementation.ProtocolLayerClientImpl; import com.openelements.hiero.base.implementation.SmartContractClientImpl; +import com.openelements.hiero.base.implementation.TransactionRepositoryImpl; +import com.openelements.hiero.base.mirrornode.AccountRepository; +import com.openelements.hiero.base.mirrornode.MirrorNodeClient; +import com.openelements.hiero.base.mirrornode.NetworkRepository; +import com.openelements.hiero.base.mirrornode.NftRepository; +import com.openelements.hiero.base.mirrornode.TransactionRepository; import com.openelements.hiero.base.protocol.ProtocolLayerClient; import com.openelements.hiero.base.verification.ContractVerificationClient; import com.openelements.hiero.microprofile.implementation.ContractVerificationClientImpl; import com.openelements.hiero.microprofile.implementation.HieroConfigImpl; +import com.openelements.hiero.microprofile.implementation.MirrorNodeClientImpl; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; import jakarta.inject.Inject; @@ -71,4 +81,34 @@ AccountClient createAccountClient(@NonNull final ProtocolLayerClient protocolLay ContractVerificationClient createContractVerificationClient(@NonNull final HieroConfig hieroConfig) { return new ContractVerificationClientImpl(hieroConfig.getNetwork()); } + + @Produces + @ApplicationScoped + MirrorNodeClient createMirrorNodeClient() { + return new MirrorNodeClientImpl(); + } + + @Produces + @ApplicationScoped + AccountRepository createAccountRepository(@NonNull final MirrorNodeClient mirrorNodeClient) { + return new AccountRepositoryImpl(mirrorNodeClient); + } + + @Produces + @ApplicationScoped + NetworkRepository createNetworkRepository(@NonNull final MirrorNodeClient mirrorNodeClient) { + return new NetworkRepositoryImpl(mirrorNodeClient); + } + + @Produces + @ApplicationScoped + NftRepository createNftRepository(@NonNull final MirrorNodeClient mirrorNodeClient) { + return new NftRepositoryImpl(mirrorNodeClient); + } + + @Produces + @ApplicationScoped + TransactionRepository createTransactionRepository(@NonNull final MirrorNodeClient mirrorNodeClient) { + return new TransactionRepositoryImpl(mirrorNodeClient); + } } diff --git a/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java b/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java new file mode 100644 index 00000000..67bbe339 --- /dev/null +++ b/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java @@ -0,0 +1,99 @@ +package com.openelements.hiero.microprofile.implementation; + +import com.hedera.hashgraph.sdk.AccountId; +import com.hedera.hashgraph.sdk.TokenId; +import com.openelements.hiero.base.HieroException; +import com.openelements.hiero.base.data.AccountInfo; +import com.openelements.hiero.base.data.ExchangeRates; +import com.openelements.hiero.base.data.NetworkFee; +import com.openelements.hiero.base.data.NetworkStake; +import com.openelements.hiero.base.data.NetworkSupplies; +import com.openelements.hiero.base.data.Nft; +import com.openelements.hiero.base.data.NftMetadata; +import com.openelements.hiero.base.data.Page; +import com.openelements.hiero.base.data.TransactionInfo; +import com.openelements.hiero.base.mirrornode.MirrorNodeClient; +import java.util.List; +import java.util.Optional; +import org.jspecify.annotations.NonNull; + +public class MirrorNodeClientImpl implements MirrorNodeClient { + @Override + public @NonNull Page queryNftsByAccount(@NonNull AccountId accountId) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page queryNftsByAccountAndTokenId(@NonNull AccountId accountId, @NonNull TokenId tokenId) + throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page queryNftsByTokenId(@NonNull TokenId tokenId) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Optional queryNftsByTokenIdAndSerial(@NonNull TokenId tokenId, long serialNumber) + throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Optional queryNftsByAccountAndTokenIdAndSerial(@NonNull AccountId accountId, + @NonNull TokenId tokenId, long serialNumber) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page queryTransactionsByAccount(@NonNull AccountId accountId) + throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Optional queryTransaction(@NonNull String transactionId) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Optional queryAccount(@NonNull AccountId accountId) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Optional queryExchangeRates() throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull List queryNetworkFees() throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Optional queryNetworkStake() throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Optional queryNetworkSupplies() throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull NftMetadata getNftMetadata(TokenId tokenId) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page findNftTypesByOwner(AccountId ownerId) { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page findAllNftTypes() { + throw new UnsupportedOperationException("Not yet implemented"); + } +} diff --git a/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java b/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java index 8f0d5b98..f22adc44 100644 --- a/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java +++ b/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java @@ -6,16 +6,17 @@ import com.hedera.hashgraph.sdk.AccountId; import com.hedera.hashgraph.sdk.TokenId; import com.openelements.hiero.base.HieroException; -import com.openelements.hiero.base.data.Nft; import com.openelements.hiero.base.data.AccountInfo; import com.openelements.hiero.base.data.ExchangeRate; import com.openelements.hiero.base.data.ExchangeRates; -import com.openelements.hiero.base.mirrornode.MirrorNodeClient; import com.openelements.hiero.base.data.NetworkFee; import com.openelements.hiero.base.data.NetworkStake; import com.openelements.hiero.base.data.NetworkSupplies; +import com.openelements.hiero.base.data.Nft; +import com.openelements.hiero.base.data.NftMetadata; import com.openelements.hiero.base.data.Page; import com.openelements.hiero.base.data.TransactionInfo; +import com.openelements.hiero.base.mirrornode.MirrorNodeClient; import java.io.IOException; import java.net.URI; import java.time.Instant; @@ -415,4 +416,19 @@ private List extractTransactionInfoFromJsonNode(JsonNode jsonNo } }).toList(); } + + @Override + public @NonNull NftMetadata getNftMetadata(TokenId tokenId) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page findNftTypesByOwner(AccountId ownerId) { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page findAllNftTypes() { + throw new UnsupportedOperationException("Not yet implemented"); + } } From 391919f1a136f12c5ee26e4a73d4064dd893ee71 Mon Sep 17 00:00:00 2001 From: Hendrik Ebbers Date: Fri, 6 Dec 2024 16:19:20 +0100 Subject: [PATCH 2/4] refactoring --- .../implementation/MirrorNodeClientImpl.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java b/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java index f22adc44..b09adffc 100644 --- a/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java +++ b/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java @@ -145,6 +145,21 @@ public Optional queryTransaction(@NonNull final String transact return jsonNodeToOptionalNetworkSupplies(jsonNode); } + @Override + public @NonNull NftMetadata getNftMetadata(TokenId tokenId) throws HieroException { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page findNftTypesByOwner(AccountId ownerId) { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public @NonNull Page findAllNftTypes() { + throw new UnsupportedOperationException("Not yet implemented"); + } + private JsonNode doGetCall(String path, Map params) throws HieroException { return doGetCall(builder -> { UriBuilder uriBuilder = builder.path(path); @@ -416,19 +431,4 @@ private List extractTransactionInfoFromJsonNode(JsonNode jsonNo } }).toList(); } - - @Override - public @NonNull NftMetadata getNftMetadata(TokenId tokenId) throws HieroException { - throw new UnsupportedOperationException("Not yet implemented"); - } - - @Override - public @NonNull Page findNftTypesByOwner(AccountId ownerId) { - throw new UnsupportedOperationException("Not yet implemented"); - } - - @Override - public @NonNull Page findAllNftTypes() { - throw new UnsupportedOperationException("Not yet implemented"); - } } From 4023ccf85abc8dc90803720a31118f6a831facb6 Mon Sep 17 00:00:00 2001 From: Hendrik Ebbers Date: Thu, 12 Dec 2024 12:01:22 +0100 Subject: [PATCH 3/4] main merged Signed-off-by: Hendrik Ebbers --- .../implementation/MirrorNodeClientImpl.java | 16 + .../implementation/MirrorNodeClientImpl.java | 311 ------------------ 2 files changed, 16 insertions(+), 311 deletions(-) diff --git a/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java b/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java index a6e1ae16..9d880f8b 100644 --- a/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java +++ b/hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java @@ -4,6 +4,7 @@ import com.hedera.hashgraph.sdk.TokenId; import com.openelements.hiero.base.HieroException; import com.openelements.hiero.base.data.Nft; +import com.openelements.hiero.base.data.NftMetadata; import com.openelements.hiero.base.data.Page; import com.openelements.hiero.base.data.TransactionInfo; import com.openelements.hiero.base.implementation.AbstractMirrorNodeClient; @@ -62,4 +63,19 @@ public MirrorNodeClientImpl(MirrorNodeRestClient restClient, public @NonNull Optional queryTransaction(@NonNull String transactionId) throws HieroException { throw new RuntimeException("Not implemented"); } + + @Override + public @NonNull NftMetadata getNftMetadata(TokenId tokenId) throws HieroException { + throw new RuntimeException("Not implemented"); + } + + @Override + public @NonNull Page findNftTypesByOwner(AccountId ownerId) { + throw new RuntimeException("Not implemented"); + } + + @Override + public @NonNull Page findAllNftTypes() { + throw new RuntimeException("Not implemented"); + } } diff --git a/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java b/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java index ec9d8105..51f6e399 100644 --- a/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java +++ b/hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java @@ -6,17 +6,9 @@ import com.hedera.hashgraph.sdk.TokenId; import com.openelements.hiero.base.HieroException; import com.openelements.hiero.base.data.Nft; -import com.openelements.hiero.base.data.AccountInfo; -import com.openelements.hiero.base.data.ExchangeRate; -import com.openelements.hiero.base.data.ExchangeRates; -import com.openelements.hiero.base.data.NetworkFee; -import com.openelements.hiero.base.data.NetworkStake; -import com.openelements.hiero.base.data.NetworkSupplies; -import com.openelements.hiero.base.data.Nft; import com.openelements.hiero.base.data.NftMetadata; import com.openelements.hiero.base.data.Page; import com.openelements.hiero.base.data.TransactionInfo; -import com.openelements.hiero.base.mirrornode.MirrorNodeClient; import com.openelements.hiero.base.implementation.AbstractMirrorNodeClient; import com.openelements.hiero.base.implementation.MirrorNodeJsonConverter; import com.openelements.hiero.base.implementation.MirrorNodeRestClient; @@ -103,37 +95,6 @@ public Optional queryTransaction(@NonNull final String transact return Optional.of(new TransactionInfo(transactionId)); } - @Override - public @NonNull Optional queryAccount(@NonNull AccountId accountId) throws HieroException { - Objects.requireNonNull(accountId, "accountId must not be null"); - final JsonNode jsonNode = doGetCall("/api/v1/accounts/" + accountId); - return jsonNodeToOptionalAccountINfo(jsonNode); - } - - @Override - public @NonNull Optional queryExchangeRates() throws HieroException { - final JsonNode jsonNode = doGetCall("/api/v1/network/exchangerate"); - return jsonNodeToOptionalExchangeRates(jsonNode); - } - - @Override - public @NonNull List queryNetworkFees() throws HieroException { - final JsonNode jsonNode = doGetCall("/api/v1/network/fees"); - return jsonNodeToListNetworkFee(jsonNode); - } - - @Override - public @NonNull Optional queryNetworkStake() throws HieroException { - final JsonNode jsonNode = doGetCall("/api/v1/network/stake"); - return jsonNodeToOptionalNetworkStake(jsonNode); - } - - @Override - public @NonNull Optional queryNetworkSupplies() throws HieroException { - final JsonNode jsonNode = doGetCall("/api/v1/network/supply"); - return jsonNodeToOptionalNetworkSupplies(jsonNode); - } - @Override public @NonNull NftMetadata getNftMetadata(TokenId tokenId) throws HieroException { throw new UnsupportedOperationException("Not yet implemented"); @@ -148,276 +109,4 @@ public Optional queryTransaction(@NonNull final String transact public @NonNull Page findAllNftTypes() { throw new UnsupportedOperationException("Not yet implemented"); } - - private JsonNode doGetCall(String path, Map params) throws HieroException { - return doGetCall(builder -> { - UriBuilder uriBuilder = builder.path(path); - for (Map.Entry entry : params.entrySet()) { - uriBuilder = uriBuilder.queryParam(entry.getKey(), entry.getValue()); - } - return uriBuilder.build(); - }); - } - - private JsonNode doGetCall(String path) throws HieroException { - return doGetCall(builder -> builder.path(path).build()); - } - - private JsonNode doGetCall(Function uriFunction) throws HieroException { - final ResponseEntity responseEntity = restClient.get() - .uri(uriBuilder -> uriFunction.apply(uriBuilder)) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .onStatus(HttpStatusCode::is4xxClientError, (request, response) -> { - if (!HttpStatus.NOT_FOUND.equals(response.getStatusCode())) { - throw new RuntimeException("Client error: " + response.getStatusText()); - } - }) - .toEntity(String.class); - final String body = responseEntity.getBody(); - try { - if (HttpStatus.NOT_FOUND.equals(responseEntity.getStatusCode())) { - return objectMapper.readTree("{}"); - } - return objectMapper.readTree(body); - } catch (JsonProcessingException e) { - throw new HieroException("Error parsing body as JSON: " + body, e); - } - } - - private List jsonNodeToNftList(final JsonNode rootNode) { - if (rootNode == null || !rootNode.fieldNames().hasNext()) { - return List.of(); - } - return StreamSupport.stream( - Spliterators.spliteratorUnknownSize(rootNode.get("nfts").iterator(), Spliterator.ORDERED), - false).map(nftNode -> { - try { - return jsonNodeToNft(nftNode); - } catch (final Exception e) { - throw new RuntimeException("Error parsing NFT from JSON '" + nftNode + "'", e); - } - }).toList(); - } - - private Optional jsonNodeToOptionalNft(final JsonNode jsonNode) throws HieroException { - if (jsonNode == null || !jsonNode.fieldNames().hasNext()) { - return Optional.empty(); - } - try { - return Optional.of(jsonNodeToNft(jsonNode)); - } catch (final Exception e) { - throw new HieroException("Error parsing NFT from JSON '" + jsonNode + "'", e); - } - } - - private Nft jsonNodeToNft(final JsonNode jsonNode) throws IOException { - try { - final TokenId parsedTokenId = TokenId.fromString(jsonNode.get("token_id").asText()); - final AccountId account = AccountId.fromString(jsonNode.get("account_id").asText()); - final long serial = jsonNode.get("serial_number").asLong(); - final byte[] metadata = jsonNode.get("metadata").binaryValue(); - return new Nft(parsedTokenId, serial, account, metadata); - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing NFT from JSON '" + jsonNode + "'", e); - } - } - - private @NonNull Optional jsonNodeToOptionalAccountINfo(JsonNode jsonNode) throws HieroException { - if (jsonNode == null || !jsonNode.fieldNames().hasNext()) { - return Optional.empty(); - } - try { - return Optional.of(jsonNodeToAccountInfo(jsonNode)); - } catch (final Exception e) { - throw new HieroException("Error parsing AccountInfo from JSON '" + jsonNode + "'", e); - } - } - - private AccountInfo jsonNodeToAccountInfo(JsonNode jsonNode) { - try { - final AccountId accountId = AccountId.fromString(jsonNode.get("account").asText()); - final String evmAddress = jsonNode.get("evm_address").asText(); - final long ethereumNonce = jsonNode.get("ethereum_nonce").asLong(); - final long pendingReward = jsonNode.get("pending_reward").asLong(); - final long balance = jsonNode.get("balance").get("balance").asLong(); - return new AccountInfo(accountId, evmAddress, balance, ethereumNonce, pendingReward); - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing NFT from JSON '" + jsonNode + "'", e); - } - } - - private @NonNull Optional jsonNodeToOptionalExchangeRates(JsonNode jsonNode) throws HieroException { - if (jsonNode == null || !jsonNode.fieldNames().hasNext()) { - return Optional.empty(); - } - try { - return Optional.of(jsonNodeToExchangeRates(jsonNode)); - } catch (final Exception e) { - throw new HieroException("Error parsing ExchangeRates from JSON '" + jsonNode + "'", e); - } - } - - private ExchangeRates jsonNodeToExchangeRates(JsonNode jsonNode) { - try { - final int currentCentEquivalent = jsonNode.get("current_rate").get("cent_equivalent").asInt(); - final int currentHbarEquivalent = jsonNode.get("current_rate").get("hbar_equivalent").asInt(); - final Instant currentExpirationTime = Instant.ofEpochSecond( - jsonNode.get("current_rate").get("expiration_time").asLong() - ); - - final int nextCentEquivalent = jsonNode.get("next_rate").get("cent_equivalent").asInt(); - final int nextHbarEquivalent = jsonNode.get("next_rate").get("hbar_equivalent").asInt(); - final Instant nextExpirationTime = Instant.ofEpochSecond( - jsonNode.get("next_rate").get("expiration_time").asLong() - ); - - return new ExchangeRates( - new ExchangeRate(currentCentEquivalent, currentHbarEquivalent, currentExpirationTime), - new ExchangeRate(nextCentEquivalent, nextHbarEquivalent, nextExpirationTime) - ); - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing ExchangeRates from JSON '" + jsonNode + "'", e); - } - } - - private List jsonNodeToListNetworkFee(JsonNode jsonNode) throws HieroException { - if (jsonNode == null || !jsonNode.fieldNames().hasNext() || !jsonNode.has("fees")) { - return List.of(); - } - - final JsonNode feesNode = jsonNode.get("fees"); - if (!feesNode.isArray()) { - throw new IllegalArgumentException("Fees node is not an array: " + feesNode); - } - - try { - return StreamSupport - .stream(Spliterators.spliteratorUnknownSize(feesNode.iterator(), Spliterator.ORDERED), false) - .map(this::jsonNodeToNetworkFee) - .toList(); - } catch (final Exception e) { - throw new HieroException("Error parsing NetworkFees from JSON '" + jsonNode + "'", e); - } - } - - private NetworkFee jsonNodeToNetworkFee(JsonNode jsonNode) { - try { - final long gas = jsonNode.get("gas").asLong(); - final String transactionType = jsonNode.get("transaction_type").asText(); - - return new NetworkFee(gas, transactionType); - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing NetworkFee from JSON '" + jsonNode + "'", e); - } - } - - private @NonNull Optional jsonNodeToOptionalNetworkStake(JsonNode jsonNode) throws HieroException { - if (jsonNode == null || !jsonNode.fieldNames().hasNext()) { - return Optional.empty(); - } - try { - return Optional.of(jsonNodeToNetworkStake(jsonNode)); - } catch (final Exception e) { - throw new HieroException("Error parsing NetworkStake from JSON '" + jsonNode + "'", e); - } - } - - private NetworkStake jsonNodeToNetworkStake(JsonNode jsonNode) { - try { - final long maxStakeReward = jsonNode.get("max_stake_rewarded").asLong(); - final long maxStakeRewardPerHbar = jsonNode.get("max_staking_reward_rate_per_hbar").asLong(); - final long maxTotalReward = jsonNode.get("max_total_reward").asLong(); - final double nodeRewardFeeFraction = jsonNode.get("node_reward_fee_fraction").asDouble(); - final long reservedStakingRewards = jsonNode.get("reserved_staking_rewards").asLong(); - final long rewardBalanceThreshold = jsonNode.get("reward_balance_threshold").asLong(); - final long stakeTotal = jsonNode.get("stake_total").asLong(); - final long stakingPeriodDuration = jsonNode.get("staking_period_duration").asLong(); - final long stakingPeriodsStored = jsonNode.get("staking_periods_stored").asLong(); - final double stakingRewardFeeFraction = jsonNode.get("staking_reward_fee_fraction").asDouble(); - final long stakingRewardRate = jsonNode.get("staking_reward_rate").asLong(); - final long stakingStartThreshold = jsonNode.get("staking_start_threshold").asLong(); - final long unreservedStakingRewardBalance = jsonNode.get("unreserved_staking_reward_balance").asLong(); - - return new NetworkStake( - maxStakeReward, - maxStakeRewardPerHbar, - maxTotalReward, - nodeRewardFeeFraction, - reservedStakingRewards, - rewardBalanceThreshold, - stakeTotal, - stakingPeriodDuration, - stakingPeriodsStored, - stakingRewardFeeFraction, - stakingRewardRate, - stakingStartThreshold, - unreservedStakingRewardBalance - ); - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing NetworkStake from JSON '" + jsonNode + "'", e); - } - } - - private @NonNull Optional jsonNodeToOptionalNetworkSupplies(JsonNode jsonNode) - throws HieroException { - if (jsonNode == null || !jsonNode.fieldNames().hasNext()) { - return Optional.empty(); - } - try { - return Optional.of(jsonNodeToNetworkSupplies(jsonNode)); - } catch (final Exception e) { - throw new HieroException("Error parsing NetworkSupplies from JSON '" + jsonNode + "'", e); - } - } - - private NetworkSupplies jsonNodeToNetworkSupplies(JsonNode jsonNode) { - try { - final String releasedSupply = jsonNode.get("released_supply").asText(); - final String totalSupply = jsonNode.get("total_supply").asText(); - - return new NetworkSupplies(releasedSupply, totalSupply); - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing NetworkSupplies from JSON '" + jsonNode + "'", e); - } - } - - private List getNfts(final JsonNode jsonNode) { - if (!jsonNode.has("nfts")) { - return List.of(); - } - final JsonNode nftsNode = jsonNode.get("nfts"); - if (!nftsNode.isArray()) { - throw new IllegalArgumentException("NFTs node is not an array: " + nftsNode); - } - return StreamSupport.stream(Spliterators.spliteratorUnknownSize(nftsNode.iterator(), Spliterator.ORDERED), - false) - .map(nftNode -> { - try { - return jsonNodeToNft(nftNode); - } catch (final Exception e) { - throw new RuntimeException("Error parsing NFT from JSON '" + nftNode + "'", e); - } - }).toList(); - } - - private List extractTransactionInfoFromJsonNode(JsonNode jsonNode) { - if (!jsonNode.has("transactions")) { - return List.of(); - } - final JsonNode transactionsNode = jsonNode.get("transactions"); - if (!transactionsNode.isArray()) { - throw new IllegalArgumentException("Transactions node is not an array: " + transactionsNode); - } - return StreamSupport.stream( - Spliterators.spliteratorUnknownSize(transactionsNode.iterator(), Spliterator.ORDERED), false) - .map(transactionNode -> { - try { - final String transactionId = transactionNode.get("transaction_id").asText(); - return new TransactionInfo(transactionId); - } catch (final Exception e) { - throw new RuntimeException("Error parsing transaction from JSON '" + transactionNode + "'", e); - } - }).toList(); - } } From 357862d9b8a4317174cfb5213c9bb26f9c48931f Mon Sep 17 00:00:00 2001 From: Hendrik Ebbers Date: Thu, 12 Dec 2024 12:12:39 +0100 Subject: [PATCH 4/4] main merged Signed-off-by: Hendrik Ebbers --- .../hiero/microprofile/test/AccountRepositoryTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hiero-enterprise-microprofile/src/test/java/com/openelements/hiero/microprofile/test/AccountRepositoryTest.java b/hiero-enterprise-microprofile/src/test/java/com/openelements/hiero/microprofile/test/AccountRepositoryTest.java index a191ee0f..f34ce5dc 100644 --- a/hiero-enterprise-microprofile/src/test/java/com/openelements/hiero/microprofile/test/AccountRepositoryTest.java +++ b/hiero-enterprise-microprofile/src/test/java/com/openelements/hiero/microprofile/test/AccountRepositoryTest.java @@ -41,8 +41,8 @@ void findById() throws Exception { final Account account = accountClient.createAccount(); final AccountId newOwner = account.accountId(); //TODO: fix sleep - Thread.sleep(5_000); - + Thread.sleep(10_000); + //when final Optional result = accountRepository.findById(newOwner);