Skip to content

Commit b2e56fb

Browse files
committed
Implemented MirrorNodeClient.queryTransaction
1 parent aa7d317 commit b2e56fb

File tree

9 files changed

+349
-50
lines changed

9 files changed

+349
-50
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.openelements.hiero.base.data;
2+
3+
import org.jspecify.annotations.Nullable;
4+
5+
public class NftTransfers {
6+
private final boolean isApproval;
7+
private final String receiverAccountId;
8+
private final @Nullable String senderAccountId;
9+
private final int serialNumber;
10+
private final String tokenId;
11+
12+
public NftTransfers(boolean isApproval, String receiverAccountId, String senderAccountId, int serialNumber, String tokenId ){
13+
this.isApproval=isApproval;
14+
this.receiverAccountId=receiverAccountId;
15+
this.senderAccountId=senderAccountId;
16+
this.serialNumber=serialNumber;
17+
this.tokenId=tokenId;
18+
}
19+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.openelements.hiero.base.data;
2+
3+
public class StakingRewardTransfers{
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.openelements.hiero.base.data;
2+
3+
public class TokenTransfers{
4+
}
Lines changed: 97 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,104 @@
11
package com.openelements.hiero.base.data;
22

3+
import java.util.List;
34
import java.util.Objects;
4-
import org.jspecify.annotations.NonNull;
55

6-
public record TransactionInfo(@NonNull String transactionId) {
6+
import org.jspecify.annotations.NonNull;
7+
import org.jspecify.annotations.Nullable;
78

8-
public TransactionInfo {
9+
public record TransactionInfo(@Nullable Byte bytes,
10+
long chargedTxFee,
11+
String consensusTimeStamp,
12+
String entityId,
13+
String maxFee,
14+
String memoBase64,
15+
String name,
16+
List<NftTransfers> nftTransfers,
17+
String node,
18+
int nonce,
19+
@Nullable String parentConsensusTimestamp,
20+
String result,
21+
boolean scheduled,
22+
List<StakingRewardTransfers> stakingRewardTransfers,
23+
List<TokenTransfers> tokenTransfers,
24+
String transactionHash,
25+
@NonNull String transactionId,
26+
List<Transfers> transfers,
27+
String validDurationSeconds,
28+
String validStartTimestamp
29+
) {
30+
public TransactionInfo(@NonNull String transactionId){
31+
this(
32+
null, // bytes
33+
0L, // chargedTxFee
34+
null, // consensusTimeStamp
35+
null, // entityId
36+
null, // maxFee
37+
null, // memoBase64
38+
null, // name
39+
List.of(), // nftTransfers (empty list)
40+
null, // node
41+
0, // nonce
42+
null, // parentConsensusTimestamp
43+
null, // result
44+
false, // scheduled
45+
List.of(), // stakingRewardTransfers (empty list)
46+
List.of(), // tokenTransfers (empty list)
47+
null, // transactionHash
48+
transactionId, // transactionId
49+
List.of(), // transfers (empty list)
50+
null, // validDurationSeconds
51+
null // validStartTimestamp
52+
);
953
Objects.requireNonNull(transactionId, "transactionId must not be null");
54+
55+
1056
}
11-
}
57+
58+
public TransactionInfo (Byte bytes,
59+
long chargedTxFee,
60+
String consensusTimeStamp,
61+
String entityId,
62+
String maxFee,
63+
String memoBase64,
64+
String name,
65+
List<NftTransfers> nftTransfers,
66+
String node, int nonce,
67+
String parentConsensusTimestamp,
68+
String result,
69+
boolean scheduled,
70+
List<StakingRewardTransfers> stakingRewardTransfers,
71+
List<TokenTransfers> tokenTransfers,
72+
String transactionHash,
73+
String transactionId,
74+
List<Transfers> transfers,
75+
String validDurationSeconds,
76+
String validStartTimestamp
77+
){
78+
79+
this.bytes= bytes;
80+
this.chargedTxFee= chargedTxFee;
81+
this.consensusTimeStamp=consensusTimeStamp;
82+
this.entityId=entityId;
83+
this.maxFee= maxFee;
84+
this.memoBase64=memoBase64;
85+
this.name=name;
86+
this.nftTransfers= nftTransfers;
87+
this.node= node;
88+
this.nonce= nonce;
89+
this.parentConsensusTimestamp= parentConsensusTimestamp;
90+
this.result= result;
91+
this.scheduled= scheduled;
92+
this.stakingRewardTransfers= stakingRewardTransfers;
93+
this.tokenTransfers= tokenTransfers;
94+
this.transactionHash= transactionHash;
95+
this.transactionId= transactionId;
96+
this.transfers= transfers;
97+
this.validDurationSeconds= validDurationSeconds;
98+
this.validStartTimestamp= validStartTimestamp;
99+
100+
101+
}
102+
}
103+
104+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.openelements.hiero.base.data;
2+
3+
public class Transfers{
4+
private final String account;
5+
private final long amount;
6+
private final boolean isApproval;
7+
8+
public Transfers(String account, long amount, boolean isApproval){
9+
this.account= account;
10+
this.amount= amount;
11+
this.isApproval= isApproval;
12+
}
13+
}

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

Lines changed: 104 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,15 @@
22

33
import com.hedera.hashgraph.sdk.AccountId;
44
import com.hedera.hashgraph.sdk.TokenId;
5-
import com.hedera.hashgraph.sdk.TokenId;
65
import com.hedera.hashgraph.sdk.TokenSupplyType;
76
import com.hedera.hashgraph.sdk.TokenType;
8-
import com.openelements.hiero.base.data.AccountInfo;
9-
import com.openelements.hiero.base.data.ExchangeRate;
10-
import com.openelements.hiero.base.data.ExchangeRates;
11-
import com.openelements.hiero.base.data.NetworkFee;
12-
import com.openelements.hiero.base.data.NetworkStake;
13-
import com.openelements.hiero.base.data.NetworkSupplies;
14-
import com.openelements.hiero.base.data.Nft;
15-
import com.openelements.hiero.base.data.TransactionInfo;
16-
import com.openelements.hiero.base.data.Token;
17-
import com.openelements.hiero.base.data.TokenInfo;
18-
import com.openelements.hiero.base.data.Balance;
19-
import com.openelements.hiero.base.data.CustomFee;
20-
import com.openelements.hiero.base.data.FixedFee;
21-
import com.openelements.hiero.base.data.FractionalFee;
22-
import com.openelements.hiero.base.data.RoyaltyFee;
7+
import com.openelements.hiero.base.data.*;
238
import com.openelements.hiero.base.implementation.MirrorNodeJsonConverter;
249
import jakarta.json.JsonArray;
2510
import jakarta.json.JsonObject;
26-
2711
import java.time.Instant;
2812
import java.math.BigInteger;
29-
import java.time.Instant;
30-
import java.util.List;
31-
import java.util.Objects;
32-
import java.util.Optional;
33-
import java.util.Spliterator;
34-
import java.util.Spliterators;
13+
import java.util.*;
3514
import java.util.stream.Stream;
3615
import java.util.stream.StreamSupport;
3716

@@ -40,6 +19,8 @@
4019

4120
public class MirrorNodeJsonConverterImpl implements MirrorNodeJsonConverter<JsonObject> {
4221

22+
private boolean scheduled;
23+
4324
@Override
4425
public @NonNull Optional<Nft> toNft(@NonNull JsonObject jsonObject) {
4526
try {
@@ -166,12 +147,110 @@ public class MirrorNodeJsonConverterImpl implements MirrorNodeJsonConverter<Json
166147
return List.of();
167148
}
168149

150+
169151
final JsonArray transactionsNode = jsonObject.getJsonArray("transactions");
152+
153+
154+
155+
170156
return jsonArrayToStream(transactionsNode)
171157
.map(n -> {
172158
try {
173-
final String transactionId = n.asJsonObject().getString("transaction_id");
174-
return new TransactionInfo(transactionId);
159+
JsonObject transactionsObject= n.asJsonObject();
160+
161+
// Converting NftTransfers Object.
162+
JsonArray nftTransfersNode= n.asJsonObject().getJsonArray("nft_transfers");
163+
List<NftTransfers> nftTransfers= new ArrayList<>();
164+
165+
if(nftTransfersNode !=null){
166+
for(JsonValue value: nftTransfersNode){
167+
JsonObject nftTransfersObject = value.asJsonObject();
168+
169+
170+
final boolean isApproval= nftTransfersObject.getBoolean("is_approval");
171+
final String receiverAccountId= nftTransfersObject.getString("receiver_account_id");
172+
final String senderAccountId= nftTransfersObject.getString("sender_account_id", null);
173+
final int serialNumber= nftTransfersObject.getInt("serial_number");
174+
final String tokenId= nftTransfersObject.getString("token_id");
175+
176+
nftTransfers.add(new NftTransfers(isApproval, receiverAccountId, senderAccountId,serialNumber, tokenId));
177+
}
178+
}
179+
180+
// Converting StakingRewardTransfers Object.
181+
JsonArray stakingRewardTransfersNode = n.asJsonObject().getJsonArray("staking_reward_transfers");
182+
List<StakingRewardTransfers> stakingRewardTransfers= new ArrayList<>();
183+
184+
if(stakingRewardTransfersNode !=null && !stakingRewardTransfersNode.isEmpty()){
185+
for(JsonValue value: stakingRewardTransfersNode ){
186+
stakingRewardTransfers.add(new StakingRewardTransfers());
187+
}
188+
}
189+
190+
// Converting TokenTransfers Object.
191+
JsonArray tokenTransfersNode = n.asJsonObject().getJsonArray("token_transfers");
192+
List<TokenTransfers> tokenTransfers= new ArrayList<>();
193+
194+
if(tokenTransfersNode !=null && !tokenTransfersNode.isEmpty()){
195+
for(JsonValue value: tokenTransfersNode ){
196+
tokenTransfers.add(new TokenTransfers());
197+
}
198+
}
199+
200+
// Converting Transfers Object.
201+
JsonArray transfersNode= n.asJsonObject().getJsonArray("transfers");
202+
List<Transfers> transfers= new ArrayList<>();
203+
204+
if(transfersNode != null){
205+
for(JsonValue value: transfersNode){
206+
JsonObject transfersNodeObject = value.asJsonObject();
207+
208+
final String account= transfersNodeObject.getString("account");
209+
final long amount= transfersNodeObject.getJsonNumber("amount").longValue();
210+
final boolean isApproval= transfersNodeObject.containsKey("is_approval") ? transfersNodeObject.getBoolean("is_approval"): false;
211+
212+
transfers.add(new Transfers(account, amount, isApproval));
213+
}
214+
}
215+
216+
final Byte bytes = transactionsObject.containsKey("bytes") ? (byte) transactionsObject.getInt("bytes") : null;
217+
final long chargedTxFee= transactionsObject.getJsonNumber("charged_tx_fee").longValue();
218+
final String consensusTimeStamp = transactionsObject.getString("consensus_timestamp");
219+
final String entityId = transactionsObject.getString("entity_id");
220+
final String maxFee= transactionsObject.getString("max_fee");
221+
final String memoBase64= transactionsObject.getString("memo_base64");
222+
final String name= transactionsObject.getString("name");
223+
final String node= transactionsObject.getString("node");
224+
final int nonce= transactionsObject.getInt("nonce");
225+
final String parentConsensusTimestamp= transactionsObject.getString("parent_consensus_timestamp", null);
226+
final String result= transactionsObject.getString("result");
227+
final boolean scheduled= transactionsObject.getBoolean("scheduled");
228+
final String transactionHash= transactionsObject.getString("transaction_hash");
229+
final String transactionId = transactionsObject.getString("transaction_id");
230+
final String validDurationSeconds= transactionsObject.getString("valid_duration_seconds");
231+
final String validStartTimestamp= transactionsObject.getString("valid_start_timestamp");
232+
233+
return new TransactionInfo(
234+
bytes,
235+
chargedTxFee,
236+
consensusTimeStamp,
237+
entityId,
238+
maxFee,
239+
memoBase64,
240+
name,
241+
nftTransfers,
242+
node,
243+
nonce,
244+
parentConsensusTimestamp,
245+
result,
246+
scheduled,
247+
stakingRewardTransfers,
248+
tokenTransfers,
249+
transactionHash,
250+
transactionId,
251+
transfers,
252+
validDurationSeconds,
253+
validStartTimestamp );
175254
} catch (final Exception e) {
176255
throw new IllegalStateException("Can not parse JSON: " + n, e);
177256
}

hiero-enterprise-spring-sample/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<groupId>io.grpc</groupId>
3535
<artifactId>grpc-inprocess</artifactId>
3636
</dependency>
37+
3738
</dependencies>
3839

3940
<build>

hiero-enterprise-spring/pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@
6868
<artifactId>spring-boot-starter-web</artifactId>
6969
<scope>test</scope>
7070
</dependency>
71+
<dependency>
72+
<groupId>jakarta.json</groupId>
73+
<artifactId>jakarta.json-api</artifactId>
74+
</dependency>
75+
<dependency>
76+
<groupId>jakarta.json</groupId>
77+
<artifactId>jakarta.json-api</artifactId>
78+
</dependency>
7179
</dependencies>
7280

7381
<build>

0 commit comments

Comments
 (0)