diff --git a/backend-modules/koios/build.gradle b/backend-modules/koios/build.gradle index 9a65990b..95a5e518 100644 --- a/backend-modules/koios/build.gradle +++ b/backend-modules/koios/build.gradle @@ -12,7 +12,7 @@ dependencies { compile project(':') compile project(':cardano-client-backend') - compile ('io.github.cardano-community:koios-java-client:1.13') + compile ('io.github.cardano-community:koios-java-client:1.14.1') testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' diff --git a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAccountService.java b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAccountService.java index 1e94839a..9626843f 100644 --- a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAccountService.java +++ b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAccountService.java @@ -6,12 +6,16 @@ import com.bloxbean.cardano.client.backend.model.*; import com.bloxbean.cardano.client.util.HexUtil; import rest.koios.client.backend.api.account.AccountService; +import rest.koios.client.backend.api.account.model.AccountHistoryInner; import rest.koios.client.backend.api.account.model.AccountInfo; +import rest.koios.client.backend.api.account.model.AccountReward; import rest.koios.client.backend.api.account.model.AccountRewards; import rest.koios.client.backend.factory.options.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; /** @@ -31,11 +35,14 @@ public KoiosAccountService(AccountService accountService) { @Override public Result getAccountInformation(String stakeAddress) throws ApiException { try { - rest.koios.client.backend.api.base.Result accountInformationResult = accountService.getAccountInformation(stakeAddress); + rest.koios.client.backend.api.base.Result> accountInformationResult = accountService.getAccountInformation(List.of(stakeAddress), Options.EMPTY); if (!accountInformationResult.isSuccessful()) { return Result.error(accountInformationResult.getResponse()).code(accountInformationResult.getCode()); } - return convertToAccountInformation(accountInformationResult.getValue()); + if (accountInformationResult.getValue().isEmpty()) { + return Result.error("Not Found").code(404); + } + return convertToAccountInformation(accountInformationResult.getValue().get(0)); } catch (rest.koios.client.backend.api.base.exception.ApiException e) { throw new ApiException(e.getMessage(), e); } @@ -62,25 +69,23 @@ public Result> getAccountRewardsHistory(String stake @Override public Result> getAccountRewardsHistory(String stakeAddress, int count, int page, OrderEnum order) throws ApiException { try { - Option ordering = Order.by("earned_epoch", SortType.ASC); - if (order == OrderEnum.desc) { - ordering = Order.by("earned_epoch", SortType.DESC); + if (page != 1) { + return Result.success("OK").withValue(Collections.emptyList()).code(200); } - Options options = Options.builder() - .option(Limit.of(count)) - .option(Offset.of((long) (page - 1) * count)) - .option(ordering).build(); - rest.koios.client.backend.api.base.Result> accountRewardsResult = accountService.getAccountRewards(stakeAddress, options); + rest.koios.client.backend.api.base.Result> accountRewardsResult = accountService.getAccountRewards(List.of(stakeAddress), null, Options.EMPTY); if (!accountRewardsResult.isSuccessful()) { return Result.error(accountRewardsResult.getResponse()).code(accountRewardsResult.getCode()); } - return convertToAccountRewards(accountRewardsResult.getValue()); + if (accountRewardsResult.getValue().isEmpty()) { + return Result.error("Not Found").code(404); + } + return convertToAccountRewards(accountRewardsResult.getValue().get(0).getRewards(), order); } catch (rest.koios.client.backend.api.base.exception.ApiException e) { throw new ApiException(e.getMessage(), e); } } - private Result> convertToAccountRewards(List accountRewardsList) { + private Result> convertToAccountRewards(List accountRewardsList, OrderEnum order) { List accountRewardsHistories = new ArrayList<>(); if (accountRewardsList != null) { accountRewardsList.forEach(accountRewards -> { @@ -92,6 +97,11 @@ private Result> convertToAccountRewards(List> getAccountHistory(String stakeAddress, int c @Override public Result> getAccountHistory(String stakeAddress, int count, int page, OrderEnum order) throws ApiException { try { - Option ordering = Order.by("epoch_no", SortType.ASC); - if (order == OrderEnum.desc) { - ordering = Order.by("epoch_no", SortType.DESC); + if (page != 1) { + return Result.success("OK").withValue(Collections.emptyList()).code(200); } - Options options = Options.builder() - .option(Limit.of(count)) - .option(Offset.of((long) (page - 1) * count)) - .option(ordering).build(); - rest.koios.client.backend.api.base.Result> accountHistoriesResult = accountService.getAccountHistory(stakeAddress, options); + rest.koios.client.backend.api.base.Result> accountHistoriesResult = accountService.getAccountHistory(List.of(stakeAddress), null, Options.EMPTY); if (!accountHistoriesResult.isSuccessful()) { return Result.error(accountHistoriesResult.getResponse()).code(accountHistoriesResult.getCode()); } - return convertToAccountHistories(accountHistoriesResult.getValue()); + if (accountHistoriesResult.getValue().isEmpty()) { + return Result.error("Not Found").code(404); + } + return convertToAccountHistories(accountHistoriesResult.getValue().get(0).getHistory(), order); } catch (rest.koios.client.backend.api.base.exception.ApiException e) { throw new ApiException(e.getMessage(), e); } } - private Result> convertToAccountHistories(List accountHistories) { + private Result> convertToAccountHistories(List accountHistories, OrderEnum order) { List accountHistoryList = new ArrayList<>(); if (accountHistories != null) { accountHistories.forEach(accountHistory -> { @@ -132,6 +140,11 @@ private Result> convertToAccountHistories(List> getAccountAddresses(String stakeAddress, int .option(Limit.of(count)) .option(Offset.of((long) (page - 1) * count)) .build(); - rest.koios.client.backend.api.base.Result> accountAddressesResult = accountService.getAccountAddresses(stakeAddress, options); + rest.koios.client.backend.api.base.Result> accountAddressesResult = accountService.getAccountAddresses(List.of(stakeAddress), null, options); if (!accountAddressesResult.isSuccessful()) { return Result.error(accountAddressesResult.getResponse()).code(accountAddressesResult.getCode()); } - return convertToAccountAddresses(accountAddressesResult.getValue()); + if (accountAddressesResult.getValue().isEmpty()) { + return Result.error("Not Found").code(404); + } + return convertToAccountAddresses(accountAddressesResult.getValue().get(0).getAddresses()); } catch (rest.koios.client.backend.api.base.exception.ApiException e) { throw new ApiException(e.getMessage(), e); } } - private Result> convertToAccountAddresses(List accountAddressList) { + private Result> convertToAccountAddresses(List accountAddressList) { List accountAddresses = new ArrayList<>(); if (accountAddressList != null) { - accountAddressList.forEach(accountAddress -> accountAddresses.add(new AccountAddress(accountAddress.getAddress()))); + accountAddressList.forEach(accountAddress -> accountAddresses.add(new AccountAddress(accountAddress))); } return Result.success("OK").withValue(accountAddresses).code(200); } @@ -177,11 +193,14 @@ public Result> getAccountAssets(String stakeAddress, int coun .option(Limit.of(count)) .option(Offset.of((long) (page - 1) * count)) .build(); - rest.koios.client.backend.api.base.Result> accountAssetsResult = accountService.getAccountAssets(stakeAddress, options); + rest.koios.client.backend.api.base.Result> accountAssetsResult = accountService.getAccountAssets(List.of(stakeAddress), null, options); if (!accountAssetsResult.isSuccessful()) { return Result.error(accountAssetsResult.getResponse()).code(accountAssetsResult.getCode()); } - return convertToAccountAssets(accountAssetsResult.getValue()); + if (accountAssetsResult.getValue().isEmpty()) { + return Result.error("Not Found").code(404); + } + return convertToAccountAssets(accountAssetsResult.getValue().get(0).getAssets()); } catch (rest.koios.client.backend.api.base.exception.ApiException e) { throw new ApiException(e.getMessage(), e); } @@ -191,10 +210,13 @@ private Result> convertToAccountAssets(List accountAssets = new ArrayList<>(); if (accountAssetList!=null) { accountAssetList.forEach(accountAsset -> { - AccountAsset accountAsset1 = new AccountAsset(); - accountAsset1.setUnit(accountAsset.getAssetPolicy() + HexUtil.encodeHexString(accountAsset.getAssetName().getBytes(StandardCharsets.UTF_8))); - accountAsset1.setQuantity(accountAsset.getQuantity()); - accountAssets.add(accountAsset1); + accountAsset.getAssets().forEach(assetInner -> { + AccountAsset accountAsset1 = new AccountAsset(); + accountAsset1.setUnit(accountAsset.getPolicyId() + HexUtil.encodeHexString(assetInner.getAssetName().getBytes(StandardCharsets.UTF_8))); + accountAsset1.setQuantity(assetInner.getBalance()); + accountAssets.add(accountAsset1); + + }); }); } return Result.success("OK").withValue(accountAssets).code(200); diff --git a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAddressService.java b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAddressService.java index d5d2e820..264403b7 100644 --- a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAddressService.java +++ b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAddressService.java @@ -69,6 +69,7 @@ private Result convertToAddressContent(AddressInfo addressInfo) txContentOutputAmountList.add(0, new TxContentOutputAmount("lovelace", addressInfo.getBalance())); addressContent.setAmount(txContentOutputAmountList); addressContent.setScript(addressInfo.getScriptAddress()); + return Result.success("OK").withValue(addressContent).code(200); } diff --git a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAssetService.java b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAssetService.java index a5fdf403..33f7b09e 100644 --- a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAssetService.java +++ b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosAssetService.java @@ -57,8 +57,8 @@ private Result convertToAsset(AssetInformation assetInformation) { asset.setQuantity(assetInformation.getTotalSupply()); asset.setInitialMintTxHash(assetInformation.getMintingTxHash()); asset.setMintOrBurnCount(assetInformation.getMintCnt() + assetInformation.getBurnCnt()); - if (assetInformation.getMintingTxMetadata() != null && !assetInformation.getMintingTxMetadata().isEmpty()) { - JsonNode jsonNode = assetInformation.getMintingTxMetadata().get(0).getJson(); + if (assetInformation.getMintingTxMetadata() != null) { + JsonNode jsonNode = assetInformation.getMintingTxMetadata().getJson(); if (jsonNode.get(assetInformation.getPolicyId()) != null && jsonNode.get(assetInformation.getPolicyId()).get(assetInformation.getAssetNameAscii()) != null) { asset.setOnchainMetadata(jsonNode.get(assetInformation.getPolicyId()).get(assetInformation.getAssetNameAscii())); } diff --git a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosMetadataService.java b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosMetadataService.java index c5c3533e..92460a5a 100644 --- a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosMetadataService.java +++ b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosMetadataService.java @@ -91,12 +91,12 @@ private Result> convertToMetadataLabels(List> getJSONMetadataByLabel(BigInteger label, int count, int page, OrderEnum order) throws ApiException { + public Result> getJSONMetadataByLabel(BigInteger label, int count, int page, OrderEnum order) { throw new UnsupportedOperationException(); } @Override - public Result> getCBORMetadataByLabel(BigInteger label, int count, int page, OrderEnum order) throws ApiException { + public Result> getCBORMetadataByLabel(BigInteger label, int count, int page, OrderEnum order) { throw new UnsupportedOperationException(); } } diff --git a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosUtxoService.java b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosUtxoService.java index 0a563f29..5f00b9ce 100644 --- a/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosUtxoService.java +++ b/backend-modules/koios/src/main/java/com/bloxbean/cardano/client/backend/koios/KoiosUtxoService.java @@ -10,6 +10,7 @@ import rest.koios.client.backend.api.address.model.AddressInfo; import rest.koios.client.backend.api.address.model.AddressUtxo; import rest.koios.client.backend.api.address.model.Asset; +import rest.koios.client.backend.factory.options.Options; import rest.koios.client.backend.factory.options.SortType; import java.math.BigInteger; @@ -45,6 +46,12 @@ private Result> convertToUTxOs(AddressInfo addressInfo) { utxo.setTxHash(addressUtxo.getTxHash()); utxo.setOutputIndex(addressUtxo.getTxIndex()); utxo.setDataHash(addressUtxo.getDatumHash()); + if (addressUtxo.getInlineDatum() != null) { + utxo.setInlineDatum(addressUtxo.getInlineDatum().getBytes()); + } + if (addressUtxo.getReferenceScript() != null) { + utxo.setReferenceScriptHash(addressUtxo.getReferenceScript().getHash()); + } List amountList = new ArrayList<>(); amountList.add(new Amount(LOVELACE, new BigInteger(addressUtxo.getValue()))); for (Asset asset : addressUtxo.getAssetList()) { @@ -65,7 +72,7 @@ public Result> getUtxos(String address, int count, int page, OrderEnu } rest.koios.client.backend.api.base.Result addressInformationResult; if (order == OrderEnum.asc) { - addressInformationResult = addressService.getAddressInformation(address, SortType.ASC); + addressInformationResult = addressService.getAddressInformation(List.of(address), SortType.ASC, Options.EMPTY); } else { addressInformationResult = addressService.getAddressInformation(address); }