Skip to content

Commit 2dfdb61

Browse files
committed
Implemented MirrorNodeClient.queryTransaction
Signed-off-by: Atwijukire Ariho Seth <[email protected]>
1 parent 9d5633f commit 2dfdb61

File tree

7 files changed

+162
-42
lines changed

7 files changed

+162
-42
lines changed

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/TransactionInfo.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
public record TransactionInfo(@Nullable Byte bytes,
1010
long chargedTxFee,
11-
String consensusTimeStamp,
11+
String consensusTimestamp,
1212
String entityId,
1313
String maxFee,
1414
String memoBase64,
@@ -51,13 +51,23 @@ public TransactionInfo(@NonNull String transactionId){
5151
null // validStartTimestamp
5252
);
5353
Objects.requireNonNull(transactionId, "transactionId must not be null");
54+
Objects.requireNonNull(transactionId, "transactionId must not be null");
55+
Objects.requireNonNull(consensusTimestamp, "consensusTimestamp must not be null");
56+
Objects.requireNonNull(maxFee, "maxFee must not be null");
57+
Objects.requireNonNull(name, "name must not be null");
58+
Objects.requireNonNull(nftTransfers, "nftTransfers must not be null");
59+
Objects.requireNonNull(stakingRewardTransfers, "stakingRewardTransfers must not be null");
60+
Objects.requireNonNull(tokenTransfers, "tokenTransfers must not be null");
61+
Objects.requireNonNull(transfers, "transfers must not be null");
62+
Objects.requireNonNull(validDurationSeconds, "validDurationSeconds must not be null");
63+
Objects.requireNonNull(validStartTimestamp, "validStartTimestamp must not be null");
5464

5565

5666
}
5767

5868
public TransactionInfo (Byte bytes,
5969
long chargedTxFee,
60-
String consensusTimeStamp,
70+
String consensusTimestamp,
6171
String entityId,
6272
String maxFee,
6373
String memoBase64,
@@ -78,7 +88,7 @@ public TransactionInfo (Byte bytes,
7888

7989
this.bytes= bytes;
8090
this.chargedTxFee= chargedTxFee;
81-
this.consensusTimeStamp=consensusTimeStamp;
91+
this.consensusTimestamp=consensusTimestamp;
8292
this.entityId=entityId;
8393
this.maxFee= maxFee;
8494
this.memoBase64=memoBase64;

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/MirrorNodeRestClient.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@
33
import com.hedera.hashgraph.sdk.AccountId;
44
import com.hedera.hashgraph.sdk.TokenId;
55
import com.openelements.hiero.base.HieroException;
6+
7+
import java.util.List;
68
import java.util.Objects;
9+
10+
import com.openelements.hiero.base.data.NftTransfers;
11+
import com.openelements.hiero.base.data.StakingRewardTransfers;
12+
import com.openelements.hiero.base.data.TokenTransfers;
13+
import com.openelements.hiero.base.data.Transfers;
714
import org.jspecify.annotations.NonNull;
15+
import org.jspecify.annotations.Nullable;
816

917
public interface MirrorNodeRestClient<JSON> {
1018

@@ -19,7 +27,26 @@ default JSON queryNftsByTokenIdAndSerial(@NonNull final TokenId tokenId, @NonNul
1927
}
2028

2129
@NonNull
22-
default JSON queryTransaction(@NonNull final String transactionId) throws HieroException {
30+
default JSON queryTransaction(@Nullable Byte bytes,
31+
long chargedTxFee,
32+
String consensusTimeStamp,
33+
String entityId,
34+
String maxFee,
35+
String memoBase64,
36+
String name,
37+
List<NftTransfers> nftTransfers,
38+
String node,
39+
int nonce,
40+
@Nullable String parentConsensusTimestamp,
41+
String result,
42+
boolean scheduled,
43+
List<StakingRewardTransfers> stakingRewardTransfers,
44+
List<TokenTransfers> tokenTransfers,
45+
String transactionHash,
46+
@NonNull String transactionId,
47+
List<Transfers> transfers,
48+
String validDurationSeconds,
49+
String validStartTimestamp) throws HieroException {
2350
Objects.requireNonNull(transactionId, "transactionId must not be null");
2451
return doGetCall("/api/v1/transactions/" + transactionId);
2552
}

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/TransactionRepositoryImpl.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
import com.hedera.hashgraph.sdk.AccountId;
44
import com.openelements.hiero.base.HieroException;
5+
import com.openelements.hiero.base.data.*;
56
import com.openelements.hiero.base.mirrornode.TransactionRepository;
67
import com.openelements.hiero.base.mirrornode.MirrorNodeClient;
7-
import com.openelements.hiero.base.data.Page;
8-
import com.openelements.hiero.base.data.TransactionInfo;
8+
9+
import java.util.List;
910
import java.util.Objects;
1011
import java.util.Optional;
1112
import org.jspecify.annotations.NonNull;
@@ -29,6 +30,29 @@ public Page<TransactionInfo> findByAccount(@NonNull final AccountId accountId) t
2930
@Override
3031
public Optional<TransactionInfo> findById(@NonNull final String transactionId) throws HieroException {
3132
Objects.requireNonNull(transactionId, "transactionId must not be null");
32-
return this.mirrorNodeClient.queryTransaction(transactionId);
33+
34+
final Byte bytes = null;
35+
final long chargedTxFee = 0;
36+
final String consensusTimeStamp = "1678901234.123456789";
37+
final String entityId = "0.0.4738897";
38+
final String maxFee = "1000000000";
39+
final String memoBase64 = "";
40+
final String name = "TOKENMINT";
41+
final List<NftTransfers> nftTransfers = List.of();
42+
final String node = "0.0.7";
43+
final int nonce = 0;
44+
final String parentConsensusTimestamp = null;
45+
final String result = "RESULT SUCCESS";
46+
final boolean scheduled = false;
47+
final List<StakingRewardTransfers> stakingRewardTransfers = List.of();
48+
final List<TokenTransfers> tokenTransfers = List.of();
49+
final String transactionHash = "VwgHwtzwU23H2mNaX0hl9lo1ZZQ+6VqGOrzqIzfz6D2KHUHgmGfzmTwStFAS2eza";
50+
final List<Transfers> transfers = List.of();
51+
final String validDurationSeconds = "120";
52+
final String validStartTimestamp = "1724503621.738000000";
53+
54+
return this.mirrorNodeClient.queryTransaction( bytes, chargedTxFee, consensusTimeStamp, entityId, maxFee, memoBase64, name, nftTransfers, node, nonce,
55+
parentConsensusTimestamp, result, scheduled, stakingRewardTransfers, tokenTransfers, transactionHash,
56+
transactionId, transfers, validDurationSeconds, validStartTimestamp);
3357
}
3458
}

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/mirrornode/MirrorNodeClient.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,13 @@
33
import com.hedera.hashgraph.sdk.AccountId;
44
import com.hedera.hashgraph.sdk.TokenId;
55
import com.openelements.hiero.base.HieroException;
6-
import com.openelements.hiero.base.data.AccountInfo;
7-
import com.openelements.hiero.base.data.Balance;
8-
import com.openelements.hiero.base.data.ExchangeRates;
9-
import com.openelements.hiero.base.data.NetworkFee;
10-
import com.openelements.hiero.base.data.NetworkStake;
11-
import com.openelements.hiero.base.data.NetworkSupplies;
12-
import com.openelements.hiero.base.data.Nft;
13-
import com.openelements.hiero.base.data.NftMetadata;
14-
import com.openelements.hiero.base.data.Page;
15-
import com.openelements.hiero.base.data.Token;
16-
import com.openelements.hiero.base.data.TokenInfo;
17-
import com.openelements.hiero.base.data.TransactionInfo;
6+
import com.openelements.hiero.base.data.*;
7+
188
import java.util.List;
199
import java.util.Objects;
2010
import java.util.Optional;
2111
import org.jspecify.annotations.NonNull;
12+
import org.jspecify.annotations.Nullable;
2213

2314
/**
2415
* A client for querying the Hiero Mirror Node REST API.
@@ -179,7 +170,26 @@ default Optional<Nft> queryNftsByAccountAndTokenIdAndSerial(@NonNull String acco
179170
* @throws HieroException if an error occurs
180171
*/
181172
@NonNull
182-
Optional<TransactionInfo> queryTransaction(@NonNull String transactionId) throws HieroException;
173+
Optional<TransactionInfo> queryTransaction(@Nullable Byte bytes,
174+
long chargedTxFee,
175+
String consensusTimeStamp,
176+
String entityId,
177+
String maxFee,
178+
String memoBase64,
179+
String name,
180+
List<NftTransfers> nftTransfers,
181+
String node,
182+
int nonce,
183+
@Nullable String parentConsensusTimestamp,
184+
String result,
185+
boolean scheduled,
186+
List<StakingRewardTransfers> stakingRewardTransfers,
187+
List<TokenTransfers> tokenTransfers,
188+
String transactionHash,
189+
@NonNull String transactionId,
190+
List<Transfers> transfers,
191+
String validDurationSeconds,
192+
String validStartTimestamp) throws HieroException;
183193

184194
/**
185195
* Queries the account information for a specific account ID.

hiero-enterprise-microprofile/src/main/java/com/openelements/hiero/microprofile/implementation/MirrorNodeClientImpl.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33
import com.hedera.hashgraph.sdk.AccountId;
44
import com.hedera.hashgraph.sdk.TokenId;
55
import com.openelements.hiero.base.HieroException;
6-
import com.openelements.hiero.base.data.Nft;
7-
import com.openelements.hiero.base.data.NftMetadata;
8-
import com.openelements.hiero.base.data.Page;
9-
import com.openelements.hiero.base.data.TransactionInfo;
10-
import com.openelements.hiero.base.data.Token;
11-
import com.openelements.hiero.base.data.Balance;
6+
import com.openelements.hiero.base.data.*;
127
import com.openelements.hiero.base.implementation.AbstractMirrorNodeClient;
138
import com.openelements.hiero.base.implementation.MirrorNodeJsonConverter;
149
import com.openelements.hiero.base.implementation.MirrorNodeRestClient;
@@ -18,6 +13,7 @@
1813
import java.util.Optional;
1914
import java.util.function.Function;
2015
import org.jspecify.annotations.NonNull;
16+
import org.jspecify.annotations.Nullable;
2117

2218
public class MirrorNodeClientImpl extends AbstractMirrorNodeClient<JsonObject> {
2319

@@ -64,8 +60,8 @@ public MirrorNodeClientImpl(MirrorNodeRestClientImpl restClient,
6460
}
6561

6662
@Override
67-
public @NonNull Optional<TransactionInfo> queryTransaction(@NonNull String transactionId) throws HieroException {
68-
throw new RuntimeException("Not implemented");
63+
public @NonNull Optional<TransactionInfo> queryTransaction(@Nullable Byte bytes, long chargedTxFee, String consensusTimeStamp, String entityId, String maxFee, String memoBase64, String name, List<NftTransfers> nftTransfers, String node, int nonce, @Nullable String parentConsensusTimestamp, String result, boolean scheduled, List<StakingRewardTransfers> stakingRewardTransfers, List<TokenTransfers> tokenTransfers, String transactionHash, @NonNull String transactionId, List<Transfers> transfers, String validDurationSeconds, String validStartTimestamp) throws HieroException {
64+
return Optional.empty();
6965
}
7066

7167
@Override

hiero-enterprise-spring/src/main/java/com/openelements/hiero/spring/implementation/MirrorNodeClientImpl.java

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@
55
import com.hedera.hashgraph.sdk.AccountId;
66
import com.hedera.hashgraph.sdk.TokenId;
77
import com.openelements.hiero.base.HieroException;
8-
import com.openelements.hiero.base.data.Nft;
9-
import com.openelements.hiero.base.data.NftMetadata;
10-
import com.openelements.hiero.base.data.Page;
11-
import com.openelements.hiero.base.data.TransactionInfo;
12-
import com.openelements.hiero.base.data.Balance;
13-
import com.openelements.hiero.base.data.Token;
8+
import com.openelements.hiero.base.data.*;
149
import com.openelements.hiero.base.implementation.AbstractMirrorNodeClient;
1510
import com.openelements.hiero.base.implementation.MirrorNodeJsonConverter;
1611
import com.openelements.hiero.base.implementation.MirrorNodeRestClient;
@@ -19,6 +14,7 @@
1914
import java.util.Optional;
2015
import java.util.function.Function;
2116
import org.jspecify.annotations.NonNull;
17+
import org.jspecify.annotations.Nullable;
2218
import org.springframework.web.client.RestClient;
2319

2420
public class MirrorNodeClientImpl extends AbstractMirrorNodeClient<JsonNode> {
@@ -82,19 +78,49 @@ public Page<Nft> queryNftsByTokenId(@NonNull TokenId tokenId) {
8278
public Page<TransactionInfo> queryTransactionsByAccount(@NonNull final AccountId accountId) throws HieroException {
8379
Objects.requireNonNull(accountId, "accountId must not be null");
8480
final String path = "/api/v1/transactions?account.id=" + accountId;
85-
final Function<JsonNode, List<TransactionInfo>> dataExtractionFunction = n -> jsonConverter.toTransactionInfos(
86-
n);
81+
final Function<JsonNode, List<TransactionInfo>> dataExtractionFunction = n -> jsonConverter.toTransactionInfos(n);
8782
return new RestBasedPage<>(objectMapper, restClient.mutate().clone(), path, dataExtractionFunction);
8883
}
8984

9085
@Override
91-
public Optional<TransactionInfo> queryTransaction(@NonNull final String transactionId) throws HieroException {
92-
final JsonNode jsonNode = mirrorNodeRestClient.queryTransaction(transactionId);
93-
//TODO: I assume there is a better check
94-
if (jsonNode == null || !jsonNode.fieldNames().hasNext()) {
86+
public Optional<TransactionInfo> queryTransaction(@Nullable Byte bytes,
87+
long chargedTxFee,
88+
String consensusTimeStamp,
89+
String entityId,
90+
String maxFee,
91+
String memoBase64,
92+
String name,
93+
List<NftTransfers> nftTransfers,
94+
String node,
95+
int nonce,
96+
@Nullable String parentConsensusTimestamp,
97+
String result,
98+
boolean scheduled,
99+
List<StakingRewardTransfers> stakingRewardTransfers,
100+
List<TokenTransfers> tokenTransfers,
101+
String transactionHash,
102+
@NonNull String transactionId,
103+
List<Transfers> transfers,
104+
String validDurationSeconds,
105+
String validStartTimestamp) throws HieroException {
106+
107+
final JsonNode jsonNode = mirrorNodeRestClient.queryTransaction( bytes, chargedTxFee, consensusTimeStamp, entityId, maxFee, memoBase64, name, nftTransfers, node, nonce,
108+
parentConsensusTimestamp, result, scheduled, stakingRewardTransfers, tokenTransfers, transactionHash,
109+
transactionId, transfers, validDurationSeconds, validStartTimestamp);
110+
111+
112+
if (jsonNode == null || jsonNode.isEmpty()) {
95113
return Optional.empty();
96114
}
97-
return Optional.of(new TransactionInfo(transactionId));
115+
116+
final Function<JsonNode, List<TransactionInfo>> dataExtractionFunction= n -> jsonConverter.toTransactionInfos(n);
117+
118+
List<TransactionInfo> transactionInfos= dataExtractionFunction.apply(jsonNode);
119+
if(transactionInfos.isEmpty()){
120+
return Optional.empty();
121+
}
122+
123+
return Optional.of(transactionInfos.getFirst());
98124
}
99125

100126
@Override

hiero-enterprise-test/src/main/java/com/openelements/hiero/test/HieroTestUtils.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import com.hedera.hashgraph.sdk.Status;
44
import com.hedera.hashgraph.sdk.TransactionId;
55
import com.openelements.hiero.base.HieroException;
6+
import com.openelements.hiero.base.data.TransactionInfo;
67
import com.openelements.hiero.base.mirrornode.MirrorNodeClient;
78
import com.openelements.hiero.base.protocol.ProtocolLayerClient;
89
import com.openelements.hiero.base.protocol.TransactionListener;
910
import com.openelements.hiero.base.protocol.data.TransactionType;
1011
import java.io.Serializable;
1112
import java.time.LocalDateTime;
13+
import java.util.List;
14+
import java.util.Optional;
1215
import java.util.concurrent.atomic.AtomicReference;
1316
import org.slf4j.Logger;
1417
import org.slf4j.LoggerFactory;
@@ -50,12 +53,36 @@ public void waitForMirrorNodeRecords() {
5053
log.debug("Waiting for transaction '{}' available at mirror node", transactionId);
5154
final LocalDateTime start = LocalDateTime.now();
5255
boolean done = false;
56+
5357
while (!done) {
5458
String transactionIdString =
5559
transactionId.accountId.toString() + "-" + transactionId.validStart.getEpochSecond() + "-"
5660
+ String.format("%09d", transactionId.validStart.getNano());
5761
try {
58-
done = mirrorNodeClient.queryTransaction(transactionIdString).isPresent();
62+
Optional<TransactionInfo> transactionResult= mirrorNodeClient.queryTransaction(
63+
null, // Byte bytes
64+
0L, // chargedTxFee
65+
"", // consensusTimeStamp
66+
"", // entityId
67+
"", // maxFee
68+
"", // memoBase64
69+
"", // name
70+
List.of(), // nftTransfers
71+
"", // node
72+
0, // nonce
73+
null, // parentConsensusTimestamp
74+
"", // result
75+
false, // scheduled
76+
List.of(), // stakingRewardTransfers
77+
List.of(), // tokenTransfers
78+
"", // transactionHash
79+
transactionIdString, // transactionId (this is the one you're tracking)
80+
List.of(), // transfers
81+
"", // validDurationSeconds
82+
"" // validStartTimestamp
83+
);
84+
85+
done = transactionResult.isPresent();
5986
} catch (HieroException e) {
6087
throw new RuntimeException("Error in mirror node query!", e);
6188
}

0 commit comments

Comments
 (0)